130 lines
No EOL
4.7 KiB
JavaScript
130 lines
No EOL
4.7 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.redis = exports.prisma = void 0;
|
|
const express_1 = __importDefault(require("express"));
|
|
const cors_1 = __importDefault(require("cors"));
|
|
const helmet_1 = __importDefault(require("helmet"));
|
|
const compression_1 = __importDefault(require("compression"));
|
|
const express_rate_limit_1 = __importDefault(require("express-rate-limit"));
|
|
const dotenv_1 = __importDefault(require("dotenv"));
|
|
const client_1 = require("@prisma/client");
|
|
const adapter_pg_1 = require("@prisma/adapter-pg");
|
|
const pg_1 = __importDefault(require("pg"));
|
|
const redis_1 = require("redis");
|
|
const logger_1 = require("./utils/logger");
|
|
const errorHandler_1 = require("./middleware/errorHandler");
|
|
const requestLogger_1 = require("./middleware/requestLogger");
|
|
const auth_1 = __importDefault(require("./routes/auth"));
|
|
const docket_1 = __importDefault(require("./routes/docket"));
|
|
const documents_1 = __importDefault(require("./routes/documents"));
|
|
const subscriptions_1 = __importDefault(require("./routes/subscriptions"));
|
|
const health_1 = __importDefault(require("./routes/health"));
|
|
const notifications_1 = __importDefault(require("./routes/notifications"));
|
|
dotenv_1.default.config();
|
|
const app = (0, express_1.default)();
|
|
const PORT = process.env.PORT || 3001;
|
|
app.set('trust proxy', true);
|
|
const connectionString = process.env.DATABASE_URL;
|
|
const pool = new pg_1.default.Pool({ connectionString });
|
|
const adapter = new adapter_pg_1.PrismaPg(pool);
|
|
exports.prisma = new client_1.PrismaClient({
|
|
adapter,
|
|
log: ['query', 'info', 'warn', 'error'],
|
|
});
|
|
exports.redis = (0, redis_1.createClient)({
|
|
url: process.env.REDIS_URL || 'redis://localhost:6379',
|
|
});
|
|
exports.redis.connect().catch((error) => {
|
|
logger_1.logger.error('Redis connection failed:', error);
|
|
});
|
|
exports.redis.on('error', (error) => {
|
|
logger_1.logger.error('Redis error:', error);
|
|
});
|
|
exports.redis.on('connect', () => {
|
|
logger_1.logger.info('Connected to Redis');
|
|
});
|
|
app.use((0, helmet_1.default)({
|
|
crossOriginResourcePolicy: { policy: "cross-origin" }
|
|
}));
|
|
app.use((0, cors_1.default)({
|
|
origin: process.env.NODE_ENV === 'production'
|
|
? [
|
|
process.env.FRONTEND_URL,
|
|
'https://mad-lawsuit.org',
|
|
'https://files.mad-lawsuit.org',
|
|
'http://frontend:806',
|
|
'http://localhost:806'
|
|
]
|
|
: [
|
|
'http://localhost:3000',
|
|
'http://localhost:806',
|
|
'http://frontend:806',
|
|
'http://frontend:3000',
|
|
'https://mad-lawsuit.org',
|
|
'https://files.mad-lawsuit.org'
|
|
],
|
|
credentials: true,
|
|
}));
|
|
const limiter = (0, express_rate_limit_1.default)({
|
|
windowMs: 15 * 60 * 1000,
|
|
max: 100,
|
|
message: 'Too many requests from this IP, please try again later.',
|
|
standardHeaders: true,
|
|
legacyHeaders: false,
|
|
skip: (req) => {
|
|
return false;
|
|
},
|
|
keyGenerator: (req) => {
|
|
return req.ip || 'unknown';
|
|
},
|
|
});
|
|
app.use('/api', limiter);
|
|
const authLimiter = (0, express_rate_limit_1.default)({
|
|
windowMs: 15 * 60 * 1000,
|
|
max: 5,
|
|
message: 'Too many authentication attempts, please try again later.',
|
|
standardHeaders: true,
|
|
legacyHeaders: false,
|
|
keyGenerator: (req) => {
|
|
return req.ip || 'unknown';
|
|
},
|
|
});
|
|
app.use('/api/auth', authLimiter);
|
|
app.use((0, compression_1.default)());
|
|
app.use(express_1.default.json({ limit: '10mb' }));
|
|
app.use(express_1.default.urlencoded({ extended: true, limit: '10mb' }));
|
|
app.use(requestLogger_1.requestLogger);
|
|
app.use('/api/health', health_1.default);
|
|
app.use('/api/auth', auth_1.default);
|
|
app.use('/api/docket-entries', docket_1.default);
|
|
app.use('/api/documents', documents_1.default);
|
|
app.use('/api/subscriptions', subscriptions_1.default);
|
|
app.use('/api/notifications', notifications_1.default);
|
|
app.use('*', (req, res) => {
|
|
res.status(404).json({
|
|
success: false,
|
|
message: 'Route not found',
|
|
});
|
|
});
|
|
app.use(errorHandler_1.errorHandler);
|
|
process.on('SIGTERM', async () => {
|
|
logger_1.logger.info('SIGTERM received, shutting down gracefully');
|
|
await exports.prisma.$disconnect();
|
|
await exports.redis.quit();
|
|
process.exit(0);
|
|
});
|
|
process.on('SIGINT', async () => {
|
|
logger_1.logger.info('SIGINT received, shutting down gracefully');
|
|
await exports.prisma.$disconnect();
|
|
await exports.redis.quit();
|
|
process.exit(0);
|
|
});
|
|
app.listen(PORT, () => {
|
|
logger_1.logger.info(`Server running on port ${PORT}`);
|
|
logger_1.logger.info(`Environment: ${process.env.NODE_ENV || 'development'}`);
|
|
});
|
|
exports.default = app;
|
|
//# sourceMappingURL=index.js.map
|