233 lines
7.1 KiB
Go
233 lines
7.1 KiB
Go
package processor
|
|
|
|
import (
|
|
"apskel-pos-be/internal/constants"
|
|
"apskel-pos-be/internal/entities"
|
|
"apskel-pos-be/internal/models"
|
|
"apskel-pos-be/internal/repository"
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type OutletSettingProcessorImpl struct {
|
|
outletSettingRepo *repository.OutletSettingRepositoryImpl
|
|
outletRepo *repository.OutletRepositoryImpl
|
|
}
|
|
|
|
func NewOutletSettingProcessorImpl(
|
|
outletSettingRepo *repository.OutletSettingRepositoryImpl,
|
|
outletRepo *repository.OutletRepositoryImpl,
|
|
) *OutletSettingProcessorImpl {
|
|
return &OutletSettingProcessorImpl{
|
|
outletSettingRepo: outletSettingRepo,
|
|
outletRepo: outletRepo,
|
|
}
|
|
}
|
|
|
|
func (p *OutletSettingProcessorImpl) CreateSetting(ctx context.Context, req *models.CreateOutletSettingRequest) (*models.OutletSettingResponse, error) {
|
|
// Check if outlet exists
|
|
_, err := p.outletRepo.GetByID(ctx, req.OutletID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("outlet not found: %w", err)
|
|
}
|
|
|
|
// Check if setting already exists
|
|
existingSetting, err := p.outletSettingRepo.GetByOutletIDAndKey(ctx, req.OutletID, req.Key)
|
|
if err == nil && existingSetting != nil {
|
|
return nil, fmt.Errorf("setting with key '%s' already exists for this outlet", req.Key)
|
|
}
|
|
|
|
setting := &entities.OutletSetting{
|
|
OutletID: req.OutletID,
|
|
Key: req.Key,
|
|
Value: req.Value,
|
|
}
|
|
|
|
err = p.outletSettingRepo.Create(ctx, setting)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create setting: %w", err)
|
|
}
|
|
|
|
return &models.OutletSettingResponse{
|
|
ID: setting.ID,
|
|
OutletID: setting.OutletID,
|
|
Key: setting.Key,
|
|
Value: setting.Value,
|
|
CreatedAt: setting.CreatedAt,
|
|
UpdatedAt: setting.UpdatedAt,
|
|
}, nil
|
|
}
|
|
|
|
func (p *OutletSettingProcessorImpl) UpdateSetting(ctx context.Context, outletID uuid.UUID, key string, req *models.UpdateOutletSettingRequest) (*models.OutletSettingResponse, error) {
|
|
// Check if outlet exists
|
|
_, err := p.outletRepo.GetByID(ctx, outletID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("outlet not found: %w", err)
|
|
}
|
|
|
|
// Get existing setting
|
|
setting, err := p.outletSettingRepo.GetByOutletIDAndKey(ctx, outletID, key)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("setting not found: %w", err)
|
|
}
|
|
|
|
// Update setting
|
|
setting.Value = req.Value
|
|
err = p.outletSettingRepo.Update(ctx, setting)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to update setting: %w", err)
|
|
}
|
|
|
|
return &models.OutletSettingResponse{
|
|
ID: setting.ID,
|
|
OutletID: setting.OutletID,
|
|
Key: setting.Key,
|
|
Value: setting.Value,
|
|
CreatedAt: setting.CreatedAt,
|
|
UpdatedAt: setting.UpdatedAt,
|
|
}, nil
|
|
}
|
|
|
|
func (p *OutletSettingProcessorImpl) GetSetting(ctx context.Context, outletID uuid.UUID, key string) (*models.OutletSettingResponse, error) {
|
|
// Check if outlet exists
|
|
_, err := p.outletRepo.GetByID(ctx, outletID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("outlet not found: %w", err)
|
|
}
|
|
|
|
setting, err := p.outletSettingRepo.GetByOutletIDAndKey(ctx, outletID, key)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("setting not found: %w", err)
|
|
}
|
|
|
|
return &models.OutletSettingResponse{
|
|
ID: setting.ID,
|
|
OutletID: setting.OutletID,
|
|
Key: setting.Key,
|
|
Value: setting.Value,
|
|
CreatedAt: setting.CreatedAt,
|
|
UpdatedAt: setting.UpdatedAt,
|
|
}, nil
|
|
}
|
|
|
|
func (p *OutletSettingProcessorImpl) GetPrinterSettings(ctx context.Context, outletID uuid.UUID) (*models.OutletPrinterSettings, error) {
|
|
// Check if outlet exists
|
|
outlet, err := p.outletRepo.GetByID(ctx, outletID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("outlet not found: %w", err)
|
|
}
|
|
|
|
// Get printer settings from database
|
|
settings, err := p.outletSettingRepo.GetPrinterSettingsByOutletID(ctx, outletID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to get printer settings: %w", err)
|
|
}
|
|
|
|
// Build printer settings with defaults
|
|
printerSettings := &models.OutletPrinterSettings{
|
|
OutletName: p.getSettingValue(settings, constants.PRINTER_OUTLET_NAME, outlet.Name),
|
|
Address: p.getSettingValue(settings, constants.PRINTER_ADDRESS, ""),
|
|
PhoneNumber: p.getSettingValue(settings, constants.PRINTER_PHONE_NUMBER, ""),
|
|
PaperSize: p.getSettingValue(settings, constants.PRINTER_PAPER_SIZE, constants.DEFAULT_PAPER_SIZE),
|
|
Footer: p.getSettingValue(settings, constants.PRINTER_FOOTER, constants.DEFAULT_FOOTER),
|
|
FooterHashtag: p.getSettingValue(settings, constants.PRINTER_FOOTER_HASHTAG, constants.DEFAULT_FOOTER_HASHTAG),
|
|
}
|
|
|
|
return printerSettings, nil
|
|
}
|
|
|
|
func (p *OutletSettingProcessorImpl) UpdatePrinterSettings(ctx context.Context, outletID uuid.UUID, req *models.UpdateOutletPrinterSettingsRequest) (*models.OutletPrinterSettings, error) {
|
|
// Check if outlet exists
|
|
_, err := p.outletRepo.GetByID(ctx, outletID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("outlet not found: %w", err)
|
|
}
|
|
|
|
// Update each setting if provided
|
|
if req.OutletName != nil {
|
|
err = p.upsertSetting(ctx, outletID, constants.PRINTER_OUTLET_NAME, *req.OutletName)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to update outlet name: %w", err)
|
|
}
|
|
}
|
|
|
|
if req.Address != nil {
|
|
err = p.upsertSetting(ctx, outletID, constants.PRINTER_ADDRESS, *req.Address)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to update address: %w", err)
|
|
}
|
|
}
|
|
|
|
if req.PhoneNumber != nil {
|
|
err = p.upsertSetting(ctx, outletID, constants.PRINTER_PHONE_NUMBER, *req.PhoneNumber)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to update phone number: %w", err)
|
|
}
|
|
}
|
|
|
|
if req.PaperSize != nil {
|
|
err = p.upsertSetting(ctx, outletID, constants.PRINTER_PAPER_SIZE, *req.PaperSize)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to update paper size: %w", err)
|
|
}
|
|
}
|
|
|
|
if req.Footer != nil {
|
|
err = p.upsertSetting(ctx, outletID, constants.PRINTER_FOOTER, *req.Footer)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to update footer: %w", err)
|
|
}
|
|
}
|
|
|
|
if req.FooterHashtag != nil {
|
|
err = p.upsertSetting(ctx, outletID, constants.PRINTER_FOOTER_HASHTAG, *req.FooterHashtag)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to update footer hashtag: %w", err)
|
|
}
|
|
}
|
|
|
|
// Return updated settings
|
|
return p.GetPrinterSettings(ctx, outletID)
|
|
}
|
|
|
|
func (p *OutletSettingProcessorImpl) DeleteSetting(ctx context.Context, outletID uuid.UUID, key string) error {
|
|
// Check if outlet exists
|
|
_, err := p.outletRepo.GetByID(ctx, outletID)
|
|
if err != nil {
|
|
return fmt.Errorf("outlet not found: %w", err)
|
|
}
|
|
|
|
err = p.outletSettingRepo.DeleteByOutletIDAndKey(ctx, outletID, key)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to delete setting: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (p *OutletSettingProcessorImpl) getSettingValue(settings map[string]string, key, defaultValue string) string {
|
|
if value, exists := settings[key]; exists {
|
|
return value
|
|
}
|
|
return defaultValue
|
|
}
|
|
|
|
func (p *OutletSettingProcessorImpl) upsertSetting(ctx context.Context, outletID uuid.UUID, key, value string) error {
|
|
setting, err := p.outletSettingRepo.GetByOutletIDAndKey(ctx, outletID, key)
|
|
if err != nil {
|
|
// Setting doesn't exist, create new one
|
|
setting = &entities.OutletSetting{
|
|
OutletID: outletID,
|
|
Key: key,
|
|
Value: value,
|
|
}
|
|
return p.outletSettingRepo.Create(ctx, setting)
|
|
}
|
|
|
|
// Setting exists, update it
|
|
setting.Value = value
|
|
return p.outletSettingRepo.Update(ctx, setting)
|
|
}
|