eletrotupi / tcc/ commit / ded6090

api: improve add and remove user's avatar

Could it be a single endpoint? Yeah, but for now this will do
Pedro Lucas Porcellis porcellis@eletrotupi.com · 5 months ago ded6090f16fd0c3268ecefa120f37740ce837f40 Browse files
Parents 9c32546
Changed files
2
Additions
+53
Deletions
-2
api/src/controllers/users.ts
1 1
import { Request, Response, NextFunction } from 'express';
2 2
import {
3 3
  generateToken
4 4
} from '@app/services/auth.service';
5 5

18 18

19 19
import {
20 20
  AuthenticatedRequest
21 21
} from '@app/middleware/auth';
22 22

23 +
import { prisma } from '@app/lib/prisma';
24 +
import s3 from '@app/lib/s3';
25 +
import { DeleteObjectCommand } from '@aws-sdk/client-s3';
26 +

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

84 88
    try {
85 89
      if (!req.file) {
86 90
        return res.status(400).json({ error: 'No file uploaded' });
87 91
      }
88 92

93 +
      const currentUser = await findUserById(Number(req.userId));
94 +
      if (currentUser?.avatarKey) {
95 +
        await s3.send(
96 +
          new DeleteObjectCommand({
97 +
            Bucket: process.env.S3_BUCKET!, Key: currentUser?.avatarKey!
98 +
          })
99 +
        );
100 +
      }
101 +

102 +
      const user = await prisma.user.update({
103 +
        where: {
104 +
          id: currentUser?.id
105 +
        }, data: {
106 +
          avatarURL: req.file.location,
107 +
          avatarKey: req.file.key
108 +
        }
109 +
      });
110 +

89 111
      res.json({
90 112
        message: 'File uploaded successfully',
91 113
        fileLocation: req.file.location,
92 114
        key: req.file.key,
93 115
        filename: req.file.originalname,
94 -
        size: req.file.size
116 +
        size: req.file.size,
117 +
        user: user
95 118
      });
96 119
    } catch (err) {
97 120
      next(err);
98 121
    }
122 +
  },
123 +

124 +
  removeAvatar: async (req: AuthenticatedRequest, res: Response, next: NextFunction) => {
125 +
    const currentUser = await findUserById(Number(req.userId));
126 +

127 +
    if (currentUser && currentUser?.avatarKey == null) {
128 +
      return res.json({ user: currentUser })
129 +
    }
130 +

131 +
    await s3.send(
132 +
      new DeleteObjectCommand({
133 +
        Bucket: process.env.S3_BUCKET!, Key: currentUser?.avatarKey!
134 +
      })
135 +
    );
136 +

137 +
    const user = await prisma.user.update({
138 +
      where: {
139 +
        id: req.userId
140 +
      }, data: {
141 +
        avatarURL: null,
142 +
        avatarKey: null
143 +
      }
144 +
    });
145 +

146 +
    return res.json({
147 +
      user
148 +
    })
99 149
  }
100 150
}
api/src/routes/users.ts
1 1
import { Router } from "express";
2 2
import { UsersController } from '@app/controllers/users';
3 3
import multer from '@app/services/avatar';
4 4
import { requireAuth } from '@app/middleware/auth';
5 5

6 6
const router = Router();
7 7

8 8
router.post('/', UsersController.create);
9 9
router.put('/:id', UsersController.update);
10 -
router.post('/:id/avatar', requireAuth, multer.single('avatar'), UsersController.updateAvatar);
10 +
router.post('/me/avatar', requireAuth, multer.single('avatar'), UsersController.updateAvatar);
11 +
router.delete('/me/avatar', requireAuth, UsersController.removeAvatar);
11 12

12 13
export default router;