Files
apskel-pos-backend/internal/mappers/category_mapper.go
T

181 lines
4.1 KiB
Go
Raw Normal View History

2025-07-18 20:10:29 +07:00
package mappers
import (
"apskel-pos-be/internal/entities"
"apskel-pos-be/internal/models"
)
func CategoryEntityToModel(entity *entities.Category) *models.Category {
if entity == nil {
return nil
}
return &models.Category{
ID: entity.ID,
OrganizationID: entity.OrganizationID,
2026-05-21 21:27:57 +07:00
OutletID: entity.OutletID,
2025-07-18 20:10:29 +07:00
Name: entity.Name,
Description: entity.Description,
2026-05-21 21:27:57 +07:00
ImageURL: nil,
Order: entity.Order,
IsActive: true,
2025-07-18 20:10:29 +07:00
CreatedAt: entity.CreatedAt,
UpdatedAt: entity.UpdatedAt,
}
}
func CategoryModelToEntity(model *models.Category) *entities.Category {
if model == nil {
return nil
}
metadata := entities.Metadata{}
if model.ImageURL != nil {
metadata["image_url"] = *model.ImageURL
}
return &entities.Category{
ID: model.ID,
OrganizationID: model.OrganizationID,
2026-05-21 21:27:57 +07:00
OutletID: model.OutletID,
2025-07-18 20:10:29 +07:00
Name: model.Name,
Description: model.Description,
2026-05-21 21:27:57 +07:00
BusinessType: "restaurant",
2025-10-06 22:46:01 +07:00
Order: model.Order,
2025-07-18 20:10:29 +07:00
Metadata: metadata,
CreatedAt: model.CreatedAt,
UpdatedAt: model.UpdatedAt,
}
}
func CreateCategoryRequestToEntity(req *models.CreateCategoryRequest) *entities.Category {
if req == nil {
return nil
}
metadata := entities.Metadata{}
if req.ImageURL != nil {
metadata["image_url"] = *req.ImageURL
}
return &entities.Category{
2026-10-02 23:30:03 +07:00
OrganizationID: req.OrganizationID,
OutletID: req.OutletID,
ParentID: req.ParentID,
Name: req.Name,
Description: req.Description,
Order: req.Order,
OwnerFeePercent: req.OwnerFeePercent,
BusinessType: "restaurant",
Metadata: metadata,
2025-07-18 20:10:29 +07:00
}
}
func CategoryEntityToResponse(entity *entities.Category) *models.CategoryResponse {
if entity == nil {
return nil
}
// Extract image URL and sort order from metadata
var imageURL *string
if entity.Metadata != nil {
if imgURL, exists := entity.Metadata["image_url"]; exists {
if imgURLStr, ok := imgURL.(string); ok {
imageURL = &imgURLStr
}
}
}
2026-08-05 19:28:38 +07:00
// Parent name is only available when the Parent association is preloaded
var parentName *string
if entity.Parent != nil {
name := entity.Parent.Name
parentName = &name
}
2025-07-18 20:10:29 +07:00
return &models.CategoryResponse{
2026-10-02 23:30:03 +07:00
ID: entity.ID,
OrganizationID: entity.OrganizationID,
OutletID: entity.OutletID,
ParentID: entity.ParentID,
ParentName: parentName,
Name: entity.Name,
Description: entity.Description,
ImageURL: imageURL,
Order: entity.Order,
OwnerFeePercent: entity.OwnerFeePercent,
IsActive: true,
CreatedAt: entity.CreatedAt,
UpdatedAt: entity.UpdatedAt,
2025-07-18 20:10:29 +07:00
}
}
func UpdateCategoryEntityFromRequest(entity *entities.Category, req *models.UpdateCategoryRequest) {
if entity == nil || req == nil {
return
}
if req.Name != nil {
entity.Name = *req.Name
}
if req.Description != nil {
entity.Description = req.Description
}
if entity.Metadata == nil {
entity.Metadata = make(entities.Metadata)
}
if req.ImageURL != nil {
entity.Metadata["image_url"] = *req.ImageURL
}
2025-10-06 22:46:01 +07:00
if req.Order != nil {
entity.Order = *req.Order
2025-07-18 20:10:29 +07:00
}
2026-05-21 21:27:57 +07:00
2026-10-02 23:30:03 +07:00
if req.ClearOwnerFeePercent {
entity.OwnerFeePercent = nil
} else if req.OwnerFeePercent != nil {
entity.OwnerFeePercent = req.OwnerFeePercent
}
2026-05-21 21:27:57 +07:00
if req.OutletID != nil {
entity.OutletID = req.OutletID
}
2026-08-05 19:28:38 +07:00
2026-10-02 23:30:03 +07:00
if req.ClearParentID {
// Drop the preloaded parent too, so the response stops reporting it
entity.ParentID = nil
entity.Parent = nil
} else if req.ParentID != nil {
2026-08-05 19:28:38 +07:00
entity.ParentID = req.ParentID
}
2025-07-18 20:10:29 +07:00
}
func CategoryEntitiesToModels(entities []*entities.Category) []*models.Category {
if entities == nil {
return nil
}
models := make([]*models.Category, len(entities))
for i, entity := range entities {
models[i] = CategoryEntityToModel(entity)
}
return models
}
func CategoryEntitiesToResponses(entities []*entities.Category) []*models.CategoryResponse {
if entities == nil {
return nil
}
responses := make([]*models.CategoryResponse, len(entities))
for i, entity := range entities {
responses[i] = CategoryEntityToResponse(entity)
}
return responses
}