eletrotupi / tcc/ commit / f4ff3fb

api/moods: refactor whole mood endpoint to accept params

Pedro Lucas Porcellis porcellis@eletrotupi.com · 5 months ago f4ff3fb7e1a2ed9ab25a6ab364dd521888dcbe92 Browse files
Parents 32f2f03
Changed files
3
Additions
+52
Deletions
-11
api/src/controllers/moods.ts
1 1
import { Request, Response, NextFunction } from 'express';
2 2
import { AuthenticatedRequest } from '@app/middleware/auth';
3 3
import {
4 4
  createMood,
5 5
  getMoodsByUserId
28 28
    }
29 29
  },
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
    }
41 46
  },
42 47
};
api/src/routes/moods.ts
1 1
import { Router } from "express";
2 2
import { MoodsController } from '@app/controllers/moods'
3 3
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
1 1
import { prisma } from '@app/lib/prisma';
2 2
import { Mood } from '@prisma/client';
3 3

4 4
import { CreateMoodInput } from '@app/schemas';
5 5

16 16
    },
17 17
    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
};