125 lines
3.2 KiB
Go
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"})
|
|
}
|