database work !
Some checks failed
Deploy to Test Environment / deploy-to-test (push) Failing after 41s
Some checks failed
Deploy to Test Environment / deploy-to-test (push) Failing after 41s
This commit is contained in:
109
src/routes/reactions.routes.ts
Normal file
109
src/routes/reactions.routes.ts
Normal file
@@ -0,0 +1,109 @@
|
||||
import { Router, Request, Response, NextFunction } from 'express';
|
||||
import { z } from 'zod';
|
||||
import { reactionRepo } from '../services/db/index.db';
|
||||
import { validateRequest } from '../middleware/validation.middleware';
|
||||
import passport from './passport.routes';
|
||||
import { requiredString } from '../utils/zodUtils';
|
||||
import { UserProfile } from '../types';
|
||||
|
||||
const router = Router();
|
||||
|
||||
// --- Zod Schemas for Reaction Routes ---
|
||||
|
||||
const getReactionsSchema = z.object({
|
||||
query: z.object({
|
||||
userId: z.string().uuid().optional(),
|
||||
entityType: z.string().optional(),
|
||||
entityId: z.string().optional(),
|
||||
}),
|
||||
});
|
||||
|
||||
const toggleReactionSchema = z.object({
|
||||
body: z.object({
|
||||
entity_type: requiredString('entity_type is required.'),
|
||||
entity_id: requiredString('entity_id is required.'),
|
||||
reaction_type: requiredString('reaction_type is required.'),
|
||||
}),
|
||||
});
|
||||
|
||||
const getReactionSummarySchema = z.object({
|
||||
query: z.object({
|
||||
entityType: requiredString('entityType is required.'),
|
||||
entityId: requiredString('entityId is required.'),
|
||||
}),
|
||||
});
|
||||
|
||||
// --- Routes ---
|
||||
|
||||
/**
|
||||
* GET /api/reactions - Fetches user reactions based on query filters.
|
||||
* Supports filtering by userId, entityType, and entityId.
|
||||
* This is a public endpoint.
|
||||
*/
|
||||
router.get(
|
||||
'/',
|
||||
validateRequest(getReactionsSchema),
|
||||
async (req: Request, res: Response, next: NextFunction) => {
|
||||
try {
|
||||
const { query } = getReactionsSchema.parse({ query: req.query });
|
||||
const reactions = await reactionRepo.getReactions(query, req.log);
|
||||
res.json(reactions);
|
||||
} catch (error) {
|
||||
req.log.error({ error }, 'Error fetching user reactions');
|
||||
next(error);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
/**
|
||||
* GET /api/reactions/summary - Fetches a summary of reactions for a specific entity.
|
||||
* Example: /api/reactions/summary?entityType=recipe&entityId=123
|
||||
* This is a public endpoint.
|
||||
*/
|
||||
router.get(
|
||||
'/summary',
|
||||
validateRequest(getReactionSummarySchema),
|
||||
async (req: Request, res: Response, next: NextFunction) => {
|
||||
try {
|
||||
const { query } = getReactionSummarySchema.parse({ query: req.query });
|
||||
const summary = await reactionRepo.getReactionSummary(query.entityType, query.entityId, req.log);
|
||||
res.json(summary);
|
||||
} catch (error) {
|
||||
req.log.error({ error }, 'Error fetching reaction summary');
|
||||
next(error);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
/**
|
||||
* POST /api/reactions/toggle - Toggles a user's reaction to an entity.
|
||||
* This is a protected endpoint.
|
||||
*/
|
||||
router.post(
|
||||
'/toggle',
|
||||
passport.authenticate('jwt', { session: false }),
|
||||
validateRequest(toggleReactionSchema),
|
||||
async (req: Request, res: Response, next: NextFunction) => {
|
||||
const userProfile = req.user as UserProfile;
|
||||
type ToggleReactionRequest = z.infer<typeof toggleReactionSchema>;
|
||||
const { body } = req as unknown as ToggleReactionRequest;
|
||||
|
||||
try {
|
||||
const reactionData = {
|
||||
user_id: userProfile.user.user_id,
|
||||
...body,
|
||||
};
|
||||
const result = await reactionRepo.toggleReaction(reactionData, req.log);
|
||||
if (result) {
|
||||
res.status(201).json({ message: 'Reaction added.', reaction: result });
|
||||
} else {
|
||||
res.status(200).json({ message: 'Reaction removed.' });
|
||||
}
|
||||
} catch (error) {
|
||||
req.log.error({ error, body }, 'Error toggling user reaction');
|
||||
next(error);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
export default router;
|
||||
Reference in New Issue
Block a user