From 2e8afdb36593cd1fe39c702012269a24c9a2200c Mon Sep 17 00:00:00 2001 From: pahmiudahgede Date: Fri, 7 Feb 2025 00:57:17 +0700 Subject: [PATCH] fix: fixing response --- internal/handler/wilayah_indonesia_handler.go | 17 +++++-- .../repositories/wilayah_indonesia_repo.go | 35 +++++++++---- .../services/wilayah_indonesia_service.go | 50 ++++++++++++++++--- presentation/wilayahindonesia_route.go | 10 ++-- 4 files changed, 87 insertions(+), 25 deletions(-) diff --git a/internal/handler/wilayah_indonesia_handler.go b/internal/handler/wilayah_indonesia_handler.go index bb09a78..24944f0 100644 --- a/internal/handler/wilayah_indonesia_handler.go +++ b/internal/handler/wilayah_indonesia_handler.go @@ -50,7 +50,7 @@ func (h *WilayahIndonesiaHandler) GetProvinces(c *fiber.Ctx) error { } func (h *WilayahIndonesiaHandler) GetProvinceByID(c *fiber.Ctx) error { - provinceID := c.Params("id") + provinceID := c.Params("provinceid") page, err := strconv.Atoi(c.Query("page", "0")) if err != nil { @@ -96,7 +96,7 @@ func (h *WilayahIndonesiaHandler) GetAllRegencies(c *fiber.Ctx) error { } func (h *WilayahIndonesiaHandler) GetRegencyByID(c *fiber.Ctx) error { - regencyId := c.Params("id") + regencyId := c.Params("regencyid") page, err := strconv.Atoi(c.Query("page", "0")) if err != nil { @@ -142,7 +142,7 @@ func (h *WilayahIndonesiaHandler) GetAllDistricts(c *fiber.Ctx) error { } func (h *WilayahIndonesiaHandler) GetDistrictByID(c *fiber.Ctx) error { - districtId := c.Params("id") + districtId := c.Params("districtid") page, err := strconv.Atoi(c.Query("page", "0")) if err != nil { @@ -186,3 +186,14 @@ func (h *WilayahIndonesiaHandler) GetAllVillages(c *fiber.Ctx) error { return utils.NonPaginatedResponse(c, villages, totalVillages, "villages fetched successfully") } + +func (h *WilayahIndonesiaHandler) GetVillageByID(c *fiber.Ctx) error { + id := c.Params("villageid") + + village, err := h.WilayahService.GetVillageByID(id) + if err != nil { + return utils.GenericErrorResponse(c, fiber.StatusInternalServerError, err.Error()) + } + + return utils.LogResponse(c, village, "Village fetched successfully") +} diff --git a/internal/repositories/wilayah_indonesia_repo.go b/internal/repositories/wilayah_indonesia_repo.go index e2d9e92..ea4bd89 100644 --- a/internal/repositories/wilayah_indonesia_repo.go +++ b/internal/repositories/wilayah_indonesia_repo.go @@ -21,6 +21,7 @@ type WilayahIndonesiaRepository interface { FindDistrictByID(id string, page, limit int) (*model.District, int, error) FindAllVillages(page, limit int) ([]model.Village, int, error) + FindVillageByID(id string) (*model.Village, error) } type wilayahIndonesiaRepository struct { @@ -128,6 +129,7 @@ func (r *wilayahIndonesiaRepository) FindAllRegencies(page, limit int) ([]model. return nil, 0, err } } else { + err := r.DB.Find(®encies).Error if err != nil { return nil, 0, err @@ -140,22 +142,24 @@ func (r *wilayahIndonesiaRepository) FindAllRegencies(page, limit int) ([]model. func (r *wilayahIndonesiaRepository) FindRegencyByID(id string, page, limit int) (*model.Regency, int, error) { var regency model.Regency - err := r.DB.Preload("Districs", func(db *gorm.DB) *gorm.DB { + err := r.DB.Preload("Districts", func(db *gorm.DB) *gorm.DB { if page > 0 && limit > 0 { - return db.Offset((page - 1) * limit).Limit(limit) } - return db }).Where("id = ?", id).First(®ency).Error + if err != nil { return nil, 0, err } - var totalDistrict int64 - r.DB.Model(&model.District{}).Where("regency_id = ?", id).Count(&totalDistrict) + var totalDistricts int64 + err = r.DB.Model(&model.District{}).Where("regency_id = ?", id).Count(&totalDistricts).Error + if err != nil { + return nil, 0, err + } - return ®ency, int(totalDistrict), nil + return ®ency, int(totalDistricts), nil } func (r *wilayahIndonesiaRepository) FindAllDistricts(page, limit int) ([]model.District, int, error) { @@ -186,7 +190,7 @@ func (r *wilayahIndonesiaRepository) FindAllDistricts(page, limit int) ([]model. func (r *wilayahIndonesiaRepository) FindDistrictByID(id string, page, limit int) (*model.District, int, error) { var district model.District - err := r.DB.Preload("Village", func(db *gorm.DB) *gorm.DB { + err := r.DB.Preload("Villages", func(db *gorm.DB) *gorm.DB { if page > 0 && limit > 0 { return db.Offset((page - 1) * limit).Limit(limit) @@ -205,7 +209,7 @@ func (r *wilayahIndonesiaRepository) FindDistrictByID(id string, page, limit int } func (r *wilayahIndonesiaRepository) FindAllVillages(page, limit int) ([]model.Village, int, error) { - var village []model.Village + var villages []model.Village var total int64 err := r.DB.Model(&model.Village{}).Count(&total).Error @@ -214,17 +218,26 @@ func (r *wilayahIndonesiaRepository) FindAllVillages(page, limit int) ([]model.V } if page > 0 && limit > 0 { - err := r.DB.Offset((page - 1) * limit).Limit(limit).Find(&village).Error + err := r.DB.Offset((page - 1) * limit).Limit(limit).Find(&villages).Error if err != nil { return nil, 0, err } } else { - err := r.DB.Find(&village).Error + err := r.DB.Find(&villages).Error if err != nil { return nil, 0, err } } - return village, int(total), nil + return villages, int(total), nil } + +func (r *wilayahIndonesiaRepository) FindVillageByID(id string) (*model.Village, error) { + var village model.Village + err := r.DB.Where("id = ?", id).First(&village).Error + if err != nil { + return nil, err + } + return &village, nil +} \ No newline at end of file diff --git a/internal/services/wilayah_indonesia_service.go b/internal/services/wilayah_indonesia_service.go index b3b0f70..0f78490 100644 --- a/internal/services/wilayah_indonesia_service.go +++ b/internal/services/wilayah_indonesia_service.go @@ -25,6 +25,7 @@ type WilayahIndonesiaService interface { GetDistrictByID(id string, page, limit int) (*dto.DistrictResponseDTO, int, error) GetAllVillages(page, limit int) ([]dto.VillageResponseDTO, int, error) + GetVillageByID(id string) (*dto.VillageResponseDTO, error) } type wilayahIndonesiaService struct { @@ -412,22 +413,22 @@ func (s *wilayahIndonesiaService) GetDistrictByID(id string, page, limit int) (* func (s *wilayahIndonesiaService) GetAllVillages(page, limit int) ([]dto.VillageResponseDTO, int, error) { cacheKey := fmt.Sprintf("villages_page:%d_limit:%d", page, limit) + cachedData, err := utils.GetJSONData(cacheKey) if err == nil && cachedData != nil { var villages []dto.VillageResponseDTO if data, ok := cachedData["data"].([]interface{}); ok { for _, item := range data { - village, ok := item.(map[string]interface{}) + villageData, ok := item.(map[string]interface{}) if ok { villages = append(villages, dto.VillageResponseDTO{ - ID: village["id"].(string), - DistrictID: village["district_id"].(string), - Name: village["name"].(string), + ID: villageData["id"].(string), + DistrictID: villageData["district_id"].(string), + Name: villageData["name"].(string), }) } } - total := int(cachedData["total"].(float64)) - return villages, total, nil + return villages, int(cachedData["total"].(float64)), nil } } @@ -451,8 +452,43 @@ func (s *wilayahIndonesiaService) GetAllVillages(page, limit int) ([]dto.Village } err = utils.SetJSONData(cacheKey, cacheData, time.Hour*24) if err != nil { - fmt.Printf("Error caching villages data: %v\n", err) + fmt.Printf("Error caching villages data to Redis: %v\n", err) } return villageDTOs, total, nil } + +func (s *wilayahIndonesiaService) GetVillageByID(id string) (*dto.VillageResponseDTO, error) { + + cacheKey := fmt.Sprintf("village:%s", id) + cachedData, err := utils.GetJSONData(cacheKey) + if err == nil && cachedData != nil { + villageResponse := &dto.VillageResponseDTO{} + if data, ok := cachedData["data"].(string); ok { + if err := json.Unmarshal([]byte(data), villageResponse); err == nil { + return villageResponse, nil + } + } + } + + village, err := s.WilayahRepo.FindVillageByID(id) + if err != nil { + return nil, fmt.Errorf("village not found: %v", err) + } + + villageResponse := &dto.VillageResponseDTO{ + ID: village.ID, + DistrictID: village.DistrictID, + Name: village.Name, + } + + cacheData := map[string]interface{}{ + "data": villageResponse, + } + err = utils.SetJSONData(cacheKey, cacheData, 24*time.Hour) + if err != nil { + fmt.Printf("Error caching village data to Redis: %v\n", err) + } + + return villageResponse, nil +} diff --git a/presentation/wilayahindonesia_route.go b/presentation/wilayahindonesia_route.go index c746042..12aa1d4 100644 --- a/presentation/wilayahindonesia_route.go +++ b/presentation/wilayahindonesia_route.go @@ -16,18 +16,20 @@ func WilayahRouter(api fiber.Router) { wilayahService := services.NewWilayahIndonesiaService(wilayahRepo) wilayahHandler := handler.NewWilayahImportHandler(wilayahService) + api.Post("/import/data-wilayah-indonesia", middleware.AuthMiddleware, middleware.RoleMiddleware(utils.RoleAdministrator), wilayahHandler.ImportWilayahData) + wilayahAPI := api.Group("/wilayah-indonesia") wilayahAPI.Get("/provinces", middleware.AuthMiddleware, wilayahHandler.GetProvinces) - wilayahAPI.Get("/provinces/:id", middleware.AuthMiddleware, wilayahHandler.GetProvinceByID) + wilayahAPI.Get("/provinces/:provinceid", middleware.AuthMiddleware, wilayahHandler.GetProvinceByID) wilayahAPI.Get("/regencies", middleware.AuthMiddleware, wilayahHandler.GetAllRegencies) - wilayahAPI.Get("/regencies/:id", middleware.AuthMiddleware, wilayahHandler.GetRegencyByID) + wilayahAPI.Get("/regencies/:regencyid", middleware.AuthMiddleware, wilayahHandler.GetRegencyByID) wilayahAPI.Get("/districts", middleware.AuthMiddleware, wilayahHandler.GetAllDistricts) - wilayahAPI.Get("/districts/:id", middleware.AuthMiddleware, wilayahHandler.GetDistrictByID) + wilayahAPI.Get("/districts/:districtid", middleware.AuthMiddleware, wilayahHandler.GetDistrictByID) wilayahAPI.Get("/villages", middleware.AuthMiddleware, wilayahHandler.GetAllVillages) + wilayahAPI.Get("/villages/:villageid", middleware.AuthMiddleware, wilayahHandler.GetVillageByID) - api.Post("/import/data-wilayah-indonesia", middleware.AuthMiddleware, middleware.RoleMiddleware(utils.RoleAdministrator), wilayahHandler.ImportWilayahData) }