refact: add existing value validation in coverage area

This commit is contained in:
pahmiudahgede 2025-05-07 14:03:20 +07:00
parent 9e2ff76c3d
commit 1c0636bba4
3 changed files with 53 additions and 8 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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")