Skip to content

Day07 스크럼

minjungkim edited this page Nov 15, 2022 · 1 revision

API 명세

  • json: 카멜케이스 사용

로그인 API

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",
    }
}

로그아웃 API

GET /auth/logout

  • 로그아웃 성공
{
    "status": 200
}
  • 로그아웃 실패
{
    "status": 404
}

회원가입 API

POST /user

  • 회원가입 요청
{
    "userId": "userId",
    "password": "randowPW",
    "pace": 390,
    "zipCode": 01234,
}
  • 회원가입 성공시
{
    "status": 201
}
  • 회원가입 실패시
{
    "status": 400
}

ID 중복 검사 API

GET /check/user/:id

  • 중복 검사 응답
{
    "status": 200,
    "exists": true/false
}

토큰 갱신 API

GET /auth/refresh

  • 갱신 요청시

    • HEADER
      • Authorization: Bearer
  • 갱신 성공시

{
    "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안 결정!

모집 목록 조회/검색/필터 API - 현재 지역에서 등록순 최신 10개 (목요일 협의)

GET /recruits?page=1&

  1. 제목에 지역 표시 [잠실동] 달려~ 달려~ 지역 >>> 글제목 >>> 작성자 -> 중복되는 게시글 지역: 일치 글제목, 작성자: LIKE 지역/글제목 vs 작성자
  2. select 태그 사용
지역 글제목 작성자
같이 달리실 분 <= "같이 달리실 분" : "같이"

코스 목록 조회/검색/필터 API (목요일 협의)혐

모집 참여 API (참여 버튼 누르면 API)

POST /recruit/join - HEADER - Authorization: Bearer

{
    "recruitId": "1",
    "userId": "myid"
}                
  • 참가 요청 성공시
{
    "status": 201,
    "success": true/false
}
  • 참가 요청 실패시 (참가신청인원 꽉찬경우 & 글이 갑자기 삭제된 경우)
{
    "status": 409,
    "error": {
        "message": "Maximum cap reached" / "Deleted post"
    }
}

모집 등록 API

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" 
    }
}

코스 등록 API

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" 
    }
}

내 정보 조회 API

GET /user/:userId/profile/

  • Header
  • Authorization: Bearer
  • 내 정보 조회 요청 성공시
{
    "status": 200,
    "data": {
        "userId": "abcd1234",
        "zipCode": 12354,
        "pace": 380,
    }
}
  • 내 정보 조회 요청 실패시
{
    "status": 500,
    "error": {
        "message": "Internal server error" 
    }
}

유저 정보 수정 API

PATCH /user/:userId/profile

  • Authorization: Bearer
{
    "pace"?: 365,
    "zipCode"?: 12367
}
  • 내 정보 수정 요청 성공시
{
    "status": 201
}
  • 내 정보 수정 요청 실패시
{
    "status": 500,
    "error": {
        "message": "Internal server error" 
    }
}

유저 참여 목록 API

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"
    }
}

유저 코스 목록 API

  • 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"
    }
}

지역 정보 조회 API (목요일 협의)

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

Clone this wiki locally