ca-grow-ops-manager/backend/src/server.ts
fullsizemalt 0723c93908
Some checks are pending
Test / backend-test (push) Waiting to run
Test / frontend-test (push) Waiting to run
feat(backend): Add CORS support for Capacitor app
2026-01-06 23:08:15 -08:00

117 lines
4.9 KiB
TypeScript

import fastify from 'fastify';
import cors from '@fastify/cors';
import jwt from '@fastify/jwt';
import dotenv from 'dotenv';
import { prismaPlugin } from './plugins/prisma';
import { authRoutes } from './routes/auth.routes';
import { roomRoutes } from './routes/rooms.routes';
import { batchRoutes } from './routes/batches.routes';
import { timeclockRoutes } from './routes/timeclock.routes';
import { walkthroughRoutes } from './routes/walkthrough.routes';
import { suppliesRoutes } from './routes/supplies.routes';
import { ipmRoutes } from './routes/ipm.routes';
import { touchPointsRoutes } from './routes/touch-points.routes'; // Use new file
import { taskRoutes } from './routes/tasks.routes';
import { taskTemplateRoutes } from './routes/task-templates.routes';
import { roleRoutes } from './routes/roles.routes';
import { userRoutes } from './routes/users.routes';
import { walkthroughSettingsRoutes } from './routes/walkthrough-settings.routes';
import { weightLogsRoutes } from './routes/weight-logs.routes';
import { ipmSchedulesRoutes } from './routes/ipm-schedules.routes';
import { analyticsRoutes } from './routes/analytics.routes';
import { layoutRoutes } from './routes/layout.routes';
import { metrcRoutes } from './routes/metrc.routes';
import { visitorRoutes } from './routes/visitors.routes';
import { accessZoneRoutes } from './routes/access-zones.routes';
import { messagingRoutes } from './routes/messaging.routes';
import { pulseRoutes } from './routes/pulse.routes';
import { websocketPlugin } from './plugins/websocket';
dotenv.config();
const server = fastify({
logger: true
});
// Register Plugins
server.register(cors, {
origin: ['https://veridian.runfoo.run', 'http://localhost:5173'],
credentials: true,
methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']
});
server.register(prismaPlugin);
server.register(jwt, {
secret: process.env.JWT_SECRET || 'supersecret'
});
// Register Routes
server.register(authRoutes, { prefix: '/api/auth' });
server.register(roomRoutes, { prefix: '/api/rooms' });
server.register(batchRoutes, { prefix: '/api/batches' });
server.register(weightLogsRoutes, { prefix: '/api/batches' });
server.register(timeclockRoutes, { prefix: '/api/timeclock' });
server.register(walkthroughRoutes, { prefix: '/api/walkthroughs' });
server.register(suppliesRoutes, { prefix: '/api' });
server.register(touchPointsRoutes, { prefix: '' });
server.register(ipmRoutes, { prefix: '' });
server.register(ipmSchedulesRoutes, { prefix: '/api/ipm/schedules' });
server.register(taskRoutes, { prefix: '/api/tasks' });
server.register(taskTemplateRoutes, { prefix: '/api/task-templates' });
server.register(roleRoutes, { prefix: '/api/roles' });
server.register(userRoutes, { prefix: '/api/users' });
server.register(walkthroughSettingsRoutes, { prefix: '/api/walkthrough-settings' });
server.register(analyticsRoutes, { prefix: '/api/analytics' });
server.register(layoutRoutes, { prefix: '/api/layout' });
server.register(metrcRoutes, { prefix: '/api/metrc' });
server.register(visitorRoutes, { prefix: '/api/visitors' });
server.register(accessZoneRoutes, { prefix: '/api/zones' });
server.register(messagingRoutes, { prefix: '/api/messaging' });
import { plantRoutes } from './routes/plants.routes';
server.register(plantRoutes, { prefix: '/api/plants' });
// Phase 10: Compliance
import { auditRoutes } from './routes/audit.routes';
import { documentRoutes } from './routes/documents.routes';
server.register(auditRoutes, { prefix: '/api/audit' });
server.register(documentRoutes, { prefix: '/api/documents' });
// Phase 13: Advanced Features
import { environmentRoutes } from './routes/environment.routes';
import { financialRoutes } from './routes/financial.routes';
import { insightsRoutes } from './routes/insights.routes';
import { uploadRoutes } from './routes/upload.routes';
server.register(environmentRoutes, { prefix: '/api/environment' });
server.register(financialRoutes, { prefix: '/api/financial' });
server.register(insightsRoutes, { prefix: '/api/insights' });
server.register(uploadRoutes, { prefix: '/api/upload' });
// Pulse sensor integration
server.register(pulseRoutes, { prefix: '/api/pulse' });
// Camera/Security monitoring
import { cameraRoutes } from './routes/cameras.routes';
server.register(cameraRoutes, { prefix: '/api/cameras' });
// WebSocket for real-time alerts
server.register(websocketPlugin);
// Admin routes (demo/testing)
import { adminRoutes } from './routes/admin.routes';
server.register(adminRoutes, { prefix: '/api/admin' });
server.get('/api/healthz', async (request, reply) => {
return { status: 'ok', timestamp: new Date().toISOString() };
});
const start = async () => {
try {
const port = parseInt(process.env.PORT || '3000');
await server.listen({ port, host: '0.0.0.0' });
console.log(`Server listening on port ${port}`);
} catch (err) {
server.log.error(err);
process.exit(1);
}
};
start();