import swaggerJsdoc from 'swagger-jsdoc'; import swaggerUi from 'swagger-ui-express'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); // swagger-jsdoc résout ses motifs `apis` avec `glob`, qui n'interprète pas // les antislashs Windows comme séparateurs — on force donc des slashs. const toGlobPath = (p) => p.split(path.sep).join('/'); /** * Documentation OpenAPI de l'API publique v1 (lecture seule). * Générée depuis les annotations JSDoc `@openapi` dans backend/src/routes/v1/*.js. * Servie sur /api/docs (public, pas d'authentification pour consulter la doc — * seules les requêtes réelles vers /api/v1/... nécessitent une clé API). */ const swaggerSpec = swaggerJsdoc({ definition: { openapi: '3.0.3', info: { title: 'Crowdlending Tracker API', version: 'v1', description: "API publique en lecture seule du portefeuille — crowdlending et Private Equity " + "(cf. /investissements pour le crowdlending, /investissements-pe pour le PE ; " + "/remboursements, /depots-retraits et /frais-operations couvrent les deux). " + "Authentification par clé API (header `X-API-Key`), générée depuis Mon compte → Clés API. " + "Chaque clé est scopée à un seul investisseur.", }, servers: [{ url: '/api/v1' }], components: { securitySchemes: { ApiKeyAuth: { type: 'apiKey', in: 'header', name: 'X-API-Key', }, }, }, security: [{ ApiKeyAuth: [] }], }, apis: [toGlobPath(path.join(__dirname, 'routes/v1/*.js'))], }); const nbPaths = Object.keys(swaggerSpec.paths || {}).length; console.log(`[Swagger] ${nbPaths} route(s) documentée(s) sur /api/docs`); export { swaggerSpec, swaggerUi };