api: improve add and remove user's avatar
Could it be a single endpoint? Yeah, but for now this will do
Parents:
9c325462 file(s) changed
- api/src/controllers/users.ts +51 -1
- api/src/routes/users.ts +2 -1
api/src/controllers/users.ts
@@ -20,6 +20,10 @@ 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;
@@ -86,15 +90,61 @@ 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
@@ -7,6 +7,7 @@ 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;