Add Tiers and Game Prize
This commit is contained in:
@@ -0,0 +1,163 @@
|
||||
package processor
|
||||
|
||||
import (
|
||||
"apskel-pos-be/internal/entities"
|
||||
"apskel-pos-be/internal/mappers"
|
||||
"apskel-pos-be/internal/models"
|
||||
"apskel-pos-be/internal/repository"
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type OmsetTrackerProcessor struct {
|
||||
omsetTrackerRepo *repository.OmsetTrackerRepository
|
||||
}
|
||||
|
||||
func NewOmsetTrackerProcessor(omsetTrackerRepo *repository.OmsetTrackerRepository) *OmsetTrackerProcessor {
|
||||
return &OmsetTrackerProcessor{
|
||||
omsetTrackerRepo: omsetTrackerRepo,
|
||||
}
|
||||
}
|
||||
|
||||
// CreateOmsetTracker creates a new omset tracker record
|
||||
func (p *OmsetTrackerProcessor) CreateOmsetTracker(ctx context.Context, req *models.CreateOmsetTrackerRequest) (*models.OmsetTrackerResponse, error) {
|
||||
// Convert request to entity
|
||||
omsetTracker := mappers.ToOmsetTrackerEntity(req)
|
||||
|
||||
// Create omset tracker
|
||||
err := p.omsetTrackerRepo.Create(ctx, omsetTracker)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create omset tracker: %w", err)
|
||||
}
|
||||
|
||||
return mappers.ToOmsetTrackerResponse(omsetTracker), nil
|
||||
}
|
||||
|
||||
// GetOmsetTracker retrieves an omset tracker by ID
|
||||
func (p *OmsetTrackerProcessor) GetOmsetTracker(ctx context.Context, id uuid.UUID) (*models.OmsetTrackerResponse, error) {
|
||||
omsetTracker, err := p.omsetTrackerRepo.GetByID(ctx, id)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("omset tracker not found: %w", err)
|
||||
}
|
||||
|
||||
return mappers.ToOmsetTrackerResponse(omsetTracker), nil
|
||||
}
|
||||
|
||||
// ListOmsetTrackers retrieves omset trackers with pagination and filtering
|
||||
func (p *OmsetTrackerProcessor) ListOmsetTrackers(ctx context.Context, query *models.ListOmsetTrackerQuery) (*models.PaginatedResponse[models.OmsetTrackerResponse], error) {
|
||||
// Set default values
|
||||
if query.Page <= 0 {
|
||||
query.Page = 1
|
||||
}
|
||||
if query.Limit <= 0 {
|
||||
query.Limit = 10
|
||||
}
|
||||
if query.Limit > 100 {
|
||||
query.Limit = 100
|
||||
}
|
||||
|
||||
offset := (query.Page - 1) * query.Limit
|
||||
|
||||
// Get omset trackers from repository
|
||||
omsetTrackers, total, err := p.omsetTrackerRepo.List(
|
||||
ctx,
|
||||
offset,
|
||||
query.Limit,
|
||||
query.Search,
|
||||
query.PeriodType,
|
||||
query.GameID,
|
||||
query.From,
|
||||
query.To,
|
||||
query.SortBy,
|
||||
query.SortOrder,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to list omset trackers: %w", err)
|
||||
}
|
||||
|
||||
// Convert to responses
|
||||
responses := mappers.ToOmsetTrackerResponses(omsetTrackers)
|
||||
|
||||
// Calculate pagination info
|
||||
totalPages := int((total + int64(query.Limit) - 1) / int64(query.Limit))
|
||||
|
||||
return &models.PaginatedResponse[models.OmsetTrackerResponse]{
|
||||
Data: responses,
|
||||
Pagination: models.Pagination{
|
||||
Page: query.Page,
|
||||
Limit: query.Limit,
|
||||
Total: total,
|
||||
TotalPages: totalPages,
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
// UpdateOmsetTracker updates an existing omset tracker
|
||||
func (p *OmsetTrackerProcessor) UpdateOmsetTracker(ctx context.Context, id uuid.UUID, req *models.UpdateOmsetTrackerRequest) (*models.OmsetTrackerResponse, error) {
|
||||
// Get existing omset tracker
|
||||
omsetTracker, err := p.omsetTrackerRepo.GetByID(ctx, id)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("omset tracker not found: %w", err)
|
||||
}
|
||||
|
||||
// Update omset tracker fields
|
||||
mappers.UpdateOmsetTrackerEntity(omsetTracker, req)
|
||||
|
||||
// Save updated omset tracker
|
||||
err = p.omsetTrackerRepo.Update(ctx, omsetTracker)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to update omset tracker: %w", err)
|
||||
}
|
||||
|
||||
return mappers.ToOmsetTrackerResponse(omsetTracker), nil
|
||||
}
|
||||
|
||||
// DeleteOmsetTracker deletes an omset tracker
|
||||
func (p *OmsetTrackerProcessor) DeleteOmsetTracker(ctx context.Context, id uuid.UUID) error {
|
||||
// Get existing omset tracker
|
||||
_, err := p.omsetTrackerRepo.GetByID(ctx, id)
|
||||
if err != nil {
|
||||
return fmt.Errorf("omset tracker not found: %w", err)
|
||||
}
|
||||
|
||||
// Delete omset tracker
|
||||
err = p.omsetTrackerRepo.Delete(ctx, id)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to delete omset tracker: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddOmset adds omset to a specific period
|
||||
func (p *OmsetTrackerProcessor) AddOmset(ctx context.Context, periodType string, periodStart, periodEnd time.Time, amount int64, gameID *uuid.UUID) (*models.OmsetTrackerResponse, error) {
|
||||
if amount <= 0 {
|
||||
return nil, fmt.Errorf("amount must be greater than 0")
|
||||
}
|
||||
|
||||
// Convert string to PeriodType
|
||||
periodTypeEnum := entities.PeriodType(periodType)
|
||||
|
||||
// Get or create period tracker
|
||||
omsetTracker, err := p.omsetTrackerRepo.GetOrCreatePeriod(ctx, periodTypeEnum, periodStart, periodEnd, gameID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get or create period tracker: %w", err)
|
||||
}
|
||||
|
||||
// Add omset
|
||||
err = p.omsetTrackerRepo.AddOmset(ctx, periodTypeEnum, periodStart, periodEnd, amount, gameID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to add omset: %w", err)
|
||||
}
|
||||
|
||||
// Get updated tracker
|
||||
updatedTracker, err := p.omsetTrackerRepo.GetByID(ctx, omsetTracker.ID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get updated tracker: %w", err)
|
||||
}
|
||||
|
||||
return mappers.ToOmsetTrackerResponse(updatedTracker), nil
|
||||
}
|
||||
Reference in New Issue
Block a user