fix: fixing response

This commit is contained in:
pahmiudahgede 2025-02-07 00:57:17 +07:00
parent 0dff98736c
commit 2e8afdb365
4 changed files with 87 additions and 25 deletions

View File

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

View File

@ -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(&regencies).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(&regency).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 &regency, int(totalDistrict), nil
return &regency, 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
}

View File

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

View File

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