apskel-pos-backend/internal/service/customer_service.go

112 lines
4.5 KiB
Go
Raw Normal View History

2025-07-18 20:10:29 +07:00
package service
import (
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/processor"
"apskel-pos-be/internal/transformer"
"context"
"github.com/google/uuid"
)
type CustomerService interface {
CreateCustomer(ctx context.Context, req *contract.CreateCustomerRequest, organizationID uuid.UUID) (*contract.CustomerResponse, error)
GetCustomer(ctx context.Context, customerID, organizationID uuid.UUID) (*contract.CustomerResponse, error)
ListCustomers(ctx context.Context, query *contract.ListCustomersRequest, organizationID uuid.UUID) (*contract.PaginatedCustomerResponse, error)
UpdateCustomer(ctx context.Context, customerID, organizationID uuid.UUID, req *contract.UpdateCustomerRequest) (*contract.CustomerResponse, error)
DeleteCustomer(ctx context.Context, customerID, organizationID uuid.UUID) error
SetDefaultCustomer(ctx context.Context, customerID, organizationID uuid.UUID) (*contract.CustomerResponse, error)
GetDefaultCustomer(ctx context.Context, organizationID uuid.UUID) (*contract.CustomerResponse, error)
EnsureDefaultCustomer(ctx context.Context, organizationID uuid.UUID) (*contract.CustomerResponse, error)
}
type CustomerServiceImpl struct {
customerProcessor *processor.CustomerProcessor
}
func NewCustomerService(customerProcessor *processor.CustomerProcessor) *CustomerServiceImpl {
return &CustomerServiceImpl{
customerProcessor: customerProcessor,
}
}
func (s *CustomerServiceImpl) CreateCustomer(ctx context.Context, req *contract.CreateCustomerRequest, organizationID uuid.UUID) (*contract.CustomerResponse, error) {
modelReq := transformer.CreateCustomerRequestToModel(req)
customerResponse, err := s.customerProcessor.CreateCustomer(ctx, modelReq, organizationID)
if err != nil {
return nil, err
}
contractResponse := transformer.CustomerModelToResponse(customerResponse)
return contractResponse, nil
}
func (s *CustomerServiceImpl) GetCustomer(ctx context.Context, customerID, organizationID uuid.UUID) (*contract.CustomerResponse, error) {
customerResponse, err := s.customerProcessor.GetCustomer(ctx, customerID, organizationID)
if err != nil {
return nil, err
}
contractResponse := transformer.CustomerModelToResponse(customerResponse)
return contractResponse, nil
}
func (s *CustomerServiceImpl) ListCustomers(ctx context.Context, query *contract.ListCustomersRequest, organizationID uuid.UUID) (*contract.PaginatedCustomerResponse, error) {
modelQuery := transformer.ListCustomersRequestToModel(query)
customersResponse, err := s.customerProcessor.ListCustomers(ctx, modelQuery, organizationID)
if err != nil {
return nil, err
}
contractResponse := transformer.PaginatedCustomerResponseToContract(customersResponse)
return contractResponse, nil
}
func (s *CustomerServiceImpl) UpdateCustomer(ctx context.Context, customerID, organizationID uuid.UUID, req *contract.UpdateCustomerRequest) (*contract.CustomerResponse, error) {
modelReq := transformer.UpdateCustomerRequestToModel(req)
customerResponse, err := s.customerProcessor.UpdateCustomer(ctx, customerID, organizationID, modelReq)
if err != nil {
return nil, err
}
contractResponse := transformer.CustomerModelToResponse(customerResponse)
return contractResponse, nil
}
func (s *CustomerServiceImpl) DeleteCustomer(ctx context.Context, customerID, organizationID uuid.UUID) error {
return s.customerProcessor.DeleteCustomer(ctx, customerID, organizationID)
}
func (s *CustomerServiceImpl) SetDefaultCustomer(ctx context.Context, customerID, organizationID uuid.UUID) (*contract.CustomerResponse, error) {
customerResponse, err := s.customerProcessor.SetDefaultCustomer(ctx, customerID, organizationID)
if err != nil {
return nil, err
}
contractResponse := transformer.CustomerModelToResponse(customerResponse)
return contractResponse, nil
}
func (s *CustomerServiceImpl) GetDefaultCustomer(ctx context.Context, organizationID uuid.UUID) (*contract.CustomerResponse, error) {
customerResponse, err := s.customerProcessor.GetDefaultCustomer(ctx, organizationID)
if err != nil {
return nil, err
}
contractResponse := transformer.CustomerModelToResponse(customerResponse)
return contractResponse, nil
}
func (s *CustomerServiceImpl) EnsureDefaultCustomer(ctx context.Context, organizationID uuid.UUID) (*contract.CustomerResponse, error) {
customerResponse, err := s.customerProcessor.EnsureDefaultCustomer(ctx, organizationID)
if err != nil {
return nil, err
}
contractResponse := transformer.CustomerModelToResponse(customerResponse)
return contractResponse, nil
}