Skip to content

API 설계 초안

choikangheon edited this page Nov 14, 2023 · 19 revisions

참고

  • 백엔드 개발자는 이 문서대로 개발하면 됨
    • 혹시 수정사항 있으면 문서에 꼭 반영
  • 프론트엔드 개발자는 아직 개발되지 않은 API에 대해 미리 코딩하려 할 때 이 문서를 참고하여 개발하면 됨

API 설계

Request/Response 모두 json 형식

회원가입

POST /join

입력 : 유저 정보

{
    "email": "[email protected]",
    "nickname": "hello",
    "imageId": "http://www.naver.com"
}

출력

{ result: "SUCCESS", description: "" }
{ result: "DUPLICATE_EMAIL", description: "이미 가입된 이메일입니다." }
{ result: "ERROR", description: "" } // ERROR는 미처 처리 못한 예외

카카오 로그인

POST /login

입력: OAuth에 필요한 파라미터들

{
    "kakaoAccessToken" : "asdfasdfasdfsadf"
}

출력: 결과, 성공 시 JWT 토큰 추가

{ result: "SUCCESS", description: "" }
{ result: "ERROR", description: "" } // ERROR는 미처 처리 못한 예외

로그아웃

POST /logout

입력: X

출력: 결과

{ result: "SUCCESS" }
{ result: "NOT_LOGINED" }
{ result: "ERROR", description: "" }

모집글 목록

GET /teams

입력: X

출력: 모집글 목록

{
  result: "SUCCESS",
  teams: [
    { teamId: 0, subject: "제목", leader: "김진홍", hashtags: ["a", "b"], lastModified: "yyyy-MM-dd HH:mm:ss" },
	{ teamId: 1, subject: "제목", leader: "김진홍", hashtags: ["a", "b"], lastModified: "yyyy-MM-dd HH:mm:ss" }
  ]
}
{ result: "ERROR", description: "" }

모집글 상세 정보

GET /teams/{teamId}

입력: teamId

출력: 모집글 상세 정보

{
  result: "SUCCESS",
  subject: "제목",
  leaderId: 1231
  hashtags: ["a", "b"],
  roles: [
    { name: "개발자", number: 1 },
    { name: "디자이너", number: 1 }
  ]
  content: "내용"
  applyTemplate: [
    { type: "text", question: "안녕하세요?" },
    { type: "image", question: "증명사진" },
    { type: "radiobox", question: "동의?", options: [ "예", "아니오" ] }
  ]
  lastModified: "yyyy-MM-dd HH:mm:ss"
  liked: false
}
{ result: "ERROR", description: "" }

모집글 작성

POST /team

입력: 제목, 태그, 모집 역할, 설명, 지원 양식

{
    {
    "subjectType" : "PROJECT",
    "subject" : "스프링 프젝 구함",
    "types" : ["KOTLIN","JAVA", "MYSQL"],
    "roles" : [
        {"name" : "프론트엔드", "requiredCount" : 2},
        {"name" : "백엔드", "requiredCount" : 3}
    ],
    "content" : "열심히 할 사람 구함",
    "teamTemplates" : [
        {"type" : "TEXT","question" : "의지를 말해보아라"},
        {"type" : "CHECKBOX", "question" : "열심히 할거니", "options" : "네, 아니"}
    ],
    "openChatUrl" : "http://9in-proejct.chat"
}

}

출력: 결과

{ 
    "detail": {
        "teamId": 2,
        "openChatUrl": "http://9in-proejct.chat",
        "content": "열심히 할 사람 구함",
        "subject": "스프링 프젝 구함",
        "teamTemplates": [
            {
                "type": "TEXT",
                "question": "의지를 말해보아라",
                "options": null
            },
            {
                "type": "CHECKBOX",
                "question": "열심히 할거니",
                "options": "네, 아니"
            }
        ],
        "types": [
            "KOTLIN",
            "JAVA",
            "MYSQL"
        ],
        "subjectType": "PROJECT",
        "roles": [
            {
                "name": "프론트엔드",
                "requiredCount": 2,
                "hiredCount": 0
            },
            {
                "name": "백엔드",
                "requiredCount": 3,
                "hiredCount": 0
            }
        ]
    },
    "errorMessage": null
 }

해시태그 조회

GET /team/hashtag

출력 결과 : project 변수는 project에 대한 해시태그 study 변수는 study에 대한 해시태그

