diff --git a/src/middlewares/files/card/cardImageStorage.ts b/src/middlewares/files/card/cardImageStorage.ts index 21b9a1ca10a49969b025721625ea9cada2e75ebe..8372d0dc883ea5d4009ce39a7789759d3ed57c0b 100644 --- a/src/middlewares/files/card/cardImageStorage.ts +++ b/src/middlewares/files/card/cardImageStorage.ts @@ -1,5 +1,4 @@ import multer from "multer"; -import path from "path"; export const cardImageStorage = multer.diskStorage({ destination: function (req, file, callback) { diff --git a/src/middlewares/files/card/getCardImage.ts b/src/middlewares/files/card/getCardImage.ts index 8c518a321c7fcbc343a94f70c33fceb79542270d..18a273f2d1b3870bc7c0650d67278a31f1a161ab 100644 --- a/src/middlewares/files/card/getCardImage.ts +++ b/src/middlewares/files/card/getCardImage.ts @@ -1,30 +1,22 @@ import { NextFunction, Request, Response } from "express"; import CardImage from "../../../models/CardImageSchema"; -import File from "../../../models/FileSchema"; -import Profile from "../../../models/ProfileSchema"; -import fs from "fs"; +/** + * Get the Entry card background image + * and set res.data.cardImage + * + * @param {Request} req + * @param {Response} res + * @param {NextFunction} next + */ const getCardImage = () => async ( req: Request, res: Response, next: NextFunction ) => { - CardImage.findOne({}, async (error, cardImage) => { - if (error) { - console.warn(error); - res.status(400); - } else { - if (!!cardImage) { - const file = await File.findById(cardImage!.imageId).exec(); - - res.status(200); - - res.data.cardImage = cardImage; - } - next(); - } - }); + res.data.cardImage = await CardImage.findOne().lean().exec(); + next(); }; export default getCardImage; diff --git a/src/middlewares/files/card/getUserCard.ts b/src/middlewares/files/card/getUserCard.ts index 75f78a65d8ca2b73cec5ab2685e350ebdf3e95e4..c682239f0855651b5f946606989eb00dfbb508b9 100644 --- a/src/middlewares/files/card/getUserCard.ts +++ b/src/middlewares/files/card/getUserCard.ts @@ -2,58 +2,64 @@ import { NextFunction, Request, Response } from "express"; import Card from "../../../models/CardSchema"; import File from "../../../models/FileSchema"; -import Profile from "../../../models/ProfileSchema"; import fs from "fs"; -const getUserCard = () => async ( +/** + * Generate Entry card svg from Users data and card + * + * @param {Request} req + * @param {Response} res + * @param {NextFunction} next + * @return {*} Generated svg file + */ +const getUserCard = (): any => async ( req: Request, res: Response, next: NextFunction ) => { - Card.findOne({ userId: res.data.profile?.id }, async (error, card) => { - if (error) { - console.warn(error); - res.status(400); - } else { - if (!card) return res.status(404).send("The user doesn't have any card!"); - let profilePicture = "data:image/png;base64,"; - if (!!res.data.profile!.pictureId) { - const file = await File.findById(res.data.profile!.pictureId).exec(); - profilePicture += fs.readFileSync(file!.path, "base64"); - } else - profilePicture += fs.readFileSync( - "src/utils/card/profile_picture.png", - "base64" - ); - - let bgPicture; - if (!res.data.cardImage) - bgPicture = - "data:image/png;base64," + - fs.readFileSync("src/utils/card/background.png", "base64"); - else { - const bgFile = await File.findById(res.data.cardImage.imageId).exec(); - bgPicture = - "data:image/png;base64," + fs.readFileSync(bgFile!.path, "base64"); - } - - const svg = fs.readFileSync("src/utils/card/template.svg", "utf8"); - - const result = svg - .replace(/{{profile_picture}}/g, profilePicture) - .replace(/{{background_image}}/g, bgPicture) - .replace(/{{full_name}}/g, String(card?.fullName)) - .replace(/{{room_number}}/g, String(card?.roomNumber)) - .replace(/{{card_number}}/g, String(card?.cardId)) - .replace( - /{{expiration_date}}/g, - String(card?.expirationDate.toISOString().split("T")[0]) - ); - - res.type("svg"); - return res.send(result); - } - }); + const userCard = await Card.findOne({ userId: res.data.profile?.id }) + .lean() + .exec(); + if (!userCard) + return res.status(404).json({ message: "The user doesn't have any card!" }); + + let profilePicture = "data:image/png;base64,"; + if (!res.data.profile!.pictureId) { + profilePicture += fs.readFileSync( + "src/utils/card/profile_picture.png", + "base64" + ); + } else { + const profilePicFile = await File.findById(res.data.profile!.pictureId) + .lean() + .exec(); + profilePicture += fs.readFileSync(profilePicFile!.path, "base64"); + } + + let bgPicture = "data:image/png;base64,"; + if (!res.data.cardImage) + bgPicture += fs.readFileSync("src/utils/card/background.png", "base64"); + else { + const bgFile = await File.findById(res.data.cardImage.imageId) + .lean() + .exec(); + bgPicture += fs.readFileSync(bgFile!.path, "base64"); + } + + const svg = fs.readFileSync("src/utils/card/template.svg", "utf8"); + + const result = svg + .replace(/{{profile_picture}}/g, profilePicture) + .replace(/{{background_image}}/g, bgPicture) + .replace(/{{full_name}}/g, String(userCard?.fullName)) + .replace(/{{room_number}}/g, String(userCard?.roomNumber)) + .replace(/{{card_number}}/g, String(userCard?.cardId)) + .replace( + /{{expiration_date}}/g, + String(userCard?.expirationDate.toISOString().split("T")[0]) + ); + + return res.type("svg").send(result); }; export default getUserCard; diff --git a/src/middlewares/files/card/responseCardImage.ts b/src/middlewares/files/card/responseCardImage.ts index 211eea2061efa63c3cdc6dd461505c7e49a4e6ab..a6a3f0b4f4337b92a8a2ccc4b4985da4a7fbab41 100644 --- a/src/middlewares/files/card/responseCardImage.ts +++ b/src/middlewares/files/card/responseCardImage.ts @@ -1,14 +1,22 @@ -import { NextFunction, Request, Response, response } from "express"; +import { Request, Response } from "express"; import File from "../../../models/FileSchema"; -const responseCardImage = () => async (req: Request, res: Response) => { - if (!res.data.cardImage) { - res.status(404).json({ message: "Card Image not found" }); - } else { - const cardImage = await File.findById(res.data.cardImage.imageId).exec(); - return res.sendFile(cardImage!.path, { root: "." }); - } +/** + * Return the Entry card background Image + * + * @param {Request} req + * @param {Response} res + * @return {*} The Found CardImage or the default + */ +const responseCardImage = (): any => async (req: Request, res: Response) => { + if (!res.data.cardImage) + return res.sendFile("src/utils/card/background.png", { root: "." }); + + const cardImage = await File.findById(res.data.cardImage.imageId) + .lean() + .exec(); + return res.sendFile(cardImage!.path, { root: "." }); }; export default responseCardImage; diff --git a/src/middlewares/files/card/uploadCardImage.ts b/src/middlewares/files/card/uploadCardImage.ts index e0e59b3c5df600d7166044611093eecde36cd8d3..5b17688375871db3475e3408bb922cbb80584853 100644 --- a/src/middlewares/files/card/uploadCardImage.ts +++ b/src/middlewares/files/card/uploadCardImage.ts @@ -2,61 +2,54 @@ import { NextFunction, Request, Response } from "express"; import CardImage from "../../../models/CardImageSchema"; import File from "../../../models/FileSchema"; -import Profile from "../../../models/ProfileSchema"; -import { fileFilter } from "../fileFilter"; import fs from "fs"; +/** + * Upload a new Card background Image + * + * @param {Request} req + * @param {Response} res + * @param {NextFunction} next + * @return {*} 200 Status code if uploaded + */ const uploadCardImage = () => async ( req: Request, res: Response, next: NextFunction ) => { - const uploadedFile = req.file; - CardImage.findOne({}, async (error, cardImage) => { - if (error) { - console.warn(error); - res.status(400); - } else { - if (!!cardImage) { - const oldFile = await File.findById(cardImage.imageId).exec(); - fs.unlink(oldFile!.path, (err) => { - if (err) { - console.error(err); - } - }); - - await File.deleteOne({ _id: oldFile?.id }).exec(); - } - const newFile = new File(); - - newFile.originalName = uploadedFile.originalname; - newFile.uploadDate = new Date(); - newFile.path = uploadedFile.path; - newFile.mimeType = uploadedFile.mimetype; - - await newFile.save((err) => { - if (err) { - return res.status(400); - } - }); - - if (!cardImage) { - const cardImage = new CardImage(); - cardImage.imageId = newFile.id; - - await cardImage.save((err) => { - if (err) return res.status(400); - }); - } else { - await CardImage.updateOne( - { _id: cardImage?.id }, - { imageId: newFile.id } - ).exec(); - } - - return res.status(200).send(true); - } - }); + const oldCardImage = await CardImage.findOne().lean().exec(); + + if (oldCardImage) { + const oldFile = await File.findByIdAndRemove(oldCardImage.imageId) + .lean() + .exec(); + + fs.unlink(oldFile!.path, (err) => { + throw err; + }); + } + + const newFile = new File(); + newFile.originalName = req.file.originalname; + newFile.uploadDate = new Date(); + newFile.path = req.file.path; + newFile.mimeType = req.file.mimetype; + + await newFile.save(); + + if (oldCardImage) { + await CardImage.updateOne( + { _id: oldCardImage?.id }, + { imageId: String(newFile.id) } + ).exec(); + } else { + const cardImage = new CardImage(); + cardImage.imageId = String(newFile.id); + + await cardImage.save(); + } + + return res.status(200).send(); }; export default uploadCardImage;