diff --git a/src/middlewares/news/addNews.ts b/src/middlewares/news/addNews.ts index fe27476ee292aadbe69d0f595901769d31184b42..7c8ef3c5b3059f564741fc7e9ca61eeeeed28714 100644 --- a/src/middlewares/news/addNews.ts +++ b/src/middlewares/news/addNews.ts @@ -2,44 +2,36 @@ import { NextFunction, Request, Response } from "express"; import News from "../../models/NewsSchema"; import { ValidationError } from "../utils/ValidationError"; +import { validateFields } from "../utils/validateFields"; -const addNews = () => { - return (req: Request, res: Response, next: NextFunction) => { - try { - const news = new News(); - - // Check required fields - const fields = [ - { name: "title", required: true }, - { name: "text", required: true }, - ]; - fields.forEach((field) => { - const value = req.body[field.name]; - if (field.required && !value) { - res.status(400); - throw new ValidationError(400, `Field: {${field.name}} is required!`); - } - if (value) news.set(field.name, value); - }); - - news.publishedAt = new Date().toDateString(); - - news.save((err) => { - if (err) { - res.status(400); - } else { - res.status(201); - res.data.newsObject = news; - } - next(); - }); - } catch (error) { - if (error instanceof ValidationError) { - const { code, message } = error; - return res.status(code).send({ message }); - } - } - }; +const fields = [ + { name: "title", required: true }, + { name: "text", required: true }, +]; + +/** + * Create a New Article + */ +const addNews = () => async ( + req: Request, + res: Response, + next: NextFunction +) => { + const news = new News(); + + // Validate and set fields from request body + validateFields({ fields, reqBody: req.body }); + fields.forEach((field) => { + const value = req.body[field.name]; + if (value) news.set(field.name, req.body[field.name]); + }); + + news.publishedAt = new Date(); + + await news.save(); + + res.data.newsObject = news; + next(); }; export default addNews; diff --git a/src/middlewares/news/deleteNews.ts b/src/middlewares/news/deleteNews.ts index 4382737857e889728d7c15d6b7c6f3bea252494f..8e33524750d674162249b24b0f21cfa40d3d2b59 100644 --- a/src/middlewares/news/deleteNews.ts +++ b/src/middlewares/news/deleteNews.ts @@ -2,17 +2,14 @@ import { NextFunction, Request, Response } from "express"; import News from "../../models/NewsSchema"; -const deleteNews = () => { - return (req: Request, res: Response, next: NextFunction) => { - News.findByIdAndDelete(req.params.id, (error, result) => { - if (!error) { - res.status(204); - res.json({}); - } else { - console.warn(error); - } - }); - }; +const deleteNews = () => async ( + req: Request, + res: Response, + next: NextFunction +) => { + await News.findByIdAndDelete(req.params.id).lean().exec(); + + res.status(204).send(); }; export default deleteNews; diff --git a/src/middlewares/news/getNews.ts b/src/middlewares/news/getNews.ts index f99829e7079f3135bb08fbe8dbeba024d18da538..e8b14899b06f609457f182ca8ede4846ed7357b4 100644 --- a/src/middlewares/news/getNews.ts +++ b/src/middlewares/news/getNews.ts @@ -2,18 +2,17 @@ import { NextFunction, Request, Response } from "express"; import News from "../../models/NewsSchema"; -const getNews = () => { - return (req: Request, res: Response, next: NextFunction) => { - News.findById(req.params.id, (error, result) => { - if (!error) { - res.status(200); - res.data.newsObject = result; - } else { - console.warn(error); - } - next(); - }); - }; +/** + * Get one News with id = req.params.id + * and set res.data.newsObject + */ +const getNews = () => async ( + req: Request, + res: Response, + next: NextFunction +) => { + res.data.newsObject = await News.findById(req.params.id).lean().exec(); + next(); }; export default getNews; diff --git a/src/middlewares/news/getNewsList.ts b/src/middlewares/news/getNewsList.ts index 3f26b9006288c96241e617735fed88dc7eafb6be..ae6bbefceb5c5c43637f09ad46fe3d14e8e9d45d 100644 --- a/src/middlewares/news/getNewsList.ts +++ b/src/middlewares/news/getNewsList.ts @@ -2,15 +2,17 @@ import { NextFunction, Request, Response } from "express"; import News from "../../models/NewsSchema"; -const getNewsList = () => { - return (req: Request, res: Response, next: NextFunction) => { - News.find({}, (err, news) => { - if (!err) { - res.data.news = news; - } - next(); - }); - }; +/** + * Get all news and set res.data.news + * + */ +const getNewsList = () => async ( + req: Request, + res: Response, + next: NextFunction +) => { + res.data.news = await News.find(); + next(); }; export default getNewsList; diff --git a/src/middlewares/news/updateNews.ts b/src/middlewares/news/updateNews.ts index 87aac3b72693ea22828e00c466a73a08fb3a8b20..baa113bf8ba57c9124634ce61ce1785083481541 100644 --- a/src/middlewares/news/updateNews.ts +++ b/src/middlewares/news/updateNews.ts @@ -1,29 +1,26 @@ import News, { INews } from "../../models/NewsSchema"; import { NextFunction, Request, Response } from "express"; -const updateNews = () => { - return (req: Request, res: Response, next: NextFunction) => { - let news = res.data.newsObject; - if (news) { - const updatedNews: Partial<INews> = req.body; - if (updatedNews.title) { - news.title = updatedNews.title; - } +// Valid fields to update +const validFields = ["title", "text"]; - if (updatedNews.text) { - news.text = updatedNews.text; - } +const updateNews = () => async ( + req: Request, + res: Response, + next: NextFunction +) => { + const news = await News.findById(req.params.id).exec(); - news.save((err) => { - if (err) { - } else { - res.status(201); - res.data.newsObject = news; - } - next(); - }); - } - }; + if (news) { + validFields.forEach((field) => { + const value = req.body[field]; + if (value) news.set(field, value); + }); + await news.save(); + } + res.data.newsObject = news; + + next(); }; export default updateNews; diff --git a/src/middlewares/user/deleteUser.ts b/src/middlewares/user/deleteUser.ts index f36252985f704e9ba209128942f16edcd70acb9d..76e732659bc3feb401c846509f9e5a35e77e56bb 100644 --- a/src/middlewares/user/deleteUser.ts +++ b/src/middlewares/user/deleteUser.ts @@ -11,7 +11,7 @@ const deleteUser = () => async ( next: NextFunction ) => { await Profile.findByIdAndDelete(req.params.id); - next(); + res.status(204).send(); }; export default deleteUser; diff --git a/src/middlewares/user/updateUser.ts b/src/middlewares/user/updateUser.ts index 29ef9816397d3b9e5fa2b9bf8a91602132548650..de64f0988570dbe8bd2da5464a0a1f3c8a0d4ccc 100644 --- a/src/middlewares/user/updateUser.ts +++ b/src/middlewares/user/updateUser.ts @@ -20,7 +20,7 @@ const updateUser = () => async ( const value = req.body[field]; if (value) profile.set(field, value); }); - profile.save(); + await profile.save(); } res.data.profile = profile; diff --git a/src/models/NewsSchema.ts b/src/models/NewsSchema.ts index 5d0ad367199a7cf2a4ef67bc6e3775835019475d..e82064d5e6817af472547b8b25a518b3bf285f5f 100644 --- a/src/models/NewsSchema.ts +++ b/src/models/NewsSchema.ts @@ -3,29 +3,13 @@ import { Document, Schema, model } from "mongoose"; export interface INews extends Document { title: string; text: string; - /* author : { - // id: IUser["_id"], - userName: string, - }, - editedBy?: { - // id: IUser["_id"], - userName: string, - }, */ - publishedAt: string; + publishedAt: Date; } const NewsSchema = new Schema({ title: { type: String, required: true }, text: { type: String, required: true }, - /* author : { - id: { type: Schema.Types.ObjectId, required: true }, - userName: { type: String, required: true } - }, - editedBy: { - id: { type: Schema.Types.ObjectId, required: true }, - userName: { type: String, required: true } - }, */ - publishedAt: { type: String, required: true }, + publishedAt: { type: Date, required: true }, }); export default model<INews>("News", NewsSchema);