/aimmo

Primary LanguagePython

aimmo 과제_게시물 CRUD

[배포주소]

3.144.30.193:8000

[기술스택]

python, django, djongo, mongodb, postman, jwt, bcrypt, AWS ec2, atlas

[Team] WithCODE

  • 박현우 : 회원가입/로그인
  • 김주형 : 게시글 CRUD
  • 이정아 : 댓글 CRUD

[요구 사항]

에이모 선호 기술스택 : python flask, mashmallow, mongoengine
필수 사용 데이터베이스: mongodb

  • 글 작성, 글 확인, 글 목록 확인, 글 수정, 글 삭제가 되는 API
    • Delete과 Update는 해당 유저의 글만 가능 즉, 유저 생성, 인가, 인증 기능도 필요
    • Read는 pagination 구현 필수
  • 게시글 카테고리
  • 게시글 검색
  • 대댓글(1 depth)
    • 대댓글 pagination
  • 게시글 읽힘 수
    • 같은 User가 게시글을 읽는 경우 count 수 증가하면 안 됨
  • Rest API 설계
  • Unit Test
  • 1000만건 이상의 데이터를 넣고 성능테스트 진행 결과 필요

회원가입 / 로그인

1. 회원가입

POST/users/signup

  • bcrypt을 이용한 패스워드 암호화 및 회원가입 기능

request

{
    "email":"aimmo@gmail.com",
    "name":"에이모",
    "password":"aimmo!!!"
}

2. 로그인

POST/users/signin

  • 같은 이메일 유저 로그인 불가
  • jwt를 이용한 토큰 생성

request

{
    "email":"aimmo@gmail.com",
    "password":"aimmo!!!"
}

response

{
   "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6Mn0.BkBGhl60HeVatsYVwjkXFcrr6XYdNaPyICZSXH9nIP0"
}

3. 로그인 데코레이터 구현

  • 로그인 유효성 검사를 위핸 데코레이터 작성

4. unit test


게시글CRUD

1. 게시글 생성

POST/postings/

  • login_decorator로 유저확인
  • body로 보내진 정보 확인하고 게시글 정보와 맞지 않으면 Key error 반환
  • posting_id와 일치하는 게시글 없으면 does not exist error 반환
  • 보내진 정보를 기반으로 게시글 생성

request

게시글

{
    "title":"가입인사 드립니다",
    "content":"안녕하세요"
    "category_id" : 1
}

2. 게시글 목록 조회

`GET/postings/<posting_id>/list?search="검색어"

  • posting_id가 전달 되지 않으면 error 반환
  • 검색어에 해당하는 게시글(게시글 명, 연관된 카테고리) 반환
  • 주어진 조건에 해당하는 게시글 목록 조회

response

{
    "result": [{
        "id"         : 1,
        "title"      : "가입인사 드립니다",
        "views"      : 0,
        "category"   : "인사게시판",
        "created_at" : "2021-01-01",
        "updated_at" : "2021-01-01",
        },
        {
         "id"         : 2,
        "title"      : "가입인사 ",
        "views"      : 0,
        "category"   : "인사게시판",
        "created_at" : "2021-01-01",
        "updated_at" : "2021-01-01",
        }
    ]
}

2. 게시글 상세 조회

`GET/postings/<posting_id>

  • posting_id가 전달 되지 않으면 error 반환
  • postingd_id에 해당하는 게시글 존재하지 않으면, does not exist error 반환
  • posting_id가 올바르면 게시글 조회

response

{
    "result": {
        "id"         : 1,
        "title"      : "가입인사 드립니다",
        "content"    : "안녕하세요",
        "category"   : "인사",
        "views"      : 0,
        "created_at" : "2021-01-01",
        "updated_at" : "2021-01-01",
    }
}

3. 게시글 수정

PATCH/postings/<posting_id>

  • posting_id가 전달 되지 않으면 error 반환
  • postingd_id에 해당하는 게시글 존재하지 않으면, does not exist error 반환
  • login_decorator에서 받은 user_id와 게시글 작성자의 id를 비교하여 다르면 forbidden error 반환
  • posting_id, user_id 올바르면 body에서 받은 정보를 기반으로 수정

request

{
    "title" : "가입 인사 안합니다"
    "content" : "안녕하세요 수정수정수정수정수정 "
}

4. 게시글 삭제

DELETE/postings/comments?id=<comment_id>

  • posting_id가 전달 되지 않으면 error 반환
  • postingd_id에 해당하는 게시글 존재하지 않으면, does not exist error 반환
  • login_decorator에서 받은 user_id와 게시글 작성자의 id를 비교하여 다르면 forbidden error 반환
  • posting_id, user_id 올바르면 게시글 삭제

5. unit test

image


댓글CRUD

1. 댓글 저장

POST/postings/comments/<posting_id>

  • login_decorator로 유저확인
  • 자기자신을 참조하는 parent_comment 필드
    • 이 값이 null이면 댓글, 만약 값이 6이라면 id값 6인 댓글의 대댓글이다.
  • posting(게시물)이 없을 시 에러 반환

request

댓글

{
    "parent_comment":"",
    "content":"hi_aimmo!"
}

comment_id 2인 댓글의 대댓글

{
    "parent_comment":"2",
    "content":"hi_aimmo!"
}

2. 댓글 조회

GET/postings/comments/<posting_id>?offset=0&limit=2

  • 댓글 리스트 반환( 대댓글 리스트 포함)
  • 페이지 네이션 구현
  • posting(게시물)이 없을 시 에러 반환

response

{
    "comment_list": [
        {
            "comment_id": 1,
            "user_name": "이정아",
            "content": "난이정아야",
            "created_at": "2021-11-02",
            "nested_comment_list": [
                {
                    "comment_id": 6,
                    "user_name": "이정아",
                    "content": "난이정아야4",
                    "created_at": "2021-11-02"
                },
                {
                    "comment_id": 8,
                    "user_name": "이정아",
                    "content": "난이정아야6",
                    "created_at": "2021-11-02"
                }
            ]
        },
        {
            "comment_id": 2,
            "user_name": "이정아",
            "content": "수정했따따따따따따ㄸ따따따ㅏ따따",
            "created_at": "2021-11-02",
            "nested_comment_list": []
        }
    ]
}

3. 댓글 수정

PATCH/postings/comments?id=<comment_id>

  • login_decorator로 유저확인
  • 유저id와 댓글을 쓴 유저id가 같은지 확인, 다를 시 에러 반환
  • posting(게시물)이 없을 시 에러 반환
  • 모든 조건 통과 시 UPDATE

request

{
    "content" : "수정수정수정수정수정"
}

4. 댓글 삭제

DELETE/postings/comments?id=<comment_id>

  • login_decorator로 유저확인
  • 유저id와 댓글을 쓴 유저id가 같은지 확인, 다를 시 에러 반환
  • posting(게시물)이 없을 시 에러 반환
  • 모든 조건 통과 시 삭제

5. unit test

스크린샷 2021-11-03 오전 12 20 12