eletrotupi / tcc/ api/src/controllers/users.tscd098b6c7983a66404abe69215b9ce1e88c79574
2.3 KB | 100 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
import {
20
  AuthenticatedRequest
21
} from '@app/middleware/auth';
22

23
// XXX: I've regreted already
24
interface SingleFileRequest extends AuthenticatedRequest {
25
  file?: any;
26
}
27

28
export const UsersController = {
29
  create: async (req: Request, res: Response, next: NextFunction) => {
30
    try {
31
      const parsed = CreateUserSchema.safeParse(req.body.user);
32

33
      if (!parsed.success) {
34
        return res.status(422).json({
35
          errors: parsed.error!.issues
36
        })
37
      }
38

39
      const user = await createUser(parsed.data);
40
      const jwtToken = generateToken(user.id, user.email);
41

42
      const mailQueue = getQueue('mail');
43
      const job = await mailQueue.add(MailJobName.WelcomeEmail, { userId: user.id });
44

45
      res.status(201).json({
46
        token: jwtToken
47
      });
48
    } catch (err) {
49
      next(err);
50
    }
51
  },
52

53
  update: async (req: Request, res: Response, next: NextFunction) => {
54
    try {
55
      const { id } = req.params;
56

57
      const parsed = UpdateUserSchema.safeParse(req.body.user);
58
      if (!parsed.success) {
59
        return res.status(400).json({
60
          errors: parsed.error!.issues
61
        });
62
      }
63

64
      const user = await findUserById(Number(id));
65

66
      if (!user) {
67
        return res.status(404).json({
68
          error: "Usuário não encontrado"
69
        });
70
      }
71

72
      const updated = await updateUser(parsed.data);
73

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

83
  updateAvatar: async (req: SingleFileRequest, res: Response, next: NextFunction) => {
84
    try {
85
      if (!req.file) {
86
        return res.status(400).json({ error: 'No file uploaded' });
87
      }
88

89
      res.json({
90
        message: 'File uploaded successfully',
91
        fileLocation: req.file.location,
92
        key: req.file.key,
93
        filename: req.file.originalname,
94
        size: req.file.size
95
      });
96
    } catch (err) {
97
      next(err);
98
    }
99
  }
100
}