Repository navigation
Expand file tree
/
Copy pathapi-docs.json
More file actions
1 lines (1 loc) · 19.7 KB
/
Copy pathapi-docs.json
File metadata and controls
1 lines (1 loc) · 19.7 KB
1
{"openapi":"3.1.0","info":{"title":"SpreaDo API","description":"spreado API 문서","version":"v1.0"},"servers":[{"url":"http://localhost:8080","description":"Generated server url"}],"tags":[{"name":"User API","description":"회원 정보 관련 API"},{"name":"Meeting API","description":"회의 생성 및 참여 API"},{"name":"Auth API","description":"소셜 인증 관련 API"},{"name":"Group API","description":"그룹 생성 및 참여 API"},{"name":"Liveblocks API","description":"Liveblocks 토큰 발급 API"},{"name":"Note API","description":"노트 관련 API"},{"name":"Summary API","description":"회의록 요약 API"}],"paths":{"/summaries/{summaryId}":{"put":{"tags":["Summary API"],"summary":"회의록 요약 수정","description":"AI가 생성한 요약을 수동으로 수정합니다.","operationId":"updateSummary","parameters":[{"name":"summaryId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryUpdateRequest"}}},"required":true},"responses":{"200":{"description":"수정 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SummaryResponse"}}}},"404":{"description":"요약을 찾을 수 없음"}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Summary API"],"summary":"회의록 요약 삭제","description":"저장된 요약을 삭제합니다.","operationId":"deleteSummary","parameters":[{"name":"summaryId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"204":{"description":"No Content"}},"security":[{"bearerAuth":[]}]}},"/summaries/{summaryId}/mail":{"post":{"tags":["Summary API"],"summary":"회의록 요약 이메일 전송","description":"저장된 요약을 이메일로 전송합니다.\n회의에 참여한 참여자 모두에게 전송됩니다.\n회의 주최자 한 명만 사용하면 됩니다.\n","operationId":"sendSummaryByEmail","parameters":[{"name":"summaryId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"204":{"description":"이메일 전송 성공"},"404":{"description":"요약을 찾을 수 없음"}},"security":[{"bearerAuth":[]}]}},"/summaries/{noteId}":{"get":{"tags":["Summary API"],"summary":"회의록 요약 조회","description":"노트 ID로 저장된 요약을 조회합니다.","operationId":"getSummary","parameters":[{"name":"noteId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"조회 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SummaryResponse"}}}}}},"post":{"tags":["Summary API"],"summary":"회의록 요약 생성","description":"노트의 content JSON을 전처리하고 AI로부터 요약을 생성합니다.","operationId":"generateSummary","parameters":[{"name":"noteId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"201":{"description":"요약 생성 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SummaryResponse"}}}},"400":{"description":"잘못된 요청"},"404":{"description":"노트를 찾을 수 없음"}},"security":[{"bearerAuth":[]}]}},"/meeting":{"get":{"tags":["Meeting API"],"summary":"그룹의 회의 목록 조회","description":"특정 그룹에 속한 회의 목록을 조회합니다.","operationId":"getMeetingsByGroup","parameters":[{"name":"groupId","in":"query","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"조회 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MeetingSummaryResponse"}}}},"400":{"description":"잘못된 요청"},"404":{"description":"리소스를 찾을 수 없음"}}},"post":{"tags":["Meeting API"],"summary":"회의 생성","description":"회의를 생성합니다.","operationId":"createMeeting","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingCreateRequest"}}},"required":true},"responses":{"201":{"description":"회의 생성 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MeetingCreateResponse"}}}},"400":{"description":"잘못된 요청"}},"security":[{"bearerAuth":[]}]}},"/meeting/{meetingId}/leave":{"post":{"tags":["Meeting API"],"summary":"회의 나가기","description":"참여 중인 회의에서 나갑니다.","operationId":"leaveMeeting","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"204":{"description":"나가기 성공"},"400":{"description":"잘못된 요청"}},"security":[{"bearerAuth":[]}]}},"/meeting/{meetingId}/join":{"post":{"tags":["Meeting API"],"summary":"회의 참여","description":"회의에 참여합니다.","operationId":"joinMeeting","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"회의 참여 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GroupJoinResponse"}}}},"400":{"description":"잘못된 요청"},"404":{"description":"리소스를 찾을 수 없음"}},"security":[{"bearerAuth":[]}]}},"/meeting/{meetingId}/end":{"post":{"tags":["Meeting API"],"summary":"회의 종료","description":"회의를 종료합니다.","operationId":"endMeeting","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"회의 종료 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/NoteResponse"}}}},"400":{"description":"잘못된 요청"},"404":{"description":"리소스를 찾을 수 없음"}},"security":[{"bearerAuth":[]}]}},"/liveblocks/{meetingId}":{"post":{"tags":["Liveblocks API"],"summary":"Liveblocks 토큰 발급","description":"Liveblocks 실시간 협업을 위한 액세스 토큰을 발급합니다.","operationId":"getToken","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"토큰 발급 성공","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}},"401":{"description":"사용자 인증 실패","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}},"404":{"description":"해당 미팅을 찾을 수 없음","content":{"*/*":{"schema":{"type":"object","additionalProperties":{}}}}}},"security":[{"bearerAuth":[]}]}},"/group":{"get":{"tags":["Group API"],"summary":"내 그룹 목록 조회","description":"현재 참여 중인 그룹 목록을 조회합니다.","operationId":"getMyGroups","responses":{"200":{"description":"조회 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GroupSummaryResponse"}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Group API"],"summary":"그룹 생성","description":"그룹을 생성하고 초대 링크를 발급합니다.","operationId":"createGroup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupCreateRequest"}}},"required":true},"responses":{"201":{"description":"그룹 생성 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GroupCreateResponse"}}}},"400":{"description":"잘못된 요청"}},"security":[{"bearerAuth":[]}]}},"/group/{groupId}/leave":{"post":{"tags":["Group API"],"summary":"그룹 나가기","description":"참여 중인 그룹에서 나갑니다.","operationId":"leaveGroup","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"204":{"description":"나가기 성공"},"400":{"description":"잘못된 요청"}},"security":[{"bearerAuth":[]}]}},"/group/{groupId}/invite":{"post":{"tags":["Group API"],"summary":"그룹 초대 이메일 발송","description":"그룹 초대 링크를 이메일로 발송합니다. 그룹 멤버만 초대할 수 있습니다.","operationId":"sendEmailInvites","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupEmailInviteRequest"}}},"required":true},"responses":{"200":{"description":"이메일 발송 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GroupEmailInviteResponse"}}}},"400":{"description":"잘못된 요청"},"403":{"description":"권한 없음"},"404":{"description":"그룹을 찾을 수 없음"}},"security":[{"bearerAuth":[]}]}},"/group/join":{"post":{"tags":["Group API"],"summary":"그룹 참여","description":"초대 링크를 통해 그룹에 참여합니다.","operationId":"joinGroup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupJoinRequest"}}},"required":true},"responses":{"200":{"description":"그룹 참여 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GroupJoinResponse"}}}},"400":{"description":"잘못된 요청"},"404":{"description":"리소스를 찾을 수 없음"}},"security":[{"bearerAuth":[]}]}},"/auth/refresh":{"post":{"tags":["Auth API"],"summary":"로그인 상태 유지/자동 로그인 (액세스 토큰 재발급)","description":"클라이언트(웹)의 리프레시 토큰을 사용해 새로운 액세스 토큰을 발급받는 엔드포인트입니다.\n\n• **응답(200):** JSON 형식으로 새 액세스 토큰(`accessToken`)이 반환됩니다.\n• **오류(401):** 리프레시 토큰이 없거나 유효하지 않을 경우 401 응답이 반환되며, 이 경우 FE에서는 로그인 화면으로 이동해야 합니다.\n\n※ 리프레시 토큰은 30일간 유효하며, 이 API를 호출할 때마다 서버가 새 리프레시 토큰으로 쿠키를 갱신해 유효 기간을 연장합니다.\n즉, 30일 동안 한 번도 호출하지 않으면 만료되어 재로그인이 필요합니다.\n","operationId":"refresh","parameters":[{"name":"refreshToken","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"토큰 갱신 성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessTokenResponse"}}}},"401":{"description":"리프레시 토큰이 없거나 유효하지 않음","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AccessTokenResponse"}}}}}}},"/auth/logout":{"post":{"tags":["Auth API"],"summary":"로그아웃","description":"리프레시 토큰 삭제를 통한 로그아웃 처리입니다.\n","operationId":"logout","responses":{"204":{"description":"삭제 성공"},"401":{"description":"인증 실패"}},"security":[{"bearerAuth":[]}]}},"/user/name":{"patch":{"tags":["User API"],"summary":"회원 이름 수정","description":"회원 이름을 수정합니다.\n","operationId":"updateUserName","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateNameRequest"}}},"required":true},"responses":{"200":{"description":"성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/User"}}}},"401":{"description":"회원 인증 실패"}},"security":[{"bearerAuth":[]}]}},"/user/{id}":{"get":{"tags":["User API"],"summary":"ID로 회원 조회","operationId":"getUserInfo","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/User"}}}},"404":{"description":"회원 없음"}}}},"/user/me":{"get":{"tags":["User API"],"summary":"나의 회원 정보 조회","description":"나의 회원 정보를 조회합니다.\n","operationId":"getMyInfo","responses":{"200":{"description":"성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/User"}}}},"401":{"description":"회원 인증 실패"}},"security":[{"bearerAuth":[]}]}},"/user/email":{"get":{"tags":["User API"],"summary":"이메일로 회원 조회","operationId":"getUserByEmail","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/User"}}}},"404":{"description":"회원 없음"}}}},"/note/{noteId}":{"get":{"tags":["Note API"],"summary":"노트 상세 조회","description":"특정 노트의 상세 정보를 조회합니다.","operationId":"getNoteDetail","parameters":[{"name":"noteId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"조회 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/NoteResponse"}}}},"400":{"description":"잘못된 요청"},"404":{"description":"리소스를 찾을 수 없음"}}}},"/meeting/{meetingId}":{"get":{"tags":["Meeting API"],"summary":"회의 상세 조회","description":"특정 회의의 상세 정보를 조회합니다.","operationId":"getMeetingDetail","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"조회 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MeetingDetailResponse"}}}},"400":{"description":"잘못된 요청"},"404":{"description":"리소스를 찾을 수 없음"}}}},"/meeting/{groupId}/ongoing":{"get":{"tags":["Meeting API"],"summary":"진행 중인 회의 목록 조회","description":"현재 진행 중인 모든 회의 목록을 조회합니다.","operationId":"getOngoingMeetings","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"조회 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MeetingSummaryResponse"}}}},"400":{"description":"잘못된 요청"}}}},"/meeting/my":{"get":{"tags":["Meeting API"],"summary":"내 회의 목록 조회","description":"현재 참여 중인 회의 목록을 조회합니다.","operationId":"getMyMeetings","responses":{"200":{"description":"조회 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/MeetingMemberResponse"}}}},"400":{"description":"잘못된 요청"}},"security":[{"bearerAuth":[]}]}},"/group/{groupId}":{"get":{"tags":["Group API"],"summary":"그룹 상세 조회","description":"특정 그룹의 상세 정보를 조회합니다.","operationId":"getGroupDetail","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"조회 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GroupDetailResponse"}}}},"403":{"description":"그룹 미참여"},"404":{"description":"그룹 없음"}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Group API"],"summary":"그룹 삭제","description":"그룹을 삭제합니다. 그룹 리더만 삭제할 수 있습니다.","operationId":"deleteGroup","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"204":{"description":"삭제 성공"},"403":{"description":"권한 없음"},"404":{"description":"그룹을 찾을 수 없음"}},"security":[{"bearerAuth":[]}]}},"/group/invite-info":{"get":{"tags":["Group API"],"summary":"초대 링크로 그룹 정보 조회","description":"초대 링크를 통해 그룹의 기본 정보를 조회합니다. 인증 없이 접근 가능합니다.","operationId":"getGroupByInviteLink","parameters":[{"name":"link","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"조회 성공","content":{"*/*":{"schema":{"$ref":"#/components/schemas/GroupInviteInfoResponse"}}}},"404":{"description":"그룹을 찾을 수 없음"}}}}},"components":{"schemas":{"SummaryResponse":{"type":"object","properties":{"summaryId":{"type":"integer","format":"int64"},"noteId":{"type":"integer","format":"int64"},"summaryJson":{"type":"string"}}},"SummaryUpdateRequest":{"type":"object","properties":{"summaryJson":{"type":"string","minLength":1}},"required":["summaryJson"]},"MeetingCreateRequest":{"type":"object","properties":{"groupId":{"type":"integer","format":"int64"},"title":{"type":"string","minLength":1}},"required":["groupId","title"]},"MeetingCreateResponse":{"type":"object","properties":{"meetingId":{"type":"integer","format":"int64"},"token":{"type":"string"}}},"GroupJoinResponse":{"type":"object","properties":{"groupId":{"type":"integer","format":"int64"},"userId":{"type":"integer","format":"int64"},"role":{"type":"string"}}},"JsonNode":{},"NoteResponse":{"type":"object","properties":{"noteId":{"type":"integer","format":"int64"},"meetingId":{"type":"integer","format":"int64"},"content":{"$ref":"#/components/schemas/JsonNode"}}},"GroupCreateRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1},"role":{"type":"string","minLength":1}},"required":["name","role"]},"GroupCreateResponse":{"type":"object","properties":{"groupId":{"type":"integer","format":"int64"},"inviteLink":{"type":"string"}}},"GroupEmailInviteRequest":{"type":"object","properties":{"emails":{"type":"array","items":{"type":"string"},"minItems":1},"message":{"type":"string"}},"required":["emails"]},"GroupEmailInviteResponse":{"type":"object","description":"그룹 이메일 초대 발송 응답","properties":{"groupId":{"type":"integer","format":"int64","description":"그룹 ID","example":1},"successCount":{"type":"integer","format":"int32","description":"초대 메일 발송 성공 개수","example":3},"sentEmails":{"type":"array","description":"발송된 이메일 주소 목록","items":{"type":"string"}}}},"GroupJoinRequest":{"type":"object","properties":{"inviteLink":{"type":"string","minLength":1},"role":{"type":"string","minLength":1}},"required":["inviteLink","role"]},"AccessTokenResponse":{"type":"object","description":"액세스 토큰 응답","properties":{"accessToken":{"type":"string","description":"액세스 토큰","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}}},"User":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"email":{"type":"string"},"name":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UpdateNameRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1}},"required":["name"]},"MeetingSummaryResponse":{"type":"object","properties":{"meetingId":{"type":"integer","format":"int64"},"groupId":{"type":"integer","format":"int64"},"title":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["ONGOING","ENDED"]}}},"MeetingDetailResponse":{"type":"object","properties":{"meetingId":{"type":"integer","format":"int64"},"title":{"type":"string"},"status":{"type":"string","enum":["ONGOING","ENDED"]},"members":{"type":"array","items":{"$ref":"#/components/schemas/MeetingMemberResponse"}},"noteId":{"type":"integer","format":"int64"}}},"MeetingMemberResponse":{"type":"object","properties":{"userId":{"type":"integer","format":"int64"},"name":{"type":"string"}}},"GroupSummaryResponse":{"type":"object","properties":{"groupId":{"type":"integer","format":"int64"},"name":{"type":"string"},"role":{"type":"string"}}},"GroupDetailResponse":{"type":"object","properties":{"groupId":{"type":"integer","format":"int64"},"name":{"type":"string"},"inviteLink":{"type":"string"},"myRole":{"type":"string"},"isLeader":{"type":"boolean"},"members":{"type":"array","items":{"$ref":"#/components/schemas/GroupMemberResponse"}}}},"GroupMemberResponse":{"type":"object","properties":{"userId":{"type":"integer","format":"int64"},"name":{"type":"string"},"role":{"type":"string"}}},"GroupInviteInfoResponse":{"type":"object","description":"초대 링크로 조회한 그룹 정보","properties":{"groupId":{"type":"integer","format":"int64","description":"그룹 ID","example":1},"groupName":{"type":"string","description":"그룹 이름","example":"스프레도 개발팀"},"memberCount":{"type":"integer","format":"int32","description":"그룹 멤버 수","example":5},"leaderName":{"type":"string","description":"그룹 리더 이름","example":"홍길동"},"inviteLink":{"type":"string","description":"초대 링크","example":"https://spreado-24767338797.asia-northeast3.run.app/abc123"}}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}}}