package handlers import ( "awesomeProject/internal/common" "awesomeProject/internal/models" "net/http" "strconv" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // UserAddressHandler 用户收货地址处理器 type UserAddressHandler struct{} // GetAddressList 获取用户收货地址列表 func (h *UserAddressHandler) GetAddressList(c *gin.Context) { currentUser, _ := c.Get("current_user") user := currentUser.(models.User) var addresses []models.UserAddress err := common.GetDB().Where("user_id = ?", user.ID).Order("is_default DESC, created_at DESC").Find(&addresses).Error if err != nil { c.JSON(http.StatusOK, common.Error(500, "获取收货地址失败")) return } c.JSON(http.StatusOK, common.Success(addresses)) } // GetAddress 获取单个收货地址 func (h *UserAddressHandler) GetAddress(c *gin.Context) { currentUser, _ := c.Get("current_user") user := currentUser.(models.User) addressID, err := strconv.ParseUint(c.Param("id"), 10, 32) if err != nil { c.JSON(http.StatusOK, common.Error(400, "地址ID无效")) return } var address models.UserAddress err = common.GetDB().Where("id = ? AND user_id = ?", addressID, user.ID).First(&address).Error if err != nil { if err == gorm.ErrRecordNotFound { c.JSON(http.StatusOK, common.Error(404, "收货地址不存在")) } else { c.JSON(http.StatusOK, common.Error(500, "获取收货地址失败")) } return } c.JSON(http.StatusOK, common.Success(address)) } // CreateAddress 创建收货地址 func (h *UserAddressHandler) CreateAddress(c *gin.Context) { currentUser, _ := c.Get("current_user") user := currentUser.(models.User) var address models.UserAddress if err := c.ShouldBindJSON(&address); err != nil { c.JSON(http.StatusOK, common.Error(400, "请求参数错误")) return } // 设置用户ID address.UserID = user.ID // 开启事务 tx := common.GetDB().Begin() // 如果设置为默认地址,先取消其他地址的默认状态 if address.IsDefault == 1 { if err := tx.Model(&models.UserAddress{}).Where("user_id = ?", user.ID).Update("is_default", 0).Error; err != nil { tx.Rollback() c.JSON(http.StatusOK, common.Error(500, "更新默认地址状态失败")) return } } // 创建地址 if err := tx.Create(&address).Error; err != nil { tx.Rollback() c.JSON(http.StatusOK, common.Error(500, "创建收货地址失败")) return } tx.Commit() c.JSON(http.StatusOK, common.Success(address)) } // UpdateAddress 更新收货地址 func (h *UserAddressHandler) UpdateAddress(c *gin.Context) { currentUser, _ := c.Get("current_user") user := currentUser.(models.User) addressID, err := strconv.ParseUint(c.Param("id"), 10, 32) if err != nil { c.JSON(http.StatusOK, common.Error(400, "地址ID无效")) return } // 检查地址是否存在且属于当前用户 var existAddress models.UserAddress err = common.GetDB().Where("id = ? AND user_id = ?", addressID, user.ID).First(&existAddress).Error if err != nil { if err == gorm.ErrRecordNotFound { c.JSON(http.StatusOK, common.Error(404, "收货地址不存在")) } else { c.JSON(http.StatusOK, common.Error(500, "获取收货地址失败")) } return } var updateData models.UserAddress if err := c.ShouldBindJSON(&updateData); err != nil { c.JSON(http.StatusOK, common.Error(400, "请求参数错误")) return } // 开启事务 tx := common.GetDB().Begin() // 如果设置为默认地址,先取消其他地址的默认状态 if updateData.IsDefault == 1 { if err := tx.Model(&models.UserAddress{}).Where("user_id = ? AND id != ?", user.ID, addressID).Update("is_default", 0).Error; err != nil { tx.Rollback() c.JSON(http.StatusOK, common.Error(500, "更新默认地址状态失败")) return } } // 更新地址信息 updateData.UserID = user.ID // 确保不会被修改 if err := tx.Model(&existAddress).Updates(updateData).Error; err != nil { tx.Rollback() c.JSON(http.StatusOK, common.Error(500, "更新收货地址失败")) return } tx.Commit() // 返回更新后的地址 var updatedAddress models.UserAddress common.GetDB().Where("id = ?", addressID).First(&updatedAddress) c.JSON(http.StatusOK, common.Success(updatedAddress)) } // DeleteAddress 删除收货地址 func (h *UserAddressHandler) DeleteAddress(c *gin.Context) { currentUser, _ := c.Get("current_user") user := currentUser.(models.User) addressID, err := strconv.ParseUint(c.Param("id"), 10, 32) if err != nil { c.JSON(http.StatusOK, common.Error(400, "地址ID无效")) return } // 检查地址是否存在且属于当前用户 var address models.UserAddress err = common.GetDB().Where("id = ? AND user_id = ?", addressID, user.ID).First(&address).Error if err != nil { if err == gorm.ErrRecordNotFound { c.JSON(http.StatusOK, common.Error(404, "收货地址不存在")) } else { c.JSON(http.StatusOK, common.Error(500, "获取收货地址失败")) } return } // 删除地址 if err := common.GetDB().Delete(&address).Error; err != nil { c.JSON(http.StatusOK, common.Error(500, "删除收货地址失败")) return } c.JSON(http.StatusOK, common.Success(nil)) } // SetDefaultAddress 设置默认收货地址 func (h *UserAddressHandler) SetDefaultAddress(c *gin.Context) { currentUser, _ := c.Get("current_user") user := currentUser.(models.User) addressID, err := strconv.ParseUint(c.Param("id"), 10, 32) if err != nil { c.JSON(http.StatusOK, common.Error(400, "地址ID无效")) return } // 检查地址是否存在且属于当前用户 var address models.UserAddress err = common.GetDB().Where("id = ? AND user_id = ?", addressID, user.ID).First(&address).Error if err != nil { if err == gorm.ErrRecordNotFound { c.JSON(http.StatusOK, common.Error(404, "收货地址不存在")) } else { c.JSON(http.StatusOK, common.Error(500, "获取收货地址失败")) } return } // 开启事务 tx := common.GetDB().Begin() // 取消其他地址的默认状态 if err := tx.Model(&models.UserAddress{}).Where("user_id = ?", user.ID).Update("is_default", 0).Error; err != nil { tx.Rollback() c.JSON(http.StatusOK, common.Error(500, "更新默认地址状态失败")) return } // 设置当前地址为默认 if err := tx.Model(&address).Update("is_default", 1).Error; err != nil { tx.Rollback() c.JSON(http.StatusOK, common.Error(500, "设置默认地址失败")) return } tx.Commit() c.JSON(http.StatusOK, common.Success(nil)) }