Files
flyer-crawler.projectium.com/src/routes/deals.routes.ts
Torben Sorensen 4e22213cd1
All checks were successful
Deploy to Test Environment / deploy-to-test (push) Successful in 15m54s
all the new shiny things
2026-01-11 02:04:52 -08:00

67 lines
2.3 KiB
TypeScript

// src/routes/deals.routes.ts
import express, { type Request, type Response, type NextFunction } from 'express';
import { z } from 'zod';
import passport from './passport.routes';
import { dealsRepo } from '../services/db/deals.db';
import type { UserProfile } from '../types';
import { validateRequest } from '../middleware/validation.middleware';
import { userReadLimiter } from '../config/rateLimiters';
import { sendSuccess } from '../utils/apiResponse';
const router = express.Router();
// --- Zod Schemas for Deals Routes (as per ADR-003) ---
const bestWatchedPricesSchema = z.object({
// No params, query, or body expected for this route currently.
});
// --- Middleware for all deal routes ---
// Per ADR-002, all routes in this file require an authenticated user.
// We apply the standard passport JWT middleware at the router level.
router.use(passport.authenticate('jwt', { session: false }));
/**
* @openapi
* /deals/best-watched-prices:
* get:
* tags: [Deals]
* summary: Get best prices for watched items
* description: Fetches the best current sale price for each of the authenticated user's watched items.
* security:
* - bearerAuth: []
* responses:
* 200:
* description: List of best prices for watched items
* content:
* application/json:
* schema:
* $ref: '#/components/schemas/SuccessResponse'
* 401:
* description: Unauthorized - invalid or missing token
*/
router.get(
'/best-watched-prices',
userReadLimiter,
validateRequest(bestWatchedPricesSchema),
async (req: Request, res: Response, next: NextFunction) => {
const userProfile = req.user as UserProfile;
try {
// The controller logic is simple enough to be handled directly in the route,
// consistent with other simple GET routes in the project.
const deals = await dealsRepo.findBestPricesForWatchedItems(
userProfile.user.user_id,
req.log,
);
req.log.info({ dealCount: deals.length }, 'Successfully fetched best watched item deals.');
sendSuccess(res, deals);
} catch (error) {
req.log.error({ error }, 'Error fetching best watched item deals.');
next(error); // Pass errors to the global error handler
}
},
);
export default router;