diff --git a/src/middlewares/news/addNews.ts b/src/middlewares/news/addNews.ts index 4be1fe97e8a6805c8a9059e674e63c6195dd4a9e..b0d9f0c988f1b09d7dc6c16efea5711c0f38594b 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 406b13381c488d42e56e855de82fc5f5a7b4b51d..e101b29c26f3e73961d3cb330909f90da7619f12 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 21b6f71e4d52d7fda3becf97b5bd32433eb4b396..7db236939e82c0ce22af35f22e5443501b2b591f 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 2f8e60a6473aa2d2c688e65cd8b4c55196c75f8c..c2c610fd18d75e1e9f2bdba9a1dca6597e86d740 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 abcf8d595e0e04a29b1df9d03d3910c650ae0e95..bc7f0713018170a6a59a56fb639099f396195350 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 8be12bb9b85310d5818650019d513ab6b0341330..b1137de14b84b7b054b5c7e76076050611a9e6cc 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 adf199297ca337505c25e8d5372a46a30fc04bfd..df5693a1328b72255ea260a33f635539c9037928 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 1e9abe0d3454c291e80dc4661051a83e2e76951f..c912e8d56d8e463feda26b8522740602b83c6a59 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;