// src/config/index.js const path = require('path'); // Configuration centralisée de l'application module.exports = { // Configuration du serveur server: { port: process.env.PORT || 3000, cors: { origins: ['http://127.0.0.1:5500', 'http://localhost:5500', 'http://localhost:3000'], methods: ['GET', 'POST', 'PUT', 'DELETE'], allowedHeaders: ['Content-Type'], credentials: true } }, // Configuration de la base de données database: { host: process.env.DB_HOST || 'timelapse-db', port: process.env.DB_PORT || 5432, user: process.env.DB_USER || 'postgres', password: process.env.DB_PASSWORD || 'postgres', database: process.env.DB_NAME || 'timelapse', reconnectInterval: 3000 }, // Configuration de Swagger swagger: { definition: { openapi: '3.0.0', info: { title: 'API Timelapse', version: '1.0.0', description: 'Documentation de l\'API Timelapse pour la gestion des projets, mesures et vidéos', contact: { name: 'Support Timelapse', email: 'support@timelapse.kerboul.me' } }, servers: [ { url: 'https://timelapse.kerboul.me/api', description: 'Serveur de production' }, { url: 'http://localhost:3000/api', description: 'Serveur de développement local' } ], components: { schemas: { Project: { type: 'object', properties: { id: { type: 'integer' }, name: { type: 'string' }, description: { type: 'string' }, start_date: { type: 'string', format: 'date' }, status: { type: 'integer' } } }, Measurement: { type: 'object', properties: { id: { type: 'integer' }, project_id: { type: 'integer' }, timestamp: { type: 'string', format: 'date-time' }, path: { type: 'string' }, temperature: { type: 'number' }, humidity: { type: 'number' }, order_id: { type: 'integer' } } }, Video: { type: 'object', properties: { id: { type: 'integer' }, project_id: { type: 'integer' }, measurement_ids: { type: 'string' }, name: { type: 'string' }, resolution: { type: 'string' }, duration: { type: 'integer' }, status: { type: 'integer' }, progress: { type: 'number' }, video_file: { type: 'string', nullable: true }, started_at: { type: 'string', format: 'date-time', nullable: true }, updated_at: { type: 'string', format: 'date-time', nullable: true }, eta: { type: 'number', nullable: true } } }, Camera: { type: 'object', properties: { id: { type: 'integer' }, interval: { type: 'integer', nullable: true }, maintenance: { type: 'integer' }, active: { type: 'integer' } } }, Error: { type: 'object', properties: { message: { type: 'string' }, statusCode: { type: 'integer' }, details: { type: 'string', nullable: true }, timestamp: { type: 'string', format: 'date-time' } } } }, responses: { NotFound: { description: 'La ressource demandée n\'a pas été trouvée', content: { 'application/json': { schema: { $ref: '#/components/schemas/Error' } } } }, BadRequest: { description: 'Requête invalide', content: { 'application/json': { schema: { $ref: '#/components/schemas/Error' } } } }, ServerError: { description: 'Erreur serveur', content: { 'application/json': { schema: { $ref: '#/components/schemas/Error' } } } } } }, tags: [ { name: 'Projets', description: 'Opérations relatives aux projets' }, { name: 'Mesures', description: 'Opérations relatives aux mesures et images' }, { name: 'Vidéos', description: 'Opérations relatives aux vidéos' }, { name: 'Caméra', description: 'Opérations relatives au contrôle de la caméra' }, { name: 'Images', description: 'Opérations relatives aux images' }, { name: 'Système', description: 'Opérations relatives au système' } ], }, apis: ['./src/routes/*.js'] // Chemins pour la documentation }, // Chemins des répertoires paths: { storage: path.join(process.cwd(), 'storage'), uploads: path.join(process.cwd(), 'uploads'), samples: path.join(process.cwd(), 'sample') }, // Statuts pour les projets projectStatus: { brouillon: 0, capturing: 1, idle: 2, }, // Statuts pour les vidéos videoStatus: { rendering: 0, completed: 1, error: 2 }, // Paramètres par défaut pour la caméra camera: { defaultSettings: { id: 1, interval: null, nbImages: null, maintenance: false, stopFlag: false, idle: true } } };