diff --git a/src/middlewares/files/deleteFile.ts b/src/middlewares/files/deleteFile.ts new file mode 100644 index 0000000000000000000000000000000000000000..107a6337e9be7725cd0459771cae9e221c509bb7 --- /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 0000000000000000000000000000000000000000..507accb88b0378dcd896c6c93a7ae23850a56380 --- /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 d37b39a93e280350b813e36875499025a48c9a2f..2090a1f45c6a9d79752f3ddb23e3c82a34c0a67b 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()); };