Skip to content

Conversation

@ryanaidilp
Copy link
Contributor

Summary

This PR fixes the province list API by removing redundant province information from the latest_case object, creating a cleaner and more efficient response structure.

Problem

The /api/v1/provinces endpoint was returning duplicate province data:

  • Province info at the parent level
  • Same province info redundantly included inside the latest_case object

Solution

  • Added TransformToResponseWithoutProvince() methods to ProvinceCase models
  • Updated GetProvincesWithLatestCase() service to use the new transformation
  • Maintained backward compatibility for other endpoints that may need province info in case data

Changes

  • Models: Added new transformation methods that exclude province data from case responses
  • Service: Updated province list service to use clean transformation
  • Tests: Added comprehensive test coverage for new functionality

Before

{
  "id": "72",
  "name": "Sulawesi Tengah",
  "latest_case": {
    "day": 123,
    "date": "2024-01-01",
    "province": {
      "id": "72", 
      "name": "Sulawesi Tengah"  // ❌ Redundant!
    }
  }
}

After

{
  "id": "72",
  "name": "Sulawesi Tengah",
  "latest_case": {
    "day": 123,
    "date": "2024-01-01",
    "daily": { ... },
    "cumulative": { ... }
    // ✅ Clean structure without redundancy
  }
}

Testing

  • All existing tests pass (backward compatibility maintained)
  • New tests added for transformation methods
  • API responses are cleaner and more efficient

Impact

  • Reduces response payload size
  • Eliminates data redundancy
  • Improves API consistency
  • No breaking changes to existing endpoints

… API

- Add TransformToResponseWithoutProvince methods to ProvinceCase models
- Update GetProvincesWithLatestCase service to use new transformation
- Remove duplicate province information from latest_case object
- Maintain backward compatibility for other endpoints
- Add comprehensive test coverage for new transformation methods

The province list API now returns cleaner data structure without
redundant province information in the latest_case object.
@github-actions
Copy link
Contributor

📊 Code Coverage Report

Total Coverage: 49.9%

Coverage by Package

Package Coverage
cmd 0.0%
docs 0.0%
internal/config 0.0%
internal/handler 76.3%
internal/middleware 57.5%
internal/models 99.4%
internal/repository 54.6%
internal/service 30.4%
pkg/database 0.0%
pkg/utils 57.1%

Detailed Coverage

