diff --git a/internal/contract/category_contract.go b/internal/contract/category_contract.go index ac8c1dc..5cc9c71 100644 --- a/internal/contract/category_contract.go +++ b/internal/contract/category_contract.go @@ -10,6 +10,7 @@ type CreateCategoryRequest struct { Name string `json:"name" validate:"required,min=1,max=255"` Description *string `json:"description,omitempty"` BusinessType *string `json:"business_type,omitempty"` + Order *int `json:"order,omitempty"` Metadata map[string]interface{} `json:"metadata,omitempty"` } @@ -17,6 +18,7 @@ type UpdateCategoryRequest struct { Name *string `json:"name,omitempty" validate:"omitempty,min=1,max=255"` Description *string `json:"description,omitempty"` BusinessType *string `json:"business_type,omitempty"` + Order *int `json:"order,omitempty"` Metadata map[string]interface{} `json:"metadata,omitempty"` } @@ -35,6 +37,7 @@ type CategoryResponse struct { Name string `json:"name"` Description *string `json:"description"` BusinessType string `json:"business_type"` + Order int `json:"order"` Metadata map[string]interface{} `json:"metadata"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` diff --git a/internal/entities/category.go b/internal/entities/category.go index 465d740..c5accc6 100644 --- a/internal/entities/category.go +++ b/internal/entities/category.go @@ -35,6 +35,7 @@ type Category struct { OrganizationID uuid.UUID `gorm:"type:uuid;not null;index" json:"organization_id" validate:"required"` Name string `gorm:"not null;size:255" json:"name" validate:"required,min=1,max=255"` Description *string `gorm:"type:text" json:"description"` + Order int `gorm:"default:0" json:"order"` BusinessType string `gorm:"size:50;default:'restaurant'" json:"business_type"` Metadata Metadata `gorm:"type:jsonb;default:'{}'" json:"metadata"` CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"` diff --git a/internal/handler/category_handler.go b/internal/handler/category_handler.go index 0504d44..ddfa8a3 100644 --- a/internal/handler/category_handler.go +++ b/internal/handler/category_handler.go @@ -1,6 +1,7 @@ package handler import ( + "fmt" "strconv" "apskel-pos-be/internal/appcontext" @@ -35,6 +36,7 @@ func (h *CategoryHandler) CreateCategory(c *gin.Context) { contextInfo := appcontext.FromGinContext(ctx) var req contract.CreateCategoryRequest + fmt.Printf("CategoryHandler::CreateCategory -> Request: %+v\n", req) if err := c.ShouldBindJSON(&req); err != nil { logger.FromContext(c.Request.Context()).WithError(err).Error("CategoryHandler::CreateCategory -> request binding failed") validationResponseError := contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, err.Error()) @@ -71,6 +73,7 @@ func (h *CategoryHandler) UpdateCategory(c *gin.Context) { } var req contract.UpdateCategoryRequest + fmt.Printf("CategoryHandler::UpdateCategory -> Request: %+v\n", req) if err := c.ShouldBindJSON(&req); err != nil { logger.FromContext(ctx).WithError(err).Error("CategoryHandler::UpdateCategory -> request binding failed") validationResponseError := contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, "Invalid request body") diff --git a/internal/mappers/category_mapper.go b/internal/mappers/category_mapper.go index 931e51b..40e8187 100644 --- a/internal/mappers/category_mapper.go +++ b/internal/mappers/category_mapper.go @@ -16,7 +16,7 @@ func CategoryEntityToModel(entity *entities.Category) *models.Category { Name: entity.Name, Description: entity.Description, ImageURL: nil, // Entity doesn't have ImageURL, model does - SortOrder: 0, // Entity doesn't have SortOrder, model does + Order: entity.Order, // Entity doesn't have SortOrder, model does IsActive: true, // Entity doesn't have IsActive, default to true CreatedAt: entity.CreatedAt, UpdatedAt: entity.UpdatedAt, @@ -32,7 +32,7 @@ func CategoryModelToEntity(model *models.Category) *entities.Category { if model.ImageURL != nil { metadata["image_url"] = *model.ImageURL } - metadata["sort_order"] = model.SortOrder + // metadata["sort_order"] = model.SortOrder return &entities.Category{ ID: model.ID, @@ -40,6 +40,7 @@ func CategoryModelToEntity(model *models.Category) *entities.Category { Name: model.Name, Description: model.Description, BusinessType: "restaurant", // Default business type + Order: model.Order, Metadata: metadata, CreatedAt: model.CreatedAt, UpdatedAt: model.UpdatedAt, @@ -55,12 +56,13 @@ func CreateCategoryRequestToEntity(req *models.CreateCategoryRequest) *entities. if req.ImageURL != nil { metadata["image_url"] = *req.ImageURL } - metadata["sort_order"] = req.SortOrder + // metadata["sort_order"] = req.SortOrder return &entities.Category{ OrganizationID: req.OrganizationID, Name: req.Name, Description: req.Description, + Order: req.Order, BusinessType: "restaurant", // Default business type Metadata: metadata, } @@ -73,7 +75,6 @@ func CategoryEntityToResponse(entity *entities.Category) *models.CategoryRespons // Extract image URL and sort order from metadata var imageURL *string - var sortOrder int if entity.Metadata != nil { if imgURL, exists := entity.Metadata["image_url"]; exists { @@ -81,13 +82,6 @@ func CategoryEntityToResponse(entity *entities.Category) *models.CategoryRespons imageURL = &imgURLStr } } - if sort, exists := entity.Metadata["sort_order"]; exists { - if sortInt, ok := sort.(int); ok { - sortOrder = sortInt - } else if sortFloat, ok := sort.(float64); ok { - sortOrder = int(sortFloat) - } - } } return &models.CategoryResponse{ @@ -96,7 +90,7 @@ func CategoryEntityToResponse(entity *entities.Category) *models.CategoryRespons Name: entity.Name, Description: entity.Description, ImageURL: imageURL, - SortOrder: sortOrder, + Order: entity.Order, IsActive: true, // Default to true since entity doesn't have this field CreatedAt: entity.CreatedAt, UpdatedAt: entity.UpdatedAt, @@ -124,8 +118,8 @@ func UpdateCategoryEntityFromRequest(entity *entities.Category, req *models.Upda entity.Metadata["image_url"] = *req.ImageURL } - if req.SortOrder != nil { - entity.Metadata["sort_order"] = *req.SortOrder + if req.Order != nil { + entity.Order = *req.Order } } diff --git a/internal/models/category.go b/internal/models/category.go index 2ff54dc..eff397a 100644 --- a/internal/models/category.go +++ b/internal/models/category.go @@ -12,7 +12,7 @@ type Category struct { Name string Description *string ImageURL *string - SortOrder int + Order int IsActive bool CreatedAt time.Time UpdatedAt time.Time @@ -23,14 +23,14 @@ type CreateCategoryRequest struct { Name string `validate:"required,min=1,max=255"` Description *string `validate:"omitempty,max=1000"` ImageURL *string `validate:"omitempty,url"` - SortOrder int `validate:"min=0"` + Order int `validate:"min=0"` } type UpdateCategoryRequest struct { Name *string `validate:"omitempty,min=1,max=255"` Description *string `validate:"omitempty,max=1000"` ImageURL *string `validate:"omitempty,url"` - SortOrder *int `validate:"omitempty,min=0"` + Order *int `validate:"omitempty,min=0"` IsActive *bool } @@ -40,7 +40,7 @@ type CategoryResponse struct { Name string Description *string ImageURL *string - SortOrder int + Order int IsActive bool CreatedAt time.Time UpdatedAt time.Time diff --git a/internal/repository/category_repository.go b/internal/repository/category_repository.go index 2afac4b..a592a49 100644 --- a/internal/repository/category_repository.go +++ b/internal/repository/category_repository.go @@ -81,7 +81,7 @@ func (r *CategoryRepositoryImpl) List(ctx context.Context, filters map[string]in return nil, 0, err } - err := query.Limit(limit).Offset(offset).Find(&categories).Error + err := query.Order("\"order\" ASC").Limit(limit).Offset(offset).Find(&categories).Error return categories, total, err } diff --git a/internal/transformer/category_transformer.go b/internal/transformer/category_transformer.go index d16c7b1..962eee6 100644 --- a/internal/transformer/category_transformer.go +++ b/internal/transformer/category_transformer.go @@ -12,7 +12,7 @@ func CreateCategoryRequestToModel(apctx *appcontext.ContextInfo, req *contract.C Name: req.Name, Description: req.Description, ImageURL: nil, - SortOrder: 0, + Order: *req.Order, } } @@ -21,7 +21,7 @@ func UpdateCategoryRequestToModel(req *contract.UpdateCategoryRequest) *models.U Name: req.Name, Description: req.Description, ImageURL: nil, - SortOrder: nil, + Order: req.Order, IsActive: nil, } } @@ -37,6 +37,7 @@ func CategoryModelResponseToResponse(cat *models.CategoryResponse) *contract.Cat Name: cat.Name, Description: cat.Description, BusinessType: "restaurant", // Default business type + Order: cat.Order, Metadata: map[string]interface{}{}, CreatedAt: cat.CreatedAt, UpdatedAt: cat.UpdatedAt, diff --git a/migrations/000061_add_order_to_categories.down.sql b/migrations/000061_add_order_to_categories.down.sql new file mode 100644 index 0000000..71e7836 --- /dev/null +++ b/migrations/000061_add_order_to_categories.down.sql @@ -0,0 +1,2 @@ +ALTER TABLE categories +DROP COLUMN "order"; diff --git a/migrations/000061_add_order_to_categories.up.sql b/migrations/000061_add_order_to_categories.up.sql new file mode 100644 index 0000000..e3d0324 --- /dev/null +++ b/migrations/000061_add_order_to_categories.up.sql @@ -0,0 +1,3 @@ + +ALTER TABLE categories +ADD COLUMN "order" INT DEFAULT 0;