From 9943786c36af5be45b5c6157fbd9ea4f20c0a66a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20L=C3=A1szl=C3=B3?= <rlacko99@gmail.com> Date: Thu, 24 Dec 2020 22:25:49 +0100 Subject: [PATCH] accept user picture --- src/middlewares/files/deleteFile.ts | 27 +++++++++++++++++++ src/middlewares/user/acceptPicture.ts | 37 +++++++++++++++++++++++++++ src/routes/user.ts | 14 +++++++++- 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 src/middlewares/files/deleteFile.ts create mode 100644 src/middlewares/user/acceptPicture.ts diff --git a/src/middlewares/files/deleteFile.ts b/src/middlewares/files/deleteFile.ts new file mode 100644 index 00000000..107a6337 --- /dev/null +++ b/src/middlewares/files/deleteFile.ts @@ -0,0 +1,27 @@ +import { NextFunction, Request, Response } from "express"; + +import File from "../../models/FileSchema"; +import Profile from "../../models/ProfileSchema"; +import fs from "fs"; + +/** + * Deletes the file if exists. Careful, doesn't remove reference! + */ +const deleteFile = () => async ( + req: Request, + res: Response, + next: NextFunction +) => { + try { + if (!res.data.value) return next(); + + const oldFile = await File.findByIdAndRemove(res.data.value).lean().exec(); + if (oldFile) fs.unlinkSync(oldFile!.path); + + next(); + } catch (err) { + next(err); + } +}; + +export default deleteFile; diff --git a/src/middlewares/user/acceptPicture.ts b/src/middlewares/user/acceptPicture.ts new file mode 100644 index 00000000..507accb8 --- /dev/null +++ b/src/middlewares/user/acceptPicture.ts @@ -0,0 +1,37 @@ +import { NextFunction, Request, Response } from "express"; +import Profile, { IProfile } from "../../models/ProfileSchema"; + +/** + * userId -> updates the user + */ +const acceptPicture = () => async ( + req: Request, + res: Response, + next: NextFunction +) => { + try { + if (!res.data.profile?.picture) + return res.status(400).json({ + message: "The User doesn't have any unaccepted Profile picture!", + }); + + await Profile.updateOne( + { _id: req.params.userId }, + { + $set: { + picture: undefined, + acceptedPicture: res.data.profile?.picture, + }, + }, + { upsert: true, runValidators: true } + ) + .lean() + .exec(); + + next(); + } catch (err) { + next(err); + } +}; + +export default acceptPicture; diff --git a/src/routes/user.ts b/src/routes/user.ts index d37b39a9..2090a1f4 100644 --- a/src/routes/user.ts +++ b/src/routes/user.ts @@ -1,7 +1,10 @@ import { Application } from "express"; +import acceptPicture from "../middlewares/user/acceptPicture"; import createdResponse from "../middlewares/utils/createdResponse"; +import deleteFile from "../middlewares/files/deleteFile"; import deleteUser from "../middlewares/user/deleteUser"; import example from "../middlewares/example"; +import getFieldValue from "../middlewares/utils/getFieldValue"; import getUser from "../middlewares/user/getUser"; import getUserWarningsList from "../middlewares/user/getUserWarningsList"; import getUsersList from "../middlewares/user/getUsersList"; @@ -93,7 +96,16 @@ const usersRoute = (prefix: string, app: Application): void => { noContentResponse() ); // Accept/Reject a users picture TODO - app.post(`${prefix}/user/:userId/picture/accept`, example()); + app.post( + `${prefix}/user/:userId/picture/accept`, + isRegistered(), + isStaffOrAdmin(), + getUser(), + getFieldValue("profile", "acceptedPicture"), + deleteFile(), + acceptPicture(), + noContentResponse() + ); app.post(`${prefix}/user/:userId/picture/reject`, example()); }; -- GitLab