UNPKG

ai-templates

Version:

CLI tool for generating AI templates for different frameworks and tools

760 lines (669 loc) 17.5 kB
# API Documentation Guide - Frontend (React) This command helps you create and maintain comprehensive API documentation. ## Step 1: OpenAPI/Swagger Setup ### Install Dependencies ```bash # Install Swagger dependencies npm install --save @fastify/swagger @fastify/swagger-ui # Install documentation tools npm install --save-dev @apidevtools/swagger-cli spectacle-docs ``` ### Configure Swagger ```typescript // src/plugins/swagger.ts import fp from 'fastify-plugin'; import swagger from '@fastify/swagger'; import swaggerUI from '@fastify/swagger-ui'; export default fp(async (fastify) => { await fastify.register(swagger, { openapi: { openapi: '3.0.0', info: { title: 'Backend API', description: 'Comprehensive API documentation for our backend services', version: '1.0.0', contact: { name: 'API Support', email: 'api@example.com', url: 'https://support.example.com' }, license: { name: 'MIT', url: 'https://opensource.org/licenses/MIT' } }, servers: [ { url: 'http://localhost:3000', description: 'Development server' }, { url: 'https://api-staging.example.com', description: 'Staging server' }, { url: 'https://api.example.com', description: 'Production server' } ], components: { securitySchemes: { bearerAuth: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' }, apiKey: { type: 'apiKey', in: 'header', name: 'X-API-Key' } } }, tags: [ { name: 'Auth', description: 'Authentication endpoints' }, { name: 'Users', description: 'User management' }, { name: 'Admin', description: 'Admin operations' } ] } }); await fastify.register(swaggerUI, { routePrefix: '/docs', uiConfig: { docExpansion: 'list', deepLinking: true, displayRequestDuration: true }, staticCSP: true, transformStaticCSP: (header) => header, transformSpecification: (swaggerObject, request, reply) => { return swaggerObject; } }); }); ``` ## Step 2: Document Endpoints ### Schema Documentation ```typescript // Define reusable schemas export const UserSchema = { type: 'object', properties: { id: { type: 'string', format: 'uuid', description: 'Unique user identifier' }, email: { type: 'string', format: 'email', description: 'User email address' }, name: { type: 'string', minLength: 1, maxLength: 100, description: 'User full name' }, role: { type: 'string', enum: ['user', 'admin'], description: 'User role' }, createdAt: { type: 'string', format: 'date-time', description: 'Account creation timestamp' }, updatedAt: { type: 'string', format: 'date-time', description: 'Last update timestamp' } }, required: ['id', 'email', 'name', 'role'], additionalProperties: false }; export const ErrorSchema = { type: 'object', properties: { statusCode: { type: 'number', description: 'HTTP status code' }, error: { type: 'string', description: 'Error type' }, message: { type: 'string', description: 'Error message' }, validation: { type: 'array', items: { type: 'object', properties: { field: { type: 'string' }, message: { type: 'string' } } } } }, required: ['statusCode', 'error', 'message'] }; ``` ### Route Documentation ```typescript // Comprehensive route documentation app.post('/api/auth/login', { schema: { description: 'Authenticate user and receive access token', tags: ['Auth'], summary: 'User login', body: { type: 'object', required: ['email', 'password'], properties: { email: { type: 'string', format: 'email', description: 'User email address', example: 'user@example.com' }, password: { type: 'string', minLength: 8, description: 'User password', example: 'SecurePass123!' } } }, response: { 200: { description: 'Successful authentication', type: 'object', properties: { token: { type: 'string', description: 'JWT access token', example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' }, refreshToken: { type: 'string', description: 'Refresh token for token renewal', example: 'f47ac10b-58cc-4372-a567-0e02b2c3d479' }, user: { ...UserSchema, description: 'Authenticated user information' } } }, 400: { description: 'Invalid request data', ...ErrorSchema }, 401: { description: 'Invalid credentials', ...ErrorSchema }, 429: { description: 'Too many login attempts', ...ErrorSchema, headers: { 'Retry-After': { type: 'integer', description: 'Seconds until next attempt allowed' } } } } } }, loginHandler); ``` ### Complex Endpoint Documentation ```typescript app.get('/api/users', { schema: { description: 'Get paginated list of users with filtering and sorting', tags: ['Users'], summary: 'List users', security: [{ bearerAuth: [] }], querystring: { type: 'object', properties: { page: { type: 'integer', minimum: 1, default: 1, description: 'Page number' }, limit: { type: 'integer', minimum: 1, maximum: 100, default: 20, description: 'Items per page' }, search: { type: 'string', description: 'Search by name or email' }, role: { type: 'string', enum: ['user', 'admin'], description: 'Filter by role' }, sortBy: { type: 'string', enum: ['name', 'email', 'createdAt'], default: 'createdAt', description: 'Field to sort by' }, sortOrder: { type: 'string', enum: ['asc', 'desc'], default: 'desc', description: 'Sort direction' } } }, response: { 200: { description: 'Paginated user list', type: 'object', properties: { data: { type: 'array', items: UserSchema }, pagination: { type: 'object', properties: { page: { type: 'integer' }, limit: { type: 'integer' }, total: { type: 'integer' }, pages: { type: 'integer' } } } } } } } }, getUsersHandler); ``` ## Step 3: Generate API Documentation ### Export OpenAPI Specification ```bash # Generate OpenAPI spec node -e " const app = require('./dist/app').build(); app.ready().then(() => { const spec = app.swagger(); require('fs').writeFileSync('openapi.json', JSON.stringify(spec, null, 2)); console.log('OpenAPI spec generated'); process.exit(0); }); " # Validate specification npx @apidevtools/swagger-cli validate openapi.json # Bundle multi-file specs npx @apidevtools/swagger-cli bundle openapi.yaml -o openapi-bundled.json ``` ### Generate Documentation Formats ```bash # Generate HTML documentation npx spectacle -d ./docs/api openapi.json # Generate Markdown npx widdershins openapi.json -o docs/API.md # Generate Postman collection npx openapi-to-postmanv2 -s openapi.json -o postman-collection.json ``` ## Step 4: API Versioning Documentation ### Version Management ```typescript // API versioning strategy app.register(v1Routes, { prefix: '/api/v1' }); app.register(v2Routes, { prefix: '/api/v2' }); // Document version differences const versionDoc = { 'v1': { deprecated: false, sunsetDate: null, changes: [] }, 'v2': { deprecated: false, sunsetDate: null, changes: [ 'Added pagination to all list endpoints', 'Changed user.fullName to user.name', 'Removed legacy authentication endpoint' ] } }; ``` ### Migration Guide ```markdown # API Version Migration Guide ## Migrating from v1 to v2 ### Breaking Changes 1. **User Object Structure** - v1: `{ fullName: "John Doe" }` - v2: `{ name: "John Doe" }` 2. **Pagination** - v1: Returns all results - v2: Returns paginated results with metadata ### Deprecated Endpoints - `POST /api/v1/auth/login-legacy` → Use `POST /api/v2/auth/login` ### New Features in v2 - Webhook support - Batch operations - GraphQL endpoint ``` ## Step 5: Interactive Documentation ### API Playground ```typescript // Add try-it-out functionality app.get('/playground', (request, reply) => { reply.type('text/html').send(` <!DOCTYPE html> <html> <head> <title>API Playground</title> <link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist/swagger-ui.css"> </head> <body> <div id="swagger-ui"></div> <script src="https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js"></script> <script> SwaggerUIBundle({ url: '/docs/json', dom_id: '#swagger-ui', presets: [ SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset ], layout: "BaseLayout", tryItOutEnabled: true, requestInterceptor: (req) => { // Add auth token from localStorage const token = localStorage.getItem('api_token'); if (token) { req.headers['Authorization'] = 'Bearer ' + token; } return req; } }); </script> </body> </html> `); }); ``` ### Code Examples ```typescript // Generate code examples for each endpoint const codeExamples = { curl: (endpoint) => `curl -X ${endpoint.method} \\ ${endpoint.url} \\ -H "Authorization: Bearer YOUR_TOKEN" \\ -H "Content-Type: application/json" \\ -d '${JSON.stringify(endpoint.body, null, 2)}'`, javascript: (endpoint) => `fetch('${endpoint.url}', { method: '${endpoint.method}', headers: { 'Authorization': 'Bearer YOUR_TOKEN', 'Content-Type': 'application/json' }, body: JSON.stringify(${JSON.stringify(endpoint.body, null, 2)}) }) .then(response => response.json()) .then(data => console.log(data));`, python: (endpoint) => `import requests response = requests.${endpoint.method.toLowerCase()}( '${endpoint.url}', headers={ 'Authorization': 'Bearer YOUR_TOKEN', 'Content-Type': 'application/json' }, json=${JSON.stringify(endpoint.body, null, 2)} ) print(response.json())` }; ``` ## Step 6: SDK Generation ### Generate Client SDKs ```bash # Install OpenAPI Generator npm install -g @openapitools/openapi-generator-cli # Generate TypeScript SDK openapi-generator-cli generate \ -i openapi.json \ -g typescript-axios \ -o ./sdk/typescript # Generate Python SDK openapi-generator-cli generate \ -i openapi.json \ -g python \ -o ./sdk/python # Generate Go SDK openapi-generator-cli generate \ -i openapi.json \ -g go \ -o ./sdk/go ``` ### SDK Documentation ```markdown # SDK Usage ## TypeScript \`\`\`typescript import { ApiClient, UsersApi } from '@company/api-sdk'; const client = new ApiClient(); client.accessToken = 'YOUR_TOKEN'; const usersApi = new UsersApi(client); const users = await usersApi.getUsers({ page: 1, limit: 20 }); \`\`\` ## Python \`\`\`python from company_api import ApiClient, UsersApi client = ApiClient() client.access_token = 'YOUR_TOKEN' users_api = UsersApi(client) users = users_api.get_users(page=1, limit=20) \`\`\` ``` ## Step 7: API Testing Documentation ### Request/Response Examples ```yaml # examples/auth-login.yaml request: method: POST url: /api/auth/login headers: Content-Type: application/json body: email: user@example.com password: SecurePass123! response: status: 200 headers: Content-Type: application/json body: token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... user: id: 123e4567-e89b-12d3-a456-426614174000 email: user@example.com name: John Doe ``` ### Error Response Catalog ```markdown # Common Error Responses ## 400 Bad Request Returned when request data is invalid. \`\`\`json { "statusCode": 400, "error": "Bad Request", "message": "Invalid request data", "validation": [ { "field": "email", "message": "Invalid email format" } ] } \`\`\` ## 401 Unauthorized Returned when authentication fails. \`\`\`json { "statusCode": 401, "error": "Unauthorized", "message": "Invalid or expired token" } \`\`\` ## 429 Too Many Requests Returned when rate limit is exceeded. \`\`\`json { "statusCode": 429, "error": "Too Many Requests", "message": "Rate limit exceeded", "retryAfter": 60 } \`\`\` ``` ## Step 8: Webhook Documentation ### Webhook Events ```typescript // Document webhook payloads export const WebhookSchemas = { 'user.created': { type: 'object', properties: { event: { type: 'string', const: 'user.created' }, timestamp: { type: 'string', format: 'date-time' }, data: UserSchema } }, 'order.completed': { type: 'object', properties: { event: { type: 'string', const: 'order.completed' }, timestamp: { type: 'string', format: 'date-time' }, data: OrderSchema } } }; // Webhook endpoint documentation app.post('/webhooks/configure', { schema: { description: 'Configure webhook endpoints', tags: ['Webhooks'], body: { type: 'object', properties: { url: { type: 'string', format: 'uri' }, events: { type: 'array', items: { type: 'string', enum: Object.keys(WebhookSchemas) } }, secret: { type: 'string', minLength: 32 } } } } }, configureWebhookHandler); ``` ## Step 9: Documentation Automation ### CI/CD Integration ```yaml # .github/workflows/docs.yml name: Update API Documentation on: push: branches: [main] paths: - 'src/**' - 'openapi.yaml' jobs: update-docs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Generate OpenAPI spec run: | npm ci npm run build npm run docs:generate - name: Generate documentation run: | npm run docs:html npm run docs:markdown npm run docs:postman - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./docs/api ``` ### Documentation Tests ```typescript // Test that all routes are documented describe('API Documentation', () => { it('should have all routes documented', async () => { const app = build(); await app.ready(); const routes = app.printRoutes(); const spec = app.swagger(); routes.forEach(route => { const path = route.path.replace(/:(\w+)/g, '{$1}'); expect(spec.paths[path]).toBeDefined(); expect(spec.paths[path][route.method.toLowerCase()]).toBeDefined(); }); }); }); ``` ## Step 10: Documentation Best Practices ### README Template ```markdown # API Documentation ## Quick Start 1. Get your API key from [Dashboard](https://dashboard.example.com) 2. Make your first request: \`\`\`bash curl -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/api/users \`\`\` ## Base URL - Production: `https://api.example.com` - Staging: `https://api-staging.example.com` ## Authentication All requests require authentication using Bearer tokens. ## Rate Limiting - 100 requests per minute for standard tier - 1000 requests per minute for premium tier ## SDKs - [TypeScript/JavaScript](./sdk/typescript) - [Python](./sdk/python) - [Go](./sdk/go) ## Support - Email: api@example.com - Slack: [Join our community](https://slack.example.com) ``` ### Changelog ```markdown # API Changelog ## [2.0.0] - 2024-01-15 ### Breaking Changes - Changed `fullName` to `name` in User object - Removed `/api/v1/legacy` endpoints ### Added - Pagination for all list endpoints - Webhook support - Batch operations ### Fixed - Rate limiting header format - Timezone handling in timestamps ## [1.5.0] - 2023-12-01 ### Added - New filters for user listing - Export functionality ``` ## Documentation Checklist ```markdown ## API Documentation Checklist ### Setup - [ ] OpenAPI/Swagger configured - [ ] Interactive documentation available - [ ] Version strategy documented ### Endpoints - [ ] All endpoints documented - [ ] Request/response examples - [ ] Error responses catalogued - [ ] Authentication documented ### Schemas - [ ] All models documented - [ ] Validation rules clear - [ ] Required fields marked - [ ] Examples provided ### Developer Experience - [ ] Getting started guide - [ ] Code examples in multiple languages - [ ] SDKs generated - [ ] Postman collection available ### Maintenance - [ ] Automated documentation generation - [ ] Documentation tests - [ ] Changelog maintained - [ ] Version migration guides ```