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
169 lines • 7.07 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 { TemplateRepository } from '../repositories/TemplateRepository.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';
import { dbConnection } from '../config/database.js';
import projectRoutes from './routes/projects.js';
import feedbackRoutes from './routes/feedback.js';
// In-memory project database (sample data)
const projects = [
{
id: '1',
name: 'Financial Services Digital Transformation',
description: 'Comprehensive requirements gathering for digital banking platform',
status: 'active',
framework: 'babok',
complianceScore: 94,
createdAt: '2025-01-10',
updatedAt: '2025-01-13',
documents: 12,
stakeholders: 8
},
{
id: '2',
name: 'Healthcare Management System',
description: 'HIPAA-compliant patient management system requirements',
status: 'review',
framework: 'pmbok',
complianceScore: 87,
createdAt: '2025-01-08',
updatedAt: '2025-01-12',
documents: 9,
stakeholders: 12
},
{
id: '3',
name: 'E-commerce Platform Redesign',
description: 'Modern e-commerce platform with AI-powered recommendations',
status: 'completed',
framework: 'multi',
complianceScore: 96,
createdAt: '2024-12-15',
updatedAt: '2025-01-05',
documents: 18,
stakeholders: 15
}
];
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);
app.use('/api/v1/projects', apiKeyAuth);
app.use('/api/v1/feedback', apiKeyAuth);
// Project management routes
app.use('/api/v1/projects', projectRoutes);
// Feedback management routes
app.use('/api/v1/feedback', feedbackRoutes);
// 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
// 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;
dbConnection.connect()
.then(() => {
console.log('✅ Database connection established.');
try {
const repo = new TemplateRepository();
TemplateController.setTemplateRepository(repo);
console.log('✅ TemplateRepository initialized and set on TemplateController.');
}
catch (err) {
console.error('❌ Failed to initialize TemplateRepository:', err);
}
// Import and register templates router only after repo is set
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { createTemplatesRouter } = require('./routes/templates.js');
const templatesRouter = createTemplatesRouter(TemplateController);
app.use('/api/v1/templates', templatesRouter);
app.listen(actualPort, () => {
if (process.env.NODE_ENV !== 'development' && process.env.NODE_ENV !== 'test') {
console.warn('⚠️ NODE_ENV is not set to development or test. Some features may not work as expected.');
}
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(`📊 Database: ${dbConnection.getConnectionStatus()}`);
console.log(`🎯 Ready to process documents via API!`);
});
})
.catch((error) => {
console.error('❌ Failed to start server due to database connection error:', error);
process.exit(1);
});
}
export { app };
//# sourceMappingURL=server.js.map