13-2. 덧글 작성 API 만들기
덧글 작성 API에 대한 로직은, posts 디렉토리에 comments.controller.js
를 만들어서 관리를 하도록 하겠습니다.
덧글 작성 로직은 다음과 같습니다.
- 로그인 확인
- 덧글 작성 요청 스키마 확인
- 포스트 ID 검사 및 존재유무 확인
- 포스트에 덧글 작성
- 포스트의 현재 덧글 목록 반환
src/api/posts/comments.controller.js
const Joi = require('joi');
const Post = require('models/post');
const {ObjectId} = require('mongoose').Types;
exports.comment = async (ctx) => {
/* 로그인 확인 */
const { user } = ctx.request;
if(!user) {
ctx.status = 403; // Forbidden
return;
}
/* 덧글 작성 요청 스키마 확인 */
const schema = Joi.object().keys({
text: Joi.string().min(1).max(100).required()
});
const result = Joi.validate(ctx.request.body, schema);
if(result.error) {
ctx.status = 400; // Bad request
return;
}
const { username } = user.profile;
const { text } = ctx.request.body;
const { postId } = ctx.params;
/* 포스트 ID 검사 및 존재유무 확인 */
if(!ObjectId.isValid(postId)) {
ctx.status = 400; // Bad request
return;
}
let post = null;
try {
post = await Post.findById(postId);
} catch (e) {
ctx.throw(500, e);
}
if(!post) {
ctx.status = 404; // Not Found
return;
}
/* 포스트에 덧글 작성 */
try {
await post.writeComment({
username,
text
});
} catch (e) {
ctx.throw(500, e);
}
/* 포스트의 현재 덧글 목록 반환 */
ctx.body = post.comments;
};
벌써 덧글 작성에 대한 서버 구현이 거의 끝났습니다! posts API 라우터에서 다음과 같이 설정만 해주면됩니다.
src/api/posts/index.js
const Router = require('koa-router');
const posts = new Router();
const postsCtrl = require('./posts.controller');
const likesCtrl = require('./likes.controller');
const commentsCtrl = require('./comments.controller');
posts.post('/', postsCtrl.write);
posts.get('/', postsCtrl.list);
posts.post('/:postId/likes', likesCtrl.like);
posts.delete('/:postId/likes', likesCtrl.unlike);
posts.post('/:postId/comments', commentsCtrl.comment);
module.exports = posts;
이제, 다음과 같은 형식으로 Postman 에서 테스트를 해보세요.
POST http://localhost:4000/api/posts/:id/comments
{
"text": "덧글 내용"
}
그러면, 덧글을 작성 할 때마다 배열에 덧글 내용과 유저명이 들어있는 객체가 상단에 추가됩니다.