Skip to content

API 명세

강성준 edited this page Dec 5, 2022 · 30 revisions

😀 User

로그인

  • 소셜 로그인
  • GET /user/login?social=${'naver' | 'kakao' | 'google'}로 해당 페이지로 이동 후 인증 진행.
  • Redirection 문제 때문에 axios 가 아닌 anchor 태그 사용 권장.
  • 쿠키에 accessToken 식으로 jwt 토큰 생성.
  • DB 확인 후 미가입자 인 경우 signup 페이지로 이동.

회원가입

  • jwt payload 확인 및 재생성

    요청

    • POST /user 로 signupData 객체 전송 필수,
    {
       signupData : {
          nickname : string
          characterName : string
       }
    }
    
    

    응답

    • 성공 (200)
    "회원가입 완료!!"
    
    
    • 실패
    { // body 형식 오류
        "statusCode": 400,
        "message": [
            "특수문자는 불가합니다.",
            "nickname must be shorter than or equal to 12 characters",
            "nickname must be longer than or equal to 4 characters",
            "nickname must be a string",
            "nickname should not be empty",
            "characterName must be a string",
            "characterName should not be empty"
        ],
        "error": "Bad Request"
    }
    
    
       { // 토큰이 없는 경우
          "statusCode": 401,
          "message": "Unauthorized"
       }
    
    
    { //닉네임이 중복되는 경우
        "statusCode": 406,
        "message": "닉네임이 중복됩니다.",
        "error": "Not Acceptable"
    }
    
    
    { // 제공하지 않는 캐릭터를 넣었을 경우.
        "statusCode": 400,
        "message": "nohair2 can't be the character name.",
        "error": "Bad Request"
    }
    
    

로그아웃

  • GET /user/logout 요청 시 AccessToken 만료.

    요청

    • GET /user/logout

    응답

    • 성공 (200)
    "로그아웃 되었습니다."
    
    

회원탈퇴

  • DELETE /user 로 요청 시 Guards 로 토큰 인증 확인.

  • 토큰이 인증되었다면, DB에서 해당 유저 제거.

    요청

    • DELETE /user

    응답

    • 성공 (200)
    "캐릭터가 삭제 되었습니다."
    
    

인증

  • GET /user/auth 로 요청 시 Guards 로 토큰 인증 확인.

    요청

    • DELETE /user

    응답

    • nicknamecharacterName 반환
    • 성공 (200)
    {
        "nickname": "stouter",
        "characterName": "cat"
    }
    
    
    • 실패
    {
        "statusCode": 401,
        "message": "Unauthorized"
    }
    
    

유저데이터 변경 (닉네임, 캐릭터 변경)

  • signup API 와 동일**

  • jwt payload 확인 및 재생성

    요청

    • POST /user 로 signupData 객체 전송 필수,
    {
       signupData : {
          nickname : string
          characterName : string
       }
    }
    
    

    응답

    • 성공 (200)
    "회원가입 완료!!"
    
    
    • 실패 (400)
    {
        "statusCode": 400,
        "message": [
            "특수문자는 불가합니다.",
            "nickname must be shorter than or equal to 12 characters",
            "nickname must be longer than or equal to 4 characters",
            "nickname must be a string",
            "nickname should not be empty",
            "characterName must be a string",
            "characterName should not be empty"
        ],
        "error": "Bad Request"
    }
    
    

🧑‍🤝‍🧑 친구 기능

팔로잉 목록 조회

  • 내가 팔로잉 중인 사람들의 목록 반환.

    요청

    • GET /friendship

    응답

    • 성공 (200)
    [ // 팔로잉 2명
        {
            "userId": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
            "nickname": "hungjin",
            "characterName": "lion"
        },
        {
            "userId": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
            "nickname": "hungjin",
            "characterName": "lion"
        }
    ]
    
    
     []// 팔로잉 0명
    
    

