-
Notifications
You must be signed in to change notification settings - Fork 0
Day07 스크럼
minjungkim edited this page Nov 15, 2022
·
1 revision
- json: 카멜케이스 사용
POST /auth/login
- 로그인 요청
{
"userId": "myid",
"password": "p@ssw0rd"
}
- 로그인 성공
{
"status": 200,
"data": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
"userId": "abcd1234",
}
}
- 로그인 실패
{
"status": 401,
"error": {
"message": "Your login request has failed",
}
}
GET /auth/logout
- 로그아웃 성공
{
"status": 200
}
- 로그아웃 실패
{
"status": 404
}
POST /user
- 회원가입 요청
{
"userId": "userId",
"password": "randowPW",
"pace": 390,
"zipCode": 01234,
}
- 회원가입 성공시
{
"status": 201
}
- 회원가입 실패시
{
"status": 400
}
GET /check/user/:id
- 중복 검사 응답
{
"status": 200,
"exists": true/false
}
GET /auth/refresh
-
갱신 요청시
- HEADER
- Authorization: Bearer
- HEADER
-
갱신 성공시
{
"status": 201,
"data": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
"userId": "abcd1234",
}
}
- 갱신 실패시
{
"status": 401,
"error": {
"message": "Invalid refresh token"
}
}
토큰 관리 어떻게 할건지?
-
1안: 액세스 토큰을 응답값으로 반환(클라이언트는 state로 관리=전역 상태관리) & 리프레시 토큰 쿠키에 OOO
- 보안상 굳
-
ID PW ---->
-
<------- AT (만료기간 - 엑세스 토큰) + RT (수명이 길다) + silent login
-
받는시간부터 계산시작 1분전에 미리 갱신
-
2안: 액세스 토큰 & 리프레시 토큰 둘다 쿠키
- 서버에서 모두 처리
-> 1안 결정!
GET /recruits?page=1&
- 제목에 지역 표시 [잠실동] 달려~ 달려~ 지역 >>> 글제목 >>> 작성자 -> 중복되는 게시글 지역: 일치 글제목, 작성자: LIKE 지역/글제목 vs 작성자
- select 태그 사용
같이 달리실 분 <= "같이 달리실 분" : "같이"
POST /recruit/join - HEADER - Authorization: Bearer
{
"recruitId": "1",
"userId": "myid"
}
- 참가 요청 성공시
{
"status": 201,
"success": true/false
}
- 참가 요청 실패시 (참가신청인원 꽉찬경우 & 글이 갑자기 삭제된 경우)
{
"status": 409,
"error": {
"message": "Maximum cap reached" / "Deleted post"
}
}
POST /recruit
- HEADER - Authorization: Bearer
{
"title": "제목입니다",
"courseId": "40",
"startTime": "2022-11-15 09:00:00",
"maxPpl": 3,
"pace": 365,
"zipCode": 1234,
"authorId": "jagijasin"
}
- 모집 등록 성공시
{
"status": 201,
"data": {
"recruitId": 210
}
}
- 모집 등록 실패시
{
"status": 500,
"error": {
"message": "Internal server error"
}
}
POST /course HEADER
- content-type multipart/form-data
- Authorization: Bearer
{
"title": "제목",
"path": [(1, 1), (2, 2), (3, 3)...],
"pathLength": 3800,
"userId": "abcd1234",
"img" : "data................."
}
raw image ---> server ----> s3 ----> db
- 코스 등록 요청 성공시
{
"status": 201,
"data": {
"courseId": 234
}
}
{
"status": 500,
"error": {
"message": "Internal server error"
}
}
GET /user/:userId/profile/
- Header
- Authorization: Bearer
- 내 정보 조회 요청 성공시
{
"status": 200,
"data": {
"userId": "abcd1234",
"zipCode": 12354,
"pace": 380,
}
}
- 내 정보 조회 요청 실패시
{
"status": 500,
"error": {
"message": "Internal server error"
}
}
PATCH /user/:userId/profile
- Authorization: Bearer
{
"pace"?: 365,
"zipCode"?: 12367
}
- 내 정보 수정 요청 성공시
{
"status": 201
}
- 내 정보 수정 요청 실패시
{
"status": 500,
"error": {
"message": "Internal server error"
}
}
GET /user/:userId/recruit
-
Authorization: Bearer
-
유저 참여 모집목록 요청 성공시
{
"status": 200,
"data": {
"recruits": [
{
"title": "1번 모집글",
"recruitId": "1",
"courseId": "1",
"startTime": "2022-11-15 09:00:00",
"maxPpl": 3,
"pace": 365,
"zipCode": 12345,
"authorId": "jagijasin"
},
{
"title": "2번 모집글",
"recruitId": "2",
"courseId": "2",
"startTime": "2022-11-15 09:00:00",
"maxPpl": 3,
"pace": 365,
"zipCode": 12345,
"authorId": "jagijasin"
}, ...
]
}
}
- 유저 참여 모집목록 요청 실패시
{
"status": 500,
"error": {
"message": "Internal server error"
}
}
- Authorization: Bearer GET /user/:userId/course
- 유저 코스 목록 요청 성공시
{
"status": 200,
"data": {
courses: [
{
"title": "제목1",
"courseId": 1,
"path": [(1, 1), (2, 2), (3, 3)...],
"pathLength": 3800,
"userId": "abcd1234",
"img" : "https://ncp.storage.imglink"
},
{
"title": "제목2",
"courseId": 2,
"path": [(1, 1), (2, 2), (3, 3)...],
"pathLength": 3800,
"userId": "abcd1234",
"img" : "https://ncp.storage.imglink"
}, ...
]
}
}
- 유저 코스 목록 요청 실패시
{
"status": 500,
"error": {
"message": "Internal server error"
}
}
https://stackoverflow.com/questions/47047785/whats-the-best-practice-to-get-user-profile-in-restful-api-design
GET http://api.domain.com/users/id/profile
Daily Scrum
- React + 전역상태관리
- Docker + Kubernetes
- NginX
- ORM
- CI/CD with github actions
- NestJS + Prisma
- styled-component 튜토리얼
- NestJS 시작하기
- React Hooks
- JWT
- Storybook
- Faker Library
- CI 최적화하기
- React-Query
- Message-Queue