diff --git a/internal/repositories/coveragearea_repo.go b/internal/repositories/coveragearea_repo.go index 1ddf70d..02674a9 100644 --- a/internal/repositories/coveragearea_repo.go +++ b/internal/repositories/coveragearea_repo.go @@ -8,6 +8,7 @@ import ( ) type CoverageAreaRepository interface { + FindCoverageByProvinceAndRegency(province, regency string) (*model.CoverageArea, error) CreateCoverage(coverage *model.CoverageArea) error FindCoverageById(id string) (*model.CoverageArea, error) FindAllCoverage() ([]model.CoverageArea, error) @@ -23,6 +24,18 @@ func NewCoverageAreaRepository(db *gorm.DB) CoverageAreaRepository { return &coverageAreaRepository{DB: db} } +func (r *coverageAreaRepository) FindCoverageByProvinceAndRegency(province, regency string) (*model.CoverageArea, error) { + var coverage model.CoverageArea + err := r.DB.Where("province = ? AND regency = ?", province, regency).First(&coverage).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil, nil + } + return nil, err + } + return &coverage, nil +} + func (r *coverageAreaRepository) CreateCoverage(coverage *model.CoverageArea) error { if err := r.DB.Create(coverage).Error; err != nil { return fmt.Errorf("failed to create coverage: %v", err) diff --git a/internal/services/coveragearea_service.go b/internal/services/coveragearea_service.go index f80faea..1a0f522 100644 --- a/internal/services/coveragearea_service.go +++ b/internal/services/coveragearea_service.go @@ -18,11 +18,12 @@ type CoverageAreaService interface { } type coverageAreaService struct { - repo repositories.CoverageAreaRepository + repo repositories.CoverageAreaRepository + WilayahRepo repositories.WilayahIndonesiaRepository } -func NewCoverageAreaService(repo repositories.CoverageAreaRepository) CoverageAreaService { - return &coverageAreaService{repo: repo} +func NewCoverageAreaService(repo repositories.CoverageAreaRepository, WilayahRepo repositories.WilayahIndonesiaRepository) CoverageAreaService { + return &coverageAreaService{repo: repo, WilayahRepo: WilayahRepo} } func ConvertCoverageAreaToResponse(coverage *model.CoverageArea) *dto.ResponseCoverageArea { @@ -44,9 +45,24 @@ func (s *coverageAreaService) CreateCoverageArea(request dto.RequestCoverageArea return nil, fmt.Errorf("validation errors: %v", errors) } + province, _, err := s.WilayahRepo.FindProvinceByID(request.Province, 0, 0) + if err != nil { + return nil, fmt.Errorf("invalid province_id") + } + + regency, _, err := s.WilayahRepo.FindRegencyByID(request.Regency, 0, 0) + if err != nil { + return nil, fmt.Errorf("invalid regency_id") + } + + existingCoverage, err := s.repo.FindCoverageByProvinceAndRegency(province.Name, regency.Name) + if err == nil && existingCoverage != nil { + return nil, fmt.Errorf("coverage area with province %s and regency %s already exists", province.Name, regency.Name) + } + coverage := model.CoverageArea{ - Province: request.Province, - Regency: request.Regency, + Province: province.Name, + Regency: regency.Name, } if err := s.repo.CreateCoverage(&coverage); err != nil { @@ -96,8 +112,23 @@ func (s *coverageAreaService) UpdateCoverageArea(id string, request dto.RequestC return nil, fmt.Errorf("coverage area with ID %s not found: %v", id, err) } - coverage.Province = request.Province - coverage.Regency = request.Regency + province, _, err := s.WilayahRepo.FindProvinceByID(request.Province, 0, 0) + if err != nil { + return nil, fmt.Errorf("invalid province_id") + } + + regency, _, err := s.WilayahRepo.FindRegencyByID(request.Regency, 0, 0) + if err != nil { + return nil, fmt.Errorf("invalid regency_id") + } + + existingCoverage, err := s.repo.FindCoverageByProvinceAndRegency(province.Name, regency.Name) + if err == nil && existingCoverage != nil { + return nil, fmt.Errorf("coverage area with province %s and regency %s already exists", province.Name, regency.Name) + } + + coverage.Province = province.Name + coverage.Regency = regency.Name if err := s.repo.UpdateCoverage(id, coverage); err != nil { return nil, fmt.Errorf("failed to update coverage area: %v", err) diff --git a/presentation/coveragearea_route.go b/presentation/coveragearea_route.go index aa91c14..a1603ed 100644 --- a/presentation/coveragearea_route.go +++ b/presentation/coveragearea_route.go @@ -11,7 +11,8 @@ import ( func CoverageAreaRouter(api fiber.Router) { coverageAreaRepo := repositories.NewCoverageAreaRepository(config.DB) - coverageAreaService := services.NewCoverageAreaService(coverageAreaRepo) + wilayahRepo := repositories.NewWilayahIndonesiaRepository(config.DB) + coverageAreaService := services.NewCoverageAreaService(coverageAreaRepo, wilayahRepo) coverageAreaHandler := handler.NewCoverageAreaHandler(coverageAreaService) coverage := api.Group("/coveragearea")