닉네임으로 시작하는 유저 목록 검색하기

  • GET /friendship/{시작닉네임} 으로 요청

    요청

    • GET /friendship/{시작닉네임}

    응답

    • 성공 (200) - 항상 배열 형식으로 반환
    [ // 해당 이름으로 시작하는 유저 2
        {
            "id": "1NJfqr-aPPEfIJPIvFNd6OzG8qFqTUSRNbT7bxM24R0",
            "nickname": "jongbin",
            "characterName": "curlyhair",
            "social": "naver",
            "created_at": "2022-11-29",
            "deleted": false
        },
        {
            "id": "Z-NVwpPpbw7oOjHEn-CYEZ8V9nU3P9IIChz_9PuuVak",
            "nickname": "j002",
            "characterName": "mophair",
            "social": "naver",
            "created_at": "2022-11-29",
            "deleted": false
        }
    ]
    
    
    // 해당 이름으로 시작하는 유저 x
    []
    
    
    • 실패 (404)
    { // Query 오류
         "statusCode": 404,
         "message": "해당 nickname으로 시작하는 유저들이 없습니다.",
         "error": "Not Found"
    }
    
    
    { // 토큰 x
        "statusCode": 401,
        "message": "Unauthorized"
    }
    
    

닉네임으로 팔로우 신청

  • PUT /friendship/{상대닉네임} 으로 요청

    요청

    • PUT /friendship/{상대닉네임}

    응답

    • 성공 (200)
    팔로우한 유저의 유저데이터
    {
         "userId": "ABCDEFGHIJHLMNOPQRSTUVWXYZ",
         "nickname": "usernicknameSample",
         "characterName": "mophair"
    }
    
    
    • 실패 (404)
    {
         "statusCode": 404,
         "message": "이미 팔로우한 유저입니다.",
         "error": "Not Found"
    }
    
    

닉네임으로 팔로우 취소

  • DELETE /friendship/{상대닉네임} 으로 요청

    요청

    • DELETE /friendship/{상대닉네임}

    응답

    • 성공 (200)
    "팔로우 취소 성공"
    
    
    • 실패 (404)
    {
        "statusCode": 404,
        "message": "팔로우 취소 실패",
        "error": "Not Found"
    }
    
    

👨‍👩‍👧‍👦 공유 (SleepyBoard)

게시글 조회

  • 내가 Following 한 유저들의 게시글만 불러오기. (최신순)

    요청

    • GET /board/{all | like | me} 로 요청 (all : 팔로우한 모든 게시글, like : 좋아요한 게시물, me : 나의 게시물)

    응답

    • 성공 (200)
    [ // 게시글 목록
        {
            "id": 2,
            "nickname": "stouter",
            "content": "너무 좋아요",
            "category": "fishing",
            "liked": true,
            "created_at": "2022-11-23T13:57:44.356Z"
        },
        {
            "id": 1,
            "nickname": "stouter",
            "content": "너무 좋아요",
            "category": "lifencut",
            "liked": false,
            "created_at": "2022-11-23T13:49:51.475Z"
        }
    ]
    
    
    [] // 팔로잉 유저 없음 || 팔로잉 유저들 게시글 없음
    
    

게시글 작성

  • 게임 혹은 서비스 중 공유하기 버튼으로 요청

    요청

    • POST /boardarticleData 와 함께 요청
    {
    	articleData : {
    		content : string,
    		category : string // ("fishing" | "lifencut")
    	}
    }
    
    

    응답

    • 성공 (200)
    "글 작성 성공"
    
    
    • 실패 (400)
    {
        "statusCode": 400,
        "message": [
            "content must be shorter than or equal to 36 characters",
            "content must be a string",
            "content should not be empty",
            "category must be shorter than or equal to 36 characters",
            "category must be a string",
            "category should not be empty"
        ],
        "error": "Bad Request"
    }
    
    

