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
109 lines • 4.04 kB
JavaScript
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const express = require('express');
const cors = require('cors');
const helmet = require('helmet');
const compression = require('compression');
const morgan = require('morgan');
const rateLimit = require('express-rate-limit');
const swaggerUi = require('swagger-ui-express');
const path = require('path');
const fs = require('fs');
// Routes
import documentRoutes from './api/routes/documents.js';
import templateRoutes from './api/routes/templates.js';
import healthRoutes from './api/routes/health.js';
import standardsComplianceRoutes from './api/routes/standardsCompliance.js';
// Middleware
import { errorHandler } from './api/middleware/errorHandler.js';
import { authMiddleware } from './api/middleware/auth.js';
import { logger } from './config/logger.js';
const app = express();
// Security middleware
app.use(helmet({
crossOriginEmbedderPolicy: false,
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
styleSrc: ["'self'", "'unsafe-inline'"],
scriptSrc: ["'self'"],
imgSrc: ["'self'", "data:", "https:"],
},
},
}));
app.use(cors({
origin: process.env.ALLOWED_ORIGINS?.split(',') || ['http://localhost:3000', 'http://localhost:8080'],
credentials: true,
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization', 'X-API-Key']
}));
// Rate limiting - More generous for API development
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: process.env.NODE_ENV === 'production' ? 100 : 1000, // limit each IP to 100 requests per windowMs in production
message: {
error: 'Too many requests from this IP, please try again later.',
retryAfter: '15 minutes'
},
standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers
legacyHeaders: false, // Disable the `X-RateLimit-*` headers
});
app.use('/api/', limiter);
// Body parsing middleware
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true, limit: '10mb' }));
app.use(compression());
// Logging middleware
if (process.env.NODE_ENV !== 'test') {
app.use(morgan('combined', {
stream: {
write: (message) => logger.info(message.trim())
}
}));
}
// API Documentation - Serve the generated OpenAPI spec
const openApiPath = path.join(process.cwd(), 'api-specs', 'generated', '@typespec', 'openapi3', 'openapi.yaml');
if (fs.existsSync(openApiPath)) {
const yaml = require('yaml');
const swaggerDocument = yaml.parse(fs.readFileSync(openApiPath, 'utf8'));
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument, {
explorer: true,
swaggerOptions: {
persistAuthorization: true,
},
}));
}
// Health check endpoint (no auth required)
app.use('/api/v1/health', healthRoutes);
// Root endpoint
app.get('/', (req, res) => {
res.json({
name: 'ADPA Document Processing API',
version: '1.0.0',
description: 'TypeSpec-defined REST API for document processing and template management',
documentation: '/api-docs',
health: '/api/v1/health'
});
});
// Protected API routes
app.use('/api/v1/documents', authMiddleware, documentRoutes);
app.use('/api/v1/templates', authMiddleware, templateRoutes);
app.use('/api/v1/standards', authMiddleware, standardsComplianceRoutes);
// 404 handler
app.use('*', (req, res) => {
res.status(404).json({
error: 'Not Found',
message: `Route ${req.originalUrl} not found`,
availableEndpoints: {
health: '/api/v1/health',
documents: '/api/v1/documents',
templates: '/api/v1/templates',
standards: '/api/v1/standards',
documentation: '/api-docs'
}
});
});
// Global error handling middleware (must be last)
app.use(errorHandler);
export default app;
//# sourceMappingURL=app.js.map