diff --git a/nodemon.json b/nodemon.json index 4df56ed0c5d5d53f10b139aa6fcdfebe598dde8f..2220bb3e3a3e2e97e1122aa9b7a9c480a63e88fa 100644 --- a/nodemon.json +++ b/nodemon.json @@ -2,5 +2,5 @@ "watch": ["src"], "ext": "ts", "ignore": ["src/public"], - "exec": "NODE_ENV=development ts-node src/index.ts" + "exec": "ts-node --files src/index.ts" } diff --git a/src/index.ts b/src/index.ts index f26f67e492a27ba99a225895c19e6a6b7faa0c30..d4d4e03a90526f68b863acfb68616cf0268762d4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,26 @@ -import "./utils/env" +import "./utils/env"; import express, { Request, Response, NextFunction, Application } from "express"; +import mongoose from "mongoose"; import bodyParser from "body-parser"; import expressSession from "express-session"; -import authRoute from './routes/auth'; -import userRoute from './routes/user'; +import authRoute from "./routes/auth"; +import newsRoute from "./routes/news"; + +mongoose + .connect("mongodb://localhost:27017/bodysch", { + useNewUrlParser: true, + useCreateIndex: true, + useUnifiedTopology: true + }) + .then(() => { + console.log("Connected to database"); + }) + .catch(err => { + console.log( + "MongoDB connection error. Please make sure MongoDB is running. " + err + ); + // process.exit(); + }); const app: Application = express(); @@ -26,6 +43,9 @@ app.get("/", (req: Request, res: Response) => { // Register routes authRoute(app); +// Register routes +newsRoute(app); + app.use((err: any, req: Request, res: Response, next: NextFunction) => { res.status(500).send("Houston, we have a problem!"); diff --git a/src/middlewares/.gitkeep b/src/middlewares/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/middlewares/news/addNews.ts b/src/middlewares/news/addNews.ts new file mode 100644 index 0000000000000000000000000000000000000000..43c6437fa20c7d7808dd93b7415c8fb969f616db --- /dev/null +++ b/src/middlewares/news/addNews.ts @@ -0,0 +1,22 @@ +import { Request, Response, NextFunction } from "express"; +import News from "../../models/NewsSchema"; + +const addNews = () => { + return (req: Request, res: Response, next: NextFunction) => { + const news = new News(); + news.title = req.body.title; + news.text = req.body.text; + news.publishedAt = new Date().toDateString(); + + news.save(err => { + if (err) { + } else { + res.status(201); + res.data.newsObject = news; + } + next(); + }); + }; +}; + +export default addNews; diff --git a/src/middlewares/news/deleteNews.ts b/src/middlewares/news/deleteNews.ts new file mode 100644 index 0000000000000000000000000000000000000000..7f6330375840761cfd595786688d62310018fc38 --- /dev/null +++ b/src/middlewares/news/deleteNews.ts @@ -0,0 +1,17 @@ +import { Request, Response, NextFunction } 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); + } + }); + }; +}; + +export default deleteNews; diff --git a/src/middlewares/news/getNews.ts b/src/middlewares/news/getNews.ts new file mode 100644 index 0000000000000000000000000000000000000000..e48a3d6cf7a8d2cbb4bd54b035369a1785a63ef6 --- /dev/null +++ b/src/middlewares/news/getNews.ts @@ -0,0 +1,18 @@ +import { Request, Response, NextFunction } 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(); + }); + }; +}; + +export default getNews; diff --git a/src/middlewares/news/getNewsList.ts b/src/middlewares/news/getNewsList.ts new file mode 100644 index 0000000000000000000000000000000000000000..c55aa8a23b87205f6940ffb38a2de4f947944c15 --- /dev/null +++ b/src/middlewares/news/getNewsList.ts @@ -0,0 +1,15 @@ +import { Request, Response, NextFunction } 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(); + }); + }; +}; + +export default getNewsList; diff --git a/src/models/NewsSchema.ts b/src/models/NewsSchema.ts new file mode 100644 index 0000000000000000000000000000000000000000..36a42fe0651bfa9d638275e0cc6089ff66c62845 --- /dev/null +++ b/src/models/NewsSchema.ts @@ -0,0 +1,31 @@ +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 +} + +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 }, +}); + +export default model<INews>('News', NewsSchema); \ No newline at end of file diff --git a/src/routes/.gitkeep b/src/routes/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/routes/news.ts b/src/routes/news.ts new file mode 100644 index 0000000000000000000000000000000000000000..a2a54bf1966bf02eb6192c8c5333c445866b7e8a --- /dev/null +++ b/src/routes/news.ts @@ -0,0 +1,35 @@ +import { Application, Response } from "express"; +import getNewsListMiddleware from "../middlewares/news/getNewsList"; +import addNews from "../middlewares/news/addNews"; +import getNews from "../middlewares/news/getNews"; +import deleteNews from "../middlewares/news/deleteNews"; + +export default (app: Application): void => { + app.get("/news", getNewsListMiddleware(), (req, res: Response) => { + if (res.data.news) { + res.json(res.data.news); + } else { + throw Error("Cant get the news list"); + } + }); + + app.post("/news", addNews(), (req, res: Response) => { + if (res.data.newsObject) { + res.json(res.data.newsObject); + } else { + throw Error("Cant add news"); + } + }); + + app.get("/news/:id", getNews(), (req, res: Response) => { + if (res.data.newsObject) { + res.json(res.data.newsObject); + } else { + throw Error("Cant get the news"); + } + }); + + app.post("/news/:id"); + + app.delete("/news/:id", deleteNews()); +}; diff --git a/src/utils/declarations/request.d.ts b/src/utils/declarations/request.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..5875527d11d1137dd1246d257abc2da7ee722ec3 --- /dev/null +++ b/src/utils/declarations/request.d.ts @@ -0,0 +1,3 @@ +declare namespace Express { + export interface Request {} +} diff --git a/src/utils/declarations/response.d.ts b/src/utils/declarations/response.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..fb2d7ee4b3aaea8c4fd741748c86631e764b969f --- /dev/null +++ b/src/utils/declarations/response.d.ts @@ -0,0 +1,12 @@ +import { INews } from "../../models/NewsSchema"; + +declare global { + namespace Express { + export interface Response { + data: { + news?: INews[] | null; + newsObject?: INews | null; + }; + } + } +} diff --git a/tsconfig.json b/tsconfig.json index fe19797508bb8cee6a58c85b0a8024c493e9da63..8b2d85389cfbd32bd092a3f62fec934b340519bc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,9 @@ { "files": [ - "./src/utils/declarations/session.d.ts" + "./src/utils/declarations/response.d.ts", + "./src/utils/declarations/request.d.ts", + "./src/utils/declarations/session.d.ts", ], - "compilerOptions": { "module": "commonjs", "strict": true,