게시글 삭제

  • 내가 작성한 글만 삭제 가능

    요청

    • DELETE /board/{articleId}

    응답

    • 성공 (200)
    // 내 게시글일 때
    "삭제처리 되었습니다."
    
    
    • 실패 (401)
    { // 내 게시글이 아닐 때,
        "statusCode": 401,
        "message": "삭제 권한이 없습니다.",
        "error": "Unauthorized"
    }
    
    

게시글 좋아요

  • 게시글에 좋아요 버튼으로 API 요청

    요청

    • PUT /board/like/{articleId}

    응답

    • 성공 (200)
    "좋아요 성공"
    
    
    • 실패
    // 이미 좋아요 눌렀을 때,
    {
        "statusCode": 406,
        "message": "이미 좋아요를 누르셨습니다.",
        "error": "Not Acceptable"
    }
    
    
    // 없는 게시글을 좋아요 눌렀을 때,
    {
        "statusCode": 404,
        "message": "해당하는 게시글이 없습니다.",
        "error": "Not Found"
    }
    
    

게시글에 좋아요 취소

  • 게시글에 좋아요 해체 버튼으로 API 요청

    요청

    • DELETE /board/like/{articleId}

    응답

    • 성공 (200)
    "좋아요 취소 성공"
    
    
    • 실패
    // 이미 좋아요 눌렀을 때, 없는 게시글의 좋아요를 취소할 때
    {
        "statusCode": 406,
        "message": "이미 처리되었습니다.",
        "error": "Not Acceptable"
    }
    
    

💬 채팅

채팅방 목록 불러오기

  • 내가 속해있는 채팅방 목록을 불러오기

    요청

    • GET /chat/roomList
    • 쿠키에 accessToken 필요

    응답

    • 성공 (200)
    [
     {
       // socket -  chatRoomEntered 이벤트로 인해, 내부적으로 채팅방 생성이 되었지만 메시지 수발신이 없었던 채팅방
       // 메시지 수발신이 없었기 때문에 lastMsg필드가 없습니다
       "roomId": 10,
       "targetUserId": "9B8X7YWtA0XlNTBzCItRGmLlUKBYkHdshMPqtsE7sWE",
       "targetUserNickname": "ktmihs",
       "unReadCount": 0
      },
     {
       "roomId": 1,
       "targetUserId": "Z-NVwpPpbw7oOjHEn-CYEZ8V9nU3P9IIChz_9PuuVak",
       "targetUserNickname": "j002",
       "unReadCount": 2,
       "lastMsg": {
           "id": 66,
           "timestamp": "2022-11-30T15:05:48.448Z",
           "message": "개인 메시지 입니다.."
       }
     }
    ]
    
    
    • 실패 (401)
    { // accessToken 권한 없을 때,
        "statusCode": 401,
        "message": "Unauthorized"
    }
    
    

채팅 내용 불러오기

  • 내가 속해있는 채팅방의 채팅 내용을 불러오기

    요청

    • GET /chat/content?targetUserId={상대방 userId}
      • Query 필수.
    • 쿠키에 accessToken 필요

    응답

    • 성공(200)
      • 채팅 내용들 전부 전송.
    [
        {
            "id": 29, // 해당 채팅방 내, chat 고유 id
            "roomId": 1, // 해당 채팅방 고유 id
            "timestamp": "2022-11-29T16:11:09.304Z", // 보낸 시각
            "message": "감자 감자의 감자 감자의 감자", // 메시지 내용
            "senderId": "IZI_1Wzwhqblu0A4KA_TCrtkl4mM55Qstc_FDKMv_sY" // 보낸 사람 id
        },
        {
            "id": 30,
            "roomId": 1,
            "timestamp": "2022-11-29T16:11:09.304Z",
            "message": "답장입니다",
            "senderId": "Z-NVwpPpbw7oOjHEn-CYEZ8V9nU3P9IIChz_9PuuVak"
        },
        {
            "id": 31,
            "roomId": 1,
            "timestamp": "2022-11-29T16:11:09.304Z",
            "message": "답장입니다2",
            "senderId": "Z-NVwpPpbw7oOjHEn-CYEZ8V9nU3P9IIChz_9PuuVak"
        },]
    
    
    • 실패 (401)
    { // accessToken 권한 없을 때,
        "statusCode": 401,
        "message": "Unauthorized"
    }
    
    

