diff --git a/internal/contract/analytics_contract.go b/internal/contract/analytics_contract.go index 8e32a64..cc553a0 100644 --- a/internal/contract/analytics_contract.go +++ b/internal/contract/analytics_contract.go @@ -7,11 +7,11 @@ import ( ) type PaymentMethodAnalyticsRequest struct { - OrganizationID uuid.UUID `form:"organization_id"` - OutletID *uuid.UUID `form:"outlet_id,omitempty"` - DateFrom string `form:"date_from" validate:"required"` - DateTo string `form:"date_to" validate:"required"` - GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"` + OrganizationID uuid.UUID `form:"organization_id"` + OutletID *string `form:"outlet_id,omitempty"` + DateFrom string `form:"date_from" validate:"required"` + DateTo string `form:"date_to" validate:"required"` + GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"` } // PaymentMethodAnalyticsResponse represents the response for payment method analytics @@ -45,10 +45,10 @@ type PaymentMethodAnalyticsData struct { type SalesAnalyticsRequest struct { OrganizationID uuid.UUID - OutletID *uuid.UUID `form:"outlet_id,omitempty"` - DateFrom string `form:"date_from" validate:"required"` - DateTo string `form:"date_to" validate:"required"` - GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"` + OutletID *string `form:"outlet_id,omitempty"` + DateFrom string `form:"date_from" validate:"required"` + DateTo string `form:"date_to" validate:"required"` + GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"` } type SalesAnalyticsResponse struct { @@ -86,10 +86,10 @@ type SalesAnalyticsData struct { // ProductAnalyticsRequest represents the request for product analytics type ProductAnalyticsRequest struct { OrganizationID uuid.UUID - OutletID *uuid.UUID `form:"outlet_id,omitempty"` - DateFrom string `form:"date_from" validate:"required"` - DateTo string `form:"date_to" validate:"required"` - Limit int `form:"limit,default=1000" validate:"min=1,max=1000"` + OutletID *string `form:"outlet_id,omitempty"` + DateFrom string `form:"date_from" validate:"required"` + DateTo string `form:"date_to" validate:"required"` + Limit int `form:"limit,default=1000" validate:"min=1,max=1000"` } // ProductAnalyticsResponse represents the response for product analytics @@ -123,9 +123,9 @@ type ProductAnalyticsData struct { // ProductAnalyticsPerCategoryRequest represents the request for product analytics per category type ProductAnalyticsPerCategoryRequest struct { OrganizationID uuid.UUID - OutletID *uuid.UUID `form:"outlet_id,omitempty"` - DateFrom string `form:"date_from" validate:"required"` - DateTo string `form:"date_to" validate:"required"` + OutletID *string `form:"outlet_id,omitempty"` + DateFrom string `form:"date_from" validate:"required"` + DateTo string `form:"date_to" validate:"required"` } // ProductAnalyticsPerCategoryResponse represents the response for product analytics per category @@ -152,9 +152,9 @@ type ProductAnalyticsPerCategoryData struct { // DashboardAnalyticsRequest represents the request for dashboard analytics type DashboardAnalyticsRequest struct { OrganizationID uuid.UUID - OutletID *uuid.UUID `form:"outlet_id,omitempty"` - DateFrom string `form:"date_from" validate:"required"` - DateTo string `form:"date_to" validate:"required"` + OutletID *string `form:"outlet_id,omitempty"` + DateFrom string `form:"date_from" validate:"required"` + DateTo string `form:"date_to" validate:"required"` } // DashboardAnalyticsResponse represents the response for dashboard analytics @@ -182,10 +182,10 @@ type DashboardOverview struct { // ProfitLossAnalyticsRequest represents the request for profit and loss analytics type ProfitLossAnalyticsRequest struct { OrganizationID uuid.UUID - OutletID *uuid.UUID `form:"outlet_id,omitempty"` - DateFrom string `form:"date_from" validate:"required"` - DateTo string `form:"date_to" validate:"required"` - GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"` + OutletID *string `form:"outlet_id,omitempty"` + DateFrom string `form:"date_from" validate:"required"` + DateTo string `form:"date_to" validate:"required"` + GroupBy string `form:"group_by,default=day" validate:"omitempty,oneof=day hour week month"` } // ProfitLossAnalyticsResponse represents the response for profit and loss analytics diff --git a/internal/handler/analytics_handler.go b/internal/handler/analytics_handler.go index debe736..d40ae33 100644 --- a/internal/handler/analytics_handler.go +++ b/internal/handler/analytics_handler.go @@ -26,14 +26,13 @@ func NewAnalyticsHandler( } } -func (h *AnalyticsHandler) resolveOutletID(c *gin.Context, contextOutletID uuid.UUID) *uuid.UUID { +func (h *AnalyticsHandler) resolveOutletID(c *gin.Context, contextOutletID uuid.UUID) *string { if outletIDStr := c.Query("outlet_id"); outletIDStr != "" { - if parsedID, err := uuid.Parse(outletIDStr); err == nil { - return &parsedID - } + return &outletIDStr } if contextOutletID != uuid.Nil { - return &contextOutletID + s := contextOutletID.String() + return &s } return nil } diff --git a/internal/transformer/analytics_transformer.go b/internal/transformer/analytics_transformer.go index e776d1b..018dfdf 100644 --- a/internal/transformer/analytics_transformer.go +++ b/internal/transformer/analytics_transformer.go @@ -6,8 +6,22 @@ import ( "apskel-pos-be/internal/util" "fmt" "time" + + "github.com/google/uuid" ) +// parseOutletID converts a *string outlet ID to *uuid.UUID, returning nil for invalid/empty values. +func parseOutletID(s *string) *uuid.UUID { + if s == nil { + return nil + } + id, err := uuid.Parse(*s) + if err != nil { + return nil + } + return &id +} + // PaymentMethodAnalyticsContractToModel converts contract request to model func PaymentMethodAnalyticsContractToModel(req *contract.PaymentMethodAnalyticsRequest) *models.PaymentMethodAnalyticsRequest { var dateFrom, dateTo time.Time @@ -23,7 +37,7 @@ func PaymentMethodAnalyticsContractToModel(req *contract.PaymentMethodAnalyticsR return &models.PaymentMethodAnalyticsRequest{ OrganizationID: req.OrganizationID, - OutletID: req.OutletID, + OutletID: parseOutletID(req.OutletID), DateFrom: dateFrom, DateTo: dateTo, GroupBy: req.GroupBy, @@ -79,7 +93,7 @@ func SalesAnalyticsContractToModel(req *contract.SalesAnalyticsRequest) *models. return &models.SalesAnalyticsRequest{ OrganizationID: req.OrganizationID, - OutletID: req.OutletID, + OutletID: parseOutletID(req.OutletID), DateFrom: dateFrom, DateTo: dateTo, GroupBy: req.GroupBy, @@ -139,7 +153,7 @@ func ProductAnalyticsContractToModel(req *contract.ProductAnalyticsRequest) *mod return &models.ProductAnalyticsRequest{ OrganizationID: req.OrganizationID, - OutletID: req.OutletID, + OutletID: parseOutletID(req.OutletID), DateFrom: dateFrom, DateTo: dateTo, Limit: req.Limit, @@ -199,7 +213,7 @@ func ProductAnalyticsPerCategoryContractToModel(req *contract.ProductAnalyticsPe return &models.ProductAnalyticsPerCategoryRequest{ OrganizationID: req.OrganizationID, - OutletID: req.OutletID, + OutletID: parseOutletID(req.OutletID), DateFrom: dateFrom, DateTo: dateTo, } @@ -251,7 +265,7 @@ func DashboardAnalyticsContractToModel(req *contract.DashboardAnalyticsRequest) return &models.DashboardAnalyticsRequest{ OrganizationID: req.OrganizationID, - OutletID: req.OutletID, + OutletID: parseOutletID(req.OutletID), DateFrom: dateFrom, DateTo: dateTo, } @@ -346,7 +360,7 @@ func ProfitLossAnalyticsContractToModel(req *contract.ProfitLossAnalyticsRequest return &models.ProfitLossAnalyticsRequest{ OrganizationID: req.OrganizationID, - OutletID: req.OutletID, + OutletID: parseOutletID(req.OutletID), DateFrom: *dateFrom, DateTo: *dateTo, GroupBy: req.GroupBy,