package handler import ( "apskel-pos-be/internal/contract" "apskel-pos-be/internal/util" "apskel-pos-be/internal/validator" "github.com/gin-gonic/gin" "github.com/google/uuid" ) type OrderIngredientTransactionHandler struct { service OrderIngredientTransactionService validator validator.OrderIngredientTransactionValidator } func NewOrderIngredientTransactionHandler(service OrderIngredientTransactionService, validator validator.OrderIngredientTransactionValidator) *OrderIngredientTransactionHandler { return &OrderIngredientTransactionHandler{ service: service, validator: validator, } } func (h *OrderIngredientTransactionHandler) CreateOrderIngredientTransaction(c *gin.Context) { var req contract.CreateOrderIngredientTransactionRequest if err := c.ShouldBindJSON(&req); err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } response, err := h.service.CreateOrderIngredientTransaction(c, &req) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(response), "OrderIngredientTransactionHandler") } func (h *OrderIngredientTransactionHandler) GetOrderIngredientTransactionByID(c *gin.Context) { idStr := c.Param("id") id, err := uuid.Parse(idStr) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: "Invalid ID format"}}), "OrderIngredientTransactionHandler") return } response, err := h.service.GetOrderIngredientTransactionByID(c, id) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(response), "OrderIngredientTransactionHandler") } func (h *OrderIngredientTransactionHandler) UpdateOrderIngredientTransaction(c *gin.Context) { idStr := c.Param("id") id, err := uuid.Parse(idStr) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: "Invalid ID format"}}), "OrderIngredientTransactionHandler") return } var req contract.UpdateOrderIngredientTransactionRequest if err := c.ShouldBindJSON(&req); err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } response, err := h.service.UpdateOrderIngredientTransaction(c, id, &req) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(response), "OrderIngredientTransactionHandler") } func (h *OrderIngredientTransactionHandler) DeleteOrderIngredientTransaction(c *gin.Context) { idStr := c.Param("id") id, err := uuid.Parse(idStr) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: "Invalid ID format"}}), "OrderIngredientTransactionHandler") return } err = h.service.DeleteOrderIngredientTransaction(c, id) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(gin.H{"message": "Order ingredient transaction deleted successfully"}), "OrderIngredientTransactionHandler") } func (h *OrderIngredientTransactionHandler) ListOrderIngredientTransactions(c *gin.Context) { var req contract.ListOrderIngredientTransactionsRequest if err := c.ShouldBindQuery(&req); err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } response, total, err := h.service.ListOrderIngredientTransactions(c, &req) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(gin.H{ "data": response, "total": total, "page": req.Page, "limit": req.Limit, }), "OrderIngredientTransactionHandler") } func (h *OrderIngredientTransactionHandler) GetOrderIngredientTransactionsByOrder(c *gin.Context) { orderIDStr := c.Param("order_id") orderID, err := uuid.Parse(orderIDStr) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: "Invalid order ID format"}}), "OrderIngredientTransactionHandler") return } response, err := h.service.GetOrderIngredientTransactionsByOrder(c, orderID) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(response), "OrderIngredientTransactionHandler") } func (h *OrderIngredientTransactionHandler) GetOrderIngredientTransactionsByOrderItem(c *gin.Context) { orderItemIDStr := c.Param("order_item_id") orderItemID, err := uuid.Parse(orderItemIDStr) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: "Invalid order item ID format"}}), "OrderIngredientTransactionHandler") return } response, err := h.service.GetOrderIngredientTransactionsByOrderItem(c, orderItemID) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(response), "OrderIngredientTransactionHandler") } func (h *OrderIngredientTransactionHandler) GetOrderIngredientTransactionsByIngredient(c *gin.Context) { ingredientIDStr := c.Param("ingredient_id") ingredientID, err := uuid.Parse(ingredientIDStr) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: "Invalid ingredient ID format"}}), "OrderIngredientTransactionHandler") return } response, err := h.service.GetOrderIngredientTransactionsByIngredient(c, ingredientID) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(response), "OrderIngredientTransactionHandler") } func (h *OrderIngredientTransactionHandler) GetOrderIngredientTransactionSummary(c *gin.Context) { var req contract.ListOrderIngredientTransactionsRequest if err := c.ShouldBindQuery(&req); err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } response, err := h.service.GetOrderIngredientTransactionSummary(c, &req) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(response), "OrderIngredientTransactionHandler") } func (h *OrderIngredientTransactionHandler) BulkCreateOrderIngredientTransactions(c *gin.Context) { var req struct { Transactions []*contract.CreateOrderIngredientTransactionRequest `json:"transactions" validate:"required,min=1"` } if err := c.ShouldBindJSON(&req); err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } response, err := h.service.BulkCreateOrderIngredientTransactions(c, req.Transactions) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{{Cause: err.Error()}}), "OrderIngredientTransactionHandler") return } util.HandleResponse(c.Writer, c.Request, contract.BuildSuccessResponse(response), "OrderIngredientTransactionHandler") }