227 lines
6.3 KiB
Go
227 lines
6.3 KiB
Go
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))
|
|
} |