import path from 'path' import express from 'express' import cors from 'cors' import dotenv from 'dotenv' import session from 'express-session' import equipmentRoutes from './routes/equipment' import { scanEquipment } from './controllers/equipmentController' import borrowRoutes, { returnRouter } from './routes/borrow' import statisticsRoutes from './routes/statistics' import authRoutes from './routes/auth' import barcodeRoutes from './routes/barcode' import settingsRoutes from './routes/settings' import usersRoutes from './routes/users' import personRoutes from './routes/persons' import storageLocationRoutes from './routes/storageLocations' import assetTypeRoutes from './routes/assetTypes' import departmentRoutes from './routes/departments' import operationLogRoutes from './routes/operationLog' import batchImportRoutes from './routes/batchImport' import mountRoutes from './routes/mount' import disposalRoutes from './routes/disposal' import maintenanceRoutes from './routes/maintenance' import batchRoutes from './routes/batch' import exportRoutes from './routes/export' import searchRoutes from './routes/search' import { keycloak, memoryStore } from './utils/keycloak' import { protect, requireAdmin } from './middleware/auth' dotenv.config() const app = express() const PORT = process.env.PORT || 3000 const SESSION_SECRET = process.env.SESSION_SECRET || 'equipment-management-secret' // Middleware app.use(cors({ origin: true, credentials: true })) app.use(express.json()) app.use(express.urlencoded({ extended: true })) app.use( session({ secret: SESSION_SECRET, resave: false, saveUninitialized: false, store: memoryStore, cookie: { secure: false, maxAge: 1000 * 60 * 60 // 1 hour } }) ) if (process.env.AUTH_MODE !== 'local') { app.use(keycloak.middleware({ logout: '/api/auth/logout', admin: '/keycloak' })) } app.use('/uploads', express.static(path.resolve(__dirname, '..', 'uploads'))) // Routes app.get('/api/equipment/scan/:equipment_code', protect(), scanEquipment) app.use('/api/equipment', protect(), requireAdmin(), equipmentRoutes) app.use('/api/borrow', protect(), borrowRoutes) app.use('/api/return', protect(), returnRouter) app.use('/api/statistics', protect(), statisticsRoutes) app.use('/api/barcode', protect(), barcodeRoutes) app.use('/api/auth', authRoutes) app.use('/api/settings', protect(), requireAdmin(), settingsRoutes) app.use('/api/users', protect(), requireAdmin(), usersRoutes) app.use('/api/persons', personRoutes) app.use('/api/storage-locations', storageLocationRoutes) app.use('/api/asset-types', assetTypeRoutes) app.use('/api/departments', departmentRoutes) app.use('/api/operation-logs', operationLogRoutes) app.use('/api/batch-import', batchImportRoutes) app.use('/api/mount', protect(), mountRoutes) app.use('/api/disposal', protect(), disposalRoutes) app.use('/api/maintenance', protect(), maintenanceRoutes) app.use('/api/batch', protect(), batchRoutes) app.use('/api/export', protect(), exportRoutes) app.use('/api/search', protect(), searchRoutes) // Health check app.get('/api/health', (req, res) => { res.json({ status: 'ok', message: 'Server is running' }) }) // Error handling middleware app.use((err: any, req: express.Request, res: express.Response, next: express.NextFunction) => { console.error('Error:', err) res.status(err.status || 500).json({ code: err.status || 500, message: err.message || 'Internal Server Error', data: null }) }) app.listen(PORT, () => { console.log(`Server is running on http://localhost:${PORT}`) })