채팅 내용 불러오기

  • 내가 속해있는 채팅방의 채팅 내용을 불러오기

    요청

    • GET /chat/content?targetUserId={상대방 userId}
      • Query 필수.
    • 쿠키에 accessToken 필요

    응답

    • 성공(200)
      • 채팅 내용들 전부 전송.
    [
        {
            "id": 29, // 해당 채팅방 내, chat 고유 id
            "roomId": 1, // 해당 채팅방 고유 id
            "timestamp": "2022-11-29T16:11:09.304Z", // 보낸 시각
            "message": "감자 감자의 감자 감자의 감자", // 메시지 내용
            "senderId": "IZI_1Wzwhqblu0A4KA_TCrtkl4mM55Qstc_FDKMv_sY" // 보낸 사람 id
        },
        {
            "id": 30,
            "roomId": 1,
            "timestamp": "2022-11-29T16:11:09.304Z",
            "message": "답장입니다",
            "senderId": "Z-NVwpPpbw7oOjHEn-CYEZ8V9nU3P9IIChz_9PuuVak"
        },
        {
            "id": 31,
            "roomId": 1,
            "timestamp": "2022-11-29T16:11:09.304Z",
            "message": "답장입니다2",
            "senderId": "Z-NVwpPpbw7oOjHEn-CYEZ8V9nU3P9IIChz_9PuuVak"
        },]
    
    
    • 실패 (401)
    { // accessToken 권한 없을 때,
        "statusCode": 401,
        "message": "Unauthorized"
    }
    
    

🏅업적

월별 걸음 수 랭킹 불러오기

  • 월별 걸음 수 랭킹 불러오기

    요청

    • GET /achievement/walk?year={yyyy}&month={m}&range={’all’ || ‘friend’}
    • 쿠키에 accessToken 필요

    응답

    • 성공 (200)
    [ // GET /achievement/walk?year=2022&month=12&range=all
        {
            "userid": "9B8X7YWtA0XlNTBzCItRGmLlUKBYkHdshMPqtsE7sWE",
            "year": 2022,
            "month": 12,
            "walkcount": "2525",
            "nickname": "ktmihs"
        },
        {
            "userid": "k2526688659",
            "year": 2022,
            "month": 12,
            "walkcount": "22",
            "nickname": "j00002"
        },
        {
            "userid": "1NJfqr-aPPEfIJPIvFNd6OzG8qFqTUSRNbT7bxM24R0",
            "year": 2022,
            "month": 12,
            "walkcount": "10",
            "nickname": "jongbin"
        }
    ]
    
    • 성공 (200)
    [ // GET /achievement/walk?year=2022&month=12&range=friend
        {
            "userid": "k2526688659",
            "year": 2022,
            "month": 12,
            "walkcount": "22",
            "nickname": "j00002"
        },
        {
            "userid": "1NJfqr-aPPEfIJPIvFNd6OzG8qFqTUSRNbT7bxM24R0",
            "year": 2022,
            "month": 12,
            "walkcount": "10",
            "nickname": "jongbin"
        }
    ]
    
    • 실패 (401) - 권한 x
    { // accessToken 권한 없을 때,
        "statusCode": 401,
        "message": "Unauthorized"
    }
    • 실패 (404) - 불러오기 오류
    { // 에러
        "statusCode": 404,
        "message": "유저들의 걸음 수를 불러올 수 없습니다."
    }

🎮 Interface

  • [PATCH] 캐릭터 변경
  • [PATCH] 닉네임 변경
  • [GET] 친구 목록 조회
  • [DELETE] 친구 삭제