MIF_E31222379_BE/internal/services/coveragearea_service.go

125 lines
3.3 KiB
Go

package services
import (
"fmt"
"log"
"rijig/dto"
"rijig/internal/repositories"
"rijig/model"
"rijig/utils"
)
type CoverageAreaService interface {
CreateCoverageArea(request dto.RequestCoverageArea) (*dto.ResponseCoverageArea, error)
GetCoverageAreaByID(id string) (*dto.ResponseCoverageArea, error)
GetAllCoverageAreas() ([]dto.ResponseCoverageArea, error)
UpdateCoverageArea(id string, request dto.RequestCoverageArea) (*dto.ResponseCoverageArea, error)
DeleteCoverageArea(id string) error
}
type coverageAreaService struct {
repo repositories.CoverageAreaRepository
}
func NewCoverageAreaService(repo repositories.CoverageAreaRepository) CoverageAreaService {
return &coverageAreaService{repo: repo}
}
func ConvertCoverageAreaToResponse(coverage *model.CoverageArea) *dto.ResponseCoverageArea {
createdAt, _ := utils.FormatDateToIndonesianFormat(coverage.CreatedAt)
updatedAt, _ := utils.FormatDateToIndonesianFormat(coverage.UpdatedAt)
return &dto.ResponseCoverageArea{
ID: coverage.ID,
Province: coverage.Province,
Regency: coverage.Regency,
CreatedAt: createdAt,
UpdatedAt: updatedAt,
}
}
func (s *coverageAreaService) CreateCoverageArea(request dto.RequestCoverageArea) (*dto.ResponseCoverageArea, error) {
errors, valid := request.ValidateCoverageArea()
if !valid {
return nil, fmt.Errorf("validation errors: %v", errors)
}
coverage := model.CoverageArea{
Province: request.Province,
Regency: request.Regency,
}
if err := s.repo.CreateCoverage(&coverage); err != nil {
return nil, fmt.Errorf("failed to create coverage area: %v", err)
}
response := ConvertCoverageAreaToResponse(&coverage)
return response, nil
}
func (s *coverageAreaService) GetCoverageAreaByID(id string) (*dto.ResponseCoverageArea, error) {
coverage, err := s.repo.FindCoverageById(id)
if err != nil {
return nil, err
}
response := ConvertCoverageAreaToResponse(coverage)
return response, nil
}
func (s *coverageAreaService) GetAllCoverageAreas() ([]dto.ResponseCoverageArea, error) {
coverageAreas, err := s.repo.FindAllCoverage()
if err != nil {
return nil, err
}
var response []dto.ResponseCoverageArea
for _, coverage := range coverageAreas {
response = append(response, *ConvertCoverageAreaToResponse(&coverage))
}
return response, nil
}
func (s *coverageAreaService) UpdateCoverageArea(id string, request dto.RequestCoverageArea) (*dto.ResponseCoverageArea, error) {
errors, valid := request.ValidateCoverageArea()
if !valid {
return nil, fmt.Errorf("validation errors: %v", errors)
}
coverage, err := s.repo.FindCoverageById(id)
if err != nil {
return nil, fmt.Errorf("coverage area with ID %s not found: %v", id, err)
}
coverage.Province = request.Province
coverage.Regency = request.Regency
if err := s.repo.UpdateCoverage(id, coverage); err != nil {
return nil, fmt.Errorf("failed to update coverage area: %v", err)
}
response := ConvertCoverageAreaToResponse(coverage)
return response, nil
}
func (s *coverageAreaService) DeleteCoverageArea(id string) error {
coverage, err := s.repo.FindCoverageById(id)
if err != nil {
return fmt.Errorf("coverage area with ID %s not found: %v", id, err)
}
if err := s.repo.DeleteCoverage(id); err != nil {
return fmt.Errorf("failed to delete coverage area: %v", err)
}
log.Printf("Coverage area with ID %s successfully deleted", coverage.ID)
return nil
}