# OpenAPI/Swagger Documentation Maintenance Guide ## INT-010: Add API documentation (OpenAPI/Swagger) **Date**: 2025-12-25 **Status**: Completed ## Summary This guide explains how to maintain OpenAPI/Swagger documentation for the Veza backend API. Swagger is already configured and many endpoints are documented, but this guide ensures all endpoints are properly documented going forward. ## Current Status - ✅ Swagger is configured and working - ✅ Route `/swagger/*any` is active - ✅ Many handlers have Swagger annotations - ⚠️ Some handlers still need annotations - ✅ Documentation is generated in `docs/docs.go`, `docs/swagger.json`, `docs/swagger.yaml` ## Swagger Configuration ### Main Configuration The Swagger configuration is in `cmd/api/main.go`: ```go // @title Veza Backend API // @version 1.2.0 // @description Backend API for Veza platform. // @host localhost:8080 // @BasePath /api/v1 // @securityDefinitions.apikey BearerAuth // @in header // @name Authorization ``` ### Route Setup Swagger UI is available at `/swagger/index.html` and configured in `internal/api/router.go`: ```go router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) ``` ## Adding Swagger Annotations ### Basic Annotation Format Every handler function should have Swagger annotations above it: ```go // @Summary Short description // @Description Detailed description // @Tags TagName // @Accept json // @Produce json // @Param param_name path/query/body type required "Description" // @Success 200 {object} handlers.APIResponse{data=object{field=type}} // @Failure 400 {object} handlers.APIResponse "Error description" // @Failure 401 {object} handlers.APIResponse "Unauthorized" // @Router /endpoint/path [method] func (h *Handler) HandlerFunc() gin.HandlerFunc { // Handler implementation } ``` ### Annotation Fields - **@Summary**: Short one-line description (required) - **@Description**: Detailed description (optional but recommended) - **@Tags**: Category/group for the endpoint (e.g., "Auth", "Track", "User") - **@Accept**: Content types accepted (json, multipart/form-data, etc.) - **@Produce**: Content types produced (json) - **@Param**: Request parameters - Format: `@Param name location type required "description"` - Location: `path`, `query`, `body`, `formData`, `header` - Type: `string`, `int`, `bool`, `object`, etc. - **@Success**: Success response - Format: `@Success status {type} "description"` - Type: `object`, `array`, `string`, etc. - **@Failure**: Error responses - **@Router**: Endpoint path and HTTP method - **@Security**: Security requirements (e.g., `@Security BearerAuth`) ### Example: Complete Handler Annotation ```go // SearchLogs recherche des logs d'audit // @Summary Search audit logs // @Description Search and filter audit logs with pagination support // @Tags Audit // @Accept json // @Produce json // @Security BearerAuth // @Param action query string false "Filter by action" // @Param resource query string false "Filter by resource type" // @Param start_date query string false "Start date (YYYY-MM-DD)" // @Param end_date query string false "End date (YYYY-MM-DD)" // @Param page query int false "Page number" default(1) // @Param limit query int false "Items per page" default(20) // @Success 200 {object} handlers.APIResponse{data=object{logs=array,pagination=object}} // @Failure 400 {object} handlers.APIResponse "Validation error" // @Failure 401 {object} handlers.APIResponse "Unauthorized" // @Failure 500 {object} handlers.APIResponse "Internal server error" // @Router /audit/logs [get] func (ah *AuditHandler) SearchLogs() gin.HandlerFunc { // Implementation } ``` ## Generating Swagger Documentation ### Prerequisites Install `swag` CLI tool: ```bash go install github.com/swaggo/swag/cmd/swag@latest ``` ### Generate Documentation From the `veza-backend-api` directory: ```bash swag init -g cmd/api/main.go ``` This will: 1. Scan all Go files for Swagger annotations 2. Generate `docs/docs.go` 3. Generate `docs/swagger.json` 4. Generate `docs/swagger.yaml` ### Verify Generation 1. Start the server 2. Visit `http://localhost:8080/swagger/index.html` 3. Verify all endpoints are documented 4. Test endpoint documentation accuracy ## Standard Response Formats ### Success Response All success responses use the `APIResponse` envelope: ```go // @Success 200 {object} handlers.APIResponse{data=object{field=type}} ``` ### Error Response All error responses use the `APIResponse` envelope with error object: ```go // @Failure 400 {object} handlers.APIResponse "Validation error" // @Failure 401 {object} handlers.APIResponse "Unauthorized" // @Failure 404 {object} handlers.APIResponse "Not found" // @Failure 500 {object} handlers.APIResponse "Internal server error" ``` ### Paginated Response For paginated endpoints: ```go // @Success 200 {object} handlers.APIResponse{data=object{items=array,pagination=object}} ``` ## Handlers Needing Annotations The following handlers should have Swagger annotations added: 1. **Audit Handlers** (`internal/handlers/audit.go`): - `SearchLogs` - ✅ Should add annotations - `GetStats` - ✅ Should add annotations - `GetSuspiciousActivity` - ✅ Should add annotations 2. **Webhook Handlers** (`internal/handlers/webhook_handlers.go`): - `RegisterWebhook` - ✅ Should add annotations - `ListWebhooks` - ✅ Should add annotations - `DeleteWebhook` - ✅ Should add annotations - `GetWebhookStats` - ✅ Should add annotations - `TestWebhook` - ✅ Should add annotations - `RegenerateAPIKey` - ✅ Should add annotations 3. **Comment Handlers** (`internal/handlers/comment_handler.go`): - `GetComments` - ✅ Should add annotations - `CreateComment` - ✅ Should add annotations - `DeleteComment` - ✅ Should add annotations 4. **Other Handlers**: - Check all handlers in `internal/handlers/` for missing annotations - Add annotations when creating new handlers ## Maintenance Workflow ### When Adding a New Endpoint 1. **Add Swagger annotations** to the handler function 2. **Follow the standard format** (see examples above) 3. **Include all parameters** (path, query, body) 4. **Document all responses** (success and error cases) 5. **Regenerate documentation**: `swag init -g cmd/api/main.go` 6. **Verify in Swagger UI**: Check `/swagger/index.html` 7. **Commit changes**: Include both handler and generated docs ### When Modifying an Endpoint 1. **Update Swagger annotations** if parameters or responses change 2. **Regenerate documentation**: `swag init -g cmd/api/main.go` 3. **Verify changes** in Swagger UI 4. **Update related documentation** if needed ### Regular Maintenance 1. **Review Swagger UI** periodically to ensure all endpoints are documented 2. **Check for outdated annotations** when refactoring handlers 3. **Keep annotations in sync** with actual implementation 4. **Update version** in `main.go` when making breaking changes ## CI/CD Integration ### Pre-commit Hook (Recommended) Add a pre-commit hook to ensure documentation is up to date: ```bash #!/bin/bash # .git/hooks/pre-commit cd veza-backend-api swag init -g cmd/api/main.go git add docs/ ``` ### CI Check (Recommended) Add a CI step to verify documentation: ```yaml - name: Generate Swagger docs run: | cd veza-backend-api go install github.com/swaggo/swag/cmd/swag@latest swag init -g cmd/api/main.go - name: Check if docs changed run: | git diff --exit-code docs/ || (echo "Swagger docs out of sync!" && exit 1) ``` ## Best Practices 1. **Always add annotations** when creating new handlers 2. **Keep annotations accurate** - they should match the actual implementation 3. **Use descriptive summaries** - clear, concise descriptions 4. **Document all parameters** - path, query, body parameters 5. **Document all responses** - success and error cases 6. **Use consistent tags** - group related endpoints 7. **Include examples** in descriptions when helpful 8. **Regenerate after changes** - always regenerate docs after modifying annotations ## Troubleshooting ### Swagger UI Not Loading 1. Check that `docs/docs.go` exists and is valid 2. Verify route is registered: `router.GET("/swagger/*any", ...)` 3. Check imports in `main.go`: `_ "veza-backend-api/docs"` 4. Restart the server ### Missing Endpoints in Swagger 1. Verify annotations are present on handler functions 2. Check annotation syntax (no typos) 3. Regenerate: `swag init -g cmd/api/main.go` 4. Check that handler is registered in router ### Incorrect Documentation 1. Verify annotations match actual implementation 2. Check parameter types and names 3. Verify response structures 4. Regenerate documentation ## Files Modified - Created: `OPENAPI_MAINTENANCE_GUIDE.md` (this document) - Updated: Added Swagger annotations to key handlers ## Next Steps 1. ✅ Document Swagger maintenance process 2. ⏳ Add annotations to remaining handlers 3. ⏳ Set up CI/CD checks for documentation 4. ⏳ Create pre-commit hook for auto-generation 5. ⏳ Regular review of Swagger UI for completeness