120 lines
4.6 KiB
Go
120 lines
4.6 KiB
Go
package service
|
|
|
|
import (
|
|
"apskel-pos-be/internal/appcontext"
|
|
"context"
|
|
|
|
"apskel-pos-be/internal/constants"
|
|
"apskel-pos-be/internal/contract"
|
|
"apskel-pos-be/internal/processor"
|
|
"apskel-pos-be/internal/transformer"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type OrganizationService interface {
|
|
CreateOrganization(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.CreateOrganizationRequest) *contract.Response
|
|
UpdateOrganization(ctx context.Context, id uuid.UUID, req *contract.UpdateOrganizationRequest) *contract.Response
|
|
DeleteOrganization(ctx context.Context, id uuid.UUID) *contract.Response
|
|
GetOrganizationByID(ctx context.Context, id uuid.UUID) *contract.Response
|
|
ListOrganizations(ctx context.Context, req *contract.ListOrganizationsRequest) *contract.Response
|
|
}
|
|
|
|
type OrganizationServiceImpl struct {
|
|
organizationProcessor processor.OrganizationProcessor
|
|
}
|
|
|
|
func NewOrganizationService(organizationProcessor processor.OrganizationProcessor) *OrganizationServiceImpl {
|
|
return &OrganizationServiceImpl{
|
|
organizationProcessor: organizationProcessor,
|
|
}
|
|
}
|
|
|
|
func (s *OrganizationServiceImpl) CreateOrganization(ctx context.Context, apctx *appcontext.ContextInfo, req *contract.CreateOrganizationRequest) *contract.Response {
|
|
modelReq := transformer.CreateOrganizationRequestToModel(req)
|
|
|
|
organizationResponse, err := s.organizationProcessor.CreateOrganization(ctx, modelReq)
|
|
if err != nil {
|
|
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.OrganizationServiceEntity, err.Error())
|
|
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
|
|
}
|
|
|
|
contractResponse := transformer.CreateOrganizationResponseToContract(organizationResponse)
|
|
return contract.BuildSuccessResponse(contractResponse)
|
|
}
|
|
|
|
func (s *OrganizationServiceImpl) UpdateOrganization(ctx context.Context, id uuid.UUID, req *contract.UpdateOrganizationRequest) *contract.Response {
|
|
modelReq := transformer.UpdateOrganizationRequestToModel(req)
|
|
|
|
organizationResponse, err := s.organizationProcessor.UpdateOrganization(ctx, id, modelReq)
|
|
if err != nil {
|
|
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.OrganizationServiceEntity, err.Error())
|
|
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
|
|
}
|
|
|
|
contractResponse := transformer.OrganizationModelResponseToResponse(organizationResponse)
|
|
return contract.BuildSuccessResponse(contractResponse)
|
|
}
|
|
|
|
func (s *OrganizationServiceImpl) DeleteOrganization(ctx context.Context, id uuid.UUID) *contract.Response {
|
|
err := s.organizationProcessor.DeleteOrganization(ctx, id)
|
|
if err != nil {
|
|
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.OrganizationServiceEntity, err.Error())
|
|
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
|
|
}
|
|
|
|
return contract.BuildSuccessResponse(map[string]interface{}{
|
|
"message": "Organization deleted successfully",
|
|
})
|
|
}
|
|
|
|
func (s *OrganizationServiceImpl) GetOrganizationByID(ctx context.Context, id uuid.UUID) *contract.Response {
|
|
organizationResponse, err := s.organizationProcessor.GetOrganizationByID(ctx, id)
|
|
if err != nil {
|
|
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.OrganizationServiceEntity, err.Error())
|
|
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
|
|
}
|
|
|
|
contractResponse := transformer.OrganizationModelResponseToResponse(organizationResponse)
|
|
return contract.BuildSuccessResponse(contractResponse)
|
|
}
|
|
|
|
func (s *OrganizationServiceImpl) ListOrganizations(ctx context.Context, req *contract.ListOrganizationsRequest) *contract.Response {
|
|
filters := make(map[string]interface{})
|
|
if req.PlanType != "" {
|
|
filters["plan_type"] = req.PlanType
|
|
}
|
|
if req.Search != "" {
|
|
filters["name"] = req.Search
|
|
}
|
|
|
|
organizations, totalCount, err := s.organizationProcessor.ListOrganizations(ctx, filters, req.Page, req.Limit)
|
|
if err != nil {
|
|
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.OrganizationServiceEntity, err.Error())
|
|
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
|
|
}
|
|
|
|
contractResponses := make([]contract.OrganizationResponse, len(organizations))
|
|
for i, org := range organizations {
|
|
response := transformer.OrganizationModelResponseToResponse(&org)
|
|
if response != nil {
|
|
contractResponses[i] = *response
|
|
}
|
|
}
|
|
|
|
totalPages := totalCount / req.Limit
|
|
if totalCount%req.Limit > 0 {
|
|
totalPages++
|
|
}
|
|
|
|
listResponse := &contract.ListOrganizationsResponse{
|
|
Organizations: contractResponses,
|
|
TotalCount: totalCount,
|
|
Page: req.Page,
|
|
Limit: req.Limit,
|
|
TotalPages: totalPages,
|
|
}
|
|
|
|
return contract.BuildSuccessResponse(listResponse)
|
|
}
|