eletrotupi / tcc/ api/src/controllers/users.tsbc4e3ca8a4a1a26c0509b5e4a1bc22853f463bd2
2.1 KB | 85 lines Raw
1
import { Request, Response, NextFunction } from 'express';
2
import {
3
  createUser,
4
  findUserById,
5
  findUserByEmail,
6
  updateUser,
7
  generateToken
8
} from '@app/models/user';
9

10
import {
11
  validateRequiredFields
12
} from '@app/utils/validators'
13

14
import { getQueue, MailJobName } from '@app/lib/queue';
15

16
export const UsersController = {
17
  create: async (req: Request, res: Response, next: NextFunction) => {
18
    try {
19
      const { email, password, firstName, lastName } = req.body;
20

21
      // Validate required fields
22
      const requiredValidation = validateRequiredFields(req.body, [
23
        'email', 'password', 'firstName'
24
      ]);
25

26
      if (!requiredValidation.valid) {
27
        return res.status(400).json({
28
          error: "Campos faltantes",
29
          missing: requiredValidation.missing
30
        });
31
      }
32

33
      const user = await createUser(
34
        email, firstName, lastName, password
35
      );
36

37
      const jwtToken = generateToken(user.id, user.email);
38

39
      const mailQueue = getQueue('mail');
40
      const job = await mailQueue.add(MailJobName.WelcomeEmail, { userId: user.id });
41

42
      res.status(201).json({ token: jwtToken });
43
    } catch (err) {
44
      next(err);
45
    }
46
  },
47

48
  update: async (req: Request, res: Response, next: NextFunction) => {
49
    try {
50
      const { id } = req.params
51
      const { user: userParams } = req.body;
52

53
      if (userParams) {
54
        const { email, password, firstName, lastName } = userParams;
55

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

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

64
        if (email || password || firstName || lastName) {
65
          const response = await updateUser(user, {
66
            email, firstName, lastName, password
67
          })
68

69
          const updated = await findUserById(Number(id))
70

71
          // TODO: Drop encrypted password & token here
72
          return res.status(200).json({
73
            user: updated
74
          })
75
        } else {
76
          return res.status(200).json({
77
            user
78
          })
79
        }
80
      }
81
    } catch (err) {
82
      next(err);
83
    }
84
  }
85
};