Skip to content

Conversation

ryanaidilp
Copy link
Contributor

Summary

  • Remove embedded Swagger UI dependencies to reduce binary size by 64%
  • Serve Swagger UI as static files via web server instead of Go application
  • Maintain same URLs and functionality while dramatically reducing resource usage

Changes Made

  • Binary Size: Reduced from 19MB to 6.8MB (64% reduction)
  • Dependencies: Removed github.com/swaggo/http-swagger and related packages
  • Routes: Added /api/v1/swagger.json endpoint for API specification
  • Deployment: Updated workflow to deploy swagger.json and verify endpoints
  • Configuration: Updated .htaccess for static file serving

URLs After Deployment

  • /swagger/ → Static Swagger UI files (served by web server)
  • /api/v1/swagger.json → API specification (served by Go app)
  • /docs → Redirects to /swagger/index.html

Performance Benefits

  • 64% smaller binary size
  • Faster application startup
  • Lower memory usage
  • Better caching (static files cached by browser/CDN)
  • Independent Swagger UI updates

Testing

  • ✅ All tests passing
  • ✅ Binary builds successfully
  • ✅ API endpoints unchanged
  • ✅ Deployment workflow updated

Deployment Requirements

After merging, static Swagger UI files need to be uploaded to /swagger/ directory on web server. The deployment workflow will handle swagger.json automatically.

- Remove github.com/swaggo/http-swagger dependency
- Serve API spec via /api/v1/swagger.json endpoint
- Update .htaccess to serve static Swagger UI files
- Reduce binary size from 19MB to 6.8MB (64% reduction)
- Maintain same URLs: /swagger/ and /docs redirect
- Add API specification deployment step after binary deployment
- Generate and upload swagger.json to server docs directory
- Add Swagger JSON endpoint verification to health checks
- Update deployment summary to reflect optimized binary size
- Include Swagger endpoint verification in deployment status
Copy link
Contributor

github-actions bot commented Sep 8, 2025

📊 Code Coverage Report

Total Coverage: 49.5%

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.1%
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:830:					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:11:			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:128:	TransformToResponse				100.0%
github.com/banua-coder/pico-api-go/internal/models/province_case_response.go:133:	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.5%

@ryanaidilp ryanaidilp merged commit 849cb49 into develop Sep 8, 2025
4 checks passed
@ryanaidilp ryanaidilp deleted the feature/static-swagger-ui branch September 8, 2025 11:46
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.

1 participant