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 filesParents
9c32546Changed 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;