13-2. 덧글 작성 API 만들기

덧글 작성 API에 대한 로직은, posts 디렉토리에 comments.controller.js 를 만들어서 관리를 하도록 하겠습니다.

덧글 작성 로직은 다음과 같습니다.

  1. 로그인 확인
  2. 덧글 작성 요청 스키마 확인
  3. 포스트 ID 검사 및 존재유무 확인
  4. 포스트에 덧글 작성
  5. 포스트의 현재 덧글 목록 반환

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": "덧글 내용"
}

그러면, 덧글을 작성 할 때마다 배열에 덧글 내용과 유저명이 들어있는 객체가 상단에 추가됩니다.

results matching ""

    No results matching ""