MIF_E31222379_BE/internal/handler/trashcart_handler.go

97 lines
2.6 KiB
Go

package handler
import (
"rijig/dto"
"rijig/internal/services"
"rijig/utils"
"github.com/gofiber/fiber/v2"
)
type CartHandler struct {
Service *services.CartService
}
func NewCartHandler(service *services.CartService) *CartHandler {
return &CartHandler{Service: service}
}
func (h *CartHandler) AddOrUpdateCartItem(c *fiber.Ctx) error {
var body dto.BulkRequestCartItems
if err := c.BodyParser(&body); err != nil {
return utils.ValidationErrorResponse(c, map[string][]string{
"body": {"Invalid JSON body"},
})
}
if errors, ok := body.Validate(); !ok {
return utils.ValidationErrorResponse(c, errors)
}
userID := c.Locals("userID").(string)
for _, item := range body.Items {
if err := services.AddOrUpdateCartItem(userID, item); err != nil {
return utils.InternalServerErrorResponse(c, "Failed to update one or more items")
}
}
return utils.SuccessResponse(c, nil, "Cart updated successfully")
}
func (h *CartHandler) DeleteCartItem(c *fiber.Ctx) error {
trashID := c.Params("trashid")
userID := c.Locals("userID").(string)
err := services.DeleteCartItem(userID, trashID)
if err != nil {
if err.Error() == "no cart found" || err.Error() == "trashid not found" {
return utils.GenericResponse(c, fiber.StatusNotFound, "Trash item not found in cart")
}
return utils.InternalServerErrorResponse(c, "Failed to delete item")
}
return utils.SuccessResponse(c, nil, "Item deleted")
}
func (h *CartHandler) ClearCart(c *fiber.Ctx) error {
userID := c.Locals("userID").(string)
if err := services.ClearCart(userID); err != nil {
return utils.InternalServerErrorResponse(c, "Failed to clear cart")
}
return utils.SuccessResponse(c, nil, "Cart cleared")
}
func (h *CartHandler) GetCart(c *fiber.Ctx) error {
userID := c.Locals("userID").(string)
cart, err := h.Service.GetCart(userID)
if err != nil {
return utils.InternalServerErrorResponse(c, "Failed to fetch cart")
}
return utils.SuccessResponse(c, cart, "User cart data successfully fetched")
}
func (h *CartHandler) CommitCart(c *fiber.Ctx) error {
userID := c.Locals("userID").(string)
err := h.Service.CommitCartToDatabase(userID)
if err != nil {
return utils.InternalServerErrorResponse(c, "Failed to commit cart to database")
}
return utils.SuccessResponse(c, nil, "Cart committed to database")
}
// PUT /cart/refresh → refresh TTL Redis
func (h *CartHandler) RefreshCartTTL(c *fiber.Ctx) error {
userID := c.Locals("userID").(string)
err := services.RefreshCartTTL(userID)
if err != nil {
return utils.InternalServerErrorResponse(c, "Failed to refresh cart TTL")
}
return utils.SuccessResponse(c, nil, "Cart TTL refreshed")
}