adpa-enterprise-framework-automation
Version:
Modular, standards-compliant Node.js/TypeScript automation framework for enterprise requirements, project, and data management. Provides CLI and API for BABOK v3, PMBOK 7th Edition, and DMBOK 2.0 (in progress). Production-ready Express.js API with TypeSpe
110 lines • 5.32 kB
JavaScript
// server.ts
// filepath: c:\Users\menno\Source\Repos\requirements-gathering-agent\src\api\server.ts
import { createRequire } from 'module';
import { DocumentController } from './controllers/DocumentController.js';
import { TemplateController } from './controllers/TemplateController.js';
import { HealthController } from './controllers/HealthController.js';
import { errorHandler, notFoundHandler } from './middleware/errorHandler.js';
import { requestLogger } from './middleware/requestLogger.js';
import { apiKeyAuth } from './middleware/auth.js';
const require = createRequire(import.meta.url);
const express = require('express');
const cors = require('cors');
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');
/**
* ADPA API Server
* Express.js server implementing the TypeSpec-defined API endpoints
* for professional document processing and conversion services.
*/
const app = express();
const PORT = process.env.PORT || 3001;
// Apply CORS globally for all routes FIRST
app.use(cors({
origin: true, // or ['http://localhost:3003'] for stricter dev
credentials: true,
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH'],
allowedHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Authorization', 'X-API-Key'],
optionsSuccessStatus: 200
}));
// Security middleware
app.use(helmet());
// Rate limiting
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // limit each IP to 100 requests per windowMs
message: {
success: false,
error: {
code: 'RATE_LIMIT_EXCEEDED',
message: 'Too many requests, please try again later.',
timestamp: new Date().toISOString()
}
}
});
app.use('/api/', limiter);
// Body parsing middleware
app.use(express.json({ limit: '50mb' }));
app.use(express.urlencoded({ extended: true, limit: '50mb' }));
// Request logging
app.use(requestLogger);
// API key authentication for protected endpoints
app.use('/api/v1/documents', apiKeyAuth);
app.use('/api/v1/templates', apiKeyAuth);
// Health check routes (public)
app.get('/api/v1/health', HealthController.getHealth);
app.get('/api/v1/health/ready', HealthController.getReadiness);
app.get('/api/v1/health/live', HealthController.getLiveness);
app.get('/api/v1/health/metrics', HealthController.getMetrics);
app.get('/api/v1/health/version', HealthController.getVersion);
// Document processing routes
app.post('/api/v1/documents/convert', DocumentController.convertDocument);
app.post('/api/v1/documents/batch/convert', DocumentController.batchConvert);
app.get('/api/v1/documents/jobs/:jobId', DocumentController.getJobStatus);
app.get('/api/v1/documents/batch/:batchId', DocumentController.getBatchStatus);
app.get('/api/v1/documents/download/:jobId', DocumentController.downloadDocument);
app.delete('/api/v1/documents/jobs/:jobId', DocumentController.cancelJob);
app.get('/api/v1/documents/jobs', DocumentController.listJobs);
app.get('/api/v1/documents/stats', DocumentController.getStats);
app.post('/api/v1/documents/jobs/:jobId/retry', DocumentController.retryJob);
app.get('/api/v1/documents/formats', DocumentController.getSupportedFormats);
// Template management routes
app.post('/api/v1/templates', TemplateController.createTemplate);
app.get('/api/v1/templates/stats', TemplateController.getOverallTemplateStats);
app.get('/api/v1/templates/categories', TemplateController.getTemplateCategories);
app.get('/api/v1/templates/tags', TemplateController.getTemplateTags);
app.get('/api/v1/templates/export', TemplateController.exportTemplates);
app.post('/api/v1/templates/import', TemplateController.importTemplates);
app.post('/api/v1/templates/bulk-delete', TemplateController.bulkDeleteTemplates);
app.get('/api/v1/templates/:templateId', TemplateController.getTemplate);
app.put('/api/v1/templates/:templateId', TemplateController.updateTemplate);
app.delete('/api/v1/templates/:templateId', TemplateController.deleteTemplate);
app.get('/api/v1/templates', TemplateController.listTemplates);
app.post('/api/v1/templates/:templateId/preview', TemplateController.previewTemplate);
app.post('/api/v1/templates/:templateId/clone', TemplateController.cloneTemplate);
app.get('/api/v1/templates/:templateId/stats', TemplateController.getTemplateStats);
app.post('/api/v1/templates/:templateId/validate', TemplateController.validateTemplate);
// API documentation route
app.get('/api/docs', (req, res) => {
res.redirect('/docs/api/index.html');
});
// Serve static API documentation
app.use('/docs', express.static('docs'));
// 404 handler
app.use(notFoundHandler);
// Error handling middleware
app.use(errorHandler);
// Start server
if (process.env.NODE_ENV !== 'test') {
const actualPort = PORT;
app.listen(actualPort, () => {
console.log(`🚀 ADPA API Server running on port ${actualPort}`);
console.log(`📚 API Documentation: http://localhost:${actualPort}/docs/api/`);
console.log(`🏥 Health Check: http://localhost:${actualPort}/api/v1/health`);
console.log(`🎯 Admin Interface: http://localhost:${actualPort}/admin`);
console.log(`🌐 CORS: Open (Development)`);
console.log(`🎯 Ready to process documents via API!`);
});
}
export { app };
//# sourceMappingURL=server.js.map