farmcontrol-api/src/index.js

148 lines
4.1 KiB
JavaScript

import express from 'express';
import bodyParser from 'body-parser';
import cors from 'cors';
import config from './config.js';
import { expressSession, keycloak } from './keycloak.js';
import { dbConnect } from './database/mongo.js';
import {
authRoutes,
userRoutes,
fileRoutes,
printerRoutes,
jobRoutes,
subJobRoutes,
gcodeFileRoutes,
filamentRoutes,
spotlightRoutes,
partRoutes,
productRoutes,
vendorRoutes,
materialRoutes,
partStockRoutes,
filamentStockRoutes,
purchaseOrderRoutes,
orderItemRoutes,
shipmentRoutes,
stockAuditRoutes,
stockEventRoutes,
auditLogRoutes,
noteTypeRoutes,
noteRoutes,
hostRoutes,
documentSizesRoutes,
documentTemplatesRoutes,
documentPrintersRoutes,
documentJobsRoutes,
courierRoutes,
courierServiceRoutes,
taxRateRoutes,
taxRecordRoutes,
invoiceRoutes,
} from './routes/index.js';
import path from 'path';
import * as fs from 'fs';
import log4js from 'log4js';
import { populateUserMiddleware } from './services/misc/auth.js';
import { natsServer } from './database/nats.js';
import { initializeBuckets } from './database/ceph.js';
import { getEnvironment } from './config.js';
const PORT = config.server.port;
const app = express();
const logger = log4js.getLogger('App');
logger.level = config.server.logLevel;
app.use(log4js.connectLogger(logger, { level: 'trace' }));
const whitelist = [config.app.urlClient, config.app.urlElectronClient];
const corsOptions = {
origin: function (origin, callback) {
if (!origin || whitelist.indexOf(origin) !== -1) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
},
credentials: true,
};
// Initialize application
async function initializeApp() {
logger.info('Initializing application...');
logger.info(`Environment: ${getEnvironment()}`);
logger.info(`Port: ${PORT}`);
logger.info(`Log Level: ${config.server.logLevel}`);
try {
// Connect to database
await dbConnect();
// Connect to NATS
await natsServer.connect();
// Initialize Ceph buckets
try {
await initializeBuckets();
} catch (err) {
logger.error('Failed to initialize Ceph buckets:', err);
// Don't throw error - allow app to start without Ceph for development
}
// Start server
app.listen(PORT, () => logger.info(`Server listening to port ${PORT}`));
} catch (err) {
logger.error('Failed to initialize application:', err);
process.exit(1);
}
}
// Configure middleware
app.use(cors(corsOptions));
app.use(bodyParser.json({ type: 'application/json', strict: false, limit: '50mb' }));
app.use(express.json());
app.use(expressSession);
app.use(keycloak.middleware());
app.use(populateUserMiddleware);
app.get('/', function (req, res) {
const __dirname = fs.realpathSync('.');
res.sendFile(path.join(__dirname, '/src/landing/index.html'));
});
app.use('/auth', authRoutes);
app.use('/users', userRoutes);
app.use('/files', fileRoutes);
app.use('/spotlight', spotlightRoutes);
app.use('/printers', printerRoutes);
app.use('/hosts', hostRoutes);
app.use('/jobs', jobRoutes);
app.use('/subjobs', subJobRoutes);
app.use('/gcodefiles', gcodeFileRoutes);
app.use('/filaments', filamentRoutes);
app.use('/parts', partRoutes);
app.use('/products', productRoutes);
app.use('/vendors', vendorRoutes);
app.use('/materials', materialRoutes);
app.use('/partstocks', partStockRoutes);
app.use('/filamentstocks', filamentStockRoutes);
app.use('/purchaseorders', purchaseOrderRoutes);
app.use('/orderitems', orderItemRoutes);
app.use('/shipments', shipmentRoutes);
app.use('/stockevents', stockEventRoutes);
app.use('/stockaudits', stockAuditRoutes);
app.use('/auditlogs', auditLogRoutes);
app.use('/notetypes', noteTypeRoutes);
app.use('/documentsizes', documentSizesRoutes);
app.use('/documenttemplates', documentTemplatesRoutes);
app.use('/documentprinters', documentPrintersRoutes);
app.use('/documentjobs', documentJobsRoutes);
app.use('/couriers', courierRoutes);
app.use('/courierservices', courierServiceRoutes);
app.use('/taxrates', taxRateRoutes);
app.use('/taxrecords', taxRecordRoutes);
app.use('/invoices', invoiceRoutes);
app.use('/notes', noteRoutes);
// Start the application
initializeApp();