From a25ea2d90a9219d85f85daa29fc80da4cf312bf1 Mon Sep 17 00:00:00 2001 From: Andrew Trieu Date: Tue, 11 Jul 2023 19:45:01 +0300 Subject: [PATCH] Post routes --- README.md | 2 + server/controllers/posts.js | 81 ++++++++++++++++++++++ server/controllers/users.js | 12 ++-- server/index.js | 8 +-- server/{middleware => middlewares}/auth.js | 0 server/models/Post.js | 32 +++++++++ server/package-lock.json | 7 +- server/routes/posts.js | 16 +++++ server/routes/users.js | 6 +- 9 files changed, 150 insertions(+), 14 deletions(-) create mode 100644 server/controllers/posts.js rename server/{middleware => middlewares}/auth.js (100%) create mode 100644 server/models/Post.js create mode 100644 server/routes/posts.js diff --git a/README.md b/README.md index 292ed3c..baf9428 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,5 @@ Table: | 07.07.2023 | Setting up database | 2 | | 07.07.2023 | Authentication and authorization | 6 | | 10.07.2023 | User routes | 4 | +| 11.07.2023 | Post routes | 6 | + diff --git a/server/controllers/posts.js b/server/controllers/posts.js new file mode 100644 index 0000000..d606403 --- /dev/null +++ b/server/controllers/posts.js @@ -0,0 +1,81 @@ +import Post from "../models/Post.js"; +import User from "../models/User.js"; + +/** + * Create - POST + */ +export const createPost = async (req, res) => { + try { + const { userId, content, contentPicturePath } = req.body; + const user = await User.findById(userId); + + const newPost = new Post({ + userId: user._id, + firstName: user.firstName, + lastName: user.lastName, + location: user.location, + content, + profilePicturePath: user.profilePicturePath, + contentPicturePath, + likes: {}, + comments: [], + }); + + await newPost.save(); + + const posts = await Post.find(); + + res.status(201).json(posts); + } catch (error) { + res.status(409).json({ error: error.message }); + } +}; + +/** + * Read - GET + */ +export const getFeedPosts = async (req, res) => { + try { + const posts = await Post.find(); + res.status(200).json(posts); + } catch (error) { + res.status(404).json({ error: error.message }); + } +}; +export const getUserPosts = async (req, res) => { + try { + const { userId } = req.params; + const posts = await Post.find({ userId }); + res.status(200).json(posts); + } catch (error) { + res.status(404).json({ error: error.message }); + } +}; + +/** + * Update - PATCH + */ +export const likePost = async (req, res) => { + try { + const { postId } = req.params; + const { userId } = req.body; + const post = await Post.findById(postId); + const isLiked = post.likes.get(userId); + + if (isLiked) { + post.likes.delete(userId); + } else { + post.likes.set(userId, true); + } + + const updatedPost = await Post.findByIdAndUpdate( + postId, + { likes: post.likes }, + { new: true } + ); + + res.status(200).json(updatedPost); + } catch (error) { + res.status(404).json({ error: error.message }); + } +}; diff --git a/server/controllers/users.js b/server/controllers/users.js index e40e4c6..bbca0b1 100644 --- a/server/controllers/users.js +++ b/server/controllers/users.js @@ -5,8 +5,8 @@ import User from "../models/User"; */ export const getUser = async (req, res) => { try { - const { id } = req.params; - const user = await User.findById(id); + const { userId } = req.params; + const user = await User.findById(userId); res.status(200).json(user); } catch (error) { @@ -16,8 +16,8 @@ export const getUser = async (req, res) => { export const getFriends = async (req, res) => { try { - const { id } = req.params; - const user = await User.findById(id); + const { userId } = req.params; + const user = await User.findById(userId); const friends = await Promise.all( user.friends.map((id) => User.findById(id)) ); @@ -54,8 +54,8 @@ export const getFriends = async (req, res) => { */ export const patchFriend = async (req, res) => { try { - const { id, friendId } = req.params; - const user = await User.findById(id); + const { userId, friendId } = req.params; + const user = await User.findById(userId); const friend = await User.findById(friendId); if (user.friends.includes(friendId)) { diff --git a/server/index.js b/server/index.js index dac65bf..1ce733c 100644 --- a/server/index.js +++ b/server/index.js @@ -10,11 +10,11 @@ import path from "path"; import { fileURLToPath } from "url"; /* Routes */ import authRoutes from "./routes/auth.js"; -import userRoutes from "./routes/user.js"; -import postRoutes from "./routes/post.js"; +import userRoutes from "./routes/users.js"; +import postRoutes from "./routes/posts.js"; /* Controllers */ import { register } from "./controllers/auth.js"; -import { createPost } from "./controllers/post.js"; +import { createPost } from "./controllers/posts.js"; /* Middlewares */ import { verifyToken } from "./middlewares/auth.js"; @@ -51,7 +51,7 @@ const upload = multer({ storage }); * Routes * */ app.post("/auth/register", upload.single("profilePicture"), register); -app.post("/posts", verifyToken, upload.single("image"), createPost); +app.post("/posts", verifyToken, upload.single("contentPicture"), createPost); app.use("/auth", authRoutes); app.use("/users", userRoutes); app.use("/posts", postRoutes); diff --git a/server/middleware/auth.js b/server/middlewares/auth.js similarity index 100% rename from server/middleware/auth.js rename to server/middlewares/auth.js diff --git a/server/models/Post.js b/server/models/Post.js new file mode 100644 index 0000000..938abc4 --- /dev/null +++ b/server/models/Post.js @@ -0,0 +1,32 @@ +import mongoose from 'mongoose'; + +const PostSchema = new mongoose.Schema({ + userId: { + type: String, + required: true + }, + firstName: { + type: String, + required: true, + }, + lastName: { + type: String, + required: true, + }, + location: String, + content: String, + profilePicturePath: String, + contentPicturePath: String, + likes : { + type: Map, + of: Boolean, + }, + comments: { + type: Array, + default: [], + } +}, { timestamps: true }); + +const Post = mongoose.model('Post', PostSchema); + +export default Post; \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json index cd56f9f..81b59d8 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,12 +1,17 @@ { "name": "server", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { + "name": "server", + "version": "1.0.0", + "license": "ISC", "dependencies": { "gridfs-stream": "^1.1.1" - } + }, + "devDependencies": {} }, "node_modules/flushwritable": { "version": "1.0.0", diff --git a/server/routes/posts.js b/server/routes/posts.js new file mode 100644 index 0000000..e480346 --- /dev/null +++ b/server/routes/posts.js @@ -0,0 +1,16 @@ +import express from "express"; +import { getFeedPosts, getUserPosts, likePost } from "../controllers/posts.js"; +import { verifyToken } from "../middlewares/auth.js"; + +const router = express.Router(); + +/** + * Read - GET + */ +router.get("/", verifyToken, getFeedPosts); +router.get("/:userId", verifyToken, getUserPosts); + +/** + * Update - PATCH + */ +router.patch("/:postId/like", verifyToken, likePost); diff --git a/server/routes/users.js b/server/routes/users.js index a5d38ba..4e68897 100644 --- a/server/routes/users.js +++ b/server/routes/users.js @@ -7,12 +7,12 @@ const router = express.Router(); /** * Read - GET */ -router.get("/:id", verifyToken, getUser); -router.get("/:id/friends", verifyToken, getFriends); +router.get("/:userId", verifyToken, getUser); +router.get("/:userId/friends", verifyToken, getFriends); /** * Update - PATCH */ -router.patch("/:id/:friendId", verifyToken, patchFriend); +router.patch("/:userId/:friendId", verifyToken, patchFriend); export default router;