api/moods: refactor whole mood endpoint to accept params
Pedro Lucas Porcellis porcellis@eletrotupi.com · 5 months ago
f4ff3fb7e1a2ed9ab25a6ab364dd521888dcbe92 Browse filesParents
32f2f03Changed 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
};