refactoring 1. step

This commit is contained in:
2026-03-02 10:09:24 -06:00
parent 198126c13e
commit 7226883a2e
18 changed files with 2915 additions and 2784 deletions

91
src/index.js Normal file
View File

@@ -0,0 +1,91 @@
/**
* Quote & Invoice System - Main Entry Point
* Modularized Backend
*/
const express = require('express');
const puppeteer = require('puppeteer');
// Import routes
const customerRoutes = require('./routes/customers');
const quoteRoutes = require('./routes/quotes');
const invoiceRoutes = require('./routes/invoices');
const paymentRoutes = require('./routes/payments');
const qboRoutes = require('./routes/qbo');
const settingsRoutes = require('./routes/settings');
// Import PDF service for browser initialization
const { setBrowser } = require('./services/pdf-service');
const app = express();
const PORT = process.env.PORT || 3000;
// Global browser instance
let browser = null;
// Initialize browser on startup
async function initBrowser() {
if (!browser) {
console.log('[BROWSER] Launching persistent browser...');
browser = await puppeteer.launch({
headless: 'new',
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-gpu',
'--disable-software-rasterizer',
'--no-zygote',
'--single-process'
],
protocolTimeout: 180000,
timeout: 180000
});
console.log('[BROWSER] Browser launched and ready');
// Pass browser to PDF service
setBrowser(browser);
// Restart browser if it crashes
browser.on('disconnected', () => {
console.log('[BROWSER] Browser disconnected, restarting...');
browser = null;
initBrowser();
});
}
return browser;
}
// Middleware
app.use(express.json());
app.use(express.static('public'));
// Mount routes
app.use('/api/customers', customerRoutes);
app.use('/api/quotes', quoteRoutes);
app.use('/api/invoices', invoiceRoutes);
app.use('/api/payments', paymentRoutes);
app.use('/api/qbo', qboRoutes);
app.use('/api', settingsRoutes);
// Start server
async function startServer() {
await initBrowser();
app.listen(PORT, () => {
console.log(`Quote System running on port ${PORT}`);
});
}
// Graceful shutdown
process.on('SIGTERM', async () => {
if (browser) {
await browser.close();
}
const { pool } = require('./config/database');
await pool.end();
process.exit(0);
});
startServer();
module.exports = app;