316 lines
7.6 KiB
Go
316 lines
7.6 KiB
Go
package mappers
|
|
|
|
import (
|
|
"apskel-pos-be/internal/constants"
|
|
"apskel-pos-be/internal/entities"
|
|
"apskel-pos-be/internal/models"
|
|
)
|
|
|
|
func ProductEntityToModel(entity *entities.Product) *models.Product {
|
|
if entity == nil {
|
|
return nil
|
|
}
|
|
|
|
return &models.Product{
|
|
ID: entity.ID,
|
|
OrganizationID: entity.OrganizationID,
|
|
CategoryID: entity.CategoryID,
|
|
SKU: entity.SKU,
|
|
Name: entity.Name,
|
|
Description: entity.Description,
|
|
Price: entity.Price,
|
|
Cost: entity.Cost,
|
|
BusinessType: constants.BusinessType(entity.BusinessType),
|
|
Metadata: map[string]interface{}(entity.Metadata),
|
|
IsActive: entity.IsActive,
|
|
CreatedAt: entity.CreatedAt,
|
|
UpdatedAt: entity.UpdatedAt,
|
|
}
|
|
}
|
|
|
|
func ProductModelToEntity(model *models.Product) *entities.Product {
|
|
if model == nil {
|
|
return nil
|
|
}
|
|
|
|
return &entities.Product{
|
|
ID: model.ID,
|
|
OrganizationID: model.OrganizationID,
|
|
CategoryID: model.CategoryID,
|
|
SKU: model.SKU,
|
|
Name: model.Name,
|
|
Description: model.Description,
|
|
Price: model.Price,
|
|
Cost: model.Cost,
|
|
BusinessType: string(model.BusinessType),
|
|
Metadata: entities.Metadata(model.Metadata),
|
|
IsActive: model.IsActive,
|
|
CreatedAt: model.CreatedAt,
|
|
UpdatedAt: model.UpdatedAt,
|
|
}
|
|
}
|
|
|
|
func CreateProductRequestToEntity(req *models.CreateProductRequest) *entities.Product {
|
|
if req == nil {
|
|
return nil
|
|
}
|
|
|
|
cost := float64(0)
|
|
if req.Cost > 0 {
|
|
cost = req.Cost
|
|
}
|
|
|
|
businessType := "restaurant"
|
|
if req.BusinessType != "" {
|
|
businessType = string(req.BusinessType)
|
|
}
|
|
|
|
metadata := entities.Metadata{}
|
|
if req.Metadata != nil {
|
|
metadata = entities.Metadata(req.Metadata)
|
|
}
|
|
|
|
return &entities.Product{
|
|
OrganizationID: req.OrganizationID,
|
|
CategoryID: req.CategoryID,
|
|
SKU: req.SKU,
|
|
Name: req.Name,
|
|
Description: req.Description,
|
|
Price: req.Price,
|
|
Cost: cost,
|
|
BusinessType: businessType,
|
|
Metadata: metadata,
|
|
IsActive: true, // Default to active
|
|
}
|
|
}
|
|
|
|
func ProductEntityToResponse(entity *entities.Product) *models.ProductResponse {
|
|
if entity == nil {
|
|
return nil
|
|
}
|
|
|
|
// Convert variants to response models
|
|
var variantResponses []models.ProductVariantResponse
|
|
if entity.ProductVariants != nil {
|
|
variantResponses = make([]models.ProductVariantResponse, len(entity.ProductVariants))
|
|
for i, variant := range entity.ProductVariants {
|
|
variantResponses[i] = models.ProductVariantResponse{
|
|
ID: variant.ID,
|
|
ProductID: variant.ProductID,
|
|
Name: variant.Name,
|
|
PriceModifier: variant.PriceModifier,
|
|
Cost: variant.Cost,
|
|
Metadata: map[string]interface{}(variant.Metadata),
|
|
CreatedAt: variant.CreatedAt,
|
|
UpdatedAt: variant.UpdatedAt,
|
|
}
|
|
}
|
|
}
|
|
|
|
return &models.ProductResponse{
|
|
ID: entity.ID,
|
|
OrganizationID: entity.OrganizationID,
|
|
CategoryID: entity.CategoryID,
|
|
SKU: entity.SKU,
|
|
Name: entity.Name,
|
|
Description: entity.Description,
|
|
Price: entity.Price,
|
|
Cost: entity.Cost,
|
|
BusinessType: constants.BusinessType(entity.BusinessType),
|
|
Metadata: map[string]interface{}(entity.Metadata),
|
|
IsActive: entity.IsActive,
|
|
CreatedAt: entity.CreatedAt,
|
|
UpdatedAt: entity.UpdatedAt,
|
|
Variants: variantResponses,
|
|
}
|
|
}
|
|
|
|
func UpdateProductEntityFromRequest(entity *entities.Product, req *models.UpdateProductRequest) {
|
|
if entity == nil || req == nil {
|
|
return
|
|
}
|
|
|
|
if req.CategoryID != nil {
|
|
entity.CategoryID = *req.CategoryID
|
|
}
|
|
|
|
if req.SKU != nil {
|
|
entity.SKU = req.SKU
|
|
}
|
|
|
|
if req.Name != nil {
|
|
entity.Name = *req.Name
|
|
}
|
|
|
|
if req.Description != nil {
|
|
entity.Description = req.Description
|
|
}
|
|
|
|
if req.Price != nil {
|
|
entity.Price = *req.Price
|
|
}
|
|
|
|
if req.Cost != nil {
|
|
entity.Cost = *req.Cost
|
|
}
|
|
|
|
if req.Metadata != nil {
|
|
if entity.Metadata == nil {
|
|
entity.Metadata = make(entities.Metadata)
|
|
}
|
|
for k, v := range req.Metadata {
|
|
entity.Metadata[k] = v
|
|
}
|
|
}
|
|
|
|
if req.IsActive != nil {
|
|
entity.IsActive = *req.IsActive
|
|
}
|
|
}
|
|
|
|
func ProductEntitiesToModels(entities []*entities.Product) []*models.Product {
|
|
if entities == nil {
|
|
return nil
|
|
}
|
|
|
|
models := make([]*models.Product, len(entities))
|
|
for i, entity := range entities {
|
|
models[i] = ProductEntityToModel(entity)
|
|
}
|
|
return models
|
|
}
|
|
|
|
func ProductEntitiesToResponses(entities []*entities.Product) []*models.ProductResponse {
|
|
if entities == nil {
|
|
return nil
|
|
}
|
|
|
|
responses := make([]*models.ProductResponse, len(entities))
|
|
for i, entity := range entities {
|
|
responses[i] = ProductEntityToResponse(entity)
|
|
}
|
|
return responses
|
|
}
|
|
|
|
// Product Variant Mappers
|
|
func ProductVariantEntityToModel(entity *entities.ProductVariant) *models.ProductVariant {
|
|
if entity == nil {
|
|
return nil
|
|
}
|
|
|
|
return &models.ProductVariant{
|
|
ID: entity.ID,
|
|
ProductID: entity.ProductID,
|
|
Name: entity.Name,
|
|
PriceModifier: entity.PriceModifier,
|
|
Cost: entity.Cost,
|
|
Metadata: map[string]interface{}(entity.Metadata),
|
|
CreatedAt: entity.CreatedAt,
|
|
UpdatedAt: entity.UpdatedAt,
|
|
}
|
|
}
|
|
|
|
func ProductVariantModelToEntity(model *models.ProductVariant) *entities.ProductVariant {
|
|
if model == nil {
|
|
return nil
|
|
}
|
|
|
|
return &entities.ProductVariant{
|
|
ID: model.ID,
|
|
ProductID: model.ProductID,
|
|
Name: model.Name,
|
|
PriceModifier: model.PriceModifier,
|
|
Cost: model.Cost,
|
|
Metadata: entities.Metadata(model.Metadata),
|
|
CreatedAt: model.CreatedAt,
|
|
UpdatedAt: model.UpdatedAt,
|
|
}
|
|
}
|
|
|
|
func CreateProductVariantRequestToEntity(req *models.CreateProductVariantRequest) *entities.ProductVariant {
|
|
if req == nil {
|
|
return nil
|
|
}
|
|
|
|
metadata := entities.Metadata{}
|
|
if req.Metadata != nil {
|
|
metadata = entities.Metadata(req.Metadata)
|
|
}
|
|
|
|
return &entities.ProductVariant{
|
|
ProductID: req.ProductID,
|
|
Name: req.Name,
|
|
PriceModifier: req.PriceModifier,
|
|
Cost: req.Cost,
|
|
Metadata: metadata,
|
|
}
|
|
}
|
|
|
|
func ProductVariantEntityToResponse(entity *entities.ProductVariant) *models.ProductVariantResponse {
|
|
if entity == nil {
|
|
return nil
|
|
}
|
|
|
|
return &models.ProductVariantResponse{
|
|
ID: entity.ID,
|
|
ProductID: entity.ProductID,
|
|
Name: entity.Name,
|
|
PriceModifier: entity.PriceModifier,
|
|
Cost: entity.Cost,
|
|
Metadata: map[string]interface{}(entity.Metadata),
|
|
CreatedAt: entity.CreatedAt,
|
|
UpdatedAt: entity.UpdatedAt,
|
|
}
|
|
}
|
|
|
|
func UpdateProductVariantEntityFromRequest(entity *entities.ProductVariant, req *models.UpdateProductVariantRequest) {
|
|
if entity == nil || req == nil {
|
|
return
|
|
}
|
|
|
|
if req.Name != nil {
|
|
entity.Name = *req.Name
|
|
}
|
|
|
|
if req.PriceModifier != nil {
|
|
entity.PriceModifier = *req.PriceModifier
|
|
}
|
|
|
|
if req.Cost != nil {
|
|
entity.Cost = *req.Cost
|
|
}
|
|
|
|
if req.Metadata != nil {
|
|
if entity.Metadata == nil {
|
|
entity.Metadata = make(entities.Metadata)
|
|
}
|
|
for k, v := range req.Metadata {
|
|
entity.Metadata[k] = v
|
|
}
|
|
}
|
|
}
|
|
|
|
func ProductVariantEntitiesToModels(entities []*entities.ProductVariant) []*models.ProductVariant {
|
|
if entities == nil {
|
|
return nil
|
|
}
|
|
|
|
models := make([]*models.ProductVariant, len(entities))
|
|
for i, entity := range entities {
|
|
models[i] = ProductVariantEntityToModel(entity)
|
|
}
|
|
return models
|
|
}
|
|
|
|
func ProductVariantEntitiesToResponses(entities []*entities.ProductVariant) []*models.ProductVariantResponse {
|
|
if entities == nil {
|
|
return nil
|
|
}
|
|
|
|
responses := make([]*models.ProductVariantResponse, len(entities))
|
|
for i, entity := range entities {
|
|
responses[i] = ProductVariantEntityToResponse(entity)
|
|
}
|
|
return responses
|
|
}
|