Files
apskel-pos-backend/internal/mappers/campaign_mapper.go
T
efrilmandClaude Opus 5.5 c988a79d3b refactor(loyalty): remove what is left of tokens
Tokens are EnakCoin and no app uses the token names any more, so their
compatibility layer goes:

- GET /customer/tokens and its handler, service, processor and response
  types.
- total_tokens and tokens_history on GET /customer/wallet; last_updated
  now comes from the most recent row of either currency.
- token_used and tokens_remaining on game and spin responses, and
  sort_by=token_used on the game play list.
- TOKENS as a campaign type and reward type, with the mapping to COINS:
  migration 000092 already renamed the stored values.

The customer_tokens table and its entity stay, as cmd/wallet-migrate still
reads them, and LEGACY_TOKENS stays as the reference of the MIGRATION rows
it wrote. The docs list the removed names and their replacements.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 16:55:27 +07:00

178 lines
4.8 KiB
Go

package mappers
import (
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/entities"
"apskel-pos-be/internal/models"
"github.com/google/uuid"
)
func ToCampaignResponse(entity *entities.Campaign) *models.CampaignResponse {
if entity == nil {
return nil
}
var rules []models.CampaignRuleResponse
if entity.Rules != nil {
for _, rule := range entity.Rules {
rules = append(rules, *ToCampaignRuleResponse(&rule))
}
}
return &models.CampaignResponse{
ID: entity.ID,
Name: entity.Name,
Description: entity.Description,
Type: string(entity.Type),
StartDate: entity.StartDate,
EndDate: entity.EndDate,
IsActive: entity.IsActive,
ShowOnApp: entity.ShowOnApp,
Position: entity.Position,
Metadata: entity.Metadata,
Rules: rules,
CreatedAt: entity.CreatedAt,
UpdatedAt: entity.UpdatedAt,
}
}
func ToCampaignRuleResponse(entity *entities.CampaignRule) *models.CampaignRuleResponse {
if entity == nil {
return nil
}
var rewardSubtype *string
if entity.RewardSubtype != nil {
subtype := string(*entity.RewardSubtype)
rewardSubtype = &subtype
}
return &models.CampaignRuleResponse{
ID: entity.ID,
CampaignID: entity.CampaignID,
RuleType: string(entity.RuleType),
ConditionValue: entity.ConditionValue,
RewardType: string(entity.RewardType),
RewardValue: entity.RewardValue,
RewardSubtype: rewardSubtype,
RewardRefID: entity.RewardRefID,
Metadata: entity.Metadata,
CreatedAt: entity.CreatedAt,
UpdatedAt: entity.UpdatedAt,
}
}
func ToCampaignEntity(request *contract.CreateCampaignRequest) *entities.Campaign {
if request == nil {
return nil
}
return &entities.Campaign{
Name: request.Name,
Description: request.Description,
Type: entities.CampaignType(request.Type),
StartDate: request.StartDate,
EndDate: request.EndDate,
IsActive: request.IsActive,
ShowOnApp: request.ShowOnApp,
Position: request.Position,
Metadata: request.Metadata,
Rules: nil, // Rules will be managed separately
}
}
func ToCampaignEntityFromUpdate(request *contract.UpdateCampaignRequest) *entities.Campaign {
if request == nil {
return nil
}
return &entities.Campaign{
ID: request.ID,
Name: request.Name,
Description: request.Description,
Type: entities.CampaignType(request.Type),
StartDate: request.StartDate,
EndDate: request.EndDate,
IsActive: request.IsActive,
ShowOnApp: request.ShowOnApp,
Position: request.Position,
Metadata: request.Metadata,
Rules: nil, // Rules will be managed separately
}
}
func ToCampaignRuleEntity(request *contract.CampaignRuleStruct, campaignID uuid.UUID) *entities.CampaignRule {
if request == nil {
return nil
}
var rewardSubtype *entities.RewardSubtype
if request.RewardSubtype != nil {
subtype := entities.RewardSubtype(*request.RewardSubtype)
rewardSubtype = &subtype
}
return &entities.CampaignRule{
ID: uuid.Nil, // Let GORM's BeforeCreate hook generate the UUID
CampaignID: campaignID,
RuleType: entities.RuleType(request.RuleType),
ConditionValue: request.ConditionValue,
RewardType: entities.CampaignRewardType(request.RewardType),
RewardValue: request.RewardValue,
RewardSubtype: rewardSubtype,
RewardRefID: request.RewardRefID,
Metadata: request.Metadata,
}
}
func ToCampaignRuleEntityFromUpdate(request *contract.CampaignRuleStruct, campaignID uuid.UUID) *entities.CampaignRule {
if request == nil {
return nil
}
var rewardSubtype *entities.RewardSubtype
if request.RewardSubtype != nil {
subtype := entities.RewardSubtype(*request.RewardSubtype)
rewardSubtype = &subtype
}
return &entities.CampaignRule{
ID: uuid.Nil, // Let GORM's BeforeCreate hook generate the UUID
CampaignID: campaignID,
RuleType: entities.RuleType(request.RuleType),
ConditionValue: request.ConditionValue,
RewardType: entities.CampaignRewardType(request.RewardType),
RewardValue: request.RewardValue,
RewardSubtype: rewardSubtype,
RewardRefID: request.RewardRefID,
Metadata: request.Metadata,
}
}
func ToCampaignResponseSlice(entities []entities.Campaign) []models.CampaignResponse {
if entities == nil {
return nil
}
responses := make([]models.CampaignResponse, len(entities))
for i, entity := range entities {
responses[i] = *ToCampaignResponse(&entity)
}
return responses
}
func ToCampaignRuleResponseSlice(entities []entities.CampaignRule) []models.CampaignRuleResponse {
if entities == nil {
return nil
}
responses := make([]models.CampaignRuleResponse, len(entities))
for i, entity := range entities {
responses[i] = *ToCampaignRuleResponse(&entity)
}
return responses
}