- {{ postData.title }} -
- -- {{ postData.roadmap.name }} -
-- {{ post.contentMarkdown | trim(120) }} -
-diff --git a/packages/server/controllers/auth/email/index.js b/packages/server/controllers/auth/email/index.js deleted file mode 100644 index 83ff34cd6e..0000000000 --- a/packages/server/controllers/auth/email/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const verify = require("./verify"); -const validate = require("./validate"); - -module.exports = { - ...verify, - ...validate -}; diff --git a/packages/server/controllers/auth/email/validate.js b/packages/server/controllers/auth/email/validate.js deleted file mode 100644 index ce9a8811f1..0000000000 --- a/packages/server/controllers/auth/email/validate.js +++ /dev/null @@ -1,45 +0,0 @@ -// database -const database = require("../../../database"); - -// utils -const logger = require("../../../utils/logger"); -const error = require("../../../errorResponse.json"); - -exports.validate = async (req, res) => { - const { isVerified } = req.user; - const { email } = req.emailToken; - - if (isVerified) { - return res.status(409).send({ - message: error.api.emailVerify.emailAlreadyVerified, - code: "EMAIL_VERIFIED" - }); - } - - try { - const verifyUser = await database - .update({ - isVerified: true, - updatedAt: new Date().toJSON() - }) - .from("users") - .where({ - email - }) - .returning("isVerified"); - - const isUserVerified = verifyUser[0]; - await database - .delete() - .from("emailVerification") - .where({ email }); - - res.status(200).send({ - verify: { - success: isUserVerified - } - }); - } catch (err) { - logger.error(err); - } -}; diff --git a/packages/server/controllers/auth/email/verify.js b/packages/server/controllers/auth/email/verify.js deleted file mode 100644 index 9bb20b1005..0000000000 --- a/packages/server/controllers/auth/email/verify.js +++ /dev/null @@ -1,49 +0,0 @@ -// services -const verifyEmail = require("../../../services/auth/verifyEmail"); - -// utils -const logger = require("../../../utils/logger"); -const error = require("../../../errorResponse.json"); - -exports.verify = async (req, res) => { - const { userId, email, isVerified } = req.user; - - if (isVerified) { - return res.status(409).send({ - message: error.api.emailVerify.emailAlreadyVerified, - code: "EMAIL_VERIFIED" - }); - } - - try { - const tokenPayload = { - userId, - email, - type: "emailVerification" - }; - const url = req.headers.origin; - const emailVerification = await verifyEmail(url, tokenPayload); - - /** - * sending token as response is for - * development/testing/staging environment - */ - const __token = - process.env.NODE_ENV !== "production" - ? { - ...emailVerification - } - : ""; - - res.status(200).send({ - verify: { - success: !!emailVerification, - ...__token - } - }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/auth/index.js b/packages/server/controllers/auth/index.js deleted file mode 100644 index 2311c61f72..0000000000 --- a/packages/server/controllers/auth/index.js +++ /dev/null @@ -1,15 +0,0 @@ -const login = require("./login"); -const signup = require("./signup"); -const setup = require("./setup"); -const isSiteSetup = require("./isSiteSetup"); -const email = require("./email"); -const password = require("./password"); - -module.exports = { - ...login, - ...signup, - setup, - isSiteSetup, - email, - password -}; diff --git a/packages/server/controllers/auth/isSiteSetup.js b/packages/server/controllers/auth/isSiteSetup.js deleted file mode 100644 index 48627750b0..0000000000 --- a/packages/server/controllers/auth/isSiteSetup.js +++ /dev/null @@ -1,27 +0,0 @@ -// database -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); - -const isSiteSetup = async (req, res) => { - try { - const isSetup = await database - .select() - .from("users") - .where({ - isOwner: true - }) - .first(); - - res.status(200).send({ - is_setup: !!isSetup - }); - } catch (err) { - logger.error({ - message: err.message - }); - } -}; - -module.exports = isSiteSetup; diff --git a/packages/server/controllers/auth/login.js b/packages/server/controllers/auth/login.js deleted file mode 100644 index c184e0959c..0000000000 --- a/packages/server/controllers/auth/login.js +++ /dev/null @@ -1,64 +0,0 @@ -// service -const { createToken } = require('../../services/token.service') - -// utils -const { validatePassword } = require("../../utils/password"); -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -exports.login = async (req, res) => { - const user = req.user; - const password = req.body.password; - - if (user.isBlocked) { - return res.status(403).send({ - message: error.middleware.user.userBlocked, - code: "USER_BLOCKED" - }); - } - - if (!password) { - return res.status(400).send({ - message: error.api.authentication.noPasswordProvided, - code: "PASSWORD_MISSING" - }); - } - - try { - const validateUserPassword = await validatePassword( - password, - user.password - ); - if (!validateUserPassword) { - return res.status(403).send({ - message: error.middleware.user.incorrectPassword, - code: "INCORRECT_PASSWORD" - }); - } - - // generate authToken - const tokenPayload = { - userId: user.userId, - email: user.email - }; - const authToken = createToken(tokenPayload, { - expiresIn: "2d" - }); - - res.status(200).send({ - user: { - authToken, - userId: user.userId, - name: user.name, - username: user.username, - email: user.email, - avatar: user.avatar - } - }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/auth/password/index.js b/packages/server/controllers/auth/password/index.js deleted file mode 100644 index f4e33abe3c..0000000000 --- a/packages/server/controllers/auth/password/index.js +++ /dev/null @@ -1,9 +0,0 @@ -const reset = require("./reset"); -const validateToken = require("./validateToken"); -const set = require("./set"); - -module.exports = { - ...reset, - ...validateToken, - ...set -}; diff --git a/packages/server/controllers/auth/password/reset.js b/packages/server/controllers/auth/password/reset.js deleted file mode 100644 index 13c77b43a3..0000000000 --- a/packages/server/controllers/auth/password/reset.js +++ /dev/null @@ -1,41 +0,0 @@ -// services -const passwordResetEmail = require("../../../services/auth/passwordReset"); - -// utils -const logger = require("../../../utils/logger"); - -exports.reset = async (req, res) => { - const { userId, email } = req.user; - - try { - const tokenPayload = { - userId, - email, - type: "resetPassword" - }; - const url = req.headers.origin; - const passwordReset = await passwordResetEmail(url, tokenPayload); - - /** - * sending token as response for - * development/testing/staging environment - */ - const __token = - process.env.NODE_ENV !== "production" - ? { - ...passwordReset - } - : ""; - - res.status(200).send({ - reset: { - success: !!passwordReset, - ...__token - } - }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/auth/password/set.js b/packages/server/controllers/auth/password/set.js deleted file mode 100644 index ba09c0cbd1..0000000000 --- a/packages/server/controllers/auth/password/set.js +++ /dev/null @@ -1,54 +0,0 @@ -// database -const database = require("../../../database"); - -// utils -const { hashPassword } = require("../../../utils/password"); -const logger = require("../../../utils/logger"); -const error = require("../../../errorResponse.json"); - -exports.set = async (req, res) => { - const { userId, email } = req.user; - const { password } = req.body; - - if (!password) { - return res.status(400).send({ - errors: [ - !password - ? { - message: error.api.authentication.noPasswordProvided, - code: "PASSWORD_MISSING" - } - : "" - ] - }); - } - - try { - const hashedPassword = hashPassword(password); - - await database - .update({ - password: hashedPassword, - updatedAt: new Date().toJSON() - }) - .from("users") - .where({ - userId - }); - - await database - .delete() - .from("resetPassword") - .where({ - email - }); - - res.status(200).send({ - reset: { - success: true - } - }); - } catch (err) { - logger.error(err); - } -}; diff --git a/packages/server/controllers/auth/password/validateToken.js b/packages/server/controllers/auth/password/validateToken.js deleted file mode 100644 index 4495e652b0..0000000000 --- a/packages/server/controllers/auth/password/validateToken.js +++ /dev/null @@ -1,21 +0,0 @@ -exports.validateToken = async (req, res) => { - const emailToken = req.emailToken; - - /** - * sending token as response for - * development/testing/staging environment - */ - const __token = - process.env.NODE_ENV !== "production" - ? { - ...emailToken - } - : ""; - - res.status(200).send({ - reset: { - valid: !!emailToken, - ...__token - } - }); -}; diff --git a/packages/server/controllers/auth/setup.js b/packages/server/controllers/auth/setup.js deleted file mode 100644 index 01c0083be3..0000000000 --- a/packages/server/controllers/auth/setup.js +++ /dev/null @@ -1,66 +0,0 @@ -// database -const database = require("../../database"); - -// services -const createUser = require("../../services/auth/createUser"); - -// utils -const { validEmail } = require("../../helpers"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res, next) => { - const { siteTitle, name, email, password } = req.body; - - if (!validEmail(email)) { - return res.status(400).send({ - message: error.api.authentication.invalidEmail, - code: "EMAIL_INVALID" - }); - } - - if (!password) { - return res.status(400).send({ - message: error.api.authentication.noPasswordProvided, - code: "PASSWORD_MISSING" - }); - } - - const isSetup = await database - .select() - .from("users") - .where({ - isOwner: true - }) - .first(); - - if (isSetup) { - return res.status(403).send({ - message: error.api.authentication.setupAlreadyCompleted, - code: "SETUP_COMPLETED" - }); - } - - const user = await createUser(req, res, next, { - email, - password, - name - }); - - // set user as owner - await database - .update({ - isOwner: true - }) - .from("users") - .where({ - userId: user.userId - }); - - await database - .update({ - title: siteTitle - }) - .from("settings"); - - res.status(201).send({ user }); -}; diff --git a/packages/server/controllers/auth/signup.js b/packages/server/controllers/auth/signup.js deleted file mode 100644 index 9b0c632c73..0000000000 --- a/packages/server/controllers/auth/signup.js +++ /dev/null @@ -1,50 +0,0 @@ -// services -const createUser = require("../../services/auth/createUser"); - -const database = require("../../database"); - -// utils -const { validEmail } = require("../../helpers"); -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -exports.signup = async (req, res, next) => { - const { email, password } = req.body; - - if (!validEmail(email)) { - return res.status(400).send({ - message: error.api.authentication.invalidEmail, - code: "EMAIL_INVALID" - }); - } - - if (!password) { - return res.status(400).send({ - message: error.api.authentication.noPasswordProvided, - code: "PASSWORD_MISSING" - }); - } - - try { - const settings = await database.select().from("settings").first(); - - if (!settings.allowSignup) { - return res.status(400).send({ - message: error.api.roles.notEnoughPermission, - code: "SIGNUP_NOT_ALLOWED" - }); - } - - const user = await createUser(req, res, next, { - email, - password - }); - - res.status(201).send({ user }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/boards/boardByUrl.js b/packages/server/controllers/boards/boardByUrl.js deleted file mode 100644 index 8c6e797b2f..0000000000 --- a/packages/server/controllers/boards/boardByUrl.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = async (req, res) => { - const board = req.board; - - res.status(200).send({ board }); -}; diff --git a/packages/server/controllers/boards/checkName.js b/packages/server/controllers/boards/checkName.js deleted file mode 100644 index f357f3c6cd..0000000000 --- a/packages/server/controllers/boards/checkName.js +++ /dev/null @@ -1,53 +0,0 @@ -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const permissions = req.user.permissions; - - const name = req.body.name; - - const checkPermission = permissions.includes("board:create"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - if (!name) { - return res.status(400).send({ - errors: [ - !name - ? { - message: error.api.boards.nameMissing, - code: "BOARD_NAME_MISSING" - } - : "" - ] - }); - } - - const slimUrl = name - .replace(/[^\w]+/gi, "-") - .trim() - .toLowerCase(); - - try { - const board = await database - .select() - .from("boards") - .where({ - url: slimUrl || null - }) - .first(); - - res.status(200).send({ available: !board }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/boards/create.js b/packages/server/controllers/boards/create.js deleted file mode 100644 index 03ecade748..0000000000 --- a/packages/server/controllers/boards/create.js +++ /dev/null @@ -1,44 +0,0 @@ -// modules -const { nanoid } = require("nanoid"); -const { v4: uuidv4 } = require("uuid"); - -// database -const database = require("../../database"); - -// utils -const { generateHexColor } = require("../../helpers"); -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -exports.create = async (req, res) => { - const permissions = req.user.permissions; - - const checkPermission = permissions.includes("board:create"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - const createBoard = await database - .insert({ - boardId: uuidv4(), - name: "new board", - url: `new-board-${nanoid(10)}`, - color: generateHexColor() - }) - .into("boards") - .returning("*"); - - const board = createBoard[0]; - - res.status(201).send({ board }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/boards/deleteById.js b/packages/server/controllers/boards/deleteById.js deleted file mode 100644 index 73b7fe435f..0000000000 --- a/packages/server/controllers/boards/deleteById.js +++ /dev/null @@ -1,36 +0,0 @@ -// database -const database = require("../../database"); - -// utils -const { validUUID } = require("../../helpers"); -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const permissions = req.user.permissions; - - const id = validUUID(req.body.id); - - const checkPermission = permissions.includes("board:destroy"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - await database - .delete() - .from("boards") - .where({ - boardId: id - }); - - res.sendStatus(204); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/boards/filter.js b/packages/server/controllers/boards/filter.js deleted file mode 100644 index d1bbb82714..0000000000 --- a/packages/server/controllers/boards/filter.js +++ /dev/null @@ -1,32 +0,0 @@ -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); - -exports.filter = async (req, res) => { - const created = req.query.created; - const page = req.query.page - 1; - const limit = req.query.limit || 10; - - try { - const boards = await database - .select("boards.boardId", "boards.name", "boards.color", "boards.url") - .count("posts", { as: "post_count" }) - .from("boards") - .leftJoin("posts", "boards.boardId", "posts.boardId") - .where({ - display: true - }) - .groupBy("boards.boardId") - .orderBy("boards.createdAt", created) - .limit(limit) - .offset(limit * page); - - res.status(200).send({ boards }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/boards/get.js b/packages/server/controllers/boards/get.js deleted file mode 100644 index 13b639722f..0000000000 --- a/packages/server/controllers/boards/get.js +++ /dev/null @@ -1,34 +0,0 @@ -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); - -module.exports = async (req, res) => { - const created = req.query.created; - const page = req.query.page - 1; - const limit = req.query.limit || 10; - - try { - const boards = await database - .select( - "boards.boardId", - "boards.name", - "boards.color", - "boards.url", - "boards.display" - ) - .count("posts", { as: "post_count" }) - .from("boards") - .leftJoin("posts", "boards.boardId", "posts.boardId") - .groupBy("boards.boardId") - .orderBy("boards.createdAt", created) - .limit(limit) - .offset(limit * page); - - res.status(200).send({ boards }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/boards/index.js b/packages/server/controllers/boards/index.js deleted file mode 100644 index 65c7ee3679..0000000000 --- a/packages/server/controllers/boards/index.js +++ /dev/null @@ -1,19 +0,0 @@ -const create = require("./create"); -const filter = require("./filter"); -const get = require("./get"); -const searchBoard = require("./searchBoard"); -const checkName = require("./checkName"); -const boardByUrl = require("./boardByUrl"); -const updateBoard = require("./updateBoard"); -const deleteById = require("./deleteById"); - -module.exports = { - ...create, - ...filter, - get, - searchBoard, - checkName, - boardByUrl, - updateBoard, - deleteById -}; diff --git a/packages/server/controllers/boards/searchBoard.js b/packages/server/controllers/boards/searchBoard.js deleted file mode 100644 index 466af9745d..0000000000 --- a/packages/server/controllers/boards/searchBoard.js +++ /dev/null @@ -1,33 +0,0 @@ -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const { name } = req.params; - const permissions = req.user.permissions; - - const checkPermission = permissions.includes("board:read"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - const boards = await database - .select("boardId", "name", "url", "color") - .from("boards") - .where("name", "ILIKE", `${name}%`); - - res.status(200).send({ - boards - }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/boards/updateBoard.js b/packages/server/controllers/boards/updateBoard.js deleted file mode 100644 index f63c392303..0000000000 --- a/packages/server/controllers/boards/updateBoard.js +++ /dev/null @@ -1,64 +0,0 @@ -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const permissions = req.user.permissions; - const boardId = req.board.boardId; - - const { name, url, color, view_voters, display } = req.body; - - const checkPermission = permissions.includes("board:update"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - if (!url) { - return res.status(400).send({ - errors: [ - !url - ? { - message: error.api.boards.urlMissing, - code: "BOARD_URL_MISSING" - } - : "" - ] - }); - } - - const slimUrl = url - .replace(/[^\w]+/gi, "-") - .trim() - .toLowerCase(); - - try { - const boards = await database - .update({ - name, - url: slimUrl, - color, - view_voters, - display, - updatedAt: new Date().toJSON() - }) - .from("boards") - .where({ - boardId - }) - .returning("*"); - - const board = boards[0]; - - res.status(200).send({ board }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/post/activity/get.js b/packages/server/controllers/post/activity/get.js deleted file mode 100644 index 9f90944067..0000000000 --- a/packages/server/controllers/post/activity/get.js +++ /dev/null @@ -1,70 +0,0 @@ -const database = require("../../../database"); - -// utils -const logger = require("../../../utils/logger"); - -module.exports = async (req, res) => { - const { post_id } = req.params; - const { per_page = 10, page = 1 } = req.query; - - try { - const activities = await database.raw( - /* SQL */ - ` - SELECT - id, - type, - CASE - WHEN posts_comments_id IS NULL THEN NULL - ELSE ( - SELECT - json_build_object( - 'id', posts_comments.id, - 'parent_id', posts_comments.parent_id, - 'body', posts_comments.body, - 'is_internal', posts_comments.is_internal, - 'is_edited', posts_comments.is_edited, - 'is_spam', posts_comments.is_spam, - 'created_at', posts_comments.created_at - ) - FROM posts_comments - WHERE posts_comments.activity_id = posts_activity.id - ) - END AS comment, - ( - SELECT - json_build_object( - 'user_id', users."userId", - 'name', users.name, - 'username', users.username, - 'avatar', users.avatar - ) - FROM users WHERE users."userId" = posts_activity.author_id - ) AS author, - created_at - FROM - posts_activity - WHERE - posts_activity.post_id = :post_id - ORDER BY - posts_activity.created_at DESC - LIMIT :limit - OFFSET :offset - ;`, - { - limit: per_page, - offset: page, - post_id, - } - ); - - res.status(200).send({ - activity: activities.rows - }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/post/activity/index.js b/packages/server/controllers/post/activity/index.js deleted file mode 100644 index cecc725507..0000000000 --- a/packages/server/controllers/post/activity/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const get = require("./get"); - -module.exports = { - get -}; diff --git a/packages/server/controllers/post/comments/create.js b/packages/server/controllers/post/comments/create.js deleted file mode 100644 index 3ea3d3ea2c..0000000000 --- a/packages/server/controllers/post/comments/create.js +++ /dev/null @@ -1,91 +0,0 @@ -const { v4: uuid } = require("uuid"); - -const database = require("../../../database"); - -// utils -const logger = require("../../../utils/logger"); -const error = require("../../../errorResponse.json"); - -module.exports = async (req, res) => { - const userId = req.user.userId; - const { post_id } = req.params; - const { parent_id, is_internal, body } = req.body; - - // check auth user has required permission to set comment as internal - // check the auth user has permission to comment - - try { - const labSettings = await database - .select(database.raw("labs::json")) - .from("settings") - .first(); - - if (!labSettings.labs.comments) { - return res.status(403).send({ - message: error.api.labs.disabled, - code: "LABS_DISABLED" - }); - } - - const results = await database.transaction(async (trx) => { - // postActivityId will be shared b/w "posts_comments" and "posts_activity" table - const postActivityId = uuid(); - - const comments = await trx("posts_comments").insert( - { - id: uuid(), - parent_id, - body, - activity_id: postActivityId, - is_internal, - created_at: new Date().toJSON(), - updated_at: new Date().toJSON() - }, - [ - "id", - "parent_id", - "body", - "is_internal", - "is_edited", - "is_spam", - "created_at" - ] - ); - - const comment = comments[0]; - - const activities = await trx("posts_activity") - .insert({ - id: postActivityId, - type: "comment", - posts_comments_id: comment.id, - post_id, - author_id: userId, - created_at: new Date().toJSON() - }) - .returning(["id", "type", "created_at"]); - - const activity = activities[0]; - - const author = await trx("users") - .select("userId", "name", "username", "avatar") - .where({ userId }) - .first(); - - return { - ...activity, - comment, - author - }; - }); - - res.status(201).send({ - comment: results - }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/post/comments/destroy.js b/packages/server/controllers/post/comments/destroy.js deleted file mode 100644 index 7283bbce82..0000000000 --- a/packages/server/controllers/post/comments/destroy.js +++ /dev/null @@ -1,34 +0,0 @@ -const { v4: uuid } = require("uuid"); - -const database = require("../../../database"); - -// utils -const logger = require("../../../utils/logger"); -const error = require("../../../errorResponse.json"); - -module.exports = async (req, res) => { - const { comment_id } = req.params; - - try { - const labSettings = await database - .select(database.raw("labs::json")) - .from("settings") - .first(); - - if (!labSettings.labs.comments) { - return res.status(403).send({ - message: error.api.labs.disabled, - code: "LABS_DISABLED" - }); - } - - await database.delete().from("posts_comments").where({ id: comment_id }); - - res.status(204); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/post/comments/index.js b/packages/server/controllers/post/comments/index.js deleted file mode 100644 index 4dcb23d8b4..0000000000 --- a/packages/server/controllers/post/comments/index.js +++ /dev/null @@ -1,9 +0,0 @@ -const create = require("./create"); -const update = require("./update"); -const destroy = require("./destroy"); - -module.exports = { - create, - update, - destroy -}; diff --git a/packages/server/controllers/post/comments/update.js b/packages/server/controllers/post/comments/update.js deleted file mode 100644 index df03ca991a..0000000000 --- a/packages/server/controllers/post/comments/update.js +++ /dev/null @@ -1,48 +0,0 @@ -const { v4: uuid } = require("uuid"); - -const database = require("../../../database"); - -// utils -const logger = require("../../../utils/logger"); -const error = require("../../../errorResponse.json"); - -module.exports = async (req, res) => { - const { comment_id } = req.params; - const { body, is_internal, is_spam } = req.body; - - try { - const labSettings = await database - .select(database.raw("labs::json")) - .from("settings") - .first(); - - if (!labSettings.labs.comments) { - return res.status(403).send({ - message: error.api.labs.disabled, - code: "LABS_DISABLED" - }); - } - - const comment = await database - .update({ - body, - is_internal, - is_edited: true, - is_spam, - created_at: new Date().toJSON(), - updated_at: new Date().toJSON() - }) - .from("posts_comments") - .where({ id: comment_id }) - .returning("*"); - - res.status(200).send({ - comment: comment[0] - }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/post/create.js b/packages/server/controllers/post/create.js deleted file mode 100644 index f08430c425..0000000000 --- a/packages/server/controllers/post/create.js +++ /dev/null @@ -1,91 +0,0 @@ -// modules -const { nanoid } = require("nanoid"); -const { v4: uuidv4 } = require("uuid"); - -const database = require("../../database"); - -// utils -const { validUUID } = require("../../helpers"); -const logger = require("../../utils/logger"); - -const error = require("../../errorResponse.json"); - -exports.create = async (req, res) => { - const userId = req.user.userId; - const permissions = req.user.permissions; - - const title = req.body.title; - const contentMarkdown = req.body.contentMarkdown; - const boardId = validUUID(req.body.boardId); - - const checkPermission = permissions.includes("post:create"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - if (!title || !boardId) { - return res.status(400).send({ - errors: [ - !title - ? { - message: error.api.posts.titleMissing, - code: "POST_TITLE_MISSING" - } - : "", - !boardId - ? { - message: error.api.boards.boardIdMissing, - code: "BOARD_ID_MISSING" - } - : "" - ] - }); - } - - // generate slug unique indentification - const slugId = nanoid(20); - - const slug = `${title - .replace(/[^\w\s]/gi, "") - .replace(/\s\s+/gi, " ") - .toLowerCase() - .split(" ") - .join("-")}-${slugId}`; - - try { - const createPost = await database - .insert({ - postId: uuidv4(), - title, - slug, - slugId, - contentMarkdown, - userId, - boardId - }) - .into("posts") - .returning("*"); - - const post = createPost[0]; - - await database - .insert({ - voteId: uuidv4(), - userId, - postId: post.postId - }) - .into("votes"); - - res.status(201).send({ - post - }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/post/deleteById.js b/packages/server/controllers/post/deleteById.js deleted file mode 100644 index de70da4310..0000000000 --- a/packages/server/controllers/post/deleteById.js +++ /dev/null @@ -1,35 +0,0 @@ -const database = require("../../database"); - -// utils -const { validUUID } = require("../../helpers"); -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -exports.deleteById = async (req, res) => { - const permissions = req.user.permissions; - - const id = validUUID(req.body.id); - - const checkPermission = permissions.includes("post:destroy"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - await database - .delete() - .from("posts") - .where({ - postId: id - }); - - res.sendStatus(204); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/post/filterPost.js b/packages/server/controllers/post/filterPost.js deleted file mode 100644 index e38802d81d..0000000000 --- a/packages/server/controllers/post/filterPost.js +++ /dev/null @@ -1,96 +0,0 @@ -const database = require("../../database"); - -// services -const getBoardById = require("../../services/boards/getBoardById"); -const getVotes = require("../../services/votes/getVotes"); - -// utils -const { validUUID } = require("../../helpers"); -const logger = require("../../utils/logger"); - -exports.filterPost = async (req, res) => { - const userId = validUUID(req.body.userId); - const boardId = validUUID(req.body.boardId); - const roadmapId = validUUID(req.body.roadmapId); - /** - * top, latest, oldest, trending - */ - const created = req.body.created; - const page = req.body.page - 1; - const limit = req.body.limit || 10; - - try { - const { rows: response } = await database.raw( - ` - SELECT - "postId", - "title", - "slug", - "boardId", - "roadmap_id", - "contentMarkdown", - "createdAt" - FROM - posts - ${ - boardId - ? `WHERE "boardId" IN (${boardId.map(item => { - return `'${item}'`; - })})` - : "" - } - ${roadmapId ? `WHERE roadmap_id = :roadmapId` : ""} - ORDER BY "createdAt" ${created} - LIMIT :limit - OFFSET :offset; - `, - { - limit, - offset: limit * page, - roadmapId - } - ); - - const posts = []; - - for (let i = 0; i < response.length; i++) { - const postId = response[i].postId; - const boardId = response[i].boardId; - const roadmapId = response[i].roadmap_id; - - try { - const board = await getBoardById(boardId); - const voters = await getVotes(postId, userId); - const roadmap = await database - .select("id", "name", "url", "color") - .from("roadmaps") - .where({ - id: roadmapId - }) - .first(); - - delete response[i].boardId; - delete response[i].roadmap_id; - - posts.push({ - ...response[i], - board, - roadmap, - voters - }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } - } - - res.status(200).send({ posts }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/post/index.js b/packages/server/controllers/post/index.js deleted file mode 100644 index a0d171b572..0000000000 --- a/packages/server/controllers/post/index.js +++ /dev/null @@ -1,18 +0,0 @@ -const create = require("./create"); -const filterPost = require("./filterPost"); -const postBySlug = require("./postBySlug"); -const updatePost = require("./updatePost"); -const deleteById = require("./deleteById"); - -const activity = require("./activity"); -const comments = require("./comments"); - -module.exports = { - ...create, - ...filterPost, - ...postBySlug, - ...updatePost, - ...deleteById, - activity, - comments -}; diff --git a/packages/server/controllers/post/postBySlug.js b/packages/server/controllers/post/postBySlug.js deleted file mode 100644 index 1b59d17c47..0000000000 --- a/packages/server/controllers/post/postBySlug.js +++ /dev/null @@ -1,60 +0,0 @@ -const database = require("../../database"); - -// services -const getVotes = require("../../services/votes/getVotes"); - -// utils -const { validUUID } = require("../../helpers"); -const logger = require("../../utils/logger"); - -exports.postBySlug = async (req, res) => { - const userId = validUUID(req.body.userId); - const post = req.post; - - try { - const author = await database - .select("userId", "name", "username", "avatar") - .from("users") - .where({ - userId: post.userId - }) - .first(); - - const voters = await getVotes(post.postId, userId); - - const board = await database - .select("boardId", "name", "url", "color") - .from("boards") - .where({ - boardId: post.boardId - }) - .first(); - - const roadmap = await database - .select("id", "name", "url", "color") - .from("roadmaps") - .where({ - id: post.roadmap_id - }) - .first(); - - delete post.boardId; - delete post.userId; - delete post.roadmap_id; - - res.status(200).send({ - post: { - board, - author, - roadmap, - ...post, - voters - } - }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/post/updatePost.js b/packages/server/controllers/post/updatePost.js deleted file mode 100644 index a013f818bd..0000000000 --- a/packages/server/controllers/post/updatePost.js +++ /dev/null @@ -1,60 +0,0 @@ -const database = require("../../database"); - -// utils -const { validUUID } = require("../../helpers"); -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -exports.updatePost = async (req, res) => { - const userId = req.user.userId; - const permissions = req.user.permissions; - const authorId = req.post.userId; - const slugId = req.post.slugId; - - const id = validUUID(req.body.id); - const title = req.body.title; - const contentMarkdown = req.body.contentMarkdown; - const boardId = validUUID(req.body.boardId) || undefined; - const roadmapId = validUUID(req.body.roadmapId) || undefined; - - const checkPermission = permissions.includes("post:update"); - if (!checkPermission && userId !== authorId) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - const slug = `${title - .replace(/[^\w\s]/gi, "") - .replace(/\s\s+/gi, " ") - .toLowerCase() - .split(" ") - .join("-")}-${slugId}`; - - try { - const posts = await database - .update({ - title, - slug, - contentMarkdown, - boardId, - roadmap_id: roadmapId, - updatedAt: new Date().toJSON() - }) - .from("posts") - .where({ - postId: id - }) - .returning("*"); - - const post = posts[0]; - - res.status(200).send({ post }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/roadmaps/create.js b/packages/server/controllers/roadmaps/create.js deleted file mode 100644 index e483466d4b..0000000000 --- a/packages/server/controllers/roadmaps/create.js +++ /dev/null @@ -1,50 +0,0 @@ -// modules -const { nanoid } = require("nanoid"); -const { v4: uuidv4 } = require("uuid"); - -// database -const database = require("../../database"); - -// utils -const { generateHexColor } = require("../../helpers"); -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const permissions = req.user.permissions; - - const checkPermission = permissions.includes("roadmap:create"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - // get maximum index value of roadmap - const roadmapIndex = await database - .max("index") - .from("roadmaps") - .first(); - - const createRoadmap = await database - .insert({ - id: uuidv4(), - name: "new roadmap", - url: `new-roadmap-${nanoid(10)}`, - color: generateHexColor(), - index: roadmapIndex.max + 1 - }) - .into("roadmaps") - .returning("*"); - - const roadmap = createRoadmap[0]; - - res.status(201).send({ roadmap }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/roadmaps/deleteById.js b/packages/server/controllers/roadmaps/deleteById.js deleted file mode 100644 index f9df6a4933..0000000000 --- a/packages/server/controllers/roadmaps/deleteById.js +++ /dev/null @@ -1,36 +0,0 @@ -// database -const database = require("../../database"); - -// utils -const { validUUID } = require("../../helpers"); -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const permissions = req.user.permissions; - - const id = validUUID(req.body.id); - - const checkPermission = permissions.includes("roadmap:destroy"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - await database - .delete() - .from("roadmaps") - .where({ - id: id - }); - - res.sendStatus(204); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/roadmaps/filter.js b/packages/server/controllers/roadmaps/filter.js deleted file mode 100644 index bc48c039a1..0000000000 --- a/packages/server/controllers/roadmaps/filter.js +++ /dev/null @@ -1,19 +0,0 @@ -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); - -module.exports = async (req, res) => { - try { - const roadmaps = await database - .select("id", "name", "url", "color", "display", "index") - .from("roadmaps") - .orderBy("index", "asc"); - - res.status(200).send({ roadmaps }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/roadmaps/index.js b/packages/server/controllers/roadmaps/index.js deleted file mode 100644 index dacbf4a3ae..0000000000 --- a/packages/server/controllers/roadmaps/index.js +++ /dev/null @@ -1,17 +0,0 @@ -const filter = require("./filter"); -const create = require("./create"); -const roadmapByUrl = require("./roadmapByUrl"); -const updateRoadmap = require("./updateRoadmap"); -const sort = require("./sort"); -const searchRoadmap = require("./searchRoadmap"); -const deleteById = require("./deleteById"); - -module.exports = { - filter, - create, - roadmapByUrl, - updateRoadmap, - sort, - searchRoadmap, - deleteById -}; diff --git a/packages/server/controllers/roadmaps/roadmapByUrl.js b/packages/server/controllers/roadmaps/roadmapByUrl.js deleted file mode 100644 index cdfbb13194..0000000000 --- a/packages/server/controllers/roadmaps/roadmapByUrl.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = async (req, res) => { - const roadmap = req.roadmap; - - res.status(200).send({ roadmap }); -}; diff --git a/packages/server/controllers/roadmaps/searchRoadmap.js b/packages/server/controllers/roadmaps/searchRoadmap.js deleted file mode 100644 index 27ac2e69c9..0000000000 --- a/packages/server/controllers/roadmaps/searchRoadmap.js +++ /dev/null @@ -1,33 +0,0 @@ -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const { name } = req.params; - const permissions = req.user.permissions; - - const checkPermission = permissions.includes("roadmap:read"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - const roadmaps = await database - .select("id", "name", "url", "color") - .from("roadmaps") - .where("name", "ILIKE", `${name}%`); - - res.status(200).send({ - roadmaps - }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/roadmaps/sort.js b/packages/server/controllers/roadmaps/sort.js deleted file mode 100644 index ca87183bc0..0000000000 --- a/packages/server/controllers/roadmaps/sort.js +++ /dev/null @@ -1,47 +0,0 @@ -// database -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const { from, to } = req.body; - const permissions = req.user.permissions; - - const checkPermission = permissions.includes("roadmap:update"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - // to - await database - .update({ - index: to.index - }) - .from("roadmaps") - .where({ - id: to.id - }); - - // from - await database - .update({ - index: from.index - }) - .from("roadmaps") - .where({ - id: from.id - }); - - res.sendStatus(200); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/roadmaps/updateRoadmap.js b/packages/server/controllers/roadmaps/updateRoadmap.js deleted file mode 100644 index d5cbf7d37e..0000000000 --- a/packages/server/controllers/roadmaps/updateRoadmap.js +++ /dev/null @@ -1,54 +0,0 @@ -// database -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const id = req.roadmap.id; - - const { name, url, color, display } = req.body; - - if (!url) { - return res.status(400).send({ - errors: [ - !url - ? { - message: error.api.roadmaps.urlMissing, - code: "ROADMAP_URL_MISSING" - } - : "" - ] - }); - } - - const slimUrl = url - .replace(/[^\w]+/gi, "-") - .trim() - .toLowerCase(); - - try { - const roadmaps = await database - .update({ - name, - url: slimUrl, - color, - display, - updated_at: new Date().toJSON() - }) - .from("roadmaps") - .where({ - id - }) - .returning("*"); - - const roadmap = roadmaps[0]; - - res.status(200).send({ roadmap }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/roles/addRoleToUser.js b/packages/server/controllers/roles/addRoleToUser.js deleted file mode 100644 index 08e0c68f07..0000000000 --- a/packages/server/controllers/roles/addRoleToUser.js +++ /dev/null @@ -1,40 +0,0 @@ -const { v4: uuid } = require("uuid"); - -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const permissions = req.user.permissions; - const { role_id, user_id } = req.params; - - const checkPermission = permissions.find(item => item === "role:assign"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.posts.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - const response = await database - .insert({ - id: uuid(), - role_id, - user_id, - }) - .into("roles_users") - .onConflict(["role_id", "user_id"]) - .ignore(); - - res.status(response.rowCount ? 200 : 204).send({ - success: !!response.rowCount, - }); - } catch (err) { - logger.error({ - message: err, - }); - } -}; diff --git a/packages/server/controllers/roles/create.js b/packages/server/controllers/roles/create.js deleted file mode 100644 index 3942dce4af..0000000000 --- a/packages/server/controllers/roles/create.js +++ /dev/null @@ -1,39 +0,0 @@ -const { v4: uuidv4 } = require("uuid"); - -// database -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const permissions = req.user.permissions; - const checkPermission = permissions.includes("role:create"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - const createRole = await database - .insert({ - id: uuidv4(), - name: "new role" - }) - .into("roles") - .returning("id"); - - const role = createRole[0]; - - res.status(201).send({ - role - }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/roles/deleteRoleFromUser.js b/packages/server/controllers/roles/deleteRoleFromUser.js deleted file mode 100644 index 7f21010d50..0000000000 --- a/packages/server/controllers/roles/deleteRoleFromUser.js +++ /dev/null @@ -1,31 +0,0 @@ -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const permissions = req.user.permissions; - const { role_id, user_id } = req.params; - - const checkPermission = permissions.find((item) => item === "role:unassign"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.posts.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION", - }); - } - - try { - await database.delete().from("roles_users").where({ - role_id, - user_id, - }); - - res.sendStatus(204); - } catch (err) { - logger.error({ - message: err, - }); - } -}; diff --git a/packages/server/controllers/roles/get.js b/packages/server/controllers/roles/get.js deleted file mode 100644 index 970d205d87..0000000000 --- a/packages/server/controllers/roles/get.js +++ /dev/null @@ -1,27 +0,0 @@ -// database -const database = require("../../database"); - -// utils -const error = require("../../errorResponse.json"); -const logger = require("../../utils/logger"); - -module.exports = async (req, res) => { - const permissions = req.user.permissions; - const checkPermission = permissions.includes("role:read"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - const roles = await database.select().from("roles"); - - res.status(200).send({ roles }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/roles/getOne.js b/packages/server/controllers/roles/getOne.js deleted file mode 100644 index 751d6d1b86..0000000000 --- a/packages/server/controllers/roles/getOne.js +++ /dev/null @@ -1,58 +0,0 @@ -// database -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const { id } = req.params; - - const permissions = req.user.permissions; - const checkPermission = permissions.includes("role:read"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - const role = await database - .select() - .from("roles") - .where({ - id - }) - .first(); - - const permissions = await database - .select( - database.raw("ARRAY_AGG(CONCAT(p.type, ':', p.action)) AS permissions") - ) - .from("permissions_roles AS pr") - .leftJoin("permissions AS p", "pr.permission_id", "p.id") - .where({ - "pr.role_id": role.id - }) - .first(); - - if (!role) { - res.status(404).send({ - message: error.api.roles.roleNotFound, - code: "ROLE_NOT_FOUND" - }); - } - - res.status(200).send({ - role: { - ...role, - permissions: permissions.permissions || [] - } - }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/roles/index.js b/packages/server/controllers/roles/index.js deleted file mode 100644 index 326c90b952..0000000000 --- a/packages/server/controllers/roles/index.js +++ /dev/null @@ -1,15 +0,0 @@ -const get = require("./get"); -const create = require("./create"); -const getOne = require("./getOne"); -const update = require("./update"); -const addRoleToUser = require('./addRoleToUser') -const deleteRoleFromUser = require('./deleteRoleFromUser') - -module.exports = { - get, - create, - getOne, - update, - addRoleToUser, - deleteRoleFromUser -}; diff --git a/packages/server/controllers/roles/update.js b/packages/server/controllers/roles/update.js deleted file mode 100644 index b68cda704b..0000000000 --- a/packages/server/controllers/roles/update.js +++ /dev/null @@ -1,83 +0,0 @@ -const { v4: uuidv4 } = require("uuid"); - -// database -const database = require("../../database"); - -// utils -const error = require("../../errorResponse.json"); -const logger = require("../../utils/logger"); - -module.exports = async (req, res) => { - const role = req.body; - - const permissions = req.user.permissions; - const checkPermission = permissions.includes("role:update"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - const existingPermissions = await database.select().from("permissions"); - - // delete all existing permisisons for a role - await database - .delete() - .from("permissions_roles") - .where({ - role_id: role.id - }); - - const updateRole = await database - .update({ - name: role.name, - description: role.description, - updated_at: new Date().toJSON() - }) - .from("roles") - .where({ - id: role.id - }) - .returning("*"); - - // add new permissions to the role - role.permissions.forEach(async perm => { - const type = perm.split(":")[0]; - const action = perm.split(":")[1]; - - const findPermission = existingPermissions.find( - item => item.type === type && item.action === action - ); - - await database - .insert({ - id: uuidv4(), - permission_id: findPermission.id, - role_id: role.id - }) - .into("permissions_roles"); - }); - - const updatedPermissions = await database - .select( - database.raw("ARRAY_AGG(CONCAT(p.type, ':', p.action)) AS permissions") - ) - .from("permissions_roles AS pr") - .leftJoin("permissions AS p", "pr.permission_id", "p.id") - .where({ - "pr.role_id": role.id - }) - .first(); - - res.status(200).send({ - role: updateRole, - ...updatedPermissions - }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/settings/getLabs.js b/packages/server/controllers/settings/getLabs.js deleted file mode 100644 index f18f60342c..0000000000 --- a/packages/server/controllers/settings/getLabs.js +++ /dev/null @@ -1,20 +0,0 @@ -// database -const database = require("../../database"); - -exports.getLabs = async (_, res) => { - try { - const { labs } = await database - .select(database.raw("labs::json")) - .from("settings") - .first(); - - res.status(200).send({ - labs - }); - } catch (error) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/settings/index.js b/packages/server/controllers/settings/index.js deleted file mode 100644 index 02f796d991..0000000000 --- a/packages/server/controllers/settings/index.js +++ /dev/null @@ -1,13 +0,0 @@ -const siteSettings = require("./siteSettings"); -const update = require("./update"); -const updateLogo = require("./updateLogo"); -const getLabs = require("./getLabs"); -const updateLabs = require("./updateLabs"); - -module.exports = { - ...siteSettings, - ...update, - ...updateLogo, - ...getLabs, - ...updateLabs -}; diff --git a/packages/server/controllers/settings/siteSettings.js b/packages/server/controllers/settings/siteSettings.js deleted file mode 100644 index c8bde62f7f..0000000000 --- a/packages/server/controllers/settings/siteSettings.js +++ /dev/null @@ -1,23 +0,0 @@ -// database -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); - -exports.siteSettings = async (_, res) => { - try { - const settings = await database - .select(["*", database.raw("labs::json")]) - .from("settings") - .first(); - - res.status(200).send({ - settings - }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/settings/update.js b/packages/server/controllers/settings/update.js deleted file mode 100644 index 591419233b..0000000000 --- a/packages/server/controllers/settings/update.js +++ /dev/null @@ -1,52 +0,0 @@ -// database -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -exports.update = async (req, res) => { - const permissions = req.user.permissions; - - const checkPermission = permissions.find(item => item === "settings:update"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.posts.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - const { - title, - description, - allowSignup, - accentColor, - googleAnalyticsId, - developer_mode - } = req.body; - - try { - const updateSettings = await database - .update({ - title, - description, - allowSignup, - accentColor, - googleAnalyticsId, - developer_mode - }) - .from("settings") - .returning(["*", database.raw("labs::json")]); - - const settings = updateSettings[0]; - - res.status(200).send({ - settings - }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/settings/updateLabs.js b/packages/server/controllers/settings/updateLabs.js deleted file mode 100644 index 63f136f232..0000000000 --- a/packages/server/controllers/settings/updateLabs.js +++ /dev/null @@ -1,46 +0,0 @@ -const _ = require("lodash"); - -// database -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -/** - * This API doesn't update the existing labs value - * instead overrides the existing value with req.body.labs - */ -exports.updateLabs = async (req, res) => { - const permissions = req.user.permissions; - - const labs = req.body; - const stringify = JSON.stringify(labs); - - const checkPermission = permissions.find(item => item === "settings:update"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.posts.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - const response = await database - .update({ - labs: database.raw(`labs::jsonb || '${stringify}'`) - }) - .from("settings") - .returning(database.raw("labs::json")); - - const labs = response[0]; - res.status(200).send({ - labs - }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/settings/updateLogo.js b/packages/server/controllers/settings/updateLogo.js deleted file mode 100644 index a752f0ac1e..0000000000 --- a/packages/server/controllers/settings/updateLogo.js +++ /dev/null @@ -1,31 +0,0 @@ -// database -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); - -exports.updateLogo = async (req, res) => { - const host = req.headers.host; - const imagePath = req.file.path.split("content/images")[1]; - - const imageUrl = `//${host}/content/images${imagePath}`; - - try { - const updatedSettings = await database - .update({ - logo: imageUrl - }) - .from("settings") - .returning("*"); - - res.status(200).send({ - settings: updatedSettings[0] - }); - } catch (err) { - logger.error({ - code: "DASHBOARD_SETTINGS_UPDATE", - message: "Update logo", - err - }); - } -}; diff --git a/packages/server/controllers/users/accessDashboard.js b/packages/server/controllers/users/accessDashboard.js deleted file mode 100644 index c219c7ca27..0000000000 --- a/packages/server/controllers/users/accessDashboard.js +++ /dev/null @@ -1,18 +0,0 @@ -// utils -const error = require("../../errorResponse.json"); - -exports.accessDashboard = (req, res) => { - const permissions = req.user.permissions; - - const checkPermission = permissions.includes("dashboard:read"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - res.status(200).send({ - access: true - }); -}; diff --git a/packages/server/controllers/users/filter.js b/packages/server/controllers/users/filter.js deleted file mode 100644 index b5746a332a..0000000000 --- a/packages/server/controllers/users/filter.js +++ /dev/null @@ -1,59 +0,0 @@ -// database -const database = require("../../database"); - -// services -const getUsers = require("../../services/users/getUsers"); - -// utils -const logger = require("../../utils/logger"); - -exports.filter = async (req, res) => { - const created = req.query.created; - const page = req.query.page - 1; - const limit = req.query.limit || 10; - - try { - const userData = await getUsers(created, limit, page); - - const users = []; - - for (let i = 0; i < userData.length; i++) { - const userId = userData[i].userId; - - try { - const postsCount = await database - .count() - .from("posts") - .where({ userId }); - const votesCount = await database - .count() - .from("votes") - .where({ userId }); - - users.push({ - votes: votesCount[0].count, - posts: postsCount[0].count, - ...userData[i] - }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } - } - - res.status(200).send({ - status: { - code: 200, - type: "success" - }, - users - }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/users/getProfile.js b/packages/server/controllers/users/getProfile.js deleted file mode 100644 index 40375742b0..0000000000 --- a/packages/server/controllers/users/getProfile.js +++ /dev/null @@ -1,27 +0,0 @@ -// database -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); - -module.exports = async (req, res) => { - const { userId } = req.user; - - try { - const user = await database - .select("userId", "name", "username", "email", "isVerified") - .from("users") - .where({ - userId - }) - .first(); - - res.status(200).send({ - user - }); - } catch (err) { - logger.error({ - message: err - }); - } -}; diff --git a/packages/server/controllers/users/getUserInfo.js b/packages/server/controllers/users/getUserInfo.js deleted file mode 100644 index 482a63f28f..0000000000 --- a/packages/server/controllers/users/getUserInfo.js +++ /dev/null @@ -1,37 +0,0 @@ -const database = require('../../database') -const logger = require('../../utils/logger') - -const getUserInfo = async (req, res) => { - const { user_id } = req.params - - try { - const user = await database - .select( - 'userId', - 'name', - 'username', - 'email', - 'avatar', - 'isVerified', - 'isBlocked', - 'isOwner', - 'notes', - 'createdAt' - ) - .from('users') - .where({ - userId: user_id - }) - .first() - - res.status(200).send({ - user - }) - } catch (error) { - console.log(error) - - logger.error(error) - } -} - -module.exports = getUserInfo diff --git a/packages/server/controllers/users/getUserPermissions.js b/packages/server/controllers/users/getUserPermissions.js deleted file mode 100644 index 831119f17e..0000000000 --- a/packages/server/controllers/users/getUserPermissions.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = async (req, res) => { - const user = req.user; - - res.status(200).send({ - permissions: user.permissions - }); -}; diff --git a/packages/server/controllers/users/index.js b/packages/server/controllers/users/index.js deleted file mode 100644 index c1617d2f0a..0000000000 --- a/packages/server/controllers/users/index.js +++ /dev/null @@ -1,17 +0,0 @@ -const filter = require("./filter"); -const getProfile = require("./getProfile"); -const updateProfile = require("./updateProfile"); -const accessDashboard = require("./accessDashboard"); -const getUserPermissions = require("./getUserPermissions"); -const getUserInfo = require('./getUserInfo') -const updateUserInfo = require('./updateUserInfo') - -module.exports = { - ...filter, - getProfile, - updateProfile, - ...accessDashboard, - getUserPermissions, - getUserInfo, - updateUserInfo -}; diff --git a/packages/server/controllers/users/updateProfile.js b/packages/server/controllers/users/updateProfile.js deleted file mode 100644 index 7e45389aca..0000000000 --- a/packages/server/controllers/users/updateProfile.js +++ /dev/null @@ -1,33 +0,0 @@ -// database -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); - -module.exports = async (req, res) => { - const userId = req.user.userId; - - const name = req.body.name; - - try { - const users = await database - .update({ - name, - updatedAt: new Date().toJSON() - }) - .from("users") - .where({ - userId - }) - .returning(["userId", "name", "username", "email"]); - - const user = users[0]; - - res.status(200).send({ user }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/users/updateUserInfo.js b/packages/server/controllers/users/updateUserInfo.js deleted file mode 100644 index 99ed27663a..0000000000 --- a/packages/server/controllers/users/updateUserInfo.js +++ /dev/null @@ -1,30 +0,0 @@ -const database = require('../../database') -const logger = require('../../utils/logger') - -const getUserInfo = async (req, res) => { - const { user_id } = req.params - const { username, name, notes } = req.body - - try { - const user = await database - .update({ - username, - name, - notes - }) - .from('users') - .where({ - userId: user_id - }) - - res.status(200).send({ - user - }) - } catch (error) { - console.log(error) - - logger.error(error) - } -} - -module.exports = getUserInfo diff --git a/packages/server/controllers/votes/add.js b/packages/server/controllers/votes/add.js deleted file mode 100644 index 70eef58dc7..0000000000 --- a/packages/server/controllers/votes/add.js +++ /dev/null @@ -1,62 +0,0 @@ -const { v4: uuidv4 } = require("uuid"); - -// database -const database = require("../../database"); - -// services -const getVotes = require("../../services/votes/getVotes"); - -// utils -const { validUUID } = require("../../helpers"); -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const userId = req.user.userId; - const permissions = req.user.permissions; - - const postId = validUUID(req.body.postId); - - const checkPermission = permissions.includes("vote:create"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - const vote = await database - .select() - .from("votes") - .where({ - postId: postId || null, - userId - }) - .first(); - - if (vote) { - return res.status(409).send({ - message: error.api.votes.exists, - code: "VOTE_EXISTS" - }); - } - - await database - .insert({ - voteId: uuidv4(), - userId, - postId - }) - .into("votes"); - - const voters = await getVotes(postId, userId); - - res.status(201).send({ voters }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/controllers/votes/index.js b/packages/server/controllers/votes/index.js deleted file mode 100644 index 7b2cd823fa..0000000000 --- a/packages/server/controllers/votes/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const add = require("./add"); -const remove = require("./remove"); - -module.exports = { - add, - remove -}; diff --git a/packages/server/controllers/votes/remove.js b/packages/server/controllers/votes/remove.js deleted file mode 100644 index 3ff9d2697f..0000000000 --- a/packages/server/controllers/votes/remove.js +++ /dev/null @@ -1,60 +0,0 @@ -// database -const database = require("../../database"); - -// services -const getVotes = require("../../services/votes/getVotes"); - -// utils -const { validUUID } = require("../../helpers"); -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -module.exports = async (req, res) => { - const userId = req.user.userId; - const permissions = req.user.permissions; - - const postId = validUUID(req.body.postId); - - const checkPermission = permissions.includes("vote:destroy"); - if (!checkPermission) { - return res.status(403).send({ - message: error.api.roles.notEnoughPermission, - code: "NOT_ENOUGH_PERMISSION" - }); - } - - try { - const vote = await database - .select() - .from("votes") - .where({ - postId: postId || null, - userId - }) - .first(); - - if (!vote) { - return res.status(404).send({ - message: error.api.votes.voteNotFound, - code: "VOTE_NOT_FOUND" - }); - } - - await database - .delete() - .from("votes") - .where({ - postId, - userId - }); - - const voters = await getVotes(postId, userId); - - res.status(200).send({ voters }); - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; diff --git a/packages/server/database/migrations/20200906183548_initial_users_table.js b/packages/server/database/migrations/20200906183548_initial_users_table.js deleted file mode 100644 index c9acc85620..0000000000 --- a/packages/server/database/migrations/20200906183548_initial_users_table.js +++ /dev/null @@ -1,70 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("users", table => { - table - .uuid("userId") - .notNullable() - .unique() - .primary(); - table.string("name", 30); - table - .string("email", 320) - .notNullable() - .unique(); - table.string("password", 72).notNullable(); - table - .string("username", 30) - .notNullable() - .unique(); - table.text("avatar"); - table.boolean("isVerified").defaultTo(false); - table.boolean("isOwner").defaultTo(false); - table.boolean("isBlocked").defaultTo(false); - table - .timestamp("createdAt") - .defaultTo(knex.fn.now()) - .notNullable(); - table - .timestamp("updatedAt") - .defaultTo(knex.fn.now()) - .notNullable(); - table.comment("Storing users data"); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: users" - }); - }) - .catch(err => { - logger.log({ - level: "error", - message: err - }); - }); -}; - -exports.down = knex => { - return knex.schema - .hasTable("users") - .then(exists => { - if (exists) { - return knex.schema.dropTable("users"); - } - }) - .then(() => { - logger.log({ - level: "info", - message: "Dropping table: users" - }); - }) - .catch(err => { - logger.log({ - level: "error", - message: err - }); - }); -}; diff --git a/packages/server/database/migrations/20200906183706_initial_posts_table.js b/packages/server/database/migrations/20200906183706_initial_posts_table.js deleted file mode 100644 index 2715eb3385..0000000000 --- a/packages/server/database/migrations/20200906183706_initial_posts_table.js +++ /dev/null @@ -1,72 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("posts", table => { - table - .uuid("postId") - .notNullable() - .unique() - .primary(); - table.string("title", 100).notNullable(); - table - .string("slug", 150) - .notNullable() - .unique(); - table.string("slugId", 20).notNullable(); - table.text("contentMarkdown"); - table - .uuid("userId") - .references("userId") - .inTable("users") - .notNullable(); - table - .timestamp("createdAt") - .defaultTo(knex.fn.now()) - .notNullable(); - table - .timestamp("updatedAt") - .defaultTo(knex.fn.now()) - .notNullable(); - table.comment("Storing posts data"); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: posts" - }); - }) - .catch(err => { - logger.log({ - level: "error", - message: err - }); - }); -}; - -exports.down = knex => { - return knex.schema - .hasTable("posts") - .then(exists => { - if (exists) { - return knex.schema - .alterTable("posts", table => { - table.dropForeign("userId"); - }) - .dropTable("posts"); - } - }) - .then(() => { - logger.log({ - level: "info", - message: "Dropping table: posts" - }); - }) - .catch(err => { - logger.log({ - level: "error", - message: err - }); - }); -}; diff --git a/packages/server/database/migrations/20200906184116_initial_votes_table.js b/packages/server/database/migrations/20200906184116_initial_votes_table.js deleted file mode 100644 index f5ce7eea0b..0000000000 --- a/packages/server/database/migrations/20200906184116_initial_votes_table.js +++ /dev/null @@ -1,68 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("votes", table => { - table - .uuid("voteId") - .notNullable() - .unique() - .primary(); - table - .uuid("userId") - .references("userId") - .inTable("users") - .notNullable(); - table - .uuid("postId") - .references("postId") - .inTable("posts") - .onDelete("cascade") - .notNullable(); - table - .timestamp("createdAt") - .defaultTo(knex.fn.now()) - .notNullable(); - table.comment("Storing post votes data"); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: votes" - }); - }) - .catch(err => { - logger.log({ - level: "error", - message: err - }); - }); -}; - -exports.down = knex => { - return knex.schema - .hasTable("votes") - .then(exists => { - if (exists) { - return knex.schema - .alterTable("votes", table => { - table.dropForeign("userId"); - table.dropForeign("postId"); - }) - .dropTable("votes"); - } - }) - .then(() => { - logger.log({ - level: "info", - message: "Dropping table: votes" - }); - }) - .catch(err => { - logger.log({ - level: "error", - message: err - }); - }); -}; diff --git a/packages/server/database/migrations/20200906184214_initial_boards_table.js b/packages/server/database/migrations/20200906184214_initial_boards_table.js deleted file mode 100644 index 8283ace950..0000000000 --- a/packages/server/database/migrations/20200906184214_initial_boards_table.js +++ /dev/null @@ -1,64 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("boards", table => { - table - .uuid("boardId") - .notNullable() - .unique() - .primary(); - table.string("name", 50).notNullable(); - table - .string("url", 50) - .notNullable() - .unique(); - table.string("color", 6).notNullable(); - table.boolean("display").defaultTo(false); - table.boolean("view_voters").defaultTo(true); - table - .timestamp("createdAt") - .defaultTo(knex.fn.now()) - .notNullable(); - table - .timestamp("updatedAt") - .defaultTo(knex.fn.now()) - .notNullable(); - table.comment("Storing boards data"); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: boards" - }); - }) - .catch(err => { - logger.log({ - level: "error", - message: err - }); - }); -}; - -exports.down = knex => { - return knex.schema - .hasTable("boards") - .then(exists => { - if (exists) { - return knex.schema.dropTable("boards"); - } - }) - .then(() => { - logger.log({ - level: "info", - message: "Dropping table: boards" - }); - }) - .catch(err => { - logger.log({ - level: "error", - message: err - }); - }); -}; diff --git a/packages/server/database/migrations/20200913090914_boardId_column_to_posts_table.js b/packages/server/database/migrations/20200913090914_boardId_column_to_posts_table.js deleted file mode 100644 index c4a93b9e52..0000000000 --- a/packages/server/database/migrations/20200913090914_boardId_column_to_posts_table.js +++ /dev/null @@ -1,49 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .table("posts", table => { - table - .uuid("boardId") - .references("boardId") - .inTable("boards") - .onDelete("set null"); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Adding column: boardId in posts" - }); - }) - .catch(err => { - logger.log({ - level: "error", - message: err - }); - }); -}; - -exports.down = knex => { - return knex.schema - .hasColumn("posts", "boardId") - .then(exists => { - if (exists) { - return knex.schema.table("posts", table => { - table.dropColumn("boardId"); - }); - } - }) - .then(() => { - logger.log({ - level: "info", - message: "Dropping column: boardId in posts" - }); - }) - .catch(err => { - logger.log({ - level: "error", - message: err - }); - }); -}; diff --git a/packages/server/database/migrations/20201004110523_create-settings-table.js b/packages/server/database/migrations/20201004110523_create-settings-table.js deleted file mode 100644 index f1ee2a7974..0000000000 --- a/packages/server/database/migrations/20201004110523_create-settings-table.js +++ /dev/null @@ -1,50 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("settings", table => { - table.string("title"); - table.string("description"); - table.string("logo"); - table.string("icon"); - table.string("accentColor", 6); - table.string("googleAnalyticsId"); - table.boolean("isPoweredBy").defaultTo(true); - table.boolean("allowSignup").defaultTo(true); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: settings" - }); - }) - .catch(err => { - logger.error({ - code: "DATABASE_MIGRATIONS", - err - }); - }); -}; - -exports.down = knex => { - return knex.schema - .hasTable("settings") - .then(exists => { - if (exists) { - return knex.schema.dropTable("settings"); - } - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Dropping table: settings" - }); - }) - .catch(err => { - logger.error({ - code: "DATABASE_MIGRATIONS", - err - }); - }); -}; diff --git a/packages/server/database/migrations/20201026113105_email-verification-table.js b/packages/server/database/migrations/20201026113105_email-verification-table.js deleted file mode 100644 index e732b4398d..0000000000 --- a/packages/server/database/migrations/20201026113105_email-verification-table.js +++ /dev/null @@ -1,51 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("emailVerification", table => { - table - .string("email", 320) - .notNullable() - .unique() - .primary() - .references("email") - .inTable("users") - .onDelete("cascade"); - table - .string("token", 320) - .notNullable() - .unique(); - table - .timestamp("createdAt") - .defaultTo(knex.fn.now()) - .notNullable(); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: emailVerification" - }); - }) - .catch(err => { - logger.error(err); - }); -}; - -exports.down = knex => { - return knex.schema - .hasTable("emailVerification") - .then(exists => { - if (exists) { - return knex.schema.dropTable("emailVerification"); - } - }) - .then(() => { - logger.info({ - message: "Dropping table: emailVerification" - }); - }) - .catch(err => { - logger.error(err); - }); -}; diff --git a/packages/server/database/migrations/20201027095358_reset-password-table.js b/packages/server/database/migrations/20201027095358_reset-password-table.js deleted file mode 100644 index b6b6afe587..0000000000 --- a/packages/server/database/migrations/20201027095358_reset-password-table.js +++ /dev/null @@ -1,51 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("resetPassword", table => { - table - .string("email", 320) - .notNullable() - .unique() - .primary() - .references("email") - .inTable("users") - .onDelete("cascade"); - table - .string("token", 320) - .notNullable() - .unique(); - table - .timestamp("createdAt") - .defaultTo(knex.fn.now()) - .notNullable(); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: resetPassword" - }); - }) - .catch(err => { - logger.error(err); - }); -}; - -exports.down = knex => { - return knex.schema - .hasTable("resetPassword") - .then(exists => { - if (exists) { - return knex.schema.dropTable("resetPassword"); - } - }) - .then(() => { - logger.info({ - message: "Dropping table: resetPassword" - }); - }) - .catch(err => { - logger.error(err); - }); -}; diff --git a/packages/server/database/migrations/20201120175923_seed-settings.js b/packages/server/database/migrations/20201120175923_seed-settings.js deleted file mode 100644 index 1a698c67d5..0000000000 --- a/packages/server/database/migrations/20201120175923_seed-settings.js +++ /dev/null @@ -1,44 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex("settings") - .insert([ - { - title: "LogChimp", - description: "Track user feedback to build better products", - accentColor: "484d7c", - logo: "https://cdn.logchimp.codecarrot.net/logchimp_circular_logo.png", - icon: "https://cdn.logchimp.codecarrot.net/logchimp_circular_logo.png", - isPoweredBy: true - } - ]) - .then(() => { - logger.info({ - code: "DATABASE_SEEDS", - message: "Insert data: settings" - }); - }) - .catch(err => { - logger.error({ - code: "DATABASE_SEEDS", - err - }); - }); -}; - -exports.down = knex => { - return knex("settings") - .delete() - .then(() => { - logger.info({ - message: "Drop data: settings" - }); - }) - .catch(err => { - logger.error({ - code: "DATABASE_SEEDS", - err - }); - }); -}; diff --git a/packages/server/database/migrations/20201125151704_permissions-table.js b/packages/server/database/migrations/20201125151704_permissions-table.js deleted file mode 100644 index 394726cbc6..0000000000 --- a/packages/server/database/migrations/20201125151704_permissions-table.js +++ /dev/null @@ -1,42 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("permissions", table => { - table - .uuid("id") - .notNullable() - .unique() - .primary(); - table.string("name", 30); - table.string("type", 20).notNullable(); - table.string("action", 10).notNullable(); - table - .timestamp("created_at") - .notNullable() - .defaultTo(knex.fn.now()); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: permissions" - }); - }) - .catch(err => { - logger.error(err); - }); -}; - -exports.down = knex => { - return knex.schema - .dropTable("permissions") - .then(() => { - logger.info({ - message: "Dropping table: permissions" - }); - }) - .catch(err => { - logger.error(err); - }); -}; diff --git a/packages/server/database/migrations/20201125152807_roles-table.js b/packages/server/database/migrations/20201125152807_roles-table.js deleted file mode 100644 index 9e7b8ab77d..0000000000 --- a/packages/server/database/migrations/20201125152807_roles-table.js +++ /dev/null @@ -1,45 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("roles", table => { - table - .uuid("id") - .notNullable() - .unique() - .primary(); - table.string("name", 30).notNullable(); - table.string("description", 50); - table - .timestamp("created_at") - .notNullable() - .defaultTo(knex.fn.now()); - table - .timestamp("updated_at") - .defaultTo(knex.fn.now()) - .notNullable(); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: roles" - }); - }) - .catch(err => { - logger.error(err); - }); -}; - -exports.down = knex => { - return knex.schema - .dropTable("roles") - .then(() => { - logger.info({ - message: "Dropping table: roles" - }); - }) - .catch(err => { - logger.error(err); - }); -}; diff --git a/packages/server/database/migrations/20201125214155_roles-user-table.js b/packages/server/database/migrations/20201125214155_roles-user-table.js deleted file mode 100644 index 1185698cdb..0000000000 --- a/packages/server/database/migrations/20201125214155_roles-user-table.js +++ /dev/null @@ -1,46 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("roles_users", table => { - table - .uuid("id") - .notNullable() - .primary(); - table - .uuid("role_id") - .notNullable() - .references("id") - .inTable("roles") - .onDelete("cascade"); - table - .uuid("user_id") - .notNullable() - .references("userId") - .inTable("users") - .onDelete("cascade"); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: roles_users" - }); - }) - .catch(err => { - logger.error(err); - }); -}; - -exports.down = knex => { - return knex.schema - .dropTable("roles_users") - .then(() => { - logger.info({ - message: "Dropping table: roles_users" - }); - }) - .catch(err => { - logger.error(err); - }); -}; diff --git a/packages/server/database/migrations/20201125215955_permissions-roles-table.js b/packages/server/database/migrations/20201125215955_permissions-roles-table.js deleted file mode 100644 index 379e92303c..0000000000 --- a/packages/server/database/migrations/20201125215955_permissions-roles-table.js +++ /dev/null @@ -1,47 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("permissions_roles", table => { - table - .uuid("id") - .notNullable() - .unique() - .primary(); - table - .uuid("permission_id") - .notNullable() - .references("id") - .inTable("permissions") - .onDelete("cascade"); - table - .uuid("role_id") - .notNullable() - .references("id") - .inTable("roles") - .onDelete("cascade"); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: permissions_roles" - }); - }) - .catch(err => { - logger.error(err); - }); -}; - -exports.down = knex => { - return knex.schema - .dropTable("permissions_roles") - .then(() => { - logger.info({ - message: "Dropping table: permissions_roles" - }); - }) - .catch(err => { - logger.error(err); - }); -}; diff --git a/packages/server/database/migrations/20201224104136_add-roadmaps-table.js b/packages/server/database/migrations/20201224104136_add-roadmaps-table.js deleted file mode 100644 index 08589d415f..0000000000 --- a/packages/server/database/migrations/20201224104136_add-roadmaps-table.js +++ /dev/null @@ -1,55 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("roadmaps", table => { - table - .uuid("id") - .notNullable() - .unique() - .primary(); - table.string("name", 50).notNullable(); - table - .string("url", 50) - .notNullable() - .unique(); - table.integer("index").notNullable(); - table.string("color", 6).notNullable(); - table.boolean("display").defaultTo(false); - table - .timestamp("created_at") - .defaultTo(knex.fn.now()) - .notNullable(); - table - .timestamp("updated_at") - .defaultTo(knex.fn.now()) - .notNullable(); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: roadmaps" - }); - }) - .catch(err => { - logger.error({ - message: err - }); - }); -}; - -exports.down = knex => { - return knex.schema - .dropTable("roadmaps") - .then(() => { - logger.info({ - message: "Dropping table: roadmaps" - }); - }) - .catch(err => { - logger.error({ - message: err - }); - }); -}; diff --git a/packages/server/database/migrations/20201224143827_add-roadmap-id-to-posts-table.js b/packages/server/database/migrations/20201224143827_add-roadmap-id-to-posts-table.js deleted file mode 100644 index 2d96895c57..0000000000 --- a/packages/server/database/migrations/20201224143827_add-roadmap-id-to-posts-table.js +++ /dev/null @@ -1,41 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .table("posts", table => { - table - .uuid("roadmap_id") - .references("id") - .inTable("roadmaps") - .onDelete("set null"); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Add column: roadmap_id in posts" - }); - }) - .catch(err => { - logger.error({ - message: err - }); - }); -}; - -exports.down = knex => { - return knex.schema - .table("posts", table => { - table.dropColumn("roadmap_id"); - }) - .then(() => { - logger.info({ - message: "Drop column: roadmap_id in posts" - }); - }) - .catch(err => { - logger.error({ - message: err - }); - }); -}; diff --git a/packages/server/database/migrations/20210116165906_insert-permissions.js b/packages/server/database/migrations/20210116165906_insert-permissions.js deleted file mode 100644 index ec929b4cda..0000000000 --- a/packages/server/database/migrations/20210116165906_insert-permissions.js +++ /dev/null @@ -1,39 +0,0 @@ -const { addPermission, removePermission } = require("../utils"); - -const permissions = [ - "post:read", - "post:create", - "post:update", - "post:destroy", - "board:read", - "board:create", - "board:update", - "board:destroy", - "board:assign", - "board:unassign", - "vote:create", - "vote:destroy", - "vote:assign", - "vote:unassign", - "roadmap:read", - "roadmap:create", - "roadmap:update", - "roadmap:destroy", - "roadmap:assign", - "roadmap:unassign", - "dashboard:read", - "role:read", - "role:create", - "role:update", - "role:destroy", - "role:assign", - "role:unassign" -]; - -exports.up = knex => { - return Promise.all([addPermission(knex, permissions)]); -}; - -exports.down = knex => { - return Promise.all([removePermission(knex, permissions)]); -}; diff --git a/packages/server/database/migrations/20210118101323_insert-everyone-role.js b/packages/server/database/migrations/20210118101323_insert-everyone-role.js deleted file mode 100644 index ed10dfb7bb..0000000000 --- a/packages/server/database/migrations/20210118101323_insert-everyone-role.js +++ /dev/null @@ -1,47 +0,0 @@ -const { v4: uuidv4 } = require("uuid"); - -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex - .insert([ - { - id: uuidv4(), - name: "@everyone", - description: "All users" - } - ]) - .into("roles") - .then(() => { - logger.info({ - code: "DATABASE_SEEDS", - message: "Insert data: '@everyone' role" - }); - }) - .catch(err => { - logger.error({ - code: "DATABASE_SEEDS", - message: err.message - }); - }); -}; - -exports.down = async knex => { - try { - await knex("roles") - .delete() - .where({ - name: "@everyone" - }); - - logger.info({ - message: "Drop data: '@everyone' role" - }); - } catch (err) { - logger.error({ - code: "DATABASE_SEEDS", - message: err.message - }); - } -}; diff --git a/packages/server/database/migrations/20210118102306_assign-permission-to-everyone-role.js b/packages/server/database/migrations/20210118102306_assign-permission-to-everyone-role.js deleted file mode 100644 index 8b8a416e2c..0000000000 --- a/packages/server/database/migrations/20210118102306_assign-permission-to-everyone-role.js +++ /dev/null @@ -1,79 +0,0 @@ -const { v4: uuidv4 } = require("uuid"); - -// utils -const logger = require("../../utils/logger"); - -const everyoneRole = async knex => { - return await knex("roles") - .select("id") - .where({ - name: "@everyone" - }) - .first(); -}; - -const getPermId = (list, perm) => { - const type = perm.split(":")[0]; - const action = perm.split(":")[1]; - return list.find(item => item.type === type && item.action === action).id; -}; - -exports.up = async knex => { - try { - const role = await everyoneRole(knex); - const roleId = role.id; - - const permissions = await knex("permissions").select(); - - await knex - .insert([ - { - id: uuidv4(), - role_id: roleId, - permission_id: getPermId(permissions, "post:create") - }, - { - id: uuidv4(), - role_id: roleId, - permission_id: getPermId(permissions, "vote:create") - }, - { - id: uuidv4(), - role_id: roleId, - permission_id: getPermId(permissions, "vote:destroy") - } - ]) - .into("permissions_roles"); - - logger.info({ - message: "Insert data: '@everyone' role permissions" - }); - } catch (err) { - logger.error({ - code: "DATABASE_SEEDS", - message: err.message - }); - } -}; - -exports.down = async knex => { - try { - const role = await everyoneRole(knex); - const roleId = role.id; - - await knex("permissions_roles") - .delete() - .where({ - role_id: roleId - }); - - logger.info({ - message: "Drop data: '@everyone' role permissions" - }); - } catch (err) { - logger.error({ - code: "DATABASE_SEEDS", - message: err.message - }); - } -}; diff --git a/packages/server/database/migrations/20210619173428_create-posts_comments-table.js b/packages/server/database/migrations/20210619173428_create-posts_comments-table.js deleted file mode 100644 index b1f1c3ca1b..0000000000 --- a/packages/server/database/migrations/20210619173428_create-posts_comments-table.js +++ /dev/null @@ -1,50 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("posts_comments", table => { - table - .uuid("id") - .notNullable() - .primary(); - table - .uuid("parent_id") - .references("id") - .inTable("posts_comments"); - table.uuid("activity_id").notNullable(); - table.string("body", 1000).notNullable(); - table.boolean("is_edited").defaultTo(false); - table.boolean("is_spam").defaultTo(false); - table.boolean("is_internal").defaultTo(false); - table.timestamp("created_at").notNullable(); - table.timestamp("updated_at").notNullable(); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: posts_comments" - }); - }) - .catch(err => { - logger.error(err); - }); -}; - -exports.down = knex => { - return knex.schema - .hasTable("posts_comments") - .then(exists => { - if (exists) { - return knex.schema.dropTable("posts_comments"); - } - }) - .then(() => { - logger.info({ - message: "Dropping table: posts_comments" - }); - }) - .catch(err => { - logger.error(err); - }); -}; diff --git a/packages/server/database/migrations/20210619173759_create-posts_activity-table.js b/packages/server/database/migrations/20210619173759_create-posts_activity-table.js deleted file mode 100644 index cf9f213f16..0000000000 --- a/packages/server/database/migrations/20210619173759_create-posts_activity-table.js +++ /dev/null @@ -1,55 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .createTable("posts_activity", table => { - table - .uuid("id") - .notNullable() - .primary(); - table.string("type", 50).notNullable(); - table - .uuid("posts_comments_id") - .references("id") - .inTable("posts_comments"); - table - .uuid("post_id") - .references("postId") - .inTable("posts") - .notNullable(); - table - .uuid("author_id") - .references("userId") - .inTable("users") - .notNullable(); - table.timestamp("created_at").notNullable(); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating table: posts_activity" - }); - }) - .catch(err => { - logger.error(err); - }); -}; - -exports.down = knex => { - return knex.schema - .hasTable("posts_activity") - .then(exists => { - if (exists) { - return knex.schema.dropTable("posts_activity"); - } - }) - .then(() => { - logger.info({ - message: "Dropping table: posts_activity" - }); - }) - .catch(err => { - logger.error(err); - }); -}; diff --git a/packages/server/database/migrations/20210626162044_insert-labs-post_activity.js b/packages/server/database/migrations/20210626162044_insert-labs-post_activity.js deleted file mode 100644 index f704c39b57..0000000000 --- a/packages/server/database/migrations/20210626162044_insert-labs-post_activity.js +++ /dev/null @@ -1,44 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = knex => { - return knex.schema - .table("settings", table => { - table.text("labs").defaultTo("{}"); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Insert column 'labs' into settings" - }); - }) - .then(() => { - return knex("settings").update({ - labs: knex.raw("labs::jsonb || '{\"comments\": false}'") - }); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Insert 'comments' into labs column" - }); - }) - .catch(err => { - logger.error(err); - }); -}; - -exports.down = knex => { - return knex.schema - .table("settings", table => { - table.dropColumn("labs"); - }) - .then(() => { - logger.info({ - message: "Dropping column 'labs' from settings" - }); - }) - .catch(err => { - logger.error(err); - }); -}; diff --git a/packages/server/database/migrations/20210718172153_add-settings-permission.js b/packages/server/database/migrations/20210718172153_add-settings-permission.js deleted file mode 100644 index db86de7a8c..0000000000 --- a/packages/server/database/migrations/20210718172153_add-settings-permission.js +++ /dev/null @@ -1,11 +0,0 @@ -const { addPermission, removePermission } = require("../utils"); - -const permissions = ["settings:read", "settings:update"]; - -exports.up = knex => { - return Promise.all([addPermission(knex, permissions)]); -}; - -exports.down = knex => { - return Promise.all([removePermission(knex, permissions)]); -}; diff --git a/packages/server/database/migrations/20210731141417_add-developer_mode-to-settings.js b/packages/server/database/migrations/20210731141417_add-developer_mode-to-settings.js deleted file mode 100644 index a64176a37b..0000000000 --- a/packages/server/database/migrations/20210731141417_add-developer_mode-to-settings.js +++ /dev/null @@ -1,40 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -exports.up = (knex) => { - return knex.schema - .table("settings", (table) => { - table.boolean("developer_mode").defaultTo(false); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Adding column: developer_mode in settings" - }); - }) - .catch((err) => { - logger.log({ - level: "error", - message: err - }); - }); -}; - -exports.down = (knex) => { - return knex.schema - .table("settings", (table) => { - table.dropColumn("developer_mode"); - }) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Dropping column: developer_mode in settings" - }); - }) - .catch((err) => { - logger.log({ - level: "error", - message: err - }); - }); -}; diff --git a/packages/server/database/migrations/20210808173003_add-notes-to-users-table.js b/packages/server/database/migrations/20210808173003_add-notes-to-users-table.js deleted file mode 100644 index 9c7b6effbb..0000000000 --- a/packages/server/database/migrations/20210808173003_add-notes-to-users-table.js +++ /dev/null @@ -1,45 +0,0 @@ -// utils -const logger = require('../../utils/logger') - -exports.up = (knex) => { - return knex.schema - .table('users', (table) => { - table.text('notes') - }) - .then(() => { - logger.info({ - code: 'DATABASE_MIGRATIONS', - message: 'Adding column: notes in users' - }) - }) - .catch((err) => { - logger.log({ - level: 'error', - message: err - }) - }) -} - -exports.down = (knex) => { - return knex.schema - .hasColumn('users', 'notes') - .then((exists) => { - if (exists) { - return knex.schema.table('users', (table) => { - table.dropColumn('notes') - }) - } - }) - .then(() => { - logger.log({ - level: 'info', - message: 'Dropping column: notes in users' - }) - }) - .catch((err) => { - logger.log({ - level: 'error', - message: err - }) - }) -} diff --git a/packages/server/database/migrations/20210829035703_add-roles_users-unique-index.js b/packages/server/database/migrations/20210829035703_add-roles_users-unique-index.js deleted file mode 100644 index 2b8157d664..0000000000 --- a/packages/server/database/migrations/20210829035703_add-roles_users-unique-index.js +++ /dev/null @@ -1,39 +0,0 @@ -// utils -const logger = require("../../utils/logger"); - -/** - * IF EXISTS used as fail-safe for dropping the CONSTRAINT 'role_id_user_id_unique_index' - * on ID in roles_users table. The unique index have already been removed from '20201125214155_roles-user-table' migration. - */ -exports.up = (knex) => { - return knex - .raw( - ` - CREATE UNIQUE INDEX "role_id_user_id_unique_index" ON "roles_users"("role_id", "user_id"); - - ALTER TABLE roles_users DROP CONSTRAINT IF EXISTS roles_users_id_unique; - ` - ) - .then(() => { - logger.info({ - code: "DATABASE_MIGRATIONS", - message: "Creating index: role_id_user_id_unique_index", - }); - }) - .catch((err) => { - logger.error(err); - }); -}; - -exports.down = (knex) => { - return knex - .raw("DROP INDEX role_id_user_id_unique_index;") - .then(() => { - logger.info({ - message: "Dropping index: role_id_user_id_unique_index", - }); - }) - .catch((err) => { - logger.error(err); - }); -}; diff --git a/packages/server/routes/v1/auth.js b/packages/server/routes/v1/auth.js deleted file mode 100644 index 1972c3595f..0000000000 --- a/packages/server/routes/v1/auth.js +++ /dev/null @@ -1,48 +0,0 @@ -// modules -const express = require("express"); -const router = express.Router(); - -// controller -const auth = require("../../controllers/auth"); - -// middleware -const exists = require("../../middlewares/userExists"); -const mailConfigExists = require("../../middlewares/mailConfigExists"); -const validateEmailToken = require("../../middlewares/validateEmailToken"); - -router.post("/auth/signup", mailConfigExists, auth.signup); -router.post("/auth/login", exists, auth.login); - -router.post("/auth/setup", mailConfigExists, auth.setup); -router.get("/auth/setup", auth.isSiteSetup); - -// email -router.post("/auth/email/verify", mailConfigExists, exists, auth.email.verify); -router.post( - "/auth/email/validate", - validateEmailToken, - exists, - auth.email.validate -); - -// password -router.post( - "/auth/password/reset", - mailConfigExists, - exists, - auth.password.reset -); -router.post( - "/auth/password/validateToken", - validateEmailToken, - exists, - auth.password.validateToken -); -router.post( - "/auth/password/set", - validateEmailToken, - exists, - auth.password.set -); - -module.exports = router; diff --git a/packages/server/routes/v1/boards.js b/packages/server/routes/v1/boards.js deleted file mode 100644 index e5946c489b..0000000000 --- a/packages/server/routes/v1/boards.js +++ /dev/null @@ -1,23 +0,0 @@ -// modules -const express = require("express"); -const router = express.Router(); - -// controller -const boards = require("../../controllers/boards"); - -// middleware -const middleware = require("../../middlewares"); -const exists = require("../../middlewares/boardExists"); - -router.get("/boards", boards.filter); -router.get("/boards/get", boards.get); -router.get("/boards/:url", exists, boards.boardByUrl); -router.get("/boards/search/:name", middleware.apiAuth, boards.searchBoard); - -router.post("/boards/check-name", middleware.apiAuth, boards.checkName); -router.post("/boards", middleware.apiAuth, boards.create); -router.patch("/boards", middleware.apiAuth, exists, boards.updateBoard); - -router.delete("/boards", middleware.apiAuth, exists, boards.deleteById); - -module.exports = router; diff --git a/packages/server/routes/v1/index.js b/packages/server/routes/v1/index.js deleted file mode 100644 index 6f3998f989..0000000000 --- a/packages/server/routes/v1/index.js +++ /dev/null @@ -1,27 +0,0 @@ -// modules -const express = require("express"); -const router = express.Router(); - -// requiring all routes -const auth = require("./auth"); -const posts = require("./posts"); -const votes = require("./votes"); -const users = require("./users"); -const boards = require("./boards"); -const settings = require("./settings"); -const roadmaps = require("./roadmaps"); -const roles = require("./roles"); - -router.use( - "/api/v1", - auth, - posts, - votes, - users, - boards, - settings, - roadmaps, - roles -); - -module.exports = router; diff --git a/packages/server/routes/v1/posts.js b/packages/server/routes/v1/posts.js deleted file mode 100644 index d4acfa7019..0000000000 --- a/packages/server/routes/v1/posts.js +++ /dev/null @@ -1,40 +0,0 @@ -// modules -const express = require("express"); -const router = express.Router(); - -// controller -const post = require("../../controllers/post"); - -// middleware -const middleware = require("../../middlewares"); -const exists = require("../../middlewares/postExists"); - -router.post("/posts/get", post.filterPost); -router.post("/posts/slug", exists, post.postBySlug); - -router.post("/posts", middleware.apiAuth, post.create); -router.patch("/posts", middleware.apiAuth, exists, post.updatePost); - -router.delete("/posts", middleware.apiAuth, exists, post.deleteById); - -// post activity -router.get("/posts/:post_id/activity", post.activity.get); - -// post comment -router.post( - "/posts/:post_id/comments", - middleware.apiAuth, - post.comments.create -); -router.put( - "/posts/:post_id/comments/:comment_id", - middleware.apiAuth, - post.comments.update -); -router.delete( - "/posts/:post_id/comments/:comment_id", - middleware.apiAuth, - post.comments.destroy -); - -module.exports = router; diff --git a/packages/server/routes/v1/roadmaps.js b/packages/server/routes/v1/roadmaps.js deleted file mode 100644 index 69e0fd44f9..0000000000 --- a/packages/server/routes/v1/roadmaps.js +++ /dev/null @@ -1,27 +0,0 @@ -// modules -const express = require("express"); -const router = express.Router(); - -// controller -const roadmaps = require("../../controllers/roadmaps"); - -// middleware -const middleware = require("../../middlewares"); -const exists = require("../../middlewares/roadmapExists"); - -router.get("/roadmaps", roadmaps.filter); -router.get("/roadmaps/:url", exists, roadmaps.roadmapByUrl); -router.get( - "/roadmaps/search/:name", - middleware.apiAuth, - roadmaps.searchRoadmap -); - -router.post("/roadmaps", middleware.apiAuth, roadmaps.create); - -router.patch("/roadmaps", middleware.apiAuth, exists, roadmaps.updateRoadmap); -router.patch("/roadmaps/sort", middleware.apiAuth, roadmaps.sort); - -router.delete("/roadmaps", middleware.apiAuth, exists, roadmaps.deleteById); - -module.exports = router; diff --git a/packages/server/routes/v1/roles.js b/packages/server/routes/v1/roles.js deleted file mode 100644 index 5182098b1d..0000000000 --- a/packages/server/routes/v1/roles.js +++ /dev/null @@ -1,29 +0,0 @@ -// modules -const express = require("express"); -const router = express.Router(); - -// controller -const roles = require("../../controllers/roles"); - -// middleware -const middleware = require("../../middlewares"); -const roleExists = require("../../middlewares/roleExists"); - -router.get("/roles", middleware.apiAuth, roles.get); -router.get("/roles/:id", middleware.apiAuth, roleExists, roles.getOne); - -router.post("/roles", middleware.apiAuth, roles.create); - -router.patch("/roles", middleware.apiAuth, roleExists, roles.update); - -// BETA: Assign role to a user -// todo: add userExists middleware -// todo: add roleExists middleware -router.put("/roles/:role_id/users/:user_id", middleware.apiAuth, roles.addRoleToUser); - -// BETA: Unassign role from a user -// todo: add userExists middleware -// todo: add roleExists middleware -router.delete("/roles/:role_id/users/:user_id", middleware.apiAuth, roles.deleteRoleFromUser); - -module.exports = router; diff --git a/packages/server/routes/v1/settings.js b/packages/server/routes/v1/settings.js deleted file mode 100644 index 681494b13d..0000000000 --- a/packages/server/routes/v1/settings.js +++ /dev/null @@ -1,42 +0,0 @@ -// modules -const path = require("path"); -const express = require("express"); -const router = express.Router(); -const multer = require("multer"); - -const storage = multer.diskStorage({ - destination: (req, file, cb) => { - cb(null, path.resolve(__dirname, "../../../content/images")); - }, - filename: (req, file, cb) => { - const fileExtension = file.originalname.split(".")[ - file.originalname.split(".").length - 1 - ]; - const fileName = Date.now().toString(32); - - cb(null, `${fileName}.${fileExtension}`); - } -}); - -const upload = multer({ - storage -}); - -// controller -const settings = require("../../controllers/settings"); - -// middleware -const middlewares = require("../../middlewares"); - -router.get("/settings/site", settings.siteSettings); -router.patch("/settings/site", middlewares.apiAuth, settings.update); -router.post( - "/settings/update-logo", - middlewares.apiAuth, - upload.single("logo", 1), - settings.updateLogo -); -router.get("/settings/labs", settings.getLabs); -router.patch("/settings/labs", middlewares.apiAuth, settings.updateLabs); - -module.exports = router; diff --git a/packages/server/routes/v1/users.js b/packages/server/routes/v1/users.js deleted file mode 100644 index 7d1b64af7b..0000000000 --- a/packages/server/routes/v1/users.js +++ /dev/null @@ -1,27 +0,0 @@ -// modules -const express = require("express"); -const router = express.Router(); - -// controller -const users = require("../../controllers/users"); - -// middleware -const middleware = require("../../middlewares"); - -router.get("/users", users.filter); -router.get("/users/profile", middleware.apiAuth, users.getProfile); -router.patch("/users/profile", middleware.apiAuth, users.updateProfile); - -router.get("/users/permissions", middleware.apiAuth, users.getUserPermissions); -router.get("/users/dashboard", middleware.apiAuth, users.accessDashboard); - -// TODO: create permission for user:read, user:update, user:create, user:delete -// router.get("/users/get", middleware.apiAuth, users.accessDashboard); -// router.get("/users/:user_id/get", middleware.apiAuth, users.getUserInfo); -// router.patch( -// "/users/:user_id/update", -// middleware.apiAuth, -// users.updateUserInfo -// ); - -module.exports = router; diff --git a/packages/server/routes/v1/votes.js b/packages/server/routes/v1/votes.js deleted file mode 100644 index 50f40106ea..0000000000 --- a/packages/server/routes/v1/votes.js +++ /dev/null @@ -1,14 +0,0 @@ -// modules -const express = require("express"); -const router = express.Router(); - -// controller -const votes = require("../../controllers/votes"); - -// middleware -const middleware = require("../../middlewares"); - -router.post("/votes", middleware.apiAuth, votes.add); -router.delete("/votes", middleware.apiAuth, votes.remove); - -module.exports = router; diff --git a/packages/server/services/auth/createUser.js b/packages/server/services/auth/createUser.js deleted file mode 100644 index e0f88b6c74..0000000000 --- a/packages/server/services/auth/createUser.js +++ /dev/null @@ -1,127 +0,0 @@ -// modules -const { v4: uuidv4 } = require("uuid"); -const md5 = require("md5"); - -// database -const database = require("../../database"); - -// services -const verifyEmail = require("../../services/auth/verifyEmail"); -const { createToken } = require("../../services/token.service"); - -// utils -const { hashPassword } = require("../../utils/password"); -const logger = require("../../utils/logger"); -const error = require("../../errorResponse.json"); - -/** - * Add user to 'users' database table - * - * @param {any} req - * @param {any} res - * @param {any} next - * @param {object} userData - User data to create account - * @param {string} userData.email - User email address - * @param {string} userData.password - User password - * @param {string} userData.name - User name - * @returns {object|null} - Returning user data object from database or null - */ -const createUser = async (req, res, next, userData) => { - // generate user unique identification - const userId = uuidv4(userData.email); - - const name = userData.name; - - // get username from email address - const username = userData.email.split("@")[0]; - - // get avatar by hashing email - const userMd5Hash = md5(userData.email); - const avatar = `https://www.gravatar.com/avatar/${userMd5Hash}`; - - // hash password - const hashedPassword = hashPassword(userData.password); - - try { - const { - rows: [getUser] - } = await database.raw( - ` - SELECT EXISTS ( - SELECT * FROM users WHERE LOWER(email) = LOWER(:email) - ) - `, - { - email: userData.email - } - ); - - const userExists = getUser.exists; - if (userExists) { - res.status(409).send({ - message: error.middleware.user.userExists, - code: "USER_EXISTS" - }); - return null; - } - - // insert user to database - const [newUser] = await database - .insert({ - userId, - name, - username, - email: userData.email, - password: hashedPassword, - avatar - }) - .into("users") - .returning(["userId", "name", "username", "email", "avatar"]); - - if (!newUser) { - return null; - } - - // assign '@everyone' role - const getRole = await database - .select() - .from("roles") - .where({ - name: "@everyone" - }) - .first(); - - await database - .insert({ - id: uuidv4(), - role_id: getRole.id, - user_id: newUser.userId - }) - .into("roles_users"); - - const tokenPayload = { - userId: newUser.userId, - email: newUser.email - }; - // send email verification - const url = req.headers.origin; - await verifyEmail(url, tokenPayload); - - // create auth token - const authToken = createToken(tokenPayload, { - expiresIn: "2d" - }); - - return { - authToken, - ...newUser - }; - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; - -module.exports = createUser; diff --git a/packages/server/services/auth/passwordReset.js b/packages/server/services/auth/passwordReset.js deleted file mode 100644 index 6c566eec07..0000000000 --- a/packages/server/services/auth/passwordReset.js +++ /dev/null @@ -1,56 +0,0 @@ -// database -const database = require("../../database"); - -// services -const { mail, generateContent } = require("../../services/mail"); -const { createToken } = require("../../services/token.service"); - -// utils -const logger = require("../../utils/logger"); - -const passwordReset = async (url, tokenPayload) => { - const token = createToken(tokenPayload, { - expiresIn: "2h" - }); - - try { - // remove existing resetPassword request - await database - .delete() - .from("resetPassword") - .where({ - email: tokenPayload.email - }); - - const insertPasswordResetToken = await database - .insert({ - email: tokenPayload.email, - token - }) - .into("resetPassword") - .returning("*"); - - const urlObject = new URL(url); - const passwordResetMailContent = await generateContent("reset", { - url: urlObject.origin, - domain: urlObject.host, - resetLink: `${urlObject.origin}/password-reset/confirm/?token=${token}` - }); - - const noReplyEmail = `noreply@${urlObject.host}`; - - await mail.sendMail({ - from: noReplyEmail, - to: tokenPayload.email, - subject: "Reset your LogChimp password", - text: passwordResetMailContent.text, - html: passwordResetMailContent.html - }); - - return insertPasswordResetToken[0]; - } catch (err) { - logger.error(err); - } -}; - -module.exports = passwordReset; diff --git a/packages/server/services/auth/verifyEmail.js b/packages/server/services/auth/verifyEmail.js deleted file mode 100644 index 86ad61d791..0000000000 --- a/packages/server/services/auth/verifyEmail.js +++ /dev/null @@ -1,55 +0,0 @@ -// database -const database = require("../../database"); - -// services -const { mail, generateContent } = require("../../services/mail"); -const { createToken } = require("../../services/token.service"); - -// utils -const logger = require("../../utils/logger"); - -const verifyEmail = async (url, tokenPayload) => { - const token = createToken(tokenPayload, { - expiresIn: "2h" - }); - - try { - await database - .delete() - .from("emailVerification") - .where({ - email: tokenPayload.email - }); - - const userEmailVerificationToken = await database - .insert({ - email: tokenPayload.email, - token - }) - .into("emailVerification") - .returning("*"); - - const urlObject = new URL(url); - const onboardingMailContent = await generateContent("verify", { - url: urlObject.origin, - domain: urlObject.host, - verificationLink: `${urlObject.origin}/verify/?token=${token}` - }); - - const noReplyEmail = `noreply@${urlObject.host}`; - - await mail.sendMail({ - from: noReplyEmail, - to: tokenPayload.email, - subject: "LogChimp - Please confirm your email", - text: onboardingMailContent.text, - html: onboardingMailContent.html - }); - - return userEmailVerificationToken[0]; - } catch (err) { - logger.error(err.message); - } -}; - -module.exports = verifyEmail; diff --git a/packages/server/services/boards/getBoardById.js b/packages/server/services/boards/getBoardById.js deleted file mode 100644 index d2e8772292..0000000000 --- a/packages/server/services/boards/getBoardById.js +++ /dev/null @@ -1,30 +0,0 @@ -const database = require("../../database"); - -// utils -const logger = require("../../utils/logger"); - -const getBoardById = async boardId => { - try { - const boards = await database - .select() - .from("boards") - .where({ - boardId - }) - .limit(1); - - const board = boards[0]; - if (board) { - return board; - } else { - return null; - } - } catch (err) { - logger.log({ - level: "error", - message: err - }); - } -}; - -module.exports = getBoardById; diff --git a/packages/server/services/mail/generateContent.js b/packages/server/services/mail/generateContent.js deleted file mode 100644 index 2ad91cb6e0..0000000000 --- a/packages/server/services/mail/generateContent.js +++ /dev/null @@ -1,34 +0,0 @@ -const _ = require("lodash"); -const path = require("path"); -const fs = require("fs-extra"); -const { htmlToText } = require("html-to-text"); - -const generateContent = async (templateName, options) => { - const mailTemplateFilePath = path.resolve( - __dirname, - "templates", - `${templateName}.html` - ); - - try { - const mailTemplateFileContent = await fs.readFile( - mailTemplateFilePath, - "utf8" - ); - - _.templateSettings.interpolate = /{{([\s\S]+?)}}/g; - const compiled = _.template(mailTemplateFileContent); - const htmlMail = compiled(options); - - const textMail = htmlToText(htmlMail); - - return { - html: htmlMail, - text: textMail - }; - } catch (error) { - console.error(error); - } -}; - -module.exports = generateContent; diff --git a/packages/server/services/mail/index.js b/packages/server/services/mail/index.js deleted file mode 100644 index 3ee82d64d2..0000000000 --- a/packages/server/services/mail/index.js +++ /dev/null @@ -1,2 +0,0 @@ -exports.mail = require("./mail"); -exports.generateContent = require("./generateContent"); diff --git a/packages/server/services/mail/mail.js b/packages/server/services/mail/mail.js deleted file mode 100644 index 7539df93b6..0000000000 --- a/packages/server/services/mail/mail.js +++ /dev/null @@ -1,25 +0,0 @@ -const nodemailer = require("nodemailer"); -require('dotenv').config() - -// utils -const logchimpConfig = require("../../utils/logchimpConfig"); -const config = logchimpConfig(); -const logger = require("../../utils/logger"); - -if (config.mail) { - const mail = nodemailer.createTransport({ - host: config.mail.host, - port: config.mail.port, - secure: false, - ignoreTLS: process.env.NODE_ENV === "development", - auth: { - user: config.mail.user, - pass: config.mail.password - } - }); - - module.exports = mail; -} else { - logger.warn("Email adapter missing"); - module.exports = null; -} diff --git a/packages/server/services/mail/templates/raw/reset.html b/packages/server/services/mail/templates/raw/reset.html deleted file mode 100644 index fe65316391..0000000000 --- a/packages/server/services/mail/templates/raw/reset.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -
- - - - - - -|
-
-
-
-
- - Hello, - - -- You can change your account page by clicking "Reset password" button, this link will expire in 1 - hours. - - - - -- Thanks - - -
- LogChimp
- |
-
|
-
-
-
-
- - Thank you for creating an account. - - -- Please confirm your email address by clicking - Confirm email - button below: - - - - -- Thanks - - -
- LogChimp
- |
-
|
-
-
-
-
- - Hello, - - -- You can change your account page by clicking "Reset password" button, this link will expire in 1 - hours. - - - - -- Thanks - - -
- LogChimp
- |
-
|
-
-
-
-
- - Thank you for creating an account. - - -- Please confirm your email address by clicking - Confirm email - button below: - - - - -- Thanks - - -
- LogChimp
- |
-
{{ activity.comment.body }}
- - -- Log in to your account to give feedback -
-- {{ name }} -
-- {{ name || username }} -
- - {{ email }} - -- {{ postData.roadmap.name }} -
-- {{ post.contentMarkdown | trim(120) }} -
-- {{ post.contentMarkdown | trim(120) }} -
-- Complete your LogChimp site setup to access dashboard. -
-
- - {{ note }} -
-Preview
-Beta features
- -Posts permissions
-Boards permissions
-Roadmaps permissions
-Vote permissions
-Dashboard permissions
-Roles permissions
-Settings permissions
-You will receive a password reset email soon.
-Follow the link in the email to reset your password.
-Something went wrong!
-- A board is a place where people can post and vote on ideas for a - specific topic. -
-- Let’s setup your LogChimp site to track user feedback for building - better products. -
-
-
-