Files
crowdlending-app/backend/src/swagger.js
T
2026-09-19 17:34:09 +02:00

49 lines
1.8 KiB
JavaScript

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 };