3.144.30.193:8000
python, django, djongo, mongodb, postman, jwt, bcrypt, AWS ec2, atlas
- 박현우 : 회원가입/로그인
- 김주형 : 게시글 CRUD
- 이정아 : 댓글 CRUD
에이모 선호 기술스택 : python flask, mashmallow, mongoengine
필수 사용 데이터베이스: mongodb
- 글 작성, 글 확인, 글 목록 확인, 글 수정, 글 삭제가 되는 API
- Delete과 Update는 해당 유저의 글만 가능 즉, 유저 생성, 인가, 인증 기능도 필요
- Read는 pagination 구현 필수
- 게시글 카테고리
- 게시글 검색
- 대댓글(1 depth)
- 대댓글 pagination
- 게시글 읽힘 수
- 같은 User가 게시글을 읽는 경우 count 수 증가하면 안 됨
- Rest API 설계
- Unit Test
- 1000만건 이상의 데이터를 넣고 성능테스트 진행 결과 필요
POST/users/signup
- bcrypt을 이용한 패스워드 암호화 및 회원가입 기능
{
"email":"aimmo@gmail.com",
"name":"에이모",
"password":"aimmo!!!"
}
POST/users/signin
- 같은 이메일 유저 로그인 불가
- jwt를 이용한 토큰 생성
{
"email":"aimmo@gmail.com",
"password":"aimmo!!!"
}
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6Mn0.BkBGhl60HeVatsYVwjkXFcrr6XYdNaPyICZSXH9nIP0"
}
- 로그인 유효성 검사를 위핸 데코레이터 작성
POST/postings/
- login_decorator로 유저확인
- body로 보내진 정보 확인하고 게시글 정보와 맞지 않으면 Key error 반환
- posting_id와 일치하는 게시글 없으면 does not exist error 반환
- 보내진 정보를 기반으로 게시글 생성
게시글
{
"title":"가입인사 드립니다",
"content":"안녕하세요"
"category_id" : 1
}
`GET/postings/<posting_id>/list?search="검색어"
- posting_id가 전달 되지 않으면 error 반환
- 검색어에 해당하는 게시글(게시글 명, 연관된 카테고리) 반환
- 주어진 조건에 해당하는 게시글 목록 조회
{
"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",
}
]
}
`GET/postings/<posting_id>
- posting_id가 전달 되지 않으면 error 반환
- postingd_id에 해당하는 게시글 존재하지 않으면, does not exist error 반환
- posting_id가 올바르면 게시글 조회
{
"result": {
"id" : 1,
"title" : "가입인사 드립니다",
"content" : "안녕하세요",
"category" : "인사",
"views" : 0,
"created_at" : "2021-01-01",
"updated_at" : "2021-01-01",
}
}
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에서 받은 정보를 기반으로 수정
{
"title" : "가입 인사 안합니다"
"content" : "안녕하세요 수정수정수정수정수정 "
}
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 올바르면 게시글 삭제
POST/postings/comments/<posting_id>
- login_decorator로 유저확인
- 자기자신을 참조하는 parent_comment 필드
- 이 값이 null이면 댓글, 만약 값이 6이라면 id값 6인 댓글의 대댓글이다.
- posting(게시물)이 없을 시 에러 반환
댓글
{
"parent_comment":"",
"content":"hi_aimmo!"
}
comment_id 2인 댓글의 대댓글
{
"parent_comment":"2",
"content":"hi_aimmo!"
}
GET/postings/comments/<posting_id>?offset=0&limit=2
- 댓글 리스트 반환( 대댓글 리스트 포함)
- 페이지 네이션 구현
- posting(게시물)이 없을 시 에러 반환
{
"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": []
}
]
}
PATCH/postings/comments?id=<comment_id>
- login_decorator로 유저확인
- 유저id와 댓글을 쓴 유저id가 같은지 확인, 다를 시 에러 반환
- posting(게시물)이 없을 시 에러 반환
- 모든 조건 통과 시 UPDATE
{
"content" : "수정수정수정수정수정"
}
DELETE/postings/comments?id=<comment_id>
- login_decorator로 유저확인
- 유저id와 댓글을 쓴 유저id가 같은지 확인, 다를 시 에러 반환
- posting(게시물)이 없을 시 에러 반환
- 모든 조건 통과 시 삭제