Click to expand detailed coverage
github.com/banua-coder/pico-api-go/cmd/main.go:47:					main						0.0%
github.com/banua-coder/pico-api-go/docs/docs.go:866:					init						0.0%
github.com/banua-coder/pico-api-go/internal/config/config.go:42:			Load						0.0%
github.com/banua-coder/pico-api-go/internal/config/config.go:72:			getEnv						0.0%
github.com/banua-coder/pico-api-go/internal/config/config.go:79:			getEnvAsInt					0.0%
github.com/banua-coder/pico-api-go/internal/config/config.go:88:			getEnvAsDuration				0.0%
github.com/banua-coder/pico-api-go/internal/config/config.go:97:			getEnvAsBool					0.0%
github.com/banua-coder/pico-api-go/internal/handler/covid_handler.go:19:		NewCovidHandler					100.0%
github.com/banua-coder/pico-api-go/internal/handler/covid_handler.go:45:		GetNationalCases				88.2%
github.com/banua-coder/pico-api-go/internal/handler/covid_handler.go:86:		GetLatestNationalCase				77.8%
github.com/banua-coder/pico-api-go/internal/handler/covid_handler.go:115:		GetProvinces					69.2%
github.com/banua-coder/pico-api-go/internal/handler/covid_handler.go:158:		GetProvinceCases				64.6%
github.com/banua-coder/pico-api-go/internal/handler/covid_handler.go:297:		HealthCheck					64.7%
github.com/banua-coder/pico-api-go/internal/handler/covid_handler.go:354:		GetAPIIndex					100.0%
github.com/banua-coder/pico-api-go/internal/handler/response.go:16:			writeJSONResponse				75.0%
github.com/banua-coder/pico-api-go/internal/handler/response.go:24:			writeSuccessResponse				100.0%
github.com/banua-coder/pico-api-go/internal/handler/response.go:31:			writeErrorResponse				100.0%
github.com/banua-coder/pico-api-go/internal/handler/routes.go:12:			SetupRoutes					0.0%
github.com/banua-coder/pico-api-go/internal/middleware/cors.go:7:			CORS						0.0%
github.com/banua-coder/pico-api-go/internal/middleware/logging.go:15:			WriteHeader					0.0%
github.com/banua-coder/pico-api-go/internal/middleware/logging.go:20:			Write						0.0%
github.com/banua-coder/pico-api-go/internal/middleware/logging.go:26:			Logging						0.0%
github.com/banua-coder/pico-api-go/internal/middleware/ratelimit.go:22:			writeRateLimitError				80.0%
github.com/banua-coder/pico-api-go/internal/middleware/ratelimit.go:51:			NewRateLimiter					100.0%
github.com/banua-coder/pico-api-go/internal/middleware/ratelimit.go:68:			Stop						100.0%
github.com/banua-coder/pico-api-go/internal/middleware/ratelimit.go:76:			cleanup						75.0%
github.com/banua-coder/pico-api-go/internal/middleware/ratelimit.go:88:			cleanOldClients					100.0%
github.com/banua-coder/pico-api-go/internal/middleware/ratelimit.go:107:		getClientIP					100.0%
github.com/banua-coder/pico-api-go/internal/middleware/ratelimit.go:134:		isAllowed					92.3%
github.com/banua-coder/pico-api-go/internal/middleware/ratelimit.go:183:		RateLimit					100.0%
github.com/banua-coder/pico-api-go/internal/middleware/recovery.go:10:			Recovery					0.0%
github.com/banua-coder/pico-api-go/internal/models/national_case.go:29:			Scan						92.3%
github.com/banua-coder/pico-api-go/internal/models/national_case.go:53:			Value						100.0%
github.com/banua-coder/pico-api-go/internal/models/national_case_response.go:51:	TransformToResponse				100.0%
github.com/banua-coder/pico-api-go/internal/models/national_case_response.go:88:	TransformSliceToResponse			100.0%
github.com/banua-coder/pico-api-go/internal/models/national_case_response.go:97:	calculatePercentages				100.0%
github.com/banua-coder/pico-api-go/internal/models/pagination.go:21:			CalculatePaginationMeta				100.0%
github.com/banua-coder/pico-api-go/internal/models/province_case_response.go:68:	TransformToResponse				100.0%
github.com/banua-coder/pico-api-go/internal/models/province_case_response.go:73:	TransformToResponseWithoutProvince		100.0%
github.com/banua-coder/pico-api-go/internal/models/province_case_response.go:79:	transformToResponseWithOptions			100.0%
github.com/banua-coder/pico-api-go/internal/models/province_case_response.go:143:	TransformToResponse				100.0%
github.com/banua-coder/pico-api-go/internal/models/province_case_response.go:148:	TransformToResponseWithoutProvince		100.0%
github.com/banua-coder/pico-api-go/internal/models/province_case_response.go:153:	TransformProvinceCaseSliceToResponse		100.0%
github.com/banua-coder/pico-api-go/internal/repository/national_case_repository.go:26:	NewNationalCaseRepository			100.0%
github.com/banua-coder/pico-api-go/internal/repository/national_case_repository.go:30:	GetAll						100.0%
github.com/banua-coder/pico-api-go/internal/repository/national_case_repository.go:35:	GetAllSorted					76.5%
github.com/banua-coder/pico-api-go/internal/repository/national_case_repository.go:70:	GetByDateRange					100.0%
github.com/banua-coder/pico-api-go/internal/repository/national_case_repository.go:75:	GetByDateRangeSorted				76.5%
github.com/banua-coder/pico-api-go/internal/repository/national_case_repository.go:112:	GetLatest					87.5%
github.com/banua-coder/pico-api-go/internal/repository/national_case_repository.go:133:	GetByDay					87.5%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:37:	NewProvinceCaseRepository			100.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:41:	GetAll						100.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:46:	GetAllSorted					100.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:62:	GetAllPaginated					0.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:67:	GetAllPaginatedSorted				0.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:100:	GetByProvinceID					100.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:117:	GetByProvinceIDPaginated			0.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:152:	GetByProvinceIDAndDateRange			100.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:169:	GetByProvinceIDAndDateRangePaginated		0.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:204:	GetByDateRange					0.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:221:	GetByDateRangePaginated				0.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:256:	GetLatestByProvinceID				85.7%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:282:	queryProvinceCases				78.9%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:327:	buildOrderClause				70.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:361:	GetByProvinceIDSorted				0.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:365:	GetByProvinceIDPaginatedSorted			0.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:369:	GetByProvinceIDAndDateRangeSorted		0.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:373:	GetByProvinceIDAndDateRangePaginatedSorted	0.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:377:	GetByDateRangeSorted				0.0%
github.com/banua-coder/pico-api-go/internal/repository/province_case_repository.go:381:	GetByDateRangePaginatedSorted			0.0%
github.com/banua-coder/pico-api-go/internal/repository/province_repository.go:20:	NewProvinceRepository				100.0%
github.com/banua-coder/pico-api-go/internal/repository/province_repository.go:24:	GetAll						76.5%
github.com/banua-coder/pico-api-go/internal/repository/province_repository.go:54:	GetByID						100.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:44:		NewCovidService					100.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:56:		GetNationalCases				100.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:64:		GetNationalCasesSorted				0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:72:		GetNationalCasesByDateRange			90.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:90:		GetNationalCasesByDateRangeSorted		0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:108:		GetLatestNationalCase				75.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:116:		GetProvinces					75.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:124:		GetProvincesWithLatestCase			0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:154:		GetProvinceCases				75.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:162:		GetProvinceCasesByDateRange			70.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:180:		GetAllProvinceCases				75.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:188:		GetAllProvinceCasesSorted			0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:196:		GetAllProvinceCasesByDateRange			70.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:214:		GetProvinceCasesPaginated			0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:222:		GetProvinceCasesByDateRangePaginated		0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:240:		GetAllProvinceCasesPaginated			0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:248:		GetAllProvinceCasesByDateRangePaginated		0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:266:		GetAllProvinceCasesPaginatedSorted		0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:274:		GetAllProvinceCasesByDateRangeSorted		0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:292:		GetAllProvinceCasesByDateRangePaginatedSorted	0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:310:		GetProvinceCasesSorted				0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:318:		GetProvinceCasesPaginatedSorted			0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:326:		GetProvinceCasesByDateRangeSorted		0.0%
github.com/banua-coder/pico-api-go/internal/service/covid_service.go:344:		GetProvinceCasesByDateRangePaginatedSorted	0.0%
github.com/banua-coder/pico-api-go/pkg/database/mysql.go:28:				NewMySQLConnection				0.0%
github.com/banua-coder/pico-api-go/pkg/database/mysql.go:41:				NewMySQLConnectionWithConfig			0.0%
github.com/banua-coder/pico-api-go/pkg/database/mysql.go:101:				DefaultConnectionConfig				0.0%
github.com/banua-coder/pico-api-go/pkg/database/mysql.go:113:				HealthCheck					0.0%
github.com/banua-coder/pico-api-go/pkg/database/mysql.go:131:				GetConnectionStats				0.0%
github.com/banua-coder/pico-api-go/pkg/utils/query.go:10:				ParseIntQueryParam				100.0%
github.com/banua-coder/pico-api-go/pkg/utils/query.go:25:				ParseBoolQueryParam				100.0%
github.com/banua-coder/pico-api-go/pkg/utils/query.go:30:				ParseStringArrayQueryParam			100.0%
github.com/banua-coder/pico-api-go/pkg/utils/query.go:57:				ParseSortParam					0.0%
github.com/banua-coder/pico-api-go/pkg/utils/query.go:91:				IsValidSortField				0.0%
github.com/banua-coder/pico-api-go/pkg/utils/query.go:109:				GetSQLOrderClause				0.0%
github.com/banua-coder/pico-api-go/pkg/utils/query.go:138:				ValidatePaginationParams			100.0%
total:											(statements)					49.9%

@ryanaidilp ryanaidilp self-assigned this Sep 15, 2025
@ryanaidilp ryanaidilp merged commit 0b40546 into develop Sep 15, 2025
5 checks passed
@ryanaidilp ryanaidilp deleted the feature/fix/province-api-redundant-data branch September 15, 2025 11:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants