2026-03-10 16:19:47 +08:00

99 lines
3.5 KiB
TypeScript

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}`)
})