73 lines
2.8 KiB
Go
73 lines
2.8 KiB
Go
package handler
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"io"
|
||
|
|
|
||
|
|
"github.com/gin-gonic/gin"
|
||
|
|
"github.com/google/uuid"
|
||
|
|
|
||
|
|
"apskel-pos-be/internal/appcontext"
|
||
|
|
"apskel-pos-be/internal/constants"
|
||
|
|
"apskel-pos-be/internal/contract"
|
||
|
|
"apskel-pos-be/internal/logger"
|
||
|
|
"apskel-pos-be/internal/service"
|
||
|
|
"apskel-pos-be/internal/util"
|
||
|
|
)
|
||
|
|
|
||
|
|
// loyaltySettingsBodyLimit caps a settings body; a real one is well under 2 KB.
|
||
|
|
const loyaltySettingsBodyLimit = 64 << 10
|
||
|
|
|
||
|
|
// LoyaltySettingsHandler serves the loyalty settings (docs/prd-point-coin.md F1, F2).
|
||
|
|
type LoyaltySettingsHandler struct {
|
||
|
|
loyaltySettingsService service.LoyaltySettingsService
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewLoyaltySettingsHandler(loyaltySettingsService service.LoyaltySettingsService) *LoyaltySettingsHandler {
|
||
|
|
return &LoyaltySettingsHandler{loyaltySettingsService: loyaltySettingsService}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *LoyaltySettingsHandler) GetOutletSettings(c *gin.Context) {
|
||
|
|
ctx := c.Request.Context()
|
||
|
|
outletID, ok := parseUUIDParam(c, "outlet_id", "LoyaltySettingsHandler::GetOutletSettings")
|
||
|
|
if !ok {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
response := h.loyaltySettingsService.GetOutletSettings(ctx, appcontext.FromGinContext(ctx), outletID)
|
||
|
|
if response.HasErrors() {
|
||
|
|
logger.FromContext(ctx).WithError(response.GetErrors()[0]).Error("LoyaltySettingsHandler::GetOutletSettings -> service call failed")
|
||
|
|
}
|
||
|
|
util.HandleResponse(c.Writer, c.Request, response, "LoyaltySettingsHandler::GetOutletSettings")
|
||
|
|
}
|
||
|
|
|
||
|
|
func (h *LoyaltySettingsHandler) UpdateOutletSettings(c *gin.Context) {
|
||
|
|
ctx := c.Request.Context()
|
||
|
|
outletID, ok := parseUUIDParam(c, "outlet_id", "LoyaltySettingsHandler::UpdateOutletSettings")
|
||
|
|
if !ok {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
body, err := io.ReadAll(io.LimitReader(c.Request.Body, loyaltySettingsBodyLimit))
|
||
|
|
if err != nil {
|
||
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{
|
||
|
|
contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "unable to read request body"),
|
||
|
|
}), "LoyaltySettingsHandler::UpdateOutletSettings")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
response := h.loyaltySettingsService.UpdateOutletSettings(ctx, appcontext.FromGinContext(ctx), outletID, body)
|
||
|
|
if response.HasErrors() {
|
||
|
|
logger.FromContext(ctx).WithError(response.GetErrors()[0]).Error("LoyaltySettingsHandler::UpdateOutletSettings -> service call failed")
|
||
|
|
}
|
||
|
|
util.HandleResponse(c.Writer, c.Request, response, "LoyaltySettingsHandler::UpdateOutletSettings")
|
||
|
|
}
|
||
|
|
|
||
|
|
// parseUUIDParam reads a UUID path parameter, answering 400 itself when it is not one.
|
||
|
|
func parseUUIDParam(c *gin.Context, name, method string) (uuid.UUID, bool) {
|
||
|
|
id, err := uuid.Parse(c.Param(name))
|
||
|
|
if err != nil {
|
||
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{
|
||
|
|
contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid "+name),
|
||
|
|
}), method)
|
||
|
|
return uuid.Nil, false
|
||
|
|
}
|
||
|
|
return id, true
|
||
|
|
}
|