{
    "detail": {
        "project": [
            {
                "name": "PYTHON",
                "value": "Python"
            },
            {
                "name": "SPRING_FRAMEWORK",
                "value": "Spring Framework"
            },
            {
                "name": "AWS",
                "value": "AWS"
            },
            {
                "name": "IOS",
                "value": "iOS"
            },
            {
                "name": "JAVASCRIPT",
                "value": "JavaScript"
            },
            {
                "name": "HTML",
                "value": "HTML"
            },
            {
                "name": "JAVA",
                "value": "Java"
            },
            {
                "name": "C_SHARP",
                "value": "C#"
            },
            {
                "name": "C_PLUS_PLUS",
                "value": "C++"
            },
            {
                "name": "REACT",
                "value": "React.js"
            },
            {
                "name": "NODE",
                "value": "Node.js"
            },
            {
                "name": "VUE",
                "value": "Vue.js"
            },
            {
                "name": "MYSQL",
                "value": "MySQL"
            },
            {
                "name": "KOTLIN",
                "value": "Kotlin"
            },
            {
                "name": "ANDROID",
                "value": "Android"
            },
            {
                "name": "SQL",
                "value": "SQL"
            }
        ],
        "study": [
            {
                "name": "PYTHON",
                "value": "Python"
            },
            {
                "name": "SPRING_FRAMEWORK",
                "value": "Spring Framework"
            },
            {
                "name": "AWS",
                "value": "AWS"
            },
            {
                "name": "IOS",
                "value": "iOS"
            },
            {
                "name": "JAVASCRIPT",
                "value": "JavaScript"
            },
            {
                "name": "HTML",
                "value": "HTML"
            },
            {
                "name": "JAVA",
                "value": "Java"
            },
            {
                "name": "C_SHARP",
                "value": "C#"
            },
            {
                "name": "C_PLUS_PLUS",
                "value": "C++"
            },
            {
                "name": "REACT",
                "value": "React.js"
            },
            {
                "name": "NODE",
                "value": "Node.js"
            },
            {
                "name": "VUE",
                "value": "Vue.js"
            },
            {
                "name": "MYSQL",
                "value": "MySQL"
            },
            {
                "name": "KOTLIN",
                "value": "Kotlin"
            },
            {
                "name": "ANDROID",
                "value": "Android"
            },
            {
                "name": "SQL",
                "value": "SQL"
            },
            {
                "name": "ALGORITHM",
                "value": "알고리즘"
            }
        ]
    },
    "errorMessage": null
} 

지원서 작성

POST /teams/{teamId}/apply

입력: teamId, 모집 역할, 지원 양식

{
  teamId: 1
  role: 123, // role의 고유번호
  answers: [
    { template_id: 1, answer: "네" },
    { template_id: 2, answer: "imgur.com/12345" },
    { template_id: 3, answer: "예" ] }
  ]
}

출력: 결과

{ result: "SUCCESS", applicationId: 123 }
{ result: "ERROR", description: "" }

해시태그 목록

GET /hashtags

입력: X

출력: 해시태그 목록

{
  result: "SUCCESS",
  list: [
    { name: "Backend", count: 999 },
    { name: "iOS", count: 1, subscribing: true }
  ]
}
{ result: "ERROR", description: "" }

내 구독 알림 수신 목록

GET /mySubscription/notifications

입력: X

출력: 내 구독 알림 목록

{
  result: "SUCCESS",
  notifications: [
    { teamId: 0, subject: "제목", subscribingTags: ["a"], lastModified: "yyyy-MM-dd HH:mm:ss" },
    { teamId: 1, subject: "제목", subscribingTags: ["a"], lastModified: "yyyy-MM-dd HH:mm:ss" }
  ]
}

해시태그 구독

POST /mySubscription/hashtags

입력: 구독할 해시태그

{ tagToSubscribe: 1 } // 해시태그 고유번호

출력: 결과

{ result: "SUCCESS" }
{ result: "ERROR", description: "" }

내 찜 리스트 조회

GET /myWishTeam

입력: X

출력: 내 찜 모집글 목록

{
  result: "SUCCESS",
  teams: [
    { teamId: 0, subject: "제목", hashtags: ["a", "b"], lastModified: "yyyy-MM-dd HH:mm:ss" },
	{ teamId: 1, subject: "제목", hashtags: ["a", "b"], lastModified: "yyyy-MM-dd HH:mm:ss" }
  ]
}
{ result: "ERROR", description: "" }

팀 찜하기

POST /wish

입력: 찜할 모집글 id

{ teamId: 1 } // 팀 고유번호

출력: 결과

{
  "detail": {
    "wishId": 1,
    "teamId": 1,
    "accountName": "강헌"
  }
}

{ result: "ERROR", description: "" }

대화방 목록

GET /chats

입력: X

내용: 대화중인 대화방 목록

{
  result: "SUCCESS",
  chatRooms: [
    { roomId: 0, relatedTeamId: 123, relatedTeamSubject: "제목", recentMessage: "가장 최근 메시지" }, 
    { roomId: 1, relatedTeamId: 123, relatedTeamSubject: "제목", recentMessage: "가장 최근 메시지" }, 
  ]
}
{ result: "ERROR", description: "" }

대화 내용 조회

GET /chats/{chatId}

입력: chatId

출력: 대화 내용

{
  result: "SUCCESS",
  chats: [
    { chatId: 0, userId: "id1", message: "메시지", createdAt: "yyyy-MM-dd HH:mm:ss" },
    { chatId: 1, userId: "id2", message: "메시지", createdAt: "yyyy-MM-dd HH:mm:ss" },
  ]
}
{ result: "ERROR", description: "" }

채팅 보내기

POST /chats/{chatId}

입력: chatId, 보낼 메시지

{ message: "메시지" }
{ image_url: "imgur.com/12345" }

출력: 결과

{ result: "SUCCESS" }
{ result: "ERROR", description: "" }