Skip to content

Commit

Permalink
Merge pull request #6 from wecode-bootcamp-korea/feature/13th_final
Browse files Browse the repository at this point in the history
Add: pagination, filter
  • Loading branch information
Jun4928 authored Dec 31, 2020
2 parents 9400ba4 + 197ed3d commit 82927c9
Show file tree
Hide file tree
Showing 13 changed files with 179 additions and 236 deletions.
1 change: 1 addition & 0 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ app.use(express.json())
app.use(logger)
app.use(routes)

// general error handler
app.use((err, req, res, next) => {
const { status, message } = err
console.error(err)
Expand Down
149 changes: 62 additions & 87 deletions controllers/ArticleController.js
Original file line number Diff line number Diff line change
@@ -1,116 +1,91 @@
const { ArticleService } = require('../services')
const { errorGenerator, validateFields } = require('../utils')
const { errorWrapper, errorGenerator } = require('../errors')
const { validateFields } = require('../utils')

const getArticles = async (req, res, next) => {
try {
const articles = await ArticleService.findArticles(req.query)
const getArticles = errorWrapper(async (req, res, next) => {
const articles = await ArticleService.findArticles(req.query)
res.status(200).json({ articles })
})

res.status(200).json({ articles })
} catch (err) {
next(err)
}
}

const getOneArticle = async (req, res, next) => {
try {
const { articleId } = req.params
const article = await ArticleService.findArticle({ id: articleId })
const getOneArticle = errorWrapper(async (req, res, next) => {
const { articleId } = req.params
const article = await ArticleService.findArticle({ id: articleId })

if (article.deleted_at) return res.status(200).json({ message: 'deleted ' })

res.status(200).json({ article })
} catch (err) {
next(err)
}
}
if (article.deleted_at) return res.status(200).json({ message: 'deleted ' })

const postOneArticle = async (req, res, next) => {
try {
const { id: userId } = req.foundUser
const { title, body } = req.body
res.status(200).json({ article })
})

if (!title || !body) errorGenerator({ statusCode: 400, message: 'invalid key error' })
const postOneArticle = errorWrapper(async (req, res, next) => {
const { id: userId } = req.foundUser
const { title, body } = req.body

const createdArticle = await ArticleService.createArticle({
userId,
title,
body,
})
if (!title || !body) errorGenerator({ statusCode: 400, message: 'invalid key error' })

res.status(201).json({ createdArticle })
} catch (err) {
next(err)
}
}
const createdArticle = await ArticleService.createArticle({
userId,
title,
body,
})

const updateOneArticle = async (req, res, next) => {
try {
const { id: userIdFromToken } = req.foundUser
const { articleId } = req.params
const requestedFields = req.body
const allowedFields = ['title', 'body']
res.status(201).json({ createdArticle })
})

const isValidFields = validateFields(requestedFields, allowedFields)
const updateOneArticle = errorWrapper(async (req, res, next) => {
const { id: userIdFromToken } = req.foundUser
const { articleId } = req.params
const requestedFields = req.body
const allowedFields = ['title', 'body']

if (!isValidFields) errorGenerator({ statusCode: 400, message: 'invalid requested fields' })
const isValidFields = validateFields(requestedFields, allowedFields)

const foundArticle = await ArticleService.findArticle({ id: articleId })
const { user_id: userIdFromArticle } = foundArticle
if (!isValidFields) errorGenerator({ statusCode: 400, message: 'invalid requested fields' })

if (userIdFromToken !== userIdFromArticle)
errorGenerator({ statusCode: 403, message: 'unauthorized' })
const foundArticle = await ArticleService.findArticle({ id: articleId })
const { user_id: userIdFromArticle } = foundArticle

const updatedArticle = await ArticleService.updateArticle({
articleId,
requestedFields,
})
if (userIdFromToken !== userIdFromArticle)
errorGenerator({ statusCode: 403, message: 'unauthorized' })

res.status(201).json({ updatedArticle })
} catch (err) {
next(err)
}
}
const updatedArticle = await ArticleService.updateArticle({
articleId,
requestedFields,
})

const publishOneArticle = async (req, res, next) => {
try {
const { id: userIdFromToken } = req.foundUser
const { articleId } = req.params
res.status(201).json({ updatedArticle })
})

const foundArticle = await ArticleService.findArticle({ id: articleId })
if (!foundArticle) errorGenerator({ statusCode: 404, message: 'article not found' })
const { user_id: userIdFromArticle } = foundArticle
const publishOneArticle = errorWrapper(async (req, res, next) => {
const { id: userIdFromToken } = req.foundUser
const { articleId } = req.params

if (userIdFromToken !== userIdFromArticle)
errorGenerator({ statusCode: 403, message: 'unauthorized' })
const foundArticle = await ArticleService.findArticle({ id: articleId })
if (!foundArticle) errorGenerator({ statusCode: 404, message: 'article not found' })
const { user_id: userIdFromArticle } = foundArticle

const publishedArticle = await ArticleService.publishArticle(articleId)
if (userIdFromToken !== userIdFromArticle)
errorGenerator({ statusCode: 403, message: 'unauthorized' })

res.status(201).json({ publishedArticle })
} catch (err) {
next(err)
}
}
const publishedArticle = await ArticleService.publishArticle(articleId)

const deleteOneArticle = async (req, res, next) => {
try {
const { id: userIdFromToken } = req.foundUser
const { articleId } = req.params
res.status(201).json({ publishedArticle })
})

const foundArticle = await ArticleService.findArticle({ id: articleId })
const deleteOneArticle = errorWrapper(async (req, res, next) => {
const { id: userIdFromToken } = req.foundUser
const { articleId } = req.params

if (!foundArticle) errorGenerator({ statusCode: 404, message: 'article not found' })
const { user_id: userIdFromArticle } = foundArticle
const foundArticle = await ArticleService.findArticle({ id: articleId })
if (!foundArticle) errorGenerator({ statusCode: 404, message: 'article not found' })
const { user_id: userIdFromArticle } = foundArticle

if (userIdFromToken !== userIdFromArticle)
errorGenerator({ statusCode: 403, message: 'unauthorized' })
if (userIdFromToken !== userIdFromArticle)
errorGenerator({ statusCode: 403, message: 'unauthorized' })

const deletedArticle = await ArticleService.deleteArticle(articleId)
const deletedArticle = await ArticleService.deleteArticle(articleId)

res.status(201).json({ deletedArticle })
} catch (err) {
next(err)
}
}
res.status(201).json({ deletedArticle })
})

module.exports = {
getArticles,
Expand Down
112 changes: 45 additions & 67 deletions controllers/CommentController.js
Original file line number Diff line number Diff line change
@@ -1,88 +1,66 @@
const { CommentService } = require('../services')
const { errorGenerator } = require('../utils')
const { errorWrapper, errorGenerator } = require('../errors')

const getComments = async (req, res, next) => {
try {
const { articleId } = req.params
const getComments = errorWrapper(async (req, res, next) => {
const { articleId } = req.params

const comments = await CommentService.findComments({ article_id: Number(articleId) })
const comments = await CommentService.fetchComments({ article_id: Number(articleId) })
res.status(200).json({ comments })
})

res.status(200).json({ comments })
} catch (err) {
next(err)
}
}

const postComment = async (req, res, next) => {
try {
const { articleId } = req.params
const { body } = req.body
const { id: userIdFromToken } = req.foundUser

if (!body) errorGenerator({ message: 'invalid input', statusCode: 400 })
const postComment = errorWrapper(async (req, res, next) => {
const { articleId } = req.params
const { id: userIdFromToken } = req.foundUser
const { body } = req.body

const createdComment = await CommentService.createComment({
article_id: Number(articleId),
user_id: userIdFromToken,
body,
})
const createdComment = await CommentService.createComment({
article_id: Number(articleId),
user_id: userIdFromToken,
body,
})

res.status(201).json({ createdComment })
} catch (err) {
next(err)
}
}
res.status(201).json({ createdComment })
})

const updateComment = async (req, res, next) => {
try {
const { articleId, commentId } = req.params
const { body } = req.body
const { id: userIdFromToken } = req.foundUser
const updateComment = errorWrapper(async (req, res, next) => {
const { articleId, commentId } = req.params
const { body } = req.body
const { id: userIdFromToken } = req.foundUser

if (!body) errorGenerator({ message: 'invalid input', statusCode: 400 })
const comments = await CommentService.fetchComments({ article_id: Number(articleId) })

const comments = await CommentService.findComments({ article_id: Number(articleId) })
const foundComment = comments.find((comment) => comment.id === Number(commentId))
if (!foundComment) errorGenerator({ message: 'not found', statusCode: 404 })
const foundComment = comments.find((comment) => comment.id === Number(commentId))
if (!foundComment) errorGenerator({ message: 'not found', statusCode: 404 })

const isValidUser = foundComment.user_id === userIdFromToken
if (!isValidUser) errorGenerator({ message: 'unauthorized', statusCode: 403 })
const isValidUser = foundComment.user_id === userIdFromToken // true or false
if (!isValidUser) errorGenerator({ message: 'unauthorized', statusCode: 403 })

const updatedComment = await CommentService.updateComment({
comment_id: foundComment.id,
body,
})
const updatedComment = await CommentService.updateComment({
comment_id: Number(commentId),
body,
})

res.status(200).json({ updatedComment })
} catch (err) {
next(err)
}
}
res.status(200).json({ updatedComment })
})

const deleteComment = async (req, res, next) => {
try {
const { articleId, commentId } = req.params
const { body } = req.body
const { id: userIdFromToken } = req.foundUser
const deleteComment = errorWrapper(async (req, res, next) => {
const { articleId, commentId } = req.params
const { id: userIdFromToken } = req.foundUser

if (!body) errorGenerator({ message: 'invalid input', statusCode: 400 })
const comments = await CommentService.fetchComments({ article_id: Number(articleId) })

const comments = await CommentService.findComments({ article_id: Number(articleId) })
const foundComment = comments.find((comment) => comment.id === Number(commentId))
if (!foundComment) errorGenerator({ message: 'not found', statusCode: 404 })
const foundComment = comments.find((comment) => comment.id === Number(commentId))
if (!foundComment) errorGenerator({ message: 'not found', statusCode: 404 })

const isValidUser = foundComment.user_id === userIdFromToken
if (!isValidUser) errorGenerator({ message: 'unauthorized', statusCode: 403 })
const isValidUser = foundComment.user_id === userIdFromToken
if (!isValidUser) errorGenerator({ message: 'unauthorized', statusCode: 403 })

const deletedComment = await CommentService.deleteComment({
comment_id: foundComment.id,
})
const deletedComment = await CommentService.deleteComment({
comment_id: Number(commentId),
})

res.status(200).json({ deletedComment })
} catch (err) {
next(err)
}
}
res.status(200).json({ deletedComment })
})

module.exports = {
getComments,
Expand Down
59 changes: 26 additions & 33 deletions controllers/UserController.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,51 +2,44 @@ const { AUTH_TOKEN_SALT } = process.env
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const { UserService } = require('../services')
const { errorGenerator } = require('../utils')
const { errorWrapper, errorGenerator } = require('../errors')

const signUp = async (req, res, next) => {
try {
const { email, password } = req.body
const signUp = errorWrapper(async (req, res, next) => {
const { email, password } = req.body
if (!email || !password) errorGenerator({ statusCode: 400, message: 'invalid input' })

const hashedPassword = await bcrypt.hash(password, 10)
const hashedPassword = await bcrypt.hash(password, 10)

const foundUser = await UserService.findUser({ email })
const foundUser = await UserService.findUser({ email })

if (foundUser) errorGenerator({ statusCode: 409, message: 'duplicated' })
if (foundUser) errorGenerator({ statusCode: 409, message: 'duplicated' })

const createdUser = await UserService.createUser({
email,
password: hashedPassword,
})
const createdUser = await UserService.createUser({
email,
password: hashedPassword,
})

res.status(201).json({
message: 'user created',
email: createdUser.email,
})
} catch (err) {
next(err)
}
}
res.status(201).json({
message: 'user created',
email: createdUser.email,
})
})

const logIn = async (req, res, next) => {
try {
const { email, password: inputPassword } = req.body
const logIn = errorWrapper(async (req, res, next) => {
const { email, password: inputPassword } = req.body

const foundUser = await UserService.findUser({ email })
const foundUser = await UserService.findUser({ email })

if (!foundUser) errorGenerator({ statusCode: 400, message: 'client input invalid' })
if (!foundUser) errorGenerator({ statusCode: 400, message: 'client input invalid' })

const { id, password: hashedPassword } = foundUser
const isValidPassword = await bcrypt.compare(inputPassword, hashedPassword)
const { id, password: hashedPassword } = foundUser
const isValidPassword = await bcrypt.compare(inputPassword, hashedPassword)

if (!isValidPassword) errorGenerator({ statusCode: 400, message: 'client input invalid' })
if (!isValidPassword) errorGenerator({ statusCode: 400, message: 'client input invalid' })

const token = jwt.sign({ id }, AUTH_TOKEN_SALT)
res.status(200).json({ message: 'login success!', token })
} catch (err) {
next(err)
}
}
const token = jwt.sign({ id }, AUTH_TOKEN_SALT)
res.status(200).json({ message: 'login success!', token })
})

module.exports = {
logIn,
Expand Down
File renamed without changes.
Loading

0 comments on commit 82927c9

Please sign in to comment.