Files
screenshot-tools/server.js
Frank John Begornia 2067c72dc6
All checks were successful
Deploy Production (ss-tools.crewsportswear.app) / deploy (push) Successful in 1m15s
Remove .env file and enhance SSL error handling in server configuration
2025-12-31 02:46:02 +08:00

136 lines
5.0 KiB
JavaScript

const express = require('express');
const http = require('http');
const https = require('https');
const { sslConfig, serverConfig } = require('./config/config');
const corsMiddleware = require('./middleware/cors');
// Import routes
const jerseyRoutes = require('./routes/jersey');
const tshirtRoutes = require('./routes/tshirt');
const merchbayRoutes = require('./routes/merchbay');
const maskRoutes = require('./routes/mask');
// Initialize Express app
const app = express();
// Apply CORS middleware globally
app.use(corsMiddleware);
// Health check endpoint
app.get('/health', (req, res) => {
res.status(200).json({
status: 'healthy',
service: 'screenshot-service',
timestamp: new Date().toISOString()
});
});
// Mount route modules
app.use('/jersey', jerseyRoutes);
app.use('/tshirt', tshirtRoutes);
app.use('/merchbay', merchbayRoutes);
app.use('/mask', maskRoutes);
// Legacy route compatibility (backwards compatibility)
// Map old routes to new structure
app.get('/tb/:designId', (req, res) => {
console.log('Legacy route /tb/:designId - redirecting to /jersey/:designId');
req.url = `/jersey/${req.params.designId}`;
jerseyRoutes(req, res);
});
app.get('/ap/:designId', (req, res) => {
console.log('Legacy route /ap/:designId - redirecting to /tshirt/allover/:designId');
req.url = `/tshirt/allover/${req.params.designId}`;
tshirtRoutes(req, res);
});
// 404 handler for unmatched routes
app.use((req, res) => {
res.status(404).json({
error: 'Route not found',
path: req.path,
method: req.method
});
});
// Global error handler
app.use((err, req, res, next) => {
console.error('Unhandled error:', err);
res.status(500).json({
error: 'Internal server error',
message: err.message
});
});
// Create HTTP or HTTPS server based on configuration
const server = serverConfig.useSSL && sslConfig
? https.createServer(sslConfig, app)
: http.createServer(app);
// Handle server errors
server.on('error', (err) => {
if (err.code === 'EADDRINUSE') {
console.error(`❌ Port ${serverConfig.port} is already in use`);
console.error(' Please stop the other process or use a different port');
} else if (err.code === 'ECONNREFUSED') {
console.error(`❌ Connection refused on ${serverConfig.host}:${serverConfig.port}`);
console.error(' Check if the port is accessible');
} else {
console.error('❌ Server error:', err);
}
process.exit(1);
});
const protocol = serverConfig.useSSL && sslConfig ? 'https' : 'http';
const sslNote = serverConfig.useSSL && sslConfig ? '(Direct SSL)' : '(SSL via Traefik/Reverse Proxy)';
// Start server
server.listen(serverConfig.port, serverConfig.host, (err) => {
if (err) {
console.error('Failed to start server:', err);
process.exit(1);
}
console.log('╔════════════════════════════════════════════════════════════╗');
console.log('║ Screenshot Service - Unified Application Started ║');
console.log('╚════════════════════════════════════════════════════════════╝');
console.log('');
console.log(` 🚀 Server running on: ${protocol}://${serverConfig.host}:${serverConfig.port}`);
console.log(` 🔒 SSL Mode: ${sslNote}`);
console.log('');
console.log(' 📍 Available Routes:');
console.log(' ├─ /health - Health check');
console.log(' ├─ /jersey/:designId - Jersey screenshots (4 views)');
console.log(' ├─ /tshirt/:designId - T-Shirt screenshots (4 views)');
console.log(' ├─ /tshirt/allover/:designId - T-Shirt all-over print (2 views)');
console.log(' ├─ /merchbay/tshirt/:designId - Merchbay T-Shirt (4 views)');
console.log(' ├─ /merchbay/allover/:designId - Merchbay all-over print (2 views)');
console.log(' ├─ /merchbay/legacy/:designId - Merchbay legacy viewer (4 views)');
console.log(' ├─ /mask/:designId - All-over print mask');
console.log(' └─ /mask/classic/:designId - Classic mask');
console.log('');
console.log(' 🔄 Legacy Routes (Backwards Compatible):');
console.log(' ├─ /tb/:designId → /jersey/:designId');
console.log(' └─ /ap/:designId → /tshirt/allover/:designId');
console.log('');
console.log('════════════════════════════════════════════════════════════');
});
// Graceful shutdown
process.on('SIGTERM', () => {
console.log('SIGTERM signal received: closing server');
server.close(() => {
console.log('Server closed');
process.exit(0);
});
});
process.on('SIGINT', () => {
console.log('SIGINT signal received: closing server');
server.close(() => {
console.log('Server closed');
process.exit(0);
});
});