MIF_E31222379_BE/internal/handler/trashcart_handler.go

97 lines
2.5 KiB
Go

package handler
import (
"rijig/dto"
"rijig/internal/services"
"rijig/utils"
"github.com/gofiber/fiber/v2"
)
type CartHandler struct {
CartService services.CartService
}
func NewCartHandler(service services.CartService) *CartHandler {
return &CartHandler{
CartService: service,
}
}
// GET /cart - Get cart by user ID
func (h *CartHandler) GetCart(c *fiber.Ctx) error {
userID, ok := c.Locals("userID").(string)
if !ok || userID == "" {
return utils.ErrorResponse(c, "unauthorized or invalid user")
}
cart, err := h.CartService.GetCartByUserID(userID)
if err != nil {
return utils.InternalServerErrorResponse(c, "failed to retrieve cart")
}
if cart == nil {
return utils.SuccessResponse(c, nil, "Cart is empty")
}
return utils.SuccessResponse(c, cart, "User cart data successfully fetched")
}
// POST /cart - Create new cart
func (h *CartHandler) CreateCart(c *fiber.Ctx) error {
userID, ok := c.Locals("userID").(string)
if !ok || userID == "" {
return utils.ErrorResponse(c, "unauthorized or invalid user")
}
var reqItems []dto.RequestCartItems
if err := c.BodyParser(&reqItems); err != nil {
return utils.ValidationErrorResponse(c, map[string][]string{
"body": {"invalid JSON format"},
})
}
// Logic dipindahkan ke service
if err := h.CartService.CreateCartFromDTO(userID, reqItems); err != nil {
if ve, ok := err.(dto.ValidationErrors); ok {
return utils.ValidationErrorResponse(c, ve.Errors)
}
return utils.InternalServerErrorResponse(c, "failed to create cart")
}
return utils.CreateResponse(c, nil, "Cart created successfully")
}
// DELETE /cart/:id - Delete cart by cartID
func (h *CartHandler) DeleteCart(c *fiber.Ctx) error {
cartID := c.Params("id")
if cartID == "" {
return utils.ErrorResponse(c, "Cart ID is required")
}
if err := h.CartService.DeleteCart(cartID); err != nil {
return utils.InternalServerErrorResponse(c, "failed to delete cart")
}
return utils.SuccessResponse(c, nil, "Cart deleted successfully")
}
// POST /cart/commit - Simpan cart dari Redis ke DB
func (h *CartHandler) CommitCart(c *fiber.Ctx) error {
userID, ok := c.Locals("userID").(string)
if !ok || userID == "" {
return utils.ErrorResponse(c, "unauthorized or invalid user")
}
err := h.CartService.CommitCartFromRedis(userID)
if err != nil {
if err.Error() == "cart not found in redis" {
return utils.ErrorResponse(c, "Cart tidak ditemukan atau sudah expired")
}
return utils.InternalServerErrorResponse(c, "Gagal menyimpan cart ke database")
}
return utils.SuccessResponse(c, nil, "Cart berhasil disimpan ke database")
}