package middleware import ( "apskel-pos-be/internal/constants" "apskel-pos-be/internal/contract" "apskel-pos-be/internal/repository" "apskel-pos-be/internal/util" "github.com/gin-gonic/gin" ) type SelfOrderMiddleware struct { tableRepo repository.TableRepositoryInterface } func NewSelfOrderMiddleware(tableRepo repository.TableRepositoryInterface) *SelfOrderMiddleware { return &SelfOrderMiddleware{ tableRepo: tableRepo, } } func (m *SelfOrderMiddleware) ResolveToken() gin.HandlerFunc { return func(c *gin.Context) { token := c.Query("token") if token == "" { token = c.GetHeader("X-Table-Token") } if token == "" { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{ contract.NewResponseError(constants.ValidationErrorCode, constants.SelfOrderEntity, "token is required"), }), "SelfOrderMiddleware::ResolveToken") c.Abort() return } table, err := m.tableRepo.GetByToken(c.Request.Context(), token) if err != nil { util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{ contract.NewResponseError(constants.NotFoundErrorCode, constants.SelfOrderEntity, "invalid or expired table token"), }), "SelfOrderMiddleware::ResolveToken") c.Abort() return } c.Set("self_order_table_id", table.ID.String()) c.Set("self_order_table_name", table.TableName) c.Set("self_order_outlet_id", table.OutletID.String()) c.Set("self_order_organization_id", table.OrganizationID.String()) c.Next() } }