eletrotupi / tcc/ api/src/controllers/users.ts23c0d375c6007bb31f664fa3b208e18023c04ba7
1.7 KB | 73 lines Raw
1
import { Request, Response, NextFunction } from 'express';
2
import {
3
  generateToken
4
} from '@app/services/auth.service';
5

6
import { getQueue, MailJobName } from '@app/lib/queue';
7
import {
8
  CreateUserSchema,
9
  UpdateUserSchema
10
} from '@app/schemas';
11

12
import {
13
  createUser,
14
  findUserById,
15
  findUserByEmail,
16
  updateUser
17
} from '@app/services/user.service';
18

19
export const UsersController = {
20
  create: async (req: Request, res: Response, next: NextFunction) => {
21
    try {
22
      const parsed = CreateUserSchema.safeParse(req.body.user);
23

24
      if (!parsed.success) {
25
        return res.status(422).json({
26
          errors: parsed.error!.issues
27
        })
28
      }
29

30
      const user = await createUser(parsed.data);
31
      const jwtToken = generateToken(user.id, user.email);
32

33
      const mailQueue = getQueue('mail');
34
      const job = await mailQueue.add(MailJobName.WelcomeEmail, { userId: user.id });
35

36
      res.status(201).json({
37
        token: jwtToken
38
      });
39
    } catch (err) {
40
      next(err);
41
    }
42
  },
43

44
  update: async (req: Request, res: Response, next: NextFunction) => {
45
    try {
46
      const { id } = req.params;
47

48
      const parsed = UpdateUserSchema.safeParse(req.body);
49
      if (!parsed.success) {
50
        return res.status(400).json({
51
          errors: parsed.error!.issues
52
        });
53
      }
54

55
      const user = await findUserById(Number(id));
56

57
      if (!user) {
58
        return res.status(404).json({
59
          error: "Usuário não encontrado"
60
        });
61
      }
62

63
      const updated = await updateUser(parsed.data);
64

65
      // TODO: Drop encrypted password & token here
66
      return res.status(200).json({
67
        user: updated
68
      });
69
    } catch (err) {
70
      next(err);
71
    }
72
  }
73
};