ca-grow-ops-manager/backend/src/server.ts
fullsizemalt 4894679357 Fix PDF and branding routes to use /api prefix
- Add /api prefix to PDF and branding route registration in server.ts
- Remove /api prefix from individual route definitions
- Fixes routing issue where PDF endpoints were not accessible through nginx

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-08 19:13:35 -08:00

126 lines
5.2 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: true, // Allow all origins to resolve specific Capacitor/WebView mismatches
credentials: true,
methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']
});
// Manual OPTIONS handler as fallback
// Manual OPTIONS handler removed as it conflicts with @fastify/cors plugin
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' });
// PDF generation
import { pdfRoutes } from './routes/pdf.routes';
import { brandingRoutes } from './routes/branding.routes';
server.register(pdfRoutes, { prefix: '/api/pdf' });
server.register(brandingRoutes, { prefix: '/api/branding' });
// 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();