Files
sale/backend/internal/api/handlers/address.go
T

125 lines
3.2 KiB
Go

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"})
}