From df85d3190b4a1f5d67be6ca2946c95070dd93b0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20L=C3=A1szl=C3=B3?= <rlacko99@gmail.com> Date: Fri, 25 Dec 2020 20:00:21 +0100 Subject: [PATCH] updated news middlewares --- src/middlewares/news/addNews.ts | 3 +- src/middlewares/news/deleteNews.ts | 3 +- src/middlewares/news/getNewsList.ts | 2 +- .../news/{getNews.ts => getOneNews.ts} | 9 ++-- ...sponseNewsObject.ts => responseOneNews.ts} | 8 ++-- src/middlewares/news/updateNews.ts | 24 ++++++----- src/routes/news.ts | 41 ++++++++++++++++--- src/utils/declarations/response.d.ts | 4 +- 8 files changed, 66 insertions(+), 28 deletions(-) rename src/middlewares/news/{getNews.ts => getOneNews.ts} (56%) rename src/middlewares/news/{responseNewsObject.ts => responseOneNews.ts} (54%) diff --git a/src/middlewares/news/addNews.ts b/src/middlewares/news/addNews.ts index 4be1fe97..b0d9f0c9 100644 --- a/src/middlewares/news/addNews.ts +++ b/src/middlewares/news/addNews.ts @@ -27,10 +27,11 @@ const addNews = () => async ( }); news.publishedAt = new Date(); + news.publishedBy = req.session.user!.id!; await news.save(); - res.data.newsObject = news; + res.data.newObjectId = news._id; next(); } catch (err) { next(err); diff --git a/src/middlewares/news/deleteNews.ts b/src/middlewares/news/deleteNews.ts index 406b1338..e101b29c 100644 --- a/src/middlewares/news/deleteNews.ts +++ b/src/middlewares/news/deleteNews.ts @@ -9,8 +9,7 @@ const deleteNews = () => async ( next: NextFunction ) => { try { - const news = await News.findByIdAndRemove(req.params.id).lean().exec(); - if (!news) throw new ErrorHandler(404, "News not found!"); + const news = await News.findByIdAndRemove(req.params.newsId).lean().exec(); next(); } catch (err) { next(err); diff --git a/src/middlewares/news/getNewsList.ts b/src/middlewares/news/getNewsList.ts index 21b6f71e..7db23693 100644 --- a/src/middlewares/news/getNewsList.ts +++ b/src/middlewares/news/getNewsList.ts @@ -12,7 +12,7 @@ const getNewsList = () => async ( next: NextFunction ) => { try { - res.data.news = await News.find(); + res.data.news = await News.find().lean().exec(); next(); } catch (err) { next(err); diff --git a/src/middlewares/news/getNews.ts b/src/middlewares/news/getOneNews.ts similarity index 56% rename from src/middlewares/news/getNews.ts rename to src/middlewares/news/getOneNews.ts index 2f8e60a6..c2c610fd 100644 --- a/src/middlewares/news/getNews.ts +++ b/src/middlewares/news/getOneNews.ts @@ -6,17 +6,20 @@ import News from "../../models/NewsSchema"; * Get one News with id = req.params.id * and set res.data.newsObject */ -const getNews = () => async ( +const getOneNews = () => async ( req: Request, res: Response, next: NextFunction ) => { try { - res.data.newsObject = await News.findById(req.params.id).lean().exec(); + res.data.oneNews = await News.findById(req.params.newsId).lean().exec(); + if (!res.data.oneNews) + return res.status(404).json({ message: "News not found!" }); + next(); } catch (err) { next(err); } }; -export default getNews; +export default getOneNews; diff --git a/src/middlewares/news/responseNewsObject.ts b/src/middlewares/news/responseOneNews.ts similarity index 54% rename from src/middlewares/news/responseNewsObject.ts rename to src/middlewares/news/responseOneNews.ts index abcf8d59..bc7f0713 100644 --- a/src/middlewares/news/responseNewsObject.ts +++ b/src/middlewares/news/responseOneNews.ts @@ -3,12 +3,12 @@ import { NextFunction, Request, Response, response } from "express"; /** * Return the found user from res.data.profile */ -const responseNewsObject = () => (req: Request, res: Response) => { - if (!res.data.newsObject) { +const responseOneNews = () => (req: Request, res: Response) => { + if (!res.data.oneNews) { res.status(404).json({ message: "News not found!" }); } else { - res.json(res.data.newsObject); + res.json(res.data.oneNews); } }; -export default responseNewsObject; +export default responseOneNews; diff --git a/src/middlewares/news/updateNews.ts b/src/middlewares/news/updateNews.ts index 8be12bb9..b1137de1 100644 --- a/src/middlewares/news/updateNews.ts +++ b/src/middlewares/news/updateNews.ts @@ -2,7 +2,7 @@ import News, { INews } from "../../models/NewsSchema"; import { NextFunction, Request, Response } from "express"; // Valid fields to update -const validFields = ["title", "text"]; +const validFields: Partial<keyof INews>[] = ["title", "text"]; /** * Update a News Object @@ -13,16 +13,20 @@ const updateNews = () => async ( next: NextFunction ) => { try { - const news = await News.findById(req.params.id).exec(); + let newFields: Partial<INews> = {}; + validFields.forEach((field) => { + const value = req.body[field]; + if (value) newFields[field] = value; + }); + newFields["updatedBy"] = req.session.user?.id; - if (news) { - validFields.forEach((field) => { - const value = req.body[field]; - if (value) news.set(field, value); - }); - await news.save(); - } - res.data.newsObject = news; + await News.updateOne( + { _id: req.params.newsId }, + { $set: newFields }, + { upsert: true, runValidators: true } + ) + .lean() + .exec(); next(); } catch (err) { diff --git a/src/routes/news.ts b/src/routes/news.ts index adf19929..df5693a1 100644 --- a/src/routes/news.ts +++ b/src/routes/news.ts @@ -1,18 +1,49 @@ import { Application, Response } from "express"; +import addNews from "../middlewares/news/addNews"; +import createdResponse from "../middlewares/utils/createdResponse"; +import deleteNews from "../middlewares/news/deleteNews"; import example from "../middlewares/example"; +import getNewsList from "../middlewares/news/getNewsList"; +import getOneNews from "../middlewares/news/getOneNews"; +import isRegistered from "../middlewares/auth/isRegistered"; +import isStaffOrAdmin from "../middlewares/auth/isStaffOrAdmin"; +import noContentResponse from "../middlewares/utils/noContentResponse"; +import responseNews from "../middlewares/news/responseNews"; +import responseOneNews from "../middlewares/news/responseOneNews"; +import updateNews from "../middlewares/news/updateNews"; const newsRoute = (prefix: string, app: Application): void => { // Get all news - app.get(`${prefix}/`, example()); + app.get(`${prefix}/`, getNewsList(), responseNews()); // Add a new News - app.post(`${prefix}/`, example()); + app.post( + `${prefix}/`, + isRegistered(), + isStaffOrAdmin(), + addNews(), + createdResponse() + ); // Get a News - app.get(`${prefix}/one/:newsId`, example()); + app.get(`${prefix}/one/:newsId`, getOneNews(), responseOneNews()); // Update a News - app.put(`${prefix}/one/:newsId`, example()); + app.put( + `${prefix}/one/:newsId`, + isRegistered(), + isStaffOrAdmin(), + getOneNews(), + updateNews(), + noContentResponse() + ); // Delete a News - app.delete(`${prefix}/one/:newsId`, example()); + app.delete( + `${prefix}/one/:newsId`, + isRegistered(), + isStaffOrAdmin(), + getOneNews(), + deleteNews(), + noContentResponse() + ); }; export default newsRoute; diff --git a/src/utils/declarations/response.d.ts b/src/utils/declarations/response.d.ts index 1e9abe0d..c912e8d5 100644 --- a/src/utils/declarations/response.d.ts +++ b/src/utils/declarations/response.d.ts @@ -17,9 +17,9 @@ declare global { member?: Partial<IMember> | null; members?: Partial<IMember>[] | null; memberState?: IMember["state"] | null; - news?: Partial<INews>[] | null; - newsObject?: Partial<INews> | null; + oneNews?: Partial<INews> | null; + profiles?: Partial<IProfile>[] | null; error?: string | null; files?: Partial<IFile>[] | null; -- GitLab