From 5467192ef2a56d3a151aa47c49c5feb22f1cba4d Mon Sep 17 00:00:00 2001 From: srgooglo Date: Tue, 22 Feb 2022 20:22:25 +0100 Subject: [PATCH] implement `PostController` --- .../src/controllers/PostsController/index.js | 68 +++++++++++++++++++ packages/server/src/controllers/index.js | 2 + packages/server/src/models/index.js | 3 +- packages/server/src/schemas/index.js | 3 +- packages/server/src/schemas/post/index.js | 4 ++ 5 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 packages/server/src/controllers/PostsController/index.js create mode 100644 packages/server/src/schemas/post/index.js diff --git a/packages/server/src/controllers/PostsController/index.js b/packages/server/src/controllers/PostsController/index.js new file mode 100644 index 00000000..d28bcd1b --- /dev/null +++ b/packages/server/src/controllers/PostsController/index.js @@ -0,0 +1,68 @@ +import { ComplexController } from "linebridge/dist/classes" +import { Schematized } from "../../lib" +import { Post, User } from "../../models" + +export default class PostsController extends ComplexController { + static refName = "PostsController" + static useMiddlewares = ["withAuthentication"] + + methods = { + createPost: async (payload) => { + const { user_id, message } = payload + const userData = await User.findById(user_id) + + const post = new Post({ + user_id: typeof user_id === "object" ? user_id.toString() : user_id, + message: String(message).toString(), + }) + + await post.save() + + global.wsInterface.io.emit(`new.post`, { + ...post.toObject(), + user: userData.toObject(), + }) + global.wsInterface.io.emit(`new.post.${post.user_id}`, { + ...post.toObject(), + user: userData.toObject(), + }) + + return post + }, + } + + get = { + "/feed": Schematized({ + select: ["user_id"] + }, async (req, res) => { + let posts = await Post.find(req.selection) + + posts = posts.map(async (post) => { + const user = await User.findById(post.user_id) + + return { + ...post.toObject(), + user: user.toObject(), + } + }) + + posts = await Promise.all(posts) + + return res.json(posts) + }), + } + + put = { + "/post": Schematized({ + required: ["message"], + select: ["message"], + }, async (req, res) => { + const post = await this.methods.createPost({ + user_id: req.user.id, + message: req.selection.message, + }) + + return res.json(post) + }) + } +} \ No newline at end of file diff --git a/packages/server/src/controllers/index.js b/packages/server/src/controllers/index.js index b69f67b7..a19b7f97 100644 --- a/packages/server/src/controllers/index.js +++ b/packages/server/src/controllers/index.js @@ -4,8 +4,10 @@ import { default as SessionController } from "./SessionController" import { default as UserController } from "./UserController" import { default as FilesController } from "./FilesController" import { default as PublicController } from "./PublicController" +import { default as PostsController } from "./PostsController" export default [ + PostsController, ConfigController, PublicController, RolesController, diff --git a/packages/server/src/models/index.js b/packages/server/src/models/index.js index 1e8ad9de..e625578f 100644 --- a/packages/server/src/models/index.js +++ b/packages/server/src/models/index.js @@ -16,4 +16,5 @@ const schemas = getSchemas() export const Config = mongoose.model("Config", schemas.Config, "config") export const User = mongoose.model("User", schemas.User, "accounts") export const Session = mongoose.model("Session", schemas.Session, "sessions") -export const Role = mongoose.model("Role", schemas.Role, "roles") \ No newline at end of file +export const Role = mongoose.model("Role", schemas.Role, "roles") +export const Post = mongoose.model("Post", schemas.Post, "posts") \ No newline at end of file diff --git a/packages/server/src/schemas/index.js b/packages/server/src/schemas/index.js index b2b01250..884ddd70 100644 --- a/packages/server/src/schemas/index.js +++ b/packages/server/src/schemas/index.js @@ -1,4 +1,5 @@ export { default as User } from "./user" export { default as Role } from "./role" export { default as Session } from "./session" -export { default as Config } from "./config" \ No newline at end of file +export { default as Config } from "./config" +export { default as Post } from "./post" \ No newline at end of file diff --git a/packages/server/src/schemas/post/index.js b/packages/server/src/schemas/post/index.js new file mode 100644 index 00000000..706a13d2 --- /dev/null +++ b/packages/server/src/schemas/post/index.js @@ -0,0 +1,4 @@ +export default { + user_id: String, + message: String, +} \ No newline at end of file