Some checks failed
Deploy to Test Environment / deploy-to-test (push) Failing after 43s
78 lines
2.6 KiB
TypeScript
78 lines
2.6 KiB
TypeScript
// src/routes/system.routes.ts
|
|
// All route handlers now use req.log (request-scoped logger) as per ADR-004
|
|
import { Router, Request, Response, NextFunction } from 'express';
|
|
// Removed: import { logger } from '../services/logger.server';
|
|
// All route handlers now use req.log (request-scoped logger) as per ADR-004
|
|
import { geocodingService } from '../services/geocodingService.server';
|
|
// All route handlers now use req.log (request-scoped logger) as per ADR-004
|
|
import { validateRequest } from '../middleware/validation.middleware';
|
|
// All route handlers now use req.log (request-scoped logger) as per ADR-004
|
|
import { z } from 'zod';
|
|
// All route handlers now use req.log (request-scoped logger) as per ADR-004
|
|
import { requiredString } from '../utils/zodUtils';
|
|
// All route handlers now use req.log (request-scoped logger) as per ADR-004
|
|
import { systemService } from '../services/systemService';
|
|
// All route handlers now use req.log (request-scoped logger) as per ADR-004
|
|
import { geocodeLimiter } from '../config/rateLimiters';
|
|
|
|
const router = Router();
|
|
|
|
const geocodeSchema = z.object({
|
|
body: z.object({
|
|
address: requiredString('An address string is required.'),
|
|
}),
|
|
});
|
|
|
|
// An empty schema for routes that do not expect any input, to maintain a consistent validation pattern.
|
|
const emptySchema = z.object({});
|
|
|
|
/**
|
|
* Checks the status of the 'flyer-crawler-api' process managed by PM2.
|
|
* This is intended for development and diagnostic purposes.
|
|
*/
|
|
router.get(
|
|
'/pm2-status',
|
|
validateRequest(emptySchema),
|
|
async (req: Request, res: Response, next: NextFunction) => {
|
|
try {
|
|
const status = await systemService.getPm2Status();
|
|
res.json(status);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
},
|
|
);
|
|
|
|
/**
|
|
* POST /api/system/geocode - Geocodes a given address string.
|
|
* This acts as a secure proxy to the Google Maps Geocoding API.
|
|
*/
|
|
router.post(
|
|
'/geocode',
|
|
geocodeLimiter,
|
|
validateRequest(geocodeSchema),
|
|
async (req: Request, res: Response, next: NextFunction) => {
|
|
// Infer type and cast request object as per ADR-003
|
|
type GeocodeRequest = z.infer<typeof geocodeSchema>;
|
|
const {
|
|
body: { address },
|
|
} = req as unknown as GeocodeRequest;
|
|
|
|
try {
|
|
const coordinates = await geocodingService.geocodeAddress(address, req.log);
|
|
|
|
if (!coordinates) {
|
|
// This check remains, but now it only fails if BOTH services fail.
|
|
return res.status(404).json({ message: 'Could not geocode the provided address.' });
|
|
}
|
|
|
|
res.json(coordinates);
|
|
} catch (error) {
|
|
req.log.error({ error }, 'Error geocoding address');
|
|
next(error);
|
|
}
|
|
},
|
|
);
|
|
|
|
export default router;
|