-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathswagger.json
More file actions
1 lines (1 loc) · 85.3 KB
/
Copy pathswagger.json
File metadata and controls
1 lines (1 loc) · 85.3 KB
1
{"openapi":"3.0.0","info":{"title":"MClass Server API","version":"1.0.0","description":"MClass 서버 API 문서","contact":{"name":"API Support","email":"support@mclass.com"}},"servers":[{"url":"http://localhost:3000","description":"로컬 개발 서버"},{"url":"http://localhost:3000","description":"스테이징 서버"},{"url":"http://localhost:3000","description":"프로덕션 서버"}],"components":{"schemas":{"SuccessResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]},"ErrorResponse":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]},"PaginationMeta":{"type":"object","properties":{"page":{"type":"number","example":1,"description":"현재 페이지"},"size":{"type":"number","example":20,"description":"페이지 크기"},"total":{"type":"number","example":100,"description":"전체 항목 수"},"totalPages":{"type":"number","example":5,"description":"전체 페이지 수"}},"required":["page","size","total","totalPages"]},"User":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"사용자 ID"},"email":{"type":"string","format":"email","description":"사용자 이메일"},"name":{"type":"string","description":"사용자 이름"},"role":{"type":"string","enum":["USER","ADMIN"],"description":"사용자 역할"},"isAdmin":{"type":"boolean","description":"관리자 여부"},"provider":{"type":"string","enum":["LOCAL","KAKAO","GOOGLE","NAVER"],"description":"로그인 제공자"},"social_id":{"type":"string","nullable":true,"description":"소셜 로그인 ID"},"created_at":{"type":"string","format":"date-time","description":"생성일시"}},"required":["id","email","name","role","isAdmin","provider","social_id","created_at"]},"LoginRequest":{"type":"object","properties":{"email":{"type":"string","format":"email","description":"사용자 이메일","example":"user@example.com"},"password":{"type":"string","minLength":8,"description":"사용자 비밀번호","example":"password123"}},"required":["email","password"],"additionalProperties":false,"description":"로그인 요청"},"SocialLoginRequest":{"type":"object","properties":{"provider":{"type":"string","enum":["KAKAO","GOOGLE","NAVER"],"description":"소셜 로그인 제공자"},"accessToken":{"type":"string","minLength":1,"description":"소셜 로그인 액세스 토큰"}},"required":["provider","accessToken"],"additionalProperties":false,"description":"소셜 로그인 요청"},"CompleteSignUpRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":50,"description":"사용자 이름","example":"홍길동"},"role":{"type":"string","enum":["USER","ADMIN"],"default":"USER","description":"사용자 역할"}},"required":["name"],"additionalProperties":false,"description":"회원가입 완료 요청"},"RefreshTokenRequest":{"type":"object","properties":{"refreshToken":{"type":"string","minLength":1,"description":"리프레시 토큰"}},"required":["refreshToken"],"additionalProperties":false,"description":"토큰 갱신 요청"},"ChangePasswordRequest":{"type":"object","properties":{"currentPassword":{"type":"string","minLength":8,"description":"현재 비밀번호","example":"password123"},"newPassword":{"type":"string","minLength":8,"description":"새 비밀번호","example":"password123"}},"required":["currentPassword","newPassword"],"additionalProperties":false,"description":"비밀번호 변경 요청"},"LoginResponse":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"사용자 ID"},"email":{"type":"string","format":"email","description":"사용자 이메일"},"name":{"type":"string","description":"사용자 이름"},"role":{"type":"string","enum":["USER","ADMIN"],"description":"사용자 역할"},"isAdmin":{"type":"boolean","description":"관리자 여부"},"provider":{"type":"string","enum":["LOCAL","KAKAO","GOOGLE","NAVER"],"description":"로그인 제공자"},"social_id":{"type":"string","nullable":true,"description":"소셜 로그인 ID"},"created_at":{"type":"string","format":"date-time","description":"생성일시"}},"required":["id","email","name","role","isAdmin","provider","social_id","created_at"]},"accessToken":{"type":"string","description":"액세스 토큰"},"refreshToken":{"type":"string","description":"리프레시 토큰"}},"required":["user","accessToken","refreshToken"]},"RegisterResponse":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"사용자 ID"},"email":{"type":"string","format":"email","description":"사용자 이메일"},"name":{"type":"string","description":"사용자 이름"},"role":{"type":"string","enum":["USER","ADMIN"],"description":"사용자 역할"},"isAdmin":{"type":"boolean","description":"관리자 여부"},"provider":{"type":"string","enum":["LOCAL","KAKAO","GOOGLE","NAVER"],"description":"로그인 제공자"},"social_id":{"type":"string","nullable":true,"description":"소셜 로그인 ID"},"created_at":{"type":"string","format":"date-time","description":"생성일시"}},"required":["id","email","name","role","isAdmin","provider","social_id","created_at"]},"message":{"type":"string","description":"응답 메시지"}},"required":["user","message"]},"LogoutResponse":{"type":"object","properties":{"message":{"type":"string","description":"응답 메시지"}},"required":["message"]},"MClass":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"클래스 ID"},"title":{"type":"string","description":"클래스 제목","example":"JavaScript 기초 강의"},"description":{"type":"string","nullable":true,"description":"클래스 설명"},"recruitStartAt":{"type":"string","nullable":true,"format":"date-time","description":"모집 시작일시"},"recruitEndAt":{"type":"string","nullable":true,"format":"date-time","description":"모집 종료일시"},"startAt":{"type":"string","format":"date-time","description":"클래스 시작일시"},"endAt":{"type":"string","format":"date-time","description":"클래스 종료일시"},"selectionType":{"type":"string","enum":["FIRST_COME","REVIEW"],"description":"선발 방식"},"capacity":{"type":"integer","nullable":true,"description":"수용 인원 (null이면 무제한)"},"allowWaitlist":{"type":"boolean","description":"대기열 허용 여부"},"waitlistCapacity":{"type":"integer","nullable":true,"description":"대기열 수용 인원"},"visibility":{"type":"string","enum":["PUBLIC","UNLISTED"],"description":"공개 여부"},"isOnline":{"type":"boolean","description":"온라인 클래스 여부"},"location":{"type":"string","nullable":true,"description":"오프라인 장소"},"fee":{"type":"integer","nullable":true,"description":"수강료 (0이면 무료)"},"phase":{"type":"string","enum":["UPCOMING","RECRUITING","IN_PROGRESS","ENDED"],"description":"클래스 단계"},"createdBy":{"type":"string","format":"uuid","description":"생성자 ID"},"createdAt":{"type":"string","format":"date-time","description":"생성일시"},"updatedAt":{"type":"string","format":"date-time","description":"수정일시"}},"required":["id","title","description","recruitStartAt","recruitEndAt","startAt","endAt","selectionType","capacity","allowWaitlist","waitlistCapacity","visibility","isOnline","location","fee","phase","createdBy","createdAt","updatedAt"]},"CreateMClassRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":120,"description":"클래스 제목 (1-120자)","example":"JavaScript 기초 강의"},"description":{"type":"string","nullable":true,"description":"클래스 설명"},"selectionType":{"type":"string","enum":["FIRST_COME","REVIEW"],"default":"FIRST_COME","description":"선발 방식"},"capacity":{"type":"integer","nullable":true,"minimum":0,"exclusiveMinimum":true,"description":"수용 인원 (null이면 무제한)"},"allowWaitlist":{"type":"boolean","default":false,"description":"대기열 허용 여부"},"waitlistCapacity":{"type":"integer","nullable":true,"minimum":0,"exclusiveMinimum":true,"description":"대기열 수용 인원"},"visibility":{"type":"string","enum":["PUBLIC","UNLISTED"],"default":"PUBLIC","description":"공개 여부"},"recruitStartAt":{"type":"string","nullable":true,"format":"date-time","description":"날짜 시간 (ISO 8601 형식)","example":"2025-01-15T10:00:00.000Z"},"recruitEndAt":{"type":"string","nullable":true,"format":"date-time","description":"날짜 시간 (ISO 8601 형식)","example":"2025-01-15T10:00:00.000Z"},"startAt":{"type":"string","format":"date-time","description":"날짜 시간 (ISO 8601 형식)","example":"2025-01-15T10:00:00.000Z"},"endAt":{"type":"string","format":"date-time","description":"날짜 시간 (ISO 8601 형식)","example":"2025-01-15T10:00:00.000Z"},"isOnline":{"type":"boolean","default":true,"description":"온라인 클래스 여부"},"location":{"type":"string","nullable":true,"description":"오프라인 장소"},"fee":{"type":"integer","nullable":true,"minimum":0,"description":"수강료 (0이면 무료)"}},"required":["title","startAt","endAt"],"description":"MClass 생성 요청"},"UpdateMClassRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":120,"description":"클래스 제목 (1-120자)"},"description":{"type":"string","nullable":true,"description":"클래스 설명"},"selectionType":{"type":"string","enum":["FIRST_COME","REVIEW"],"description":"선발 방식"},"capacity":{"type":"integer","nullable":true,"minimum":0,"exclusiveMinimum":true,"description":"수용 인원 (null이면 무제한)"},"allowWaitlist":{"type":"boolean","description":"대기열 허용 여부"},"waitlistCapacity":{"type":"integer","nullable":true,"minimum":0,"exclusiveMinimum":true,"description":"대기열 수용 인원"},"visibility":{"type":"string","enum":["PUBLIC","UNLISTED"],"description":"공개 여부"},"recruitStartAt":{"type":"string","nullable":true,"format":"date-time","description":"날짜 시간 (ISO 8601 형식)","example":"2025-01-15T10:00:00.000Z"},"recruitEndAt":{"type":"string","nullable":true,"format":"date-time","description":"날짜 시간 (ISO 8601 형식)","example":"2025-01-15T10:00:00.000Z"},"startAt":{"type":"string","format":"date-time","description":"날짜 시간 (ISO 8601 형식)","example":"2025-01-15T10:00:00.000Z"},"endAt":{"type":"string","format":"date-time","description":"날짜 시간 (ISO 8601 형식)","example":"2025-01-15T10:00:00.000Z"},"isOnline":{"type":"boolean","description":"온라인 클래스 여부"},"location":{"type":"string","nullable":true,"description":"오프라인 장소"},"fee":{"type":"integer","nullable":true,"minimum":0,"description":"수강료 (0이면 무료)"}},"description":"MClass 수정 요청"},"MClassListQuery":{"type":"object","properties":{"phase":{"type":"string","enum":["UPCOMING","RECRUITING","IN_PROGRESS","ENDED"],"description":"클래스 단계 필터"},"selectionType":{"type":"string","enum":["FIRST_COME","REVIEW"],"description":"선발 방식 필터"},"visibility":{"type":"string","enum":["PUBLIC","UNLISTED"],"default":"PUBLIC","description":"공개 여부 필터 (관리자만 UNLISTED 조회 가능)"},"page":{"type":"integer","minimum":1,"default":1,"description":"페이지 번호","example":1},"size":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"페이지 크기 (최대 100)","example":20},"sort":{"type":"string","enum":["startAt","recruitStartAt","createdAt"],"default":"startAt","description":"정렬 기준"},"order":{"type":"string","enum":["asc","desc"],"default":"asc","description":"정렬 순서"}},"description":"MClass 목록 조회 쿼리"},"MClassListResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"클래스 ID"},"title":{"type":"string","description":"클래스 제목","example":"JavaScript 기초 강의"},"description":{"type":"string","nullable":true,"description":"클래스 설명"},"recruitStartAt":{"type":"string","nullable":true,"format":"date-time","description":"모집 시작일시"},"recruitEndAt":{"type":"string","nullable":true,"format":"date-time","description":"모집 종료일시"},"startAt":{"type":"string","format":"date-time","description":"클래스 시작일시"},"endAt":{"type":"string","format":"date-time","description":"클래스 종료일시"},"selectionType":{"type":"string","enum":["FIRST_COME","REVIEW"],"description":"선발 방식"},"capacity":{"type":"integer","nullable":true,"description":"수용 인원 (null이면 무제한)"},"allowWaitlist":{"type":"boolean","description":"대기열 허용 여부"},"waitlistCapacity":{"type":"integer","nullable":true,"description":"대기열 수용 인원"},"visibility":{"type":"string","enum":["PUBLIC","UNLISTED"],"description":"공개 여부"},"isOnline":{"type":"boolean","description":"온라인 클래스 여부"},"location":{"type":"string","nullable":true,"description":"오프라인 장소"},"fee":{"type":"integer","nullable":true,"description":"수강료 (0이면 무료)"},"phase":{"type":"string","enum":["UPCOMING","RECRUITING","IN_PROGRESS","ENDED"],"description":"클래스 단계"},"createdBy":{"type":"string","format":"uuid","description":"생성자 ID"},"createdAt":{"type":"string","format":"date-time","description":"생성일시"},"updatedAt":{"type":"string","format":"date-time","description":"수정일시"}},"required":["id","title","description","recruitStartAt","recruitEndAt","startAt","endAt","selectionType","capacity","allowWaitlist","waitlistCapacity","visibility","isOnline","location","fee","phase","createdBy","createdAt","updatedAt"]}},"meta":{"type":"object","properties":{"page":{"type":"number","example":1,"description":"현재 페이지"},"size":{"type":"number","example":20,"description":"페이지 크기"},"total":{"type":"number","example":100,"description":"전체 항목 수"},"totalPages":{"type":"number","example":5,"description":"전체 페이지 수"}},"required":["page","size","total","totalPages"]}},"required":["success","data","meta"]},"MClassStatistics":{"type":"object","properties":{"approvedCount":{"type":"integer","description":"승인된 인원 수"},"waitlistedCount":{"type":"integer","description":"대기열 인원 수"}},"required":["approvedCount","waitlistedCount"]},"Term":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"약관 ID"},"type":{"type":"string","enum":["SERVICE","PRIVACY","ENROLLMENT"],"description":"약관 유형"},"title":{"type":"string","description":"약관 제목","example":"서비스 이용약관"},"content":{"type":"string","description":"약관 내용"},"isRequired":{"type":"boolean","description":"필수 동의 여부"},"version":{"type":"string","description":"약관 버전","example":"1.0.0"},"createdAt":{"type":"string","format":"date-time","description":"생성일시"}},"required":["id","type","title","content","isRequired","version","createdAt"]},"CreateTermRequest":{"type":"object","properties":{"type":{"type":"string","enum":["SERVICE","PRIVACY","ENROLLMENT"],"description":"약관 유형"},"title":{"type":"string","minLength":1,"maxLength":200,"description":"약관 제목 (1-200자)","example":"서비스 이용약관"},"content":{"type":"string","minLength":1,"maxLength":10000,"description":"약관 내용 (1-10000자)"},"isRequired":{"type":"boolean","default":false,"description":"필수 동의 여부"},"version":{"type":"string","minLength":1,"maxLength":50,"description":"약관 버전 (1-50자)","example":"1.0.0"}},"required":["type","title","content","version"],"additionalProperties":false,"description":"약관 생성 요청"},"UpdateTermRequest":{"type":"object","properties":{"type":{"type":"string","enum":["SERVICE","PRIVACY","ENROLLMENT"],"description":"약관 유형"},"title":{"type":"string","minLength":1,"maxLength":200,"description":"약관 제목 (1-200자)"},"content":{"type":"string","minLength":1,"maxLength":10000,"description":"약관 내용 (1-10000자)"},"isRequired":{"type":"boolean","description":"필수 동의 여부"},"version":{"type":"string","minLength":1,"maxLength":50,"description":"약관 버전 (1-50자)"}},"additionalProperties":false,"description":"약관 수정 요청"},"AgreeToTermRequest":{"type":"object","properties":{"termId":{"type":"string","format":"uuid","description":"약관 ID"}},"required":["termId"],"additionalProperties":false,"description":"약관 동의 요청"},"TermListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"약관 ID"},"type":{"type":"string","enum":["SERVICE","PRIVACY","ENROLLMENT"],"description":"약관 유형"},"title":{"type":"string","description":"약관 제목","example":"서비스 이용약관"},"content":{"type":"string","description":"약관 내용"},"isRequired":{"type":"boolean","description":"필수 동의 여부"},"version":{"type":"string","description":"약관 버전","example":"1.0.0"},"createdAt":{"type":"string","format":"date-time","description":"생성일시"}},"required":["id","type","title","content","isRequired","version","createdAt"]}},"message":{"type":"string","description":"응답 메시지"}},"required":["data","message"]},"UserTermAgreement":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"동의 기록 ID"},"userId":{"type":"string","format":"uuid","description":"사용자 ID"},"termId":{"type":"string","format":"uuid","description":"약관 ID"},"agreedAt":{"type":"string","format":"date-time","description":"동의일시"}},"required":["id","userId","termId","agreedAt"]},"Question":{"type":"object","properties":{"id":{"type":"string","minLength":1,"description":"질문 ID"},"type":{"type":"string","enum":["text","email","phone","date","radio","checkbox","agreeTerms","textarea","select"],"description":"질문 타입"},"label":{"type":"string","minLength":1,"description":"질문 라벨","example":"이름을 입력해주세요"},"required":{"type":"boolean","default":false,"description":"필수 여부"},"options":{"type":"array","items":{"type":"string"},"description":"선택 옵션 (radio, checkbox, select 타입용)"},"placeholder":{"type":"string","description":"플레이스홀더"},"validation":{"type":"object","properties":{"minLength":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"최소 길이"},"maxLength":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"최대 길이"},"pattern":{"type":"string","description":"정규식 패턴"}},"description":"검증 규칙"}},"required":["id","type","label"]},"QuestionResponse":{"type":"object","properties":{"id":{"type":"string","description":"질문 ID"},"type":{"type":"string","enum":["text","email","phone","date","radio","checkbox","agreeTerms","textarea","select"],"description":"질문 타입"},"label":{"type":"string","description":"질문 라벨"},"required":{"type":"boolean","description":"필수 여부"},"options":{"type":"array","items":{"type":"string"},"description":"선택 옵션"},"placeholder":{"type":"string","description":"플레이스홀더"},"validation":{"type":"object","properties":{"minLength":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"최소 길이"},"maxLength":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"최대 길이"},"pattern":{"type":"string","description":"정규식 패턴"}},"description":"검증 규칙"}},"required":["id","type","label","required"]},"EnrollmentForm":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"지원서 양식 ID"},"mclassId":{"type":"string","format":"uuid","description":"MClass ID"},"title":{"type":"string","description":"지원서 제목","example":"JavaScript 강의 지원서"},"description":{"type":"string","nullable":true,"description":"지원서 설명"},"questions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"질문 ID"},"type":{"type":"string","enum":["text","email","phone","date","radio","checkbox","agreeTerms","textarea","select"],"description":"질문 타입"},"label":{"type":"string","description":"질문 라벨"},"required":{"type":"boolean","description":"필수 여부"},"options":{"type":"array","items":{"type":"string"},"description":"선택 옵션"},"placeholder":{"type":"string","description":"플레이스홀더"},"validation":{"type":"object","properties":{"minLength":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"최소 길이"},"maxLength":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"최대 길이"},"pattern":{"type":"string","description":"정규식 패턴"}},"description":"검증 규칙"}},"required":["id","type","label","required"]},"description":"질문 목록"},"isActive":{"type":"boolean","description":"활성화 여부"},"createdAt":{"type":"string","format":"date-time","description":"생성일시"},"updatedAt":{"type":"string","format":"date-time","description":"수정일시"}},"required":["id","mclassId","title","description","questions","isActive","createdAt","updatedAt"]},"CreateEnrollmentFormRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200,"description":"지원서 제목 (1-200자)","example":"JavaScript 강의 지원서"},"description":{"type":"string","nullable":true,"maxLength":1000,"description":"지원서 설명 (최대 1000자)"},"questions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"description":"질문 ID"},"type":{"type":"string","enum":["text","email","phone","date","radio","checkbox","agreeTerms","textarea","select"],"description":"질문 타입"},"label":{"type":"string","minLength":1,"description":"질문 라벨","example":"이름을 입력해주세요"},"required":{"type":"boolean","default":false,"description":"필수 여부"},"options":{"type":"array","items":{"type":"string"},"description":"선택 옵션 (radio, checkbox, select 타입용)"},"placeholder":{"type":"string","description":"플레이스홀더"},"validation":{"type":"object","properties":{"minLength":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"최소 길이"},"maxLength":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"최대 길이"},"pattern":{"type":"string","description":"정규식 패턴"}},"description":"검증 규칙"}},"required":["id","type","label"]},"minItems":1,"maxItems":50,"description":"질문 목록 (1-50개)"},"isActive":{"type":"boolean","default":true,"description":"활성화 여부"}},"required":["title","questions"],"description":"지원서 양식 생성 요청"},"UpdateEnrollmentFormRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200,"description":"지원서 제목 (1-200자)"},"description":{"type":"string","nullable":true,"maxLength":1000,"description":"지원서 설명 (최대 1000자)"},"questions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"description":"질문 ID"},"type":{"type":"string","enum":["text","email","phone","date","radio","checkbox","agreeTerms","textarea","select"],"description":"질문 타입"},"label":{"type":"string","minLength":1,"description":"질문 라벨","example":"이름을 입력해주세요"},"required":{"type":"boolean","default":false,"description":"필수 여부"},"options":{"type":"array","items":{"type":"string"},"description":"선택 옵션 (radio, checkbox, select 타입용)"},"placeholder":{"type":"string","description":"플레이스홀더"},"validation":{"type":"object","properties":{"minLength":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"최소 길이"},"maxLength":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"최대 길이"},"pattern":{"type":"string","description":"정규식 패턴"}},"description":"검증 규칙"}},"required":["id","type","label"]},"minItems":1,"maxItems":50,"description":"질문 목록 (1-50개)"},"isActive":{"type":"boolean","description":"활성화 여부"}},"description":"지원서 양식 수정 요청"},"EnrollmentFormQuery":{"type":"object","properties":{"mclassId":{"type":"string","format":"uuid","description":"MClass ID 필터"},"isActive":{"type":"boolean","description":"활성화 여부 필터"},"page":{"type":"integer","minimum":1,"default":1,"description":"페이지 번호","example":1},"size":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"페이지 크기 (최대 100)","example":20}},"description":"지원서 양식 조회 쿼리"},"UpdateUserRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":50,"description":"사용자 이름 (1-50자)","example":"홍길동"},"role":{"type":"string","enum":["USER","ADMIN"],"description":"사용자 역할"}},"additionalProperties":false,"description":"사용자 정보 수정 요청"},"UserIdParam":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"사용자 ID"}},"required":["id"],"description":"사용자 ID 파라미터"},"GetUserByEmailQuery":{"type":"object","properties":{"email":{"type":"string","format":"email","description":"사용자 이메일","example":"user@example.com"}},"required":["email"],"description":"이메일로 사용자 조회 쿼리"},"UserProfile":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"사용자 ID"},"email":{"type":"string","format":"email","description":"사용자 이메일"},"name":{"type":"string","description":"사용자 이름"},"role":{"type":"string","enum":["USER","ADMIN"],"description":"사용자 역할"},"isAdmin":{"type":"boolean","description":"관리자 여부"},"isSignUpCompleted":{"type":"boolean","description":"회원가입 완료 여부"},"provider":{"type":"string","enum":["LOCAL","KAKAO","GOOGLE","NAVER"],"description":"로그인 제공자"},"social_id":{"type":"string","nullable":true,"description":"소셜 로그인 ID"},"created_at":{"type":"string","format":"date-time","description":"생성일시"}},"required":["id","email","name","role","isAdmin","isSignUpCompleted","provider","social_id","created_at"]}},"parameters":{},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT 토큰을 입력하세요. 예: Bearer <token>"}}},"security":[{"bearerAuth":[]}],"paths":{"/api/mclasses/{id}/enrollment-form":{"get":{"tags":["EnrollmentForm"],"summary":"MClass 지원서 양식 조회","description":"특정 MClass의 지원서 양식을 조회합니다.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"MClass ID"}],"responses":{"200":{"description":"지원서 양식 조회 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"404":{"description":"지원서 양식을 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}},"post":{"tags":["EnrollmentForm"],"summary":"MClass 지원서 양식 생성","description":"특정 MClass의 지원서 양식을 생성합니다. (관리자만 가능)","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"MClass ID"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","nullable":true,"maxLength":1000},"questions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"type":{"type":"string","enum":["text","email","phone","date","radio","checkbox","agreeTerms","textarea","select"]},"label":{"type":"string","minLength":1},"required":{"type":"boolean","default":false},"options":{"type":"array","items":{"type":"string"}},"placeholder":{"type":"string"},"validation":{"type":"object","properties":{"minLength":{"type":"number","minimum":0,"exclusiveMinimum":true},"maxLength":{"type":"number","minimum":0,"exclusiveMinimum":true},"pattern":{"type":"string"}}}},"required":["id","type","label"]},"minItems":1,"maxItems":50},"isActive":{"type":"boolean","default":true}},"required":["title","questions"]}}}},"responses":{"201":{"description":"지원서 양식 생성 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"403":{"description":"권한 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"MClass를 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}},"put":{"tags":["EnrollmentForm"],"summary":"MClass 지원서 양식 수정","description":"특정 MClass의 지원서 양식을 수정합니다. (관리자만 가능)","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"MClass ID"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","nullable":true,"maxLength":1000},"questions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"type":{"type":"string","enum":["text","email","phone","date","radio","checkbox","agreeTerms","textarea","select"]},"label":{"type":"string","minLength":1},"required":{"type":"boolean","default":false},"options":{"type":"array","items":{"type":"string"}},"placeholder":{"type":"string"},"validation":{"type":"object","properties":{"minLength":{"type":"number","minimum":0,"exclusiveMinimum":true},"maxLength":{"type":"number","minimum":0,"exclusiveMinimum":true},"pattern":{"type":"string"}}}},"required":["id","type","label"]},"minItems":1,"maxItems":50},"isActive":{"type":"boolean"}}}}}},"responses":{"200":{"description":"지원서 양식 수정 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"403":{"description":"권한 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"지원서 양식을 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}},"delete":{"tags":["EnrollmentForm"],"summary":"MClass 지원서 양식 삭제","description":"특정 MClass의 지원서 양식을 삭제합니다. (관리자만 가능)","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"MClass ID"}],"responses":{"200":{"description":"지원서 양식 삭제 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"403":{"description":"권한 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"지원서 양식을 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/users/profile":{"get":{"tags":["Users"],"summary":"사용자 프로필 조회","description":"현재 로그인한 사용자의 프로필 정보를 조회합니다.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"프로필 조회 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"사용자를 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}},"put":{"tags":["Users"],"summary":"사용자 프로필 수정","description":"현재 로그인한 사용자의 프로필 정보를 수정합니다. (역할 수정 불가)","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"프로필 수정 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"사용자를 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}},"delete":{"tags":["Users"],"summary":"사용자 계정 삭제","description":"현재 로그인한 사용자의 계정을 삭제합니다.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"계정 삭제 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"사용자를 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/users/{id}/role":{"put":{"tags":["Users"],"summary":"사용자 역할 수정 (관리자 전용)","description":"관리자가 특정 사용자의 역할을 수정합니다.","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["USER","ADMIN"]}},"required":["role"],"additionalProperties":false}}}},"responses":{"200":{"description":"역할 수정 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"403":{"description":"권한 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"사용자를 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/auth/login":{"post":{"tags":["인증"],"summary":"사용자 로그인","description":"이메일과 비밀번호를 사용하여 로그인합니다.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","description":"사용자 이메일","example":"user@example.com"},"password":{"type":"string","minLength":8,"description":"사용자 비밀번호","example":"password123"}},"required":["email","password"],"additionalProperties":false,"description":"로그인 요청"}}}},"responses":{"200":{"description":"로그인 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"사용자 ID"},"email":{"type":"string","format":"email","description":"사용자 이메일"},"name":{"type":"string","description":"사용자 이름"},"role":{"type":"string","enum":["USER","ADMIN"],"description":"사용자 역할"},"isAdmin":{"type":"boolean","description":"관리자 여부"},"provider":{"type":"string","enum":["LOCAL","KAKAO","GOOGLE","NAVER"],"description":"로그인 제공자"},"social_id":{"type":"string","nullable":true,"description":"소셜 로그인 ID"},"created_at":{"type":"string","format":"date-time","description":"생성일시"}},"required":["id","email","name","role","isAdmin","provider","social_id","created_at"]},"accessToken":{"type":"string","description":"액세스 토큰"},"refreshToken":{"type":"string","description":"리프레시 토큰"}},"required":["user","accessToken","refreshToken"]},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success","data"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/auth/register":{"post":{"tags":["인증"],"summary":"사용자 회원가입","description":"새로운 사용자를 등록합니다.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"name":{"type":"string","minLength":1,"maxLength":50},"password":{"type":"string","minLength":8}},"required":["email","name","password"],"additionalProperties":false}}}},"responses":{"201":{"description":"회원가입 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"사용자 ID"},"email":{"type":"string","format":"email","description":"사용자 이메일"},"name":{"type":"string","description":"사용자 이름"},"role":{"type":"string","enum":["USER","ADMIN"],"description":"사용자 역할"},"isAdmin":{"type":"boolean","description":"관리자 여부"},"provider":{"type":"string","enum":["LOCAL","KAKAO","GOOGLE","NAVER"],"description":"로그인 제공자"},"social_id":{"type":"string","nullable":true,"description":"소셜 로그인 ID"},"created_at":{"type":"string","format":"date-time","description":"생성일시"}},"required":["id","email","name","role","isAdmin","provider","social_id","created_at"]},"message":{"type":"string","description":"응답 메시지"}},"required":["user","message"]},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success","data"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"409":{"description":"이미 존재하는 사용자","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/auth/social/login":{"post":{"tags":["인증"],"summary":"소셜 로그인","description":"소셜 로그인 제공자의 액세스 토큰을 사용하여 로그인합니다.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","enum":["KAKAO","GOOGLE","NAVER"],"description":"소셜 로그인 제공자"},"accessToken":{"type":"string","minLength":1,"description":"소셜 로그인 액세스 토큰"}},"required":["provider","accessToken"],"additionalProperties":false,"description":"소셜 로그인 요청"}}}},"responses":{"200":{"description":"소셜 로그인 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"사용자 ID"},"email":{"type":"string","format":"email","description":"사용자 이메일"},"name":{"type":"string","description":"사용자 이름"},"role":{"type":"string","enum":["USER","ADMIN"],"description":"사용자 역할"},"isAdmin":{"type":"boolean","description":"관리자 여부"},"provider":{"type":"string","enum":["LOCAL","KAKAO","GOOGLE","NAVER"],"description":"로그인 제공자"},"social_id":{"type":"string","nullable":true,"description":"소셜 로그인 ID"},"created_at":{"type":"string","format":"date-time","description":"생성일시"}},"required":["id","email","name","role","isAdmin","provider","social_id","created_at"]},"accessToken":{"type":"string","description":"액세스 토큰"},"refreshToken":{"type":"string","description":"리프레시 토큰"}},"required":["user","accessToken","refreshToken"]},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success","data"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/auth/complete-signup":{"post":{"tags":["인증"],"summary":"회원가입 완료","description":"소셜 로그인 후 추가 정보를 입력하여 회원가입을 완료합니다.","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":50,"description":"사용자 이름","example":"홍길동"},"role":{"type":"string","enum":["USER","ADMIN"],"default":"USER","description":"사용자 역할"}},"required":["name"],"additionalProperties":false,"description":"회원가입 완료 요청"}}}},"responses":{"200":{"description":"회원가입 완료 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"사용자 ID"},"email":{"type":"string","format":"email","description":"사용자 이메일"},"name":{"type":"string","description":"사용자 이름"},"role":{"type":"string","enum":["USER","ADMIN"],"description":"사용자 역할"},"isAdmin":{"type":"boolean","description":"관리자 여부"},"provider":{"type":"string","enum":["LOCAL","KAKAO","GOOGLE","NAVER"],"description":"로그인 제공자"},"social_id":{"type":"string","nullable":true,"description":"소셜 로그인 ID"},"created_at":{"type":"string","format":"date-time","description":"생성일시"}},"required":["id","email","name","role","isAdmin","provider","social_id","created_at"]},"message":{"type":"string","description":"응답 메시지"}},"required":["user","message"]},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success","data"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/auth/refresh":{"post":{"tags":["인증"],"summary":"토큰 갱신","description":"리프레시 토큰을 사용하여 새로운 액세스 토큰을 발급받습니다.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"refreshToken":{"type":"string","minLength":1,"description":"리프레시 토큰"}},"required":["refreshToken"],"additionalProperties":false,"description":"토큰 갱신 요청"}}}},"responses":{"200":{"description":"토큰 갱신 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"사용자 ID"},"email":{"type":"string","format":"email","description":"사용자 이메일"},"name":{"type":"string","description":"사용자 이름"},"role":{"type":"string","enum":["USER","ADMIN"],"description":"사용자 역할"},"isAdmin":{"type":"boolean","description":"관리자 여부"},"provider":{"type":"string","enum":["LOCAL","KAKAO","GOOGLE","NAVER"],"description":"로그인 제공자"},"social_id":{"type":"string","nullable":true,"description":"소셜 로그인 ID"},"created_at":{"type":"string","format":"date-time","description":"생성일시"}},"required":["id","email","name","role","isAdmin","provider","social_id","created_at"]},"accessToken":{"type":"string","description":"액세스 토큰"},"refreshToken":{"type":"string","description":"리프레시 토큰"}},"required":["user","accessToken","refreshToken"]},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success","data"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/auth/logout":{"post":{"tags":["인증"],"summary":"로그아웃","description":"사용자 로그아웃을 수행합니다.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"로그아웃 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"type":"object","properties":{"message":{"type":"string","description":"응답 메시지"}},"required":["message"]},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success","data"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/auth/change-password":{"post":{"tags":["인증"],"summary":"비밀번호 변경","description":"현재 비밀번호를 확인하고 새 비밀번호로 변경합니다.","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"currentPassword":{"type":"string","minLength":8,"description":"현재 비밀번호","example":"password123"},"newPassword":{"type":"string","minLength":8,"description":"새 비밀번호","example":"password123"}},"required":["currentPassword","newPassword"],"additionalProperties":false,"description":"비밀번호 변경 요청"}}}},"responses":{"200":{"description":"비밀번호 변경 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/terms":{"get":{"tags":["Terms"],"summary":"모든 약관 목록 조회","description":"시스템에 등록된 모든 약관 목록을 조회합니다.","responses":{"200":{"description":"약관 목록 조회 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"500":{"description":"서버 오류","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}},"post":{"tags":["Terms"],"summary":"약관 생성","description":"새로운 약관을 생성합니다. (관리자만 가능)","security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["SERVICE","PRIVACY","ENROLLMENT"]},"title":{"type":"string","minLength":1,"maxLength":200},"content":{"type":"string","minLength":1,"maxLength":10000},"isRequired":{"type":"boolean","default":false},"version":{"type":"string","minLength":1,"maxLength":50}},"required":["type","title","content","version"],"additionalProperties":false}}}},"responses":{"201":{"description":"약관 생성 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"403":{"description":"권한 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/terms/{id}":{"get":{"tags":["Terms"],"summary":"특정 약관 조회","description":"ID로 특정 약관을 조회합니다.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"약관 ID"}],"responses":{"200":{"description":"약관 조회 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"400":{"description":"잘못된 ID 형식","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"약관을 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"500":{"description":"서버 오류","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}},"put":{"tags":["Terms"],"summary":"약관 수정","description":"기존 약관을 수정합니다. (관리자만 가능)","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"약관 ID"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"content":{"type":"string","minLength":1,"maxLength":10000},"isRequired":{"type":"boolean"},"version":{"type":"string","minLength":1,"maxLength":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"약관 수정 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"403":{"description":"권한 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"약관을 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}},"delete":{"tags":["Terms"],"summary":"약관 삭제","description":"약관을 삭제합니다. (관리자만 가능)","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"약관 ID"}],"responses":{"200":{"description":"약관 삭제 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"403":{"description":"권한 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"약관을 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/terms/{id}/agree":{"post":{"tags":["Terms"],"summary":"약관 동의","description":"특정 약관에 동의합니다.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"약관 ID"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"termId":{"type":"string","format":"uuid"}},"required":["termId"],"additionalProperties":false}}}},"responses":{"200":{"description":"약관 동의 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"약관을 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/terms/{id}/user-agreement":{"get":{"tags":["Terms"],"summary":"사용자 약관 동의 상태 조회","description":"특정 사용자의 약관 동의 상태를 조회합니다.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"약관 ID"}],"responses":{"200":{"description":"동의 상태 조회 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"nullable":true,"description":"응답 데이터"},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"약관을 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/admin/users/{id}/role":{"get":{"tags":["Admin"],"summary":"사용자 권한 조회","description":"특정 사용자의 권한 정보를 조회합니다.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"사용자 ID"}],"responses":{"200":{"description":"사용자 권한 조회 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"name":{"type":"string"},"role":{"type":"string","enum":["USER","ADMIN"]},"isAdmin":{"type":"boolean"},"isSignUpCompleted":{"type":"boolean"},"provider":{"type":"string"},"createdAt":{"type":"string","format":"date"},"updatedAt":{"type":"string","format":"date"}},"required":["id","email","name","role","isAdmin","isSignUpCompleted","provider","createdAt","updatedAt"]},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success","data"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"403":{"description":"권한 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"사용자를 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}},"patch":{"tags":["Admin"],"summary":"사용자 권한 변경","description":"특정 사용자의 권한을 변경합니다. (관리자만 가능)","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"변경할 사용자 ID"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["USER","ADMIN"]},"isAdmin":{"type":"boolean"},"reason":{"type":"string"}},"required":["role","isAdmin"]}}}},"responses":{"200":{"description":"권한 변경 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"name":{"type":"string"},"role":{"type":"string","enum":["USER","ADMIN"]},"isAdmin":{"type":"boolean"},"isSignUpCompleted":{"type":"boolean"},"provider":{"type":"string"},"createdAt":{"type":"string","format":"date"},"updatedAt":{"type":"string","format":"date"}},"required":["id","email","name","role","isAdmin","isSignUpCompleted","provider","createdAt","updatedAt"]},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success","data"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"403":{"description":"권한 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"404":{"description":"사용자를 찾을 수 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/admin/users":{"get":{"tags":["Admin"],"summary":"모든 사용자 목록 조회","description":"시스템의 모든 사용자 목록을 조회합니다. (관리자만 가능)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"사용자 목록 조회 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"name":{"type":"string"},"role":{"type":"string","enum":["USER","ADMIN"]},"isAdmin":{"type":"boolean"},"isSignUpCompleted":{"type":"boolean"},"provider":{"type":"string"},"createdAt":{"type":"string","format":"date"},"updatedAt":{"type":"string","format":"date"}},"required":["id","email","name","role","isAdmin","isSignUpCompleted","provider","createdAt","updatedAt"]}},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"},"count":{"type":"number"}},"required":["success","data","count"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"403":{"description":"권한 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}},"/api/admin/admin-count":{"get":{"tags":["Admin"],"summary":"관리자 수 조회","description":"시스템의 관리자 수를 조회합니다. (관리자만 가능)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"관리자 수 조회 성공","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"성공 여부"},"data":{"type":"object","properties":{"adminCount":{"type":"number"}},"required":["adminCount"]},"message":{"type":"string","description":"성공 메시지"},"code":{"type":"string","example":"SUCCESS","description":"성공 코드"}},"required":["success","data"]}}}},"401":{"description":"인증 실패","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}},"403":{"description":"권한 없음","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false,"description":"성공 여부"},"error":{"type":"object","properties":{"code":{"type":"string","description":"에러 코드"},"message":{"type":"string","description":"에러 메시지"},"details":{"nullable":true,"description":"상세 에러 정보"}},"required":["code","message"]}},"required":["success","error"]}}}}}}}}}