CoolCooool / Coolcool-Back

Coolcool Backend Repository
0 stars 0 forks source link

[feat] 커뮤니티 API 설계 #59

Open miffyKing opened 1 year ago

miffyKing commented 1 year ago

목적

커뮤니티 관련 API 를 작성합니다.

상세

  • [ ] 게시글, 댓글 관련 API 작성

    참고

  • CC

miffyKing commented 1 year ago

@JiniEun @ICCHOI

커뮤니티 API 작성해 보았습니다. 기본적으로 게시글 작성, 게시글 수정, 게시글 조회, 게시글 삭제, 게시글 검색 기능 위주로 작성해 보았습니다. 조회로는 게시글 ID별 조회, 카테고리ID 별 조회,전체글 조회, 사용자 작성 글 조회 가 있습니다.

게시글 엔터티 이름이 board 보다 post 가 적당하다고 생각해 posts 로 수정하였습니다.

Posts

Method Name HTTP Method and Endpoint Description
create_post POST /posts Creates a new post
update_post PUT /posts/{post_id} Updates an existing post by ID
delete_post DELETE /posts/{post_id} Deletes a post by ID
get_post GET /posts/{post_id} Retrieves a post by ID
get_posts GET /posts Retrieves a list of posts
get_user_posts GET /posts?user_id={user_id} Retrieves a list of posts by user ID
get_post_categories GET /posts?category_id={category_id} Retrieves a list of posts by categories
get_post_searches GET /posts/search?q={query} Retrieves a list of posts that contain a specific keyword.

  1. soft delete 로 게시글을 삭제할 시 DELETE 대신 PATCH 를 사용하는 경우도 있다고 하는데, 좋은 방안이 있다면 수정하겠습니다.
  2. 기존
    • GET /users/{user_id}/posts
    • GET/posts/{category_id}/posts 이렇게 만들었다가 쿼리 방식으로 수정하였는데, 이렇게 작성해도 되는것인지 잘 모르겠습니다..
  3. 이후 댓글 기능 , 좋아요 기능 추가하도록 하겠습니다!
miffyKing commented 1 year ago

@JiniEun @ICCHOI

Reply

Method Endpoint Description
POST /posts/{post_id}/replies Creates a new reply for the specified post
GET /posts/{post_id}/replies Retrieves a list of all replies for the specified post
GET /posts/{post_id}/replies/{reply_id} Retrieves the specified reply
PUT /posts/{post_id}/replies/{reply_id} Updates the specified reply
DELETE /posts/{post_id}/replies/{reply_id} Deletes the specified reply

댓글 API 작성하였습니다. 개시글 별 댓글 목록, 개별 댓글 조회 기능이 있습니다.

JiniEun commented 1 year ago

저는 개인적으로는 post는 다른 의미랑 혼동되는 것 같아서 게시판에 잘 안쓰긴 하는데 많이 쓰는 단어라 좋으신대로 진행해도 상관없을 것 같아요 Method Name 은 camelCase 사용 예정이라 Convention 한번씩 다시 확인해주셔도 좋을 것 같아요 (#19 Convention) get_user_posts -> getPostsByUserId 이런식으로 쓸 수 있겠네용 Reply 같은 경우는 /replies?post_id={post_id} 이런식으로 설계하면 될 것 같습니당. post와 분리해서요!

miffyKing commented 1 year ago

@JiniEun @ICCHOI

피드백 반영하여 수정해 보았습니다.


Community Api

Method Name HTTP Method and Endpoint Description
createBoard POST /boards Creates a new board
updateBoard PUT /boards/{board_id} Updates an existing board by ID
getBoard GET /boards/{board_id} Retrieves a board by ID
getAllBoards GET /boards Retrieves a list of boards
getBoardsByUserId GET /boards?user_id={user_id} Retrieves a list of boards by user ID
getBoardsByCategoryId GET /boards?category_id={category_id} Retrieves a list of boards by categories
getBoardsBySearches GET /boards/search?q={query} Retrieves a list of boards that contain a specific keyword.
softDeleteBoard PATCH /boards/{board_id} Soft-deletes a board by ID
deleteBoard DELETE /boards/{board_id} Deletes a board by ID
likeBoard POST /boards/{board_id}/likes Adds a like to a board by ID
unlikeBoard DELETE /boards/{board_id}/likes?user_id={user_id} Removes a like from a board by ID

Reply Api

Method Endpoint Description
createReply POST/replies/{post_id}/replies Creates a new reply for the specified post
getReplyByPostId GET/replies?post_id={post_id} Retrieves a list of all replies for the specified post
getReplyByPostIDAndReplyId GET/replies/reply_id Retrieves the specified reply
updateReply PUT/replies/{post_id}/replies/{reply_id} Updates the specified reply
deleteReply DELETE/replies/{post_id}/replies/{reply_id} Deletes the specified reply

error handling

Error Code HTTP Status Code Error Message Description
1001 400 Invalid parameter value The parameter value is invalid. The error message should include details about the parameter and the valid range of values.
1002 401 Authentication failed The request requires authentication, but the client has not provided valid credentials.
1003 403 Authorization failed The client is not authorized to access the requested resource.
1004 404 Resource not found The requested resource was not found. The error message should include details about the resource and how to resolve the issue.
1005 409 Conflict The requested operation conflicts with the current state of the resource. The error message should include details about the conflict and how to resolve it.
1006 500 Internal server error An unexpected error occurred on the server. The error message should include details about the error and how to resolve it.

CamelCase 적용하였고, Soft Delete 할 때 Patch 를 사용하는 메서드를 추가하였습니다. error 도 정리했습니다.
또한 게시글 좋아요 추가/삭제에 해당하는 api도 만들어보았습니다. '좋아요'기능을 정확히 어떻게 구현해야할 지 감이 도무지 오지 않습니다..! velog좋아요 기능 유튭/인스타 좋아요 클론
또, 게시글 목록이 많을 경우 페이지 단위로 되어있어서 pagination 방법을 공부 중에 있습니다.

노션정리 API 완료되면 쿨쿨 노션으로 정리해 옮기겠습니다!

JiniEun commented 1 year ago

특정 reply의 경우 게시물처럼 해주시면 될것 같아요! /replies/{id}

ICCHOI commented 1 year ago

일단 완성 후 페이지네이션을 도입해도 괜찮을 것 같아요! 좋아요도 마찬가지인데, 일단 API부터 만든 후 천천히 도입해보시죠 :)

