api/moods: refactor whole mood endpoint to accept params

Pedro Lucas Porcellis porcellis@eletrotupi.com 1 month ago f4ff3fb7e1a2ed9ab25a6ab364dd521888dcbe92
Parents: 32f2f03
3 file(s) changed
  • api/src/controllers/moods.ts +9 -4
  • api/src/routes/moods.ts +1 -1
  • api/src/services/mood.service.ts +42 -6
api/src/controllers/moods.ts
@@ -30,11 +30,16 @@ },
30 30
31 31 index: async (req: AuthenticatedRequest, res: Response, next: NextFunction) => {
32 32 try {
33 - const moods = await getMoodsByUserId(Number(req.params.id));
33 + const result = await getMoodsByUserId(Number(req.userId), {
34 + limit: req.query.limit ? Number(req.query.limit) : undefined,
35 + page: req.query.page ? Number(req.query.page) : undefined,
36 + from: req.query.from as string | undefined,
37 + to: req.query.to as string | undefined,
38 + });
34 39
35 - return res.status(200).json({
36 - moods
37 - })
40 + return res.status(200).json(
41 + result
42 + )
38 43 } catch (err) {
39 44 next(err);
40 45 }
api/src/routes/moods.ts
@@ -4,7 +4,7 @@ import { requireAuth } from '@app/middleware/auth';
4 4
5 5 const router = Router();
6 6
7 - router.get('/:id', requireAuth, MoodsController.index);
7 + router.get('/', requireAuth, MoodsController.index);
8 8 router.post('/', requireAuth, MoodsController.create);
9 9
10 10 export default router;
api/src/services/mood.service.ts
@@ -18,10 +18,46 @@ include: { moodComponents: true }
18 18 });
19 19 };
20 20
21 - export const getMoodsByUserId = async (userId: number): Promise<Mood[]> => {
22 - return prisma.mood.findMany({
23 - where: { userId },
24 - include: { moodComponents: true },
25 - orderBy: { moment: 'desc' }
26 - });
21 + export const getMoodsByUserId = async (
22 + userId: number,
23 + params?: {
24 + limit?: number;
25 + page?: number;
26 + from?: string;
27 + to?: string;
28 + }
29 + ): Promise<{ entries: Mood[]; total: number; page: number; nextPage: number | null }> => {
30 + const page = params?.page ?? 1;
31 + const limit = params?.limit ?? 20;
32 + const skip = (page - 1) * limit;
33 +
34 + const where = {
35 + userId,
36 + ...(params?.from || params?.to ? {
37 + moment: {
38 + ...(params.from && { gte: new Date(params.from) }),
39 + ...(params.to && { lte: new Date(params.to) }),
40 + }
41 + } : {}),
42 + };
43 +
44 + const [entries, total] = await Promise.all([
45 + prisma.mood.findMany({
46 + where,
47 + include: { moodComponents: true },
48 + orderBy: { moment: 'desc' },
49 + take: limit,
50 + skip,
51 + }),
52 + prisma.mood.count({ where }),
53 + ]);
54 +
55 + const totalPages = Math.ceil(total / limit);
56 +
57 + return {
58 + entries,
59 + total,
60 + page,
61 + nextPage: page < totalPages ? page + 1 : null,
62 + };
27 63 };