2025-08-03 23:55:51 +07:00

167 lines
4.3 KiB
Go

package processor
import (
"apskel-pos-be/internal/entities"
"apskel-pos-be/internal/mappers"
"apskel-pos-be/internal/models"
"context"
"time"
"github.com/google/uuid"
)
type UnitProcessorImpl struct {
unitRepo UnitRepository
}
func NewUnitProcessor(unitRepo UnitRepository) *UnitProcessorImpl {
return &UnitProcessorImpl{
unitRepo: unitRepo,
}
}
func (p *UnitProcessorImpl) CreateUnit(ctx context.Context, req *models.CreateUnitRequest) (*models.UnitResponse, error) {
unit := &entities.Unit{
ID: uuid.New(),
OrganizationID: req.OrganizationID,
OutletID: req.OutletID,
Name: req.Name,
Abbreviation: req.Abbreviation,
IsActive: req.IsActive,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
err := p.unitRepo.Create(ctx, unit)
if err != nil {
return nil, err
}
unitModel := mappers.MapUnitEntityToModel(unit)
response := &models.UnitResponse{
ID: unitModel.ID,
OrganizationID: unitModel.OrganizationID,
OutletID: unitModel.OutletID,
Name: unitModel.Name,
Abbreviation: unitModel.Abbreviation,
IsActive: unitModel.IsActive,
CreatedAt: unitModel.CreatedAt,
UpdatedAt: unitModel.UpdatedAt,
}
return response, nil
}
func (p *UnitProcessorImpl) GetUnitByID(ctx context.Context, id uuid.UUID) (*models.UnitResponse, error) {
organizationID := uuid.Nil // This should come from context
unit, err := p.unitRepo.GetByID(ctx, id, organizationID)
if err != nil {
return nil, err
}
unitModel := mappers.MapUnitEntityToModel(unit)
response := &models.UnitResponse{
ID: unitModel.ID,
OrganizationID: unitModel.OrganizationID,
OutletID: unitModel.OutletID,
Name: unitModel.Name,
Abbreviation: unitModel.Abbreviation,
IsActive: unitModel.IsActive,
CreatedAt: unitModel.CreatedAt,
UpdatedAt: unitModel.UpdatedAt,
}
return response, nil
}
func (p *UnitProcessorImpl) ListUnits(ctx context.Context, organizationID uuid.UUID, outletID *uuid.UUID, page, limit int, search string) (*models.PaginatedResponse[models.UnitResponse], error) {
if page < 1 {
page = 1
}
if limit < 1 {
limit = 10
}
if limit > 100 {
limit = 100
}
units, total, err := p.unitRepo.GetAll(ctx, organizationID, outletID, page, limit, search)
if err != nil {
return nil, err
}
unitModels := mappers.MapUnitEntitiesToModels(units)
unitResponses := make([]models.UnitResponse, len(unitModels))
for i, unitModel := range unitModels {
unitResponses[i] = models.UnitResponse{
ID: unitModel.ID,
OrganizationID: unitModel.OrganizationID,
OutletID: unitModel.OutletID,
Name: unitModel.Name,
Abbreviation: unitModel.Abbreviation,
IsActive: unitModel.IsActive,
CreatedAt: unitModel.CreatedAt,
UpdatedAt: unitModel.UpdatedAt,
}
}
paginatedResponse := &models.PaginatedResponse[models.UnitResponse]{
Data: unitResponses,
Pagination: models.Pagination{
Page: page,
Limit: limit,
Total: int64(total),
TotalPages: (total + limit - 1) / limit,
},
}
return paginatedResponse, nil
}
func (p *UnitProcessorImpl) UpdateUnit(ctx context.Context, id uuid.UUID, req *models.UpdateUnitRequest) (*models.UnitResponse, error) {
organizationID := uuid.Nil
existingUnit, err := p.unitRepo.GetByID(ctx, id, organizationID)
if err != nil {
return nil, err
}
existingUnit.OutletID = req.OutletID
existingUnit.Name = req.Name
existingUnit.Abbreviation = req.Abbreviation
existingUnit.IsActive = req.IsActive
existingUnit.UpdatedAt = time.Now()
err = p.unitRepo.Update(ctx, existingUnit)
if err != nil {
return nil, err
}
unitModel := mappers.MapUnitEntityToModel(existingUnit)
response := &models.UnitResponse{
ID: unitModel.ID,
OrganizationID: unitModel.OrganizationID,
OutletID: unitModel.OutletID,
Name: unitModel.Name,
Abbreviation: unitModel.Abbreviation,
IsActive: unitModel.IsActive,
CreatedAt: unitModel.CreatedAt,
UpdatedAt: unitModel.UpdatedAt,
}
return response, nil
}
func (p *UnitProcessorImpl) DeleteUnit(ctx context.Context, id uuid.UUID) error {
organizationID := uuid.Nil
err := p.unitRepo.Delete(ctx, id, organizationID)
if err != nil {
return err
}
return nil
}