miffyKing commented 1 year ago

@JiniEun reply api 수정하였습니다. 생각해보니 게시글 id 같은 경우는 개별 댓글 조회 시 필요가 없었네욥.. 감사합니다ㅎ @ICCHOI 페이지네이션과 좋아요 기능은 기본 crud 완성하구 공부한거 토대로 진행해보도록 하겠습니다 감사합니닷

기본 crud 부터 구현해보도록 하겠습니답

JiniEun commented 1 year ago

error handling 같은 경우에는 공통으로 관리될 부분이 있어서, 추후에 확실히 정해지면 다시 공유드릴게요!

miffyKing commented 1 year ago

@JiniEun @ICCHOI


CRUD 질문이 있습니다!

@Get()
  async getBoardsByUserId(@Query('user_id') userId: string) {
    console.log('get all community boards by user id');
    const userIdNumber = parseInt(userId, 10);
    return this.communityService.getBoardsByUserId(userIdNumber);
  }
  @Get()
  getAllBoards() {
    console.log('get all community boards\n');
    return this.communityService.getAllBoards();
  }
getAllBoards GET /boards Retrieves a list of boards
getBoardsByUserId GET /boards?user_id={user_id} Retrieves a list of boards by user ID

두 라우터가 엔드포인트가 같아 같은것으로 인식이 되고 있는데, API 를 수정해 엔드포인트를 바꿔야하는 사안인지, 제가 코드를 잘못 작성하여 그런 것인지 잘 모르겠습니다..!

miffyKing commented 1 year ago

@JiniEun @ICCHOI


Community Api

Method Name HTTP Method and Endpoint Description
createBoard POST /boards Creates a new board
getAllBoards GET /boards Retrieves a list of boards
getBoardsBySearches GET /boards/search?q={query} Retrieves a list of boards that contain a specific keyword.
getBoardsByIdAndType GET /boards/board?id={id_value}&id_type={id_type} Retrieves a list of boards that contain specific id of id_type.
updateBoard PUT /boards/{board_id} Updates an existing board by ID
softDeleteBoard PATCH /boards/{board_id} Soft-deletes a board by ID
likeBoard POST /boards/{board_id}/like Adds a like to a board by ID

  1. 게시글에 대한 hard Delete 를 삭제함 → 댓글 제외 모든 엔터티를 soft-delete 로 하기로 함.
  2. 기존에
    1. 게시글 id 를 통한 조회,
    2. 유저 id 를 통한 조회,
    3. 커뮤니티 id 를 통한 조회

3가지 id 를 통한 GET 이 있었는데, 이를 서비스에서 분기 처리로 구현하기 위해

getBoardsByIdAndType  

메서드로 대체하였습니다.

댓글 관련 api 는 댓글 마일스톤에서 따로 구현하도록 하겠습니다.




추가적으로, 게시글 공유 기능에 대해서도 이야기가 나왔는데, 이러한 세부 기능에 대해선 좋아요 기능, 페이지네이션 처럼 추후에 작업하면 될까요??