Initial commit: 商品售卖网站
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"sale/internal/models"
|
||||
"sale/internal/schemas"
|
||||
"sale/internal/utils"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type AddressHandler struct{}
|
||||
|
||||
func NewAddressHandler() *AddressHandler {
|
||||
return &AddressHandler{}
|
||||
}
|
||||
|
||||
func (h *AddressHandler) List(c *gin.Context) {
|
||||
userID := c.GetUint("user_id")
|
||||
var addresses []models.Address
|
||||
utils.DB.Where("user_id = ?", userID).Order("is_default DESC, created_at DESC").Find(&addresses)
|
||||
c.JSON(http.StatusOK, gin.H{"data": addresses})
|
||||
}
|
||||
|
||||
func (h *AddressHandler) Create(c *gin.Context) {
|
||||
userID := c.GetUint("user_id")
|
||||
var req schemas.CreateAddressRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
if req.IsDefault {
|
||||
utils.DB.Model(&models.Address{}).Where("user_id = ?", userID).Update("is_default", false)
|
||||
}
|
||||
|
||||
address := models.Address{
|
||||
UserID: userID,
|
||||
Name: req.Name,
|
||||
Phone: req.Phone,
|
||||
Province: req.Province,
|
||||
City: req.City,
|
||||
District: req.District,
|
||||
Address: req.Address,
|
||||
IsDefault: req.IsDefault,
|
||||
}
|
||||
|
||||
utils.DB.Create(&address)
|
||||
c.JSON(http.StatusCreated, gin.H{"data": address})
|
||||
}
|
||||
|
||||
func (h *AddressHandler) Update(c *gin.Context) {
|
||||
userID := c.GetUint("user_id")
|
||||
id, _ := strconv.Atoi(c.Param("id"))
|
||||
|
||||
var address models.Address
|
||||
if err := utils.DB.Where("id = ? AND user_id = ?", id, userID).First(&address).Error; err != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "Address not found"})
|
||||
return
|
||||
}
|
||||
|
||||
var req schemas.UpdateAddressRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
updates := make(map[string]interface{})
|
||||
if req.Name != nil {
|
||||
updates["name"] = *req.Name
|
||||
}
|
||||
if req.Phone != nil {
|
||||
updates["phone"] = *req.Phone
|
||||
}
|
||||
if req.Province != nil {
|
||||
updates["province"] = *req.Province
|
||||
}
|
||||
if req.City != nil {
|
||||
updates["city"] = *req.City
|
||||
}
|
||||
if req.District != nil {
|
||||
updates["district"] = *req.District
|
||||
}
|
||||
if req.Address != nil {
|
||||
updates["address"] = *req.Address
|
||||
}
|
||||
if req.IsDefault != nil && *req.IsDefault {
|
||||
utils.DB.Model(&models.Address{}).Where("user_id = ?", userID).Update("is_default", false)
|
||||
updates["is_default"] = true
|
||||
}
|
||||
|
||||
utils.DB.Model(&address).Updates(updates)
|
||||
c.JSON(http.StatusOK, gin.H{"data": address})
|
||||
}
|
||||
|
||||
func (h *AddressHandler) Delete(c *gin.Context) {
|
||||
userID := c.GetUint("user_id")
|
||||
id, _ := strconv.Atoi(c.Param("id"))
|
||||
|
||||
if err := utils.DB.Where("id = ? AND user_id = ?", id, userID).Delete(&models.Address{}).Error; err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete address"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"message": "Address deleted successfully"})
|
||||
}
|
||||
|
||||
func (h *AddressHandler) SetDefault(c *gin.Context) {
|
||||
userID := c.GetUint("user_id")
|
||||
id, _ := strconv.Atoi(c.Param("id"))
|
||||
|
||||
var address models.Address
|
||||
if err := utils.DB.Where("id = ? AND user_id = ?", id, userID).First(&address).Error; err != nil {
|
||||
c.JSON(http.StatusNotFound, gin.H{"error": "Address not found"})
|
||||
return
|
||||
}
|
||||
|
||||
utils.DB.Model(&models.Address{}).Where("user_id = ?", userID).Update("is_default", false)
|
||||
utils.DB.Model(&address).Update("is_default", true)
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"message": "Default address set successfully"})
|
||||
}
|
||||
Reference in New Issue
Block a user