From 81eb1d7ba0d67fe7ebc6290c5bf07d136552132a Mon Sep 17 00:00:00 2001 From: b0nsu <125778250+b0nsu@users.noreply.github.com> Date: Wed, 13 May 2026 23:53:58 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20study=20handwriting=20snapshot=20API=20?= =?UTF-8?q?hook=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MAT-591 spec 도입. publishId/problemId/type 조합 upsert + 단건 조회. MAT-591 통합 PR (매니저 generic + ProblemScreen/PointingScreen 통합) 의 base. - useGetStudyHandwritingSnapshot: GET .../snapshot/{type}, staleTime Infinity - usePostStudyHandwritingSnapshot: POST .../snapshot, body { type, dataJson } - onSuccess setQueryData 미장착 - 캐시는 MAT-591 통합 PR 의 wiring 에서 처리 - 옛 useGetStudyHandwriting / useUpdateStudyHandwriting 제거 (consumer 0, MAT-591 spec 에선 사용 안 함) - schema.d.ts: pnpm openapi regen (snapshot endpoint 2 개 + StudyHandwritingSnapshotSaveRequest / StudyHandwritingSnapshotResp + 누적 도메인 schema 동기화) Co-Authored-By: Claude Opus 4.7 (1M context) --- .../useGetStudyHandwritingSnapshot.ts | 27 + .../usePostStudyHandwritingSnapshot.ts | 36 + .../apis/controller/student/study/index.ts | 6 + apps/native/src/types/api/schema.d.ts | 9902 +++++++++++------ 4 files changed, 6692 insertions(+), 3279 deletions(-) create mode 100644 apps/native/src/apis/controller/student/study/handwriting/useGetStudyHandwritingSnapshot.ts create mode 100644 apps/native/src/apis/controller/student/study/handwriting/usePostStudyHandwritingSnapshot.ts diff --git a/apps/native/src/apis/controller/student/study/handwriting/useGetStudyHandwritingSnapshot.ts b/apps/native/src/apis/controller/student/study/handwriting/useGetStudyHandwritingSnapshot.ts new file mode 100644 index 000000000..5ba3ff872 --- /dev/null +++ b/apps/native/src/apis/controller/student/study/handwriting/useGetStudyHandwritingSnapshot.ts @@ -0,0 +1,27 @@ +import { TanstackQueryClient } from '@/apis/client'; +import { type components } from '@schema'; + +export type StudyHandwritingSnapshotType = + components['schemas']['StudyHandwritingSnapshotSaveRequest']['type']; + +export const useGetStudyHandwritingSnapshot = ( + publishId: number, + problemId: number, + type: StudyHandwritingSnapshotType, + enabled = true +) => { + return TanstackQueryClient.useQuery( + 'get', + '/api/student/study/problem/{publishId}/{problemId}/handwriting/snapshot/{type}', + { + params: { + path: { publishId, problemId, type }, + }, + }, + { + enabled, + staleTime: Infinity, + refetchOnWindowFocus: false, + } + ); +}; diff --git a/apps/native/src/apis/controller/student/study/handwriting/usePostStudyHandwritingSnapshot.ts b/apps/native/src/apis/controller/student/study/handwriting/usePostStudyHandwritingSnapshot.ts new file mode 100644 index 000000000..882217adb --- /dev/null +++ b/apps/native/src/apis/controller/student/study/handwriting/usePostStudyHandwritingSnapshot.ts @@ -0,0 +1,36 @@ +import { useMutation } from '@tanstack/react-query'; + +import { type paths } from '@schema'; +import { client } from '@/apis/client'; + +type SaveSnapshotRequest = + paths['/api/student/study/problem/{publishId}/{problemId}/handwriting/snapshot']['post']['requestBody']['content']['application/json']; +type SaveSnapshotResponse = + paths['/api/student/study/problem/{publishId}/{problemId}/handwriting/snapshot']['post']['responses']['200']['content']['*/*']; + +interface SaveSnapshotParams { + publishId: number; + problemId: number; + request: SaveSnapshotRequest; +} + +export const usePostStudyHandwritingSnapshot = () => { + return useMutation({ + mutationFn: async ({ + publishId, + problemId, + request, + }: SaveSnapshotParams): Promise => { + const { data } = await client.POST( + '/api/student/study/problem/{publishId}/{problemId}/handwriting/snapshot', + { + params: { + path: { publishId, problemId }, + }, + body: request, + } + ); + return data as SaveSnapshotResponse; + }, + }); +}; diff --git a/apps/native/src/apis/controller/student/study/index.ts b/apps/native/src/apis/controller/student/study/index.ts index 4feb7a327..636e67233 100644 --- a/apps/native/src/apis/controller/student/study/index.ts +++ b/apps/native/src/apis/controller/student/study/index.ts @@ -9,6 +9,12 @@ import useGetWeeklyPublish from './useGetWeeklyPublish'; import useGetEntireProblemPointing from './useGetEntireProblemPointing'; import useGetEntireProblem from './useGetEntireProblem'; +export { + useGetStudyHandwritingSnapshot, + type StudyHandwritingSnapshotType, +} from './handwriting/useGetStudyHandwritingSnapshot'; +export { usePostStudyHandwritingSnapshot } from './handwriting/usePostStudyHandwritingSnapshot'; + export { getPublishDetailById, postAnswer, diff --git a/apps/native/src/types/api/schema.d.ts b/apps/native/src/types/api/schema.d.ts index 673e15b12..a33265cad 100644 --- a/apps/native/src/types/api/schema.d.ts +++ b/apps/native/src/types/api/schema.d.ts @@ -81,6 +81,25 @@ export interface paths { patch?: never; trace?: never; }; + '/api/student/study/problem/{publishId}/{problemId}/handwriting': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 필기 데이터 조회 */ + get: operations['getHandwriting']; + /** 필기 데이터 저장/수정 */ + put: operations['updateHandwriting']; + post?: never; + /** 필기 데이터 삭제 */ + delete: operations['deleteHandwriting']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; '/api/student/scrap/{scrapId}': { parameters: { query?: never; @@ -157,12 +176,12 @@ export interface paths { cookie?: never; }; /** 필기 데이터 조회 */ - get: operations['getHandwriting']; + get: operations['getHandwriting_1']; /** 필기 데이터 저장/수정 */ - put: operations['updateHandwriting']; + put: operations['updateHandwriting_1']; post?: never; /** 필기 데이터 삭제 */ - delete: operations['deleteHandwriting']; + delete: operations['deleteHandwriting_1']; options?: never; head?: never; patch?: never; @@ -367,6 +386,42 @@ export interface paths { patch?: never; trace?: never; }; + '/api/admin/user/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 관리자 단건 조회 */ + get: operations['findById']; + /** 관리자 계정 정보 수정 */ + put: operations['update_3']; + post?: never; + /** 관리자 계정 삭제 (자기 자신은 불가) */ + delete: operations['delete_2']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/user/{id}/role': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** 관리자에 역할 할당 (roleId=null이면 슈퍼 관리자 전환) */ + put: operations['assignRole']; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; '/api/admin/teacher/{id}': { parameters: { query?: never; @@ -376,7 +431,7 @@ export interface paths { }; get?: never; /** 수정 */ - put: operations['update_3']; + put: operations['update_4']; post?: never; delete?: never; options?: never; @@ -401,6 +456,24 @@ export interface paths { patch?: never; trace?: never; }; + '/api/admin/role/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** 역할 수정 */ + put: operations['update_5']; + post?: never; + /** 역할 삭제 */ + delete: operations['delete_3']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; '/api/admin/qna/{qnaId}/status': { parameters: { query?: never; @@ -465,10 +538,10 @@ export interface paths { /** 상세 조회 */ get: operations['getProblemSet']; /** 수정 */ - put: operations['update_4']; + put: operations['update_6']; post?: never; /** 삭제 */ - delete: operations['delete_2']; + delete: operations['delete_4']; options?: never; head?: never; patch?: never; @@ -500,16 +573,16 @@ export interface paths { }; get?: never; /** 수정 */ - put: operations['update_5']; + put: operations['update_7']; post?: never; /** 삭제 */ - delete: operations['delete_3']; + delete: operations['delete_5']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/notice/{id}': { + '/api/admin/pointing/bubble/{id}': { parameters: { query?: never; header?: never; @@ -517,36 +590,34 @@ export interface paths { cookie?: never; }; get?: never; - /** 수정 */ - put: operations['update_6']; + /** 버블 수정 */ + put: operations['update_8']; post?: never; - /** 삭제 */ - delete: operations['delete_4']; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/diagnosis/{id}': { + '/api/admin/notice/{id}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 학생 진단 상세보기 */ - get: operations['getById_1']; + get?: never; /** 수정 */ - put: operations['update_7']; + put: operations['update_9']; post?: never; /** 삭제 */ - delete: operations['delete_5']; + delete: operations['delete_6']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/concept/{conceptId}': { + '/api/admin/mock-exam/types/{id}': { parameters: { query?: never; header?: never; @@ -554,17 +625,17 @@ export interface paths { cookie?: never; }; get?: never; - /** 개념태그 수정 */ - put: operations['update_8']; + /** 모의고사 타입 수정 */ + put: operations['updateType']; post?: never; - /** 개념태그 삭제 */ - delete: operations['delete_6']; + /** 모의고사 타입 삭제 */ + delete: operations['deleteType']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/concept/category/{categoryId}': { + '/api/admin/menu/{id}': { parameters: { query?: never; header?: never; @@ -572,52 +643,54 @@ export interface paths { cookie?: never; }; get?: never; - /** 대분류 수정 */ - put: operations['updateCategory']; + /** 메뉴 수정 */ + put: operations['update_10']; post?: never; - /** 대분류 삭제 */ - delete: operations['deleteCategory']; + /** 메뉴 삭제 */ + delete: operations['delete_7']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/qna/chat': { + '/api/admin/diagnosis/{id}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; - put?: never; - /** 채팅메시지 생성 */ - post: operations['addChat']; - delete?: never; + /** 학생 진단 상세보기 */ + get: operations['getById_1']; + /** 수정 */ + put: operations['update_11']; + post?: never; + /** 삭제 */ + delete: operations['delete_8']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/notice': { + '/api/admin/daily-comments/{id}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 학생 별 공지사항 전체 조회 */ - get: operations['getsAll']; - put?: never; - /** 생성 */ - post: operations['create']; - delete?: never; + get?: never; + /** 데일리 코멘트 수정 */ + put: operations['update_12']; + post?: never; + /** 데일리 코멘트 삭제 */ + delete: operations['delete_9']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/me/push/token': { + '/api/admin/concept/{conceptId}': { parameters: { query?: never; header?: never; @@ -625,16 +698,17 @@ export interface paths { cookie?: never; }; get?: never; - put?: never; - /** 푸시 토큰 등록/갱신 */ - post: operations['updatePushToken']; - delete?: never; + /** 개념태그 수정 */ + put: operations['update_13']; + post?: never; + /** 개념태그 삭제 */ + delete: operations['delete_10']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/me/push/allow/toggle': { + '/api/admin/concept/graph/sheet/action-edge/cell': { parameters: { query?: never; header?: never; @@ -642,20 +716,16 @@ export interface paths { cookie?: never; }; get?: never; - put?: never; - /** - * 푸시 알림 허용 토글 - * @deprecated - * @description Deprecated: /push/settings API 사용 권장 - */ - post: operations['toggleAllowPush']; + /** 액션 그래프 셀 일괄 수정 */ + put: operations['replaceCell']; + post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/auth/refresh': { + '/api/admin/concept/graph/node/{id}': { parameters: { query?: never; header?: never; @@ -663,16 +733,17 @@ export interface paths { cookie?: never; }; get?: never; - put?: never; - /** 토큰 갱신 */ - post: operations['refresh']; - delete?: never; + /** 노드 수정 */ + put: operations['updateNode']; + post?: never; + /** 노드 삭제 */ + delete: operations['deleteNode']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/auth/login/local': { + '/api/admin/concept/graph/node-type/{id}': { parameters: { query?: never; header?: never; @@ -680,16 +751,17 @@ export interface paths { cookie?: never; }; get?: never; - put?: never; - /** 이메일 로그인 */ - post: operations['login']; - delete?: never; + /** 노드 타입 수정 */ + put: operations['updateNodeType']; + post?: never; + /** 노드 타입 삭제 */ + delete: operations['deleteNodeType']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/study/submit/pointing': { + '/api/admin/concept/graph/edge/{id}': { parameters: { query?: never; header?: never; @@ -697,16 +769,17 @@ export interface paths { cookie?: never; }; get?: never; - put?: never; - /** 포인팅 피드백(이해했어요/모르겠어요) 제출 */ - post: operations['feedback']; - delete?: never; + /** 엣지 수정 */ + put: operations['updateEdge']; + post?: never; + /** 엣지 삭제 */ + delete: operations['deleteEdge']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/study/submit/answer': { + '/api/admin/concept/graph/edge-type/{id}': { parameters: { query?: never; header?: never; @@ -714,16 +787,17 @@ export interface paths { cookie?: never; }; get?: never; - put?: never; - /** 답안 제출 */ - post: operations['submit']; - delete?: never; + /** 엣지 타입 수정 */ + put: operations['updateEdgeType']; + post?: never; + /** 엣지 타입 삭제 */ + delete: operations['deleteEdgeType']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap': { + '/api/admin/concept/graph/action-edge/{id}': { parameters: { query?: never; header?: never; @@ -731,17 +805,17 @@ export interface paths { cookie?: never; }; get?: never; - put?: never; - /** 일반 스크랩 생성(쓸지, 안쓸지 모르겠음) */ - post: operations['createScrap']; - /** 스크랩 삭제 (폴더/스크랩 혼합 배치) */ - delete: operations['deleteScraps']; + /** 액션 엣지 수정 */ + put: operations['updateActionEdge']; + post?: never; + /** 액션 엣지 삭제 */ + delete: operations['deleteActionEdge']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap/toggle/from-reading-tip': { + '/api/admin/concept/graph/action-edge-type/{id}': { parameters: { query?: never; header?: never; @@ -749,16 +823,17 @@ export interface paths { cookie?: never; }; get?: never; - put?: never; - /** 리딩팁 콘텐츠 스크랩 토글 */ - post: operations['toggleScrapFromReadingTip']; - delete?: never; + /** 액션 엣지 타입 수정 */ + put: operations['updateActionEdgeType']; + post?: never; + /** 액션 엣지 타입 삭제 */ + delete: operations['deleteActionEdgeType']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap/toggle/from-problem': { + '/api/admin/concept/category/{categoryId}': { parameters: { query?: never; header?: never; @@ -766,19 +841,17 @@ export interface paths { cookie?: never; }; get?: never; - put?: never; - /** - * 문제 기반 스크랩 토글 (있으면 삭제, 없으면 복원/생성) - * @description 활성 스크랩 있음 → 휴지통으로 이동(isScraped=false). 휴지통에 스크랩 있음 → 휴지통에서 복원(isScraped=true). 스크랩 없음 → 새로 생성(isScraped=true). 2회 연속 호출 시: 1회차 생성 → 2회차 휴지통 → 3회차 복원. - */ - post: operations['toggleScrapFromProblem']; - delete?: never; + /** 대분류 수정 */ + put: operations['updateCategory']; + post?: never; + /** 대분류 삭제 */ + delete: operations['deleteCategory']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap/toggle/from-pointing': { + '/api/teacher/qna/chat': { parameters: { query?: never; header?: never; @@ -787,35 +860,33 @@ export interface paths { }; get?: never; put?: never; - /** - * 포인팅 기반 스크랩 토글 (있으면 삭제, 없으면 복원/생성) - * @description 해당 포인팅이 스크랩에 있으면 제거(다른 콘텐츠 없으면 휴지통 이동). 포인팅 없으면: 활성 스크랩에 추가, 휴지통 스크랩 복원 후 추가, 또는 새로 생성. 2회 연속 호출 시: 1회차 추가 → 2회차 제거 및 휴지통 → 3회차 복원. - */ - post: operations['toggleScrapFromPointing']; + /** 채팅메시지 생성 */ + post: operations['addChat']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap/toggle/from-one-step-more': { + '/api/teacher/notice': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; + /** 학생 별 공지사항 전체 조회 */ + get: operations['getsAll']; put?: never; - /** 원스텝모어 콘텐츠 스크랩 토글 */ - post: operations['toggleScrapFromOneStepMore']; + /** 생성 */ + post: operations['create']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap/from-problem': { + '/api/teacher/me/push/token': { parameters: { query?: never; header?: never; @@ -824,16 +895,15 @@ export interface paths { }; get?: never; put?: never; - /** 문제에서 스크랩 (problem + 모든 pointing) */ - post: operations['createScrapFromProblem']; - /** 문제에서 스크랩 취소 (휴지통 처리) */ - delete: operations['unscrapFromProblem']; + /** 푸시 토큰 등록/갱신 */ + post: operations['updatePushToken']; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap/from-pointing': { + '/api/teacher/me/push/allow/toggle': { parameters: { query?: never; header?: never; @@ -842,16 +912,19 @@ export interface paths { }; get?: never; put?: never; - /** 포인팅에서 스크랩 (problem + 해당 pointing만) */ - post: operations['createScrapFromPointing']; - /** 포인팅에서 스크랩 취소 (다른 포인팅이 없으면 휴지통 처리) */ - delete: operations['unscrapFromPointing']; + /** + * 푸시 알림 허용 토글 + * @deprecated + * @description Deprecated: /push/settings API 사용 권장 + */ + post: operations['toggleAllowPush']; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap/from-image': { + '/api/teacher/auth/refresh': { parameters: { query?: never; header?: never; @@ -860,52 +933,49 @@ export interface paths { }; get?: never; put?: never; - /** 이미지 기반 스크랩 (문제 연결 없이) */ - post: operations['createScrapFromImage']; + /** 토큰 갱신 */ + post: operations['refresh']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap/folder': { + '/api/teacher/auth/login/local': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 폴더 목록 조회 */ - get: operations['getFolders']; + get?: never; put?: never; - /** 폴더 생성 */ - post: operations['createFolder']; - /** 폴더 삭제 */ - delete: operations['deleteFolders']; + /** 이메일 로그인 */ + post: operations['login']; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/qna': { + '/api/student/study/submit/pointing': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Q&A 목록 조회 */ - get: operations['gets']; + get?: never; put?: never; - /** Q&A 생성 */ - post: operations['create_1']; + /** 포인팅 피드백(이해했어요/모르겠어요) 제출 */ + post: operations['feedback']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/qna/exist': { + '/api/student/study/submit/bubble/question': { parameters: { query?: never; header?: never; @@ -914,15 +984,15 @@ export interface paths { }; get?: never; put?: never; - /** Q&A 존재 여부 확인, 사용자가 동일한 항목에 대해 QnA 작성 여부 확인 */ - post: operations['checkExists']; + /** 버블 ? 버튼 누름 제출 */ + post: operations['recordBubbleQuestion']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/qna/chat': { + '/api/student/study/submit/answer': { parameters: { query?: never; header?: never; @@ -931,15 +1001,15 @@ export interface paths { }; get?: never; put?: never; - /** 채팅메시지 생성 */ - post: operations['addChat_1']; + /** 답안 제출 */ + post: operations['submit']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/notification/read/{notificationId}': { + '/api/student/study/problem/{publishId}/{problemId}/handwriting/snapshot': { parameters: { query?: never; header?: never; @@ -948,15 +1018,15 @@ export interface paths { }; get?: never; put?: never; - /** 알림 읽음 처리 */ - post: operations['readNotification']; + /** 필기 스냅샷 저장 (type별 upsert) */ + post: operations['saveSnapshot']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/notification/read-all': { + '/api/student/scrap': { parameters: { query?: never; header?: never; @@ -965,15 +1035,16 @@ export interface paths { }; get?: never; put?: never; - /** 전체 알림 읽음 처리 */ - post: operations['readAllNotifications']; - delete?: never; + /** 일반 스크랩 생성(쓸지, 안쓸지 모르겠음) */ + post: operations['createScrap']; + /** 스크랩 삭제 (폴더/스크랩 혼합 배치) */ + delete: operations['deleteScraps']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/me/push/token': { + '/api/student/scrap/toggle/from-reading-tip': { parameters: { query?: never; header?: never; @@ -982,15 +1053,15 @@ export interface paths { }; get?: never; put?: never; - /** 푸시 토큰 등록/갱신 */ - post: operations['updatePushToken_1']; + /** 리딩팁 콘텐츠 스크랩 토글 */ + post: operations['toggleScrapFromReadingTip']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/me/push/settings/init': { + '/api/student/scrap/toggle/from-problem': { parameters: { query?: never; header?: never; @@ -1000,17 +1071,17 @@ export interface paths { get?: never; put?: never; /** - * 초기 푸시 설정 - * @description 전체 푸시 관련 설정(마스터 토글, 서비스 알림, QnA 알림, 마케팅 알림)을 한 번에 true/false로 세팅합니다. + * 문제 기반 스크랩 토글 (있으면 삭제, 없으면 복원/생성) + * @description 활성 스크랩 있음 → 휴지통으로 이동(isScraped=false). 휴지통에 스크랩 있음 → 휴지통에서 복원(isScraped=true). 스크랩 없음 → 새로 생성(isScraped=true). 2회 연속 호출 시: 1회차 생성 → 2회차 휴지통 → 3회차 복원. */ - post: operations['initPushSettings']; + post: operations['toggleScrapFromProblem']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/me/push/allow/toggle': { + '/api/student/scrap/toggle/from-pointing': { parameters: { query?: never; header?: never; @@ -1020,18 +1091,17 @@ export interface paths { get?: never; put?: never; /** - * 푸시 알림 허용 토글 - * @deprecated - * @description Deprecated: /push/settings API 사용 권장 + * 포인팅 기반 스크랩 토글 (있으면 삭제, 없으면 복원/생성) + * @description 해당 포인팅이 스크랩에 있으면 제거(다른 콘텐츠 없으면 휴지통 이동). 포인팅 없으면: 활성 스크랩에 추가, 휴지통 스크랩 복원 후 추가, 또는 새로 생성. 2회 연속 호출 시: 1회차 추가 → 2회차 제거 및 휴지통 → 3회차 복원. */ - post: operations['toggleAllowPush_1']; + post: operations['toggleScrapFromPointing']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/me/password': { + '/api/student/scrap/toggle/from-one-step-more': { parameters: { query?: never; header?: never; @@ -1040,15 +1110,15 @@ export interface paths { }; get?: never; put?: never; - /** 비밀번호 변경 */ - post: operations['changePassword']; + /** 원스텝모어 콘텐츠 스크랩 토글 */ + post: operations['toggleScrapFromOneStepMore']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/feedback': { + '/api/student/scrap/from-problem': { parameters: { query?: never; header?: never; @@ -1057,15 +1127,16 @@ export interface paths { }; get?: never; put?: never; - /** 서비스 피드백 제출 */ - post: operations['submitFeedback']; - delete?: never; + /** 문제에서 스크랩 (problem + 모든 pointing) */ + post: operations['createScrapFromProblem']; + /** 문제에서 스크랩 취소 (휴지통 처리) */ + delete: operations['unscrapFromProblem']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/auth/signup/local': { + '/api/student/scrap/from-pointing': { parameters: { query?: never; header?: never; @@ -1074,15 +1145,16 @@ export interface paths { }; get?: never; put?: never; - /** [학생] 이메일 회원가입 */ - post: operations['signup']; - delete?: never; + /** 포인팅에서 스크랩 (problem + 해당 pointing만) */ + post: operations['createScrapFromPointing']; + /** 포인팅에서 스크랩 취소 (다른 포인팅이 없으면 휴지통 처리) */ + delete: operations['unscrapFromPointing']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/auth/register': { + '/api/student/scrap/from-image': { parameters: { query?: never; header?: never; @@ -1091,52 +1163,52 @@ export interface paths { }; get?: never; put?: never; - /** 초기 정보 등록 */ - post: operations['register']; + /** 이미지 기반 스크랩 (문제 연결 없이) */ + post: operations['createScrapFromImage']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/auth/refresh': { + '/api/student/scrap/folder': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; + /** 폴더 목록 조회 */ + get: operations['getFolders']; put?: never; - /** 토큰 갱신 */ - post: operations['refresh_1']; - delete?: never; + /** 폴더 생성 */ + post: operations['createFolder']; + /** 폴더 삭제 */ + delete: operations['deleteFolders']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/auth/quit': { + '/api/student/qna': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; + /** Q&A 목록 조회 */ + get: operations['gets']; put?: never; - /** - * 회원 탈퇴 - * @description 탈퇴 사유를 선택하고 회원 탈퇴를 진행합니다. 복수 선택 가능합니다. - */ - post: operations['quit']; + /** Q&A 생성 */ + post: operations['create_1']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/auth/password/reset': { + '/api/student/qna/exist': { parameters: { query?: never; header?: never; @@ -1145,18 +1217,15 @@ export interface paths { }; get?: never; put?: never; - /** - * [학생] 비밀번호 찾기 - 비밀번호 재설정 - * @description 인증 코드 검증 후 새 비밀번호로 재설정합니다. - */ - post: operations['resetPassword']; + /** Q&A 존재 여부 확인, 사용자가 동일한 항목에 대해 QnA 작성 여부 확인 */ + post: operations['checkExists']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/auth/password/reset/verify-code': { + '/api/student/qna/chat': { parameters: { query?: never; header?: never; @@ -1165,18 +1234,15 @@ export interface paths { }; get?: never; put?: never; - /** - * [학생] 비밀번호 찾기 - 인증 코드 검증 - * @description 이메일로 발송된 인증 코드를 검증합니다. - */ - post: operations['verifyPasswordResetCode']; + /** 채팅메시지 생성 */ + post: operations['addChat_1']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/auth/password/reset/send-code': { + '/api/student/oauth/native': { parameters: { query?: never; header?: never; @@ -1186,17 +1252,17 @@ export interface paths { get?: never; put?: never; /** - * [학생] 비밀번호 찾기 - 인증 코드 발송 - * @description 등록된 이메일로 6자리 인증 코드를 발송합니다. 코드는 10분간 유효합니다. + * Native OAuth 로그인 + * @description 클라이언트에서 직접 받은 OAuth 토큰으로 로그인합니다. Kakao는 access_token, Google/Apple은 id_token을 전달합니다. */ - post: operations['sendPasswordResetCode']; + post: operations['nativeLogin']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/auth/login/social': { + '/api/student/notification/read/{notificationId}': { parameters: { query?: never; header?: never; @@ -1205,15 +1271,15 @@ export interface paths { }; get?: never; put?: never; - /** 소셜 로그인 URL 요청 [네이버만 완료] */ - post: operations['getSocialLoginUrl']; + /** 알림 읽음 처리 */ + post: operations['readNotification']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/auth/login/local': { + '/api/student/notification/read-all': { parameters: { query?: never; header?: never; @@ -1222,15 +1288,15 @@ export interface paths { }; get?: never; put?: never; - /** 이메일 로그인 */ - post: operations['login_1']; + /** 전체 알림 읽음 처리 */ + post: operations['readAllNotifications']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/common/upload-file': { + '/api/student/mock-exam': { parameters: { query?: never; header?: never; @@ -1239,15 +1305,15 @@ export interface paths { }; get?: never; put?: never; - /** 파일 업로드, (응답의 uploadUrl로 AWS S3 업로드 해야합니다) */ - post: operations['getPreSignedUrl']; + /** 모의고사 정오답/학습 고민 제출 */ + post: operations['submit_1']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/auth/phone/verify': { + '/api/student/me/push/token': { parameters: { query?: never; header?: never; @@ -1256,15 +1322,15 @@ export interface paths { }; get?: never; put?: never; - /** 휴대폰 인증 코드 검증 */ - post: operations['verify']; + /** 푸시 토큰 등록/갱신 */ + post: operations['updatePushToken_1']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/auth/phone/send': { + '/api/student/me/push/settings/init': { parameters: { query?: never; header?: never; @@ -1273,15 +1339,18 @@ export interface paths { }; get?: never; put?: never; - /** 휴대폰 인증 코드 발송 */ - post: operations['send']; + /** + * 초기 푸시 설정 + * @description 전체 푸시 관련 설정(마스터 토글, 서비스 알림, QnA 알림, 마케팅 알림)을 한 번에 true/false로 세팅합니다. + */ + post: operations['initPushSettings']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/auth/phone/resend': { + '/api/student/me/push/allow/toggle': { parameters: { query?: never; header?: never; @@ -1290,15 +1359,19 @@ export interface paths { }; get?: never; put?: never; - /** 휴대폰 인증 코드 재발송 */ - post: operations['resend']; + /** + * 푸시 알림 허용 토글 + * @deprecated + * @description Deprecated: /push/settings API 사용 권장 + */ + post: operations['toggleAllowPush_1']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/analytics/events': { + '/api/student/me/password': { parameters: { query?: never; header?: never; @@ -1307,50 +1380,15 @@ export interface paths { }; get?: never; put?: never; - /** - * 클라이언트 이벤트 배치 수집 - * @description ## 이벤트 수집 API - * - * 화면 이탈, 버튼 클릭 등 사용자 행동 이벤트를 배치로 수집합니다. - * 비로그인 사용자도 sessionId로 추적됩니다. - * - * ### 전송 규칙 - * - 최대 100개 이벤트까지 한 번에 전송 가능 - * - 10개 이상 쌓이거나 30초마다 전송 권장 - * - 화면 전환/앱 백그라운드 시 즉시 전송 - * - * ### 이벤트 타입별 metadata 규칙 - * - * | eventType | 필수 metadata | 선택 metadata | - * |-----------|--------------|---------------| - * | SESSION_START | - | appVersion, osVersion | - * | SESSION_END | - | sessionDurationMs | - * | SCREEN_ENTER | screenName | previousScreen, params | - * | SCREEN_EXIT | screenName, dwellTimeMs | nextScreen, exitReason | - * | BUTTON_CLICK | buttonId, screenName | buttonLabel | - * | STUDY_START | problemSetId | problemSetTitle, totalProblems | - * | STUDY_END | problemSetId, completedCount, studyDurationMs | correctCount, exitReason | - * | PROBLEM_VIEW | problemId, problemSetId | problemIndex, isRetry | - * | POINTING_VIEW | pointingId, problemId | pointingType | - * - * ### screenName 값 - * `Main`, `StudyList`, `StudyDetail`, `Problem`, `Pointing`, `Scrap`, `ScrapDetail`, `QnA`, `QnAChat`, `Notification`, `Settings`, `Profile` - * - * ### buttonId 값 - * `start_study`, `view_scrap`, `view_qna`, `submit_answer`, `next_problem`, `prev_problem`, `confirm_pointing`, `reject_pointing`, `add_scrap`, `remove_scrap`, `send_message`, `upload_image` - * - * ### exitReason 값 - * - SCREEN_EXIT용: `navigation`, `back`, `background`, `timeout` - * - STUDY_END용: `completed`, `paused`, `abandoned` - */ - post: operations['collectEvents']; + /** 비밀번호 변경 */ + post: operations['changePassword']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/user': { + '/api/student/feedback': { parameters: { query?: never; header?: never; @@ -1359,33 +1397,32 @@ export interface paths { }; get?: never; put?: never; - /** 관리자 계정 생성 */ - post: operations['create_2']; + /** 서비스 피드백 제출 */ + post: operations['submitFeedback']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/teacher': { + '/api/student/auth/signup/local': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 검색 */ - get: operations['search']; + get?: never; put?: never; - /** 생성 */ - post: operations['create_3']; + /** [학생] 이메일 회원가입 */ + post: operations['signup']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/school/batch': { + '/api/student/auth/register': { parameters: { query?: never; header?: never; @@ -1394,15 +1431,15 @@ export interface paths { }; get?: never; put?: never; - /** 학교 정보 업로드 batch */ - post: operations['batch']; + /** 초기 정보 등록 */ + post: operations['register']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/qna/chat': { + '/api/student/auth/refresh': { parameters: { query?: never; header?: never; @@ -1411,70 +1448,75 @@ export interface paths { }; get?: never; put?: never; - /** 채팅메시지 생성 */ - post: operations['addChat_2']; + /** 토큰 갱신 */ + post: operations['refresh_1']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/publish': { + '/api/student/auth/quit': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 검색 */ - get: operations['search_1']; + get?: never; put?: never; - /** 생성 */ - post: operations['create_4']; + /** + * 회원 탈퇴 + * @description 탈퇴 사유를 선택하고 회원 탈퇴를 진행합니다. 복수 선택 가능합니다. + */ + post: operations['quit']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/problem': { + '/api/student/auth/password/reset': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 검색 */ - get: operations['search_2']; + get?: never; put?: never; - /** 단일 생성 */ - post: operations['createProblem']; + /** + * [학생] 비밀번호 찾기 - 비밀번호 재설정 + * @description 인증 코드 검증 후 새 비밀번호로 재설정합니다. + */ + post: operations['resetPassword']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/problem/{parentId}/children': { + '/api/student/auth/password/reset/verify-code': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 자식 문제 목록 조회 */ - get: operations['getChildren']; + get?: never; put?: never; - /** 자식 문제 추가 */ - post: operations['addChild']; - /** 자식 문제 삭제 */ - delete: operations['removeChildren']; + /** + * [학생] 비밀번호 찾기 - 인증 코드 검증 + * @description 이메일로 발송된 인증 코드를 검증합니다. + */ + post: operations['verifyPasswordResetCode']; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/problem/with-child': { + '/api/student/auth/password/reset/send-code': { parameters: { query?: never; header?: never; @@ -1483,51 +1525,52 @@ export interface paths { }; get?: never; put?: never; - /** 생성(새끼문제, 일반문제 한번에 생성) */ - post: operations['createProblemWithChild']; + /** + * [학생] 비밀번호 찾기 - 인증 코드 발송 + * @description 등록된 이메일로 6자리 인증 코드를 발송합니다. 코드는 10분간 유효합니다. + */ + post: operations['sendPasswordResetCode']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/problem-set': { + '/api/student/auth/login/social': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 검색 */ - get: operations['search_3']; + get?: never; put?: never; - /** 생성 */ - post: operations['create_5']; + /** 소셜 로그인 URL 요청 [네이버만 완료] */ + post: operations['getSocialLoginUrl']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/practice-test': { + '/api/student/auth/login/local': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 검색 */ - get: operations['search_4']; + get?: never; put?: never; - /** 생성 */ - post: operations['create_6']; + /** 이메일 로그인 */ + post: operations['login_1']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/ocr': { + '/api/common/upload-file': { parameters: { query?: never; header?: never; @@ -1536,14 +1579,15 @@ export interface paths { }; get?: never; put?: never; - post: operations['redirect']; + /** 파일 업로드, (응답의 uploadUrl로 AWS S3 업로드 해야합니다) */ + post: operations['getPreSignedUrl']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/notification/send': { + '/api/auth/phone/verify': { parameters: { query?: never; header?: never; @@ -1552,36 +1596,32 @@ export interface paths { }; get?: never; put?: never; - /** - * 알림 발송 - * @description isAll=true이면 전체 학생에게 발송, false이면 studentIds에 지정된 학생들에게만 발송 - */ - post: operations['sendNotification']; + /** 휴대폰 인증 코드 검증 */ + post: operations['verify']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/notice': { + '/api/auth/phone/send': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 학생 별 공지사항 전체 조회 */ - get: operations['getsAll_1']; + get?: never; put?: never; - /** 생성 */ - post: operations['create_7']; + /** 휴대폰 인증 코드 발송 */ + post: operations['send']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/fcm/test': { + '/api/auth/phone/resend': { parameters: { query?: never; header?: never; @@ -1590,69 +1630,103 @@ export interface paths { }; get?: never; put?: never; - /** 특정 토큰으로 FCM 푸시 테스트 발송 */ - post: operations['sendTestPush']; + /** 휴대폰 인증 코드 재발송 */ + post: operations['resend']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/diagnosis': { + '/api/analytics/events': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 학생 진단 가져오기 */ - get: operations['gets_1']; + get?: never; put?: never; - /** 생성 */ - post: operations['create_8']; + /** + * 클라이언트 이벤트 배치 수집 + * @description ## 이벤트 수집 API + * + * 화면 이탈, 버튼 클릭 등 사용자 행동 이벤트를 배치로 수집합니다. + * 비로그인 사용자도 sessionId로 추적됩니다. + * + * ### 전송 규칙 + * - 최대 100개 이벤트까지 한 번에 전송 가능 + * - 10개 이상 쌓이거나 30초마다 전송 권장 + * - 화면 전환/앱 백그라운드 시 즉시 전송 + * + * ### 이벤트 타입별 metadata 규칙 + * + * | eventType | 필수 metadata | 선택 metadata | + * |-----------|--------------|---------------| + * | SESSION_START | - | appVersion, osVersion | + * | SESSION_END | - | sessionDurationMs | + * | SCREEN_ENTER | screenName | previousScreen, params | + * | SCREEN_EXIT | screenName, dwellTimeMs | nextScreen, exitReason | + * | BUTTON_CLICK | buttonId, screenName | buttonLabel | + * | STUDY_START | problemSetId | problemSetTitle, totalProblems | + * | STUDY_END | problemSetId, completedCount, studyDurationMs | correctCount, exitReason | + * | PROBLEM_VIEW | problemId, problemSetId | problemIndex, isRetry | + * | POINTING_VIEW | pointingId, problemId | pointingType | + * + * ### screenName 값 + * `Main`, `StudyList`, `StudyDetail`, `Problem`, `Pointing`, `Scrap`, `ScrapDetail`, `QnA`, `QnAChat`, `Notification`, `Settings`, `Profile` + * + * ### buttonId 값 + * `start_study`, `view_scrap`, `view_qna`, `submit_answer`, `next_problem`, `prev_problem`, `confirm_pointing`, `reject_pointing`, `add_scrap`, `remove_scrap`, `send_message`, `upload_image` + * + * ### exitReason 값 + * - SCREEN_EXIT용: `navigation`, `back`, `background`, `timeout` + * - STUDY_END용: `completed`, `paused`, `abandoned` + */ + post: operations['collectEvents']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/concept': { + '/api/admin/user': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 개념 태그 검색 */ - get: operations['search_5']; + /** 관리자 목록 조회 */ + get: operations['findAll']; put?: never; - /** 개념태그 생성 */ - post: operations['create_9']; + /** 관리자 계정 생성 */ + post: operations['create_2']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/concept/category': { + '/api/admin/teacher': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 대분류 검색 */ - get: operations['searchCategory']; + /** 검색 */ + get: operations['search']; put?: never; - /** 대분류 생성 */ - post: operations['createCategory']; + /** 생성 */ + post: operations['create_3']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/auth/refresh': { + '/api/admin/school/batch': { parameters: { query?: never; header?: never; @@ -1661,566 +1735,592 @@ export interface paths { }; get?: never; put?: never; - /** 토큰 갱신 */ - post: operations['refresh_2']; + /** 학교 정보 업로드 batch */ + post: operations['batch']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/auth/login/local': { + '/api/admin/role': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; + /** 역할 목록 조회 */ + get: operations['findAll_1']; put?: never; - /** 이메일 로그인 */ - post: operations['login_2']; + /** 역할 생성 */ + post: operations['create_4']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/your-redirect-url': { + '/api/admin/qna/chat': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 소셜 로그인 콜백 example */ - get: operations['oauthRedirectExample']; + get?: never; put?: never; - post?: never; + /** 채팅메시지 생성 */ + post: operations['addChat_2']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/json-convert/content': { + '/api/admin/publishes/{publishId}/focus-card-links': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get: operations['content']; + /** 발행의 집중학습 카드 링크 목록 조회 */ + get: operations['list']; put?: never; - post?: never; + /** 발행에 집중학습 카드 링크 추가 */ + post: operations['add']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/json-convert/childProblem-to-Problem': { + '/api/admin/publish': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get: operations['problem']; + /** 검색 */ + get: operations['search_1']; put?: never; - post?: never; + /** 생성 */ + post: operations['create_5']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/study/publish/weekly': { + '/api/admin/problem': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 학생 주간 발행(숙제) 조회 */ - get: operations['search_6']; + /** 검색 */ + get: operations['search_2']; put?: never; - post?: never; + /** 단일 생성 */ + post: operations['createProblem']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/study/publish/monthly': { + '/api/admin/problem/{parentId}/children': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 학생 월간 발행(숙제) 조회 */ - get: operations['searchMonthly']; + /** 자식 문제 목록 조회 */ + get: operations['getChildren']; put?: never; - post?: never; - delete?: never; + /** 자식 문제 추가 */ + post: operations['addChild']; + /** 자식 문제 삭제 */ + delete: operations['removeChildren']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/study/publish/detail/{id}': { + '/api/admin/problem/with-child': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 발행(숙제) 상세 조회 */ - get: operations['getPublishById']; + get?: never; put?: never; - post?: never; + /** 생성(새끼문제, 일반문제 한번에 생성) */ + post: operations['createProblemWithChild']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/study/progress/weekly': { + '/api/admin/problem-set': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 학생 주간 학습 진행 상황 조회 */ - get: operations['getWeeklyProgress']; + /** 검색 */ + get: operations['search_3']; put?: never; - post?: never; + /** 생성 */ + post: operations['create_6']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/study/problem/{publishId}/{problemId}': { + '/api/admin/practice-test': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 문제 상세 조회 */ - get: operations['getProblemById']; + /** 검색 */ + get: operations['search_4']; put?: never; - post?: never; + /** 생성 */ + post: operations['create_7']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/study/child-problem/{publishId}/{problemId}': { + '/api/admin/pointing/bubble/migrate-from-comment': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 새끼 문제 상세 조회 */ - get: operations['getChildProblemById']; + get?: never; put?: never; - post?: never; + /** 기존 commentContentJson을 버블로 분리 마이그레이션 */ + post: operations['migrateFromComment']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/students': { + '/api/admin/ocr': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 내 학생 전체 조회 */ - get: operations['getMyStudents']; + get?: never; put?: never; - post?: never; + post: operations['redirect']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/qna': { + '/api/admin/notification/send': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Q&A 목록 조회 */ - get: operations['gets_2']; + get?: never; put?: never; - post?: never; + /** + * 알림 발송 + * @description isAll=true이면 전체 학생에게 발송, false이면 studentIds에 지정된 학생들에게만 발송 + */ + post: operations['sendNotification']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/qna/{qnaId}': { + '/api/admin/notice': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Q&A 상세 조회 */ - get: operations['getById_2']; + /** 학생 별 공지사항 전체 조회 */ + get: operations['getsAll_1']; put?: never; - post?: never; + /** 생성 */ + post: operations['create_8']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/qna/search': { + '/api/admin/mock-exam/types': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Q&A 검색 (제목/채팅 분리) */ - get: operations['search_7']; + /** 모의고사 타입 전체 조회 */ + get: operations['getAllTypes']; put?: never; - post?: never; + /** 모의고사 타입 생성 */ + post: operations['createType']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/notice/available': { + '/api/admin/menu': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 학생 별 유효 공지사항(현재 학생이 볼 수 있는 공지사항) 조회 */ - get: operations['getsAvailable']; + /** 메뉴 목록 조회 */ + get: operations['findAll_2']; put?: never; - post?: never; + /** 메뉴 추가 */ + post: operations['create_9']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/teacher/me': { + '/api/admin/focus-card': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 내 정보 조회 */ - get: operations['getTeacherMe']; + /** 카드 템플릿 목록 조회 */ + get: operations['list_1']; put?: never; - post?: never; + /** 카드 템플릿 생성 */ + post: operations['create_10']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/study/publish/weekly': { + '/api/admin/focus-card/{id}/content': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 주간 발행(숙제) 조회 */ - get: operations['search_8']; + get?: never; put?: never; - post?: never; + /** 카드 내용 수정 */ + post: operations['editContent']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/study/publish/monthly': { + '/api/admin/focus-card/issuance': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 월간 발행(숙제) 조회 */ - get: operations['searchMonthly_1']; + /** 학생별 발급 이력 조회 (기간 범위) */ + get: operations['issuanceHistory']; put?: never; - post?: never; + /** 학생에게 카드 발급 (Action 단위) */ + post: operations['issue']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/study/publish/detail/{id}': { + '/api/admin/focus-card/auto-issue': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 발행(숙제) 상세 조회 */ - get: operations['getPublishById_1']; + get?: never; put?: never; - post?: never; + /** 한 학생 강제 자동발급 트리거 */ + post: operations['autoIssue']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/study/progress/weekly': { + '/api/admin/fcm/test': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 학생 주간 학습 진행 상황 조회 */ - get: operations['getWeeklyProgress_1']; + get?: never; put?: never; - post?: never; + /** 특정 토큰으로 FCM 푸시 테스트 발송 */ + post: operations['sendTestPush']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/study/problem/{publishId}/{problemId}': { + '/api/admin/diagnosis': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 문제 상세 조회 */ - get: operations['getProblemById_1']; + /** 학생 진단 가져오기 */ + get: operations['gets_1']; put?: never; - post?: never; + /** 생성 */ + post: operations['create_11']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/study/problem/entire/{problemId}': { + '/api/admin/daily-comments': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 문제 그룹 전체 조회 (부모+형제 문제) */ - get: operations['getEntireProblems']; + /** 학생별 특정 일자 데일리 코멘트 조회 */ + get: operations['getByStudentAndDate']; put?: never; - post?: never; + /** 데일리 코멘트 생성 또는 수정 */ + post: operations['upsert']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/study/pointing/entire/{problemId}': { + '/api/admin/concept': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 문제의 전체 포인팅 조회 (부모+새끼문제) */ - get: operations['getEntirePointings']; + /** 개념 태그 검색 */ + get: operations['search_5']; put?: never; - post?: never; + /** 개념태그 생성 */ + post: operations['create_12']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap/{id}': { + '/api/admin/concept/graph/node': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 스크랩 상세 조회 */ - get: operations['getScrap']; + /** 노드 목록 조회 */ + get: operations['getNodes']; put?: never; - post?: never; + /** 노드 생성 */ + post: operations['createNode']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap/trash': { + '/api/admin/concept/graph/node-type': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 휴지통 목록 조회 */ - get: operations['getTrash']; + /** 노드 타입 목록 조회 */ + get: operations['getNodeTypes']; put?: never; - post?: never; - /** 휴지통 영구 삭제 (폴더/스크랩 혼합 배치) */ - delete: operations['permanentDelete']; + /** 노드 타입 생성 */ + post: operations['createNodeType']; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap/search': { + '/api/admin/concept/graph/edge': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 검색 (폴더 + 스크랩 각각 반환) */ - get: operations['searchScraps']; + /** 엣지 목록 조회 */ + get: operations['getEdges']; put?: never; - post?: never; + /** 엣지 생성 */ + post: operations['createEdge']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap/folder/{folderId}/scraps': { + '/api/admin/concept/graph/edge-type': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 폴더 내 스크랩 목록 조회 */ - get: operations['getScrapsByFolder']; + /** 엣지 타입 목록 조회 */ + get: operations['getEdgeTypes']; put?: never; - post?: never; + /** 엣지 타입 생성 */ + post: operations['createEdgeType']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/scrap/by-problem/{problemId}': { + '/api/admin/concept/graph/action-edge': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 문제별 스크랩 정보 조회 */ - get: operations['getScrapInfoByProblem']; + /** 액션 엣지 목록 조회 */ + get: operations['getActionEdges']; put?: never; - post?: never; + /** 액션 엣지 생성 */ + post: operations['createActionEdge']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/school': { + '/api/admin/concept/graph/action-edge-type': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 검색 (유사도 상위순 7개 반환) */ - get: operations['search_9']; + /** 액션 엣지 타입 목록 조회 */ + get: operations['getActionEdgeTypes']; put?: never; - post?: never; + /** 액션 엣지 타입 생성 */ + post: operations['createActionEdgeType']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/qna/{qnaId}/files': { + '/api/admin/concept/category': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Q&A 전체 이미지 조회 (질문 + 채팅) */ - get: operations['getFiles']; + /** 대분류 검색 */ + get: operations['searchCategory']; put?: never; - post?: never; + /** 대분류 생성 */ + post: operations['createCategory']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/qna/search': { + '/api/admin/auth/refresh': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Q&A 검색 (제목/채팅 분리) */ - get: operations['search_10']; + get?: never; put?: never; - post?: never; + /** 토큰 갱신 */ + post: operations['refresh_2']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/qna/files': { + '/api/admin/auth/login/local': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 내가 참여한 모든 Q&A 이미지 조회 */ - get: operations['getAllFiles']; + get?: never; put?: never; - post?: never; + /** 이메일 로그인 */ + post: operations['login_2']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/student/qna/admin-chat': { + '/your-redirect-url': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 출제진 채팅방 조회/생성 */ - get: operations['getOrCreateAdminChatroom']; + /** 소셜 로그인 콜백 example */ + get: operations['oauthRedirectExample']; put?: never; post?: never; delete?: never; @@ -2229,18 +2329,14 @@ export interface paths { patch?: never; trace?: never; }; - '/api/student/notification': { + '/json-convert/content': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 알림 목록 조회 - * @description dayLimit 파라미터로 특정 기간 내 알림만 조회 가능 - */ - get: operations['getNotifications']; + get: operations['content']; put?: never; post?: never; delete?: never; @@ -2249,15 +2345,14 @@ export interface paths { patch?: never; trace?: never; }; - '/api/student/notification/count': { + '/json-convert/childProblem-to-Problem': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 읽지 않은 알림 개수 조회 */ - get: operations['countUnread']; + get: operations['problem']; put?: never; post?: never; delete?: never; @@ -2266,15 +2361,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/student/notice': { + '/api/teacher/study/publish/weekly': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 공지사항 목록 조회 */ - get: operations['getsAvailable_1']; + /** 학생 주간 발행(숙제) 조회 */ + get: operations['search_6']; put?: never; post?: never; delete?: never; @@ -2283,15 +2378,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/student/notice/count': { + '/api/teacher/study/publish/monthly': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 읽지 않은 공지사항 개수 조회 */ - get: operations['countAvailable']; + /** 학생 월간 발행(숙제) 조회 */ + get: operations['searchMonthly']; put?: never; post?: never; delete?: never; @@ -2300,15 +2395,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/student/diagnosis': { + '/api/teacher/study/publish/detail/{id}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 내 진단 리스트 가져오기 */ - get: operations['gets_3']; + /** 발행(숙제) 상세 조회 */ + get: operations['getPublishById']; put?: never; post?: never; delete?: never; @@ -2317,15 +2412,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/student/diagnosis/last': { + '/api/teacher/study/progress/weekly': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 내 최신 진단 가져오기 */ - get: operations['getById_3']; + /** 학생 주간 학습 진행 상황 조회 */ + get: operations['getWeeklyProgress']; put?: never; post?: never; delete?: never; @@ -2334,15 +2429,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/student/diagnosis/detail/{id}': { + '/api/teacher/study/problem/{publishId}/{problemId}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 학생 진단 상세보기 */ - get: operations['getById_4']; + /** 문제 상세 조회 */ + get: operations['getProblemById']; put?: never; post?: never; delete?: never; @@ -2351,15 +2446,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/student/auth/email/exists': { + '/api/teacher/study/child-problem/{publishId}/{problemId}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** [학생] 이메일 중복확인 */ - get: operations['existsByEmail']; + /** 새끼 문제 상세 조회 */ + get: operations['getChildProblemById']; put?: never; post?: never; delete?: never; @@ -2368,25 +2463,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/qna/{qnaId}/subscribe': { + '/api/teacher/students': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * Q&A 채팅 SSE 구독 - * @description 클라이언트에서 SSE로 채팅/읽음 이벤트를 구독합니다. - * - * - 요청 예: GET /api/qna/{qnaId}/subscribe?token={accessToken} - * - 응답 Content-Type: text/event-stream - * - 이벤트 이름: - * - chat: 채팅 생성/수정/삭제 (QnAChatEvent 스키마 참조) - * - read_status: 읽음 상태 변경 (QnAReadStatusEvent 스키마 참조) - * - heartbeat: 초기 연결 확인 - */ - get: operations['subscribe']; + /** 내 학생 전체 조회 */ + get: operations['getMyStudents']; put?: never; post?: never; delete?: never; @@ -2395,24 +2480,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/qna/student/subscribe': { + '/api/teacher/qna': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 학생 QnA 리스트 SSE 구독 - * @description 학생의 모든 QnA에 대한 변경 알림을 SSE로 수신합니다. - * - * - 요청 예: GET /api/qna/student/subscribe?token={accessToken} - * - 응답 Content-Type: text/event-stream - * - 이벤트 이름: - * - qna_list: QnA 리스트 변경 (QnAListEvent 스키마 참조) - * - heartbeat: 연결 유지 - */ - get: operations['subscribeStudentQnaList']; + /** Q&A 목록 조회 */ + get: operations['gets_2']; put?: never; post?: never; delete?: never; @@ -2421,14 +2497,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/exception/throw': { + '/api/teacher/qna/{qnaId}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get: operations['throwException']; + /** Q&A 상세 조회 */ + get: operations['getById_2']; put?: never; post?: never; delete?: never; @@ -2437,15 +2514,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/common/auth/refresh': { + '/api/teacher/qna/search': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 토큰 갱신 */ - get: operations['refresh_3']; + /** Q&A 검색 (제목/채팅 분리) */ + get: operations['search_7']; put?: never; post?: never; delete?: never; @@ -2454,15 +2531,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/admin/student': { + '/api/teacher/notice/available': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 검색 */ - get: operations['search_11']; + /** 학생 별 유효 공지사항(현재 학생이 볼 수 있는 공지사항) 조회 */ + get: operations['getsAvailable']; put?: never; post?: never; delete?: never; @@ -2471,15 +2548,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/admin/qna': { + '/api/teacher/me': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 출제진 채팅방 목록 조회 */ - get: operations['gets_4']; + /** 내 정보 조회 */ + get: operations['getTeacherMe']; put?: never; post?: never; delete?: never; @@ -2488,15 +2565,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/admin/qna/{qnaId}': { + '/api/student/study/publish/weekly': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 출제진 채팅방 상세 조회 */ - get: operations['getById_5']; + /** 주간 발행(숙제) 조회 */ + get: operations['search_8']; put?: never; post?: never; delete?: never; @@ -2505,33 +2582,32 @@ export interface paths { patch?: never; trace?: never; }; - '/api/admin/publish/{id}': { + '/api/student/study/publish/monthly': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 상세 조회 */ - get: operations['getById_6']; + /** 월간 발행(숙제) 조회 */ + get: operations['searchMonthly_1']; put?: never; post?: never; - /** 삭제 */ - delete: operations['delete_7']; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/problem/custom-id/generate': { + '/api/student/study/publish/detail/{id}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** unique customId 받기 */ - get: operations['getCustomId']; + /** 발행(숙제) 상세 조회 */ + get: operations['getPublishById_1']; put?: never; post?: never; delete?: never; @@ -2540,15 +2616,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/admin/notification': { + '/api/student/study/progress/weekly': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 특정 학생의 알림 목록 조회 */ - get: operations['getNotificationsByStudent']; + /** 학생 주간 학습 진행 상황 조회 */ + get: operations['getWeeklyProgress_1']; put?: never; post?: never; delete?: never; @@ -2557,15 +2633,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/admin/notice/available': { + '/api/student/study/problem/{publishId}/{problemId}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 학생 별 유효 공지사항(현재 학생이 볼 수 있는 공지사항) 조회 */ - get: operations['getsAvailable_2']; + /** 문제 상세 조회 */ + get: operations['getProblemById_1']; put?: never; post?: never; delete?: never; @@ -2574,15 +2650,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/admin/fcm/status': { + '/api/student/study/problem/{publishId}/{problemId}/handwriting/snapshot/{type}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** FCM 초기화 상태 확인 */ - get: operations['getStatus']; + /** 필기 스냅샷 단건 조회 */ + get: operations['getSnapshot']; put?: never; post?: never; delete?: never; @@ -2591,14 +2667,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/admin/auth/issue-admin-token': { + '/api/student/study/problem/entire/{problemId}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get: operations['issueTemporaryToken']; + /** 문제 그룹 전체 조회 (부모+형제 문제) */ + get: operations['getEntireProblems']; put?: never; post?: never; delete?: never; @@ -2607,18 +2684,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/admin/analytics/first-feature-stats': { + '/api/student/study/pointing/entire/{problemId}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 디바이스별 첫 기능 사용 통계 조회 - * @description 디바이스 타입별로 가장 먼저 사용하는 기능 통계를 조회합니다 - */ - get: operations['getFirstFeatureStats']; + /** 문제의 전체 포인팅 조회 (부모+새끼문제) */ + get: operations['getEntirePointings']; put?: never; post?: never; delete?: never; @@ -2627,18 +2701,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/admin/analytics/daily-solve-count/{studentId}': { + '/api/student/scrap/{id}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 일별 문제 풀이 수 조회 - * @description 특정 학생의 일별 문제 풀이 수와 평균/표준편차를 조회합니다 - */ - get: operations['getDailySolveCount']; + /** 스크랩 상세 조회 */ + get: operations['getScrap']; put?: never; post?: never; delete?: never; @@ -2647,38 +2718,33 @@ export interface paths { patch?: never; trace?: never; }; - '/api/admin/analytics/concept-history/{studentId}': { + '/api/student/scrap/trash': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 개념태그별 정답/오답 히스토리 조회 - * @description 학생의 개념태그별 정답률과 취약점을 조회합니다 - */ - get: operations['getConceptHistory']; + /** 휴지통 목록 조회 */ + get: operations['getTrash']; put?: never; post?: never; - delete?: never; + /** 휴지통 영구 삭제 (폴더/스크랩 혼합 배치) */ + delete: operations['permanentDelete']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/analytics/completion-rate/{problemSetId}': { + '/api/student/scrap/search': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 세트별 완료율 조회 - * @description 문제 세트별 학생들의 완료율을 조회합니다 - */ - get: operations['getCompletionRate']; + /** 검색 (폴더 + 스크랩 각각 반환) */ + get: operations['searchScraps']; put?: never; post?: never; delete?: never; @@ -2687,18 +2753,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/admin/analytics/access-stats': { + '/api/student/scrap/folder/{folderId}/scraps': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 접속 통계 조회 - * @description 날짜별/요일별 서비스 접속 통계를 조회합니다 - */ - get: operations['getAccessStats']; + /** 폴더 내 스크랩 목록 조회 */ + get: operations['getScrapsByFolder']; put?: never; post?: never; delete?: never; @@ -2707,327 +2770,3098 @@ export interface paths { patch?: never; trace?: never; }; - '/api/student/scrap/trash/all': { + '/api/student/scrap/by-problem/{problemId}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; + /** 문제별 스크랩 정보 조회 */ + get: operations['getScrapInfoByProblem']; put?: never; post?: never; - /** 휴지통 비우기 */ - delete: operations['emptyTrash']; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/common/upload-file/{id}': { + '/api/student/school': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; + /** 검색 (유사도 상위순 7개 반환) */ + get: operations['search_9']; put?: never; post?: never; - /** 삭제 */ - delete: operations['delete_8']; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/teacher/{teacherId}': { + '/api/student/qna/{qnaId}/files': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; + /** Q&A 전체 이미지 조회 (질문 + 채팅) */ + get: operations['getFiles']; put?: never; post?: never; - /** 선생님 삭제 */ - delete: operations['delete_9']; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/admin/problem-set/{id}/{problemId}': { + '/api/student/qna/search': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; + /** Q&A 검색 (제목/채팅 분리) */ + get: operations['search_10']; put?: never; post?: never; - /** 문제 세트에서 문제 삭제 */ - delete: operations['deleteItem']; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; -} -export type webhooks = Record; -export interface components { - schemas: { - QnAStatusUpdateDTO: { - /** - * @description Q&A 상태 - * @example QUESTIONING - * @enum {string} - */ - status: 'QUESTIONING' | 'RESOLVED' | 'QUESTIONING' | 'RESOLVED'; - }; - ChatResp: { - /** Format: int64 */ - id: number; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - isMine: boolean; - content: string; - files: components['schemas']['UploadFileResp'][]; - /** - * Format: int64 - * @description 답장 대상 채팅 ID - */ - replyToId?: number; - /** @description 답장 대상 채팅 내용 미리보기 */ - replyToContent?: string; + '/api/student/qna/files': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - QnAMetaResp: { - /** Format: int64 */ - id: number; - title: string; - /** @enum {string} */ - type: - | 'PROBLEM_CONTENT' - | 'PROBLEM_POINTING_QUESTION' - | 'PROBLEM_POINTING_COMMENT' - | 'PROBLEM_MAIN_ANALYSIS' - | 'PROBLEM_MAIN_HAND_ANALYSIS' - | 'PROBLEM_READING_TIP_CONTENT' - | 'PROBLEM_ONE_STEP_MORE' - | 'CHILD_PROBLEM_CONTENT' - | 'CHILD_PROBLEM_POINTING_QUESTION' - | 'CHILD_PROBLEM_POINTING_COMMENT' - | 'ADMIN_CHAT'; - /** @enum {string} */ - status: 'QUESTIONING' | 'RESOLVED'; - /** Format: date */ - publishDate: string; - /** Format: int64 */ - publishId?: number; - /** Format: int32 */ - unreadCount?: number; - studentName?: string; - /** - * Format: date-time - * @description 최신 메시지 시간 - */ - latestMessageTime?: string; - /** @description 최신 메시지 내용 미리보기 */ - latestMessageContent?: string; + /** 내가 참여한 모든 Q&A 이미지 조회 */ + get: operations['getAllFiles']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/qna/admin-chat': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - QnAResp: { - /** Format: int64 */ - id: number; - title: string; - /** @enum {string} */ - type: - | 'PROBLEM_CONTENT' - | 'PROBLEM_POINTING_QUESTION' - | 'PROBLEM_POINTING_COMMENT' - | 'PROBLEM_MAIN_ANALYSIS' - | 'PROBLEM_MAIN_HAND_ANALYSIS' - | 'PROBLEM_READING_TIP_CONTENT' - | 'PROBLEM_ONE_STEP_MORE' - | 'CHILD_PROBLEM_CONTENT' - | 'CHILD_PROBLEM_POINTING_QUESTION' - | 'CHILD_PROBLEM_POINTING_COMMENT' - | 'ADMIN_CHAT'; - /** @enum {string} */ - status: 'QUESTIONING' | 'RESOLVED'; - /** Format: date */ - publishDate: string; - /** Format: int64 */ - publishId?: number; - /** Format: int32 */ - unreadCount?: number; - studentName?: string; - /** - * Format: date-time - * @description 최신 메시지 시간 - */ - latestMessageTime?: string; - /** @description 최신 메시지 내용 미리보기 */ - latestMessageContent?: string; - contentTitle: string; - content: string; - question: string; - files: components['schemas']['UploadFileResp'][]; - /** Format: int64 */ - problemId?: number; - chats: components['schemas']['ChatResp'][]; + /** 출제진 채팅방 조회/생성 */ + get: operations['getOrCreateAdminChatroom']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/notification': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - UploadFileResp: { - /** Format: int64 */ - id: number; - fileName: string; - url: string; - /** @enum {string} */ - fileType: 'IMAGE' | 'DOCUMENT' | 'OTHER'; + /** + * 알림 목록 조회 + * @description dayLimit 파라미터로 특정 기간 내 알림만 조회 가능 + */ + get: operations['getNotifications']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/notification/count': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - ChatUpdateRequest: { - content: string; - files?: number[]; + /** 읽지 않은 알림 개수 조회 */ + get: operations['countUnread']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/notice': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - NoticeUpdateRequest: { - title: string; - /** Format: date */ - startAt: string; - /** Format: date */ - endAt: string; - content: string; + /** 공지사항 목록 조회 */ + get: operations['getsAvailable_1']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/notice/count': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 읽지 않은 공지사항 개수 조회 */ + get: operations['countAvailable']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/mock-exam/current-type': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 현재 활성 모의고사 타입 조회 */ + get: operations['getCurrentType']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/focus-card': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 특정 날짜에 발급된 집중학습 카드 조회 (date 미지정 시 오늘) */ + get: operations['getCards']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/diagnosis': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 내 진단 리스트 가져오기 */ + get: operations['gets_3']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/diagnosis/last': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 내 최신 진단 가져오기 */ + get: operations['getById_3']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/diagnosis/detail/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 학생 진단 상세보기 */ + get: operations['getById_4']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/daily-comments': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 특정 일자 데일리 코멘트 조회 */ + get: operations['getByDate']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/auth/email/exists': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** [학생] 이메일 중복확인 */ + get: operations['existsByEmail']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/qna/{qnaId}/subscribe': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Q&A 채팅 SSE 구독 + * @description 클라이언트에서 SSE로 채팅/읽음 이벤트를 구독합니다. + * + * - 요청 예: GET /api/qna/{qnaId}/subscribe?token={accessToken} + * - 응답 Content-Type: text/event-stream + * - 이벤트 이름: + * - chat: 채팅 생성/수정/삭제 (QnAChatEvent 스키마 참조) + * - read_status: 읽음 상태 변경 (QnAReadStatusEvent 스키마 참조) + * - heartbeat: 초기 연결 확인 + */ + get: operations['subscribe']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/qna/student/subscribe': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 학생 QnA 리스트 SSE 구독 + * @description 학생의 모든 QnA에 대한 변경 알림을 SSE로 수신합니다. + * + * - 요청 예: GET /api/qna/student/subscribe?token={accessToken} + * - 응답 Content-Type: text/event-stream + * - 이벤트 이름: + * - qna_list: QnA 리스트 변경 (QnAListEvent 스키마 참조) + * - heartbeat: 연결 유지 + */ + get: operations['subscribeStudentQnaList']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/common/auth/refresh': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 토큰 갱신 */ + get: operations['refresh_3']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/student': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 검색 */ + get: operations['search_11']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/qna': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 출제진 채팅방 목록 조회 */ + get: operations['gets_4']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/qna/{qnaId}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 출제진 채팅방 상세 조회 */ + get: operations['getById_5']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/publish/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 상세 조회 */ + get: operations['getById_6']; + put?: never; + post?: never; + /** 삭제 */ + delete: operations['delete_11']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/problem/custom-id/generate': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** unique customId 받기 */ + get: operations['getCustomId']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/notification': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 특정 학생의 알림 목록 조회 */ + get: operations['getNotificationsByStudent']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/notice/available': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 학생 별 유효 공지사항(현재 학생이 볼 수 있는 공지사항) 조회 */ + get: operations['getsAvailable_2']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/mock-exam': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 학생별 모의고사 정오답/학습 고민 조회 */ + get: operations['getByStudent']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/focus-card/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 카드 단건 조회 */ + get: operations['get']; + put?: never; + post?: never; + /** 카드 삭제 */ + delete: operations['delete_12']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/focus-card/issuance/by-date': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 학생의 특정 일자 발급 카드 조회 (발행 생성 시 카드 선택용) */ + get: operations['issuanceByDate']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/fcm/status': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** FCM 초기화 상태 확인 */ + get: operations['getStatus']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/concept/graph/sheet/node': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 노드 시트 조회 (페이징/정렬/필터) */ + get: operations['getNodeSheet']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/concept/graph/sheet/edge': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 엣지 시트 조회 (페이징/정렬/필터) */ + get: operations['getEdgeSheet']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/concept/graph/sheet/action-edge': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 액션 그래프 시트 조회 (pivot) */ + get: operations['getActionGraphSheet']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/auth/issue-admin-token': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations['issueTemporaryToken']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/analytics/first-feature-stats': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 디바이스별 첫 기능 사용 통계 조회 + * @description 디바이스 타입별로 가장 먼저 사용하는 기능 통계를 조회합니다 + */ + get: operations['getFirstFeatureStats']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/analytics/daily-solve-count/{studentId}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 일별 문제 풀이 수 조회 + * @description 특정 학생의 일별 문제 풀이 수와 평균/표준편차를 조회합니다 + */ + get: operations['getDailySolveCount']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/analytics/concept-history/{studentId}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 개념태그별 정답/오답 히스토리 조회 + * @description 학생의 개념태그별 정답률과 취약점을 조회합니다 + */ + get: operations['getConceptHistory']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/analytics/completion-rate/{problemSetId}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 세트별 완료율 조회 + * @description 문제 세트별 학생들의 완료율을 조회합니다 + */ + get: operations['getCompletionRate']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/analytics/access-stats': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * 접속 통계 조회 + * @description 날짜별/요일별 서비스 접속 통계를 조회합니다 + */ + get: operations['getAccessStats']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/scrap/trash/all': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** 휴지통 비우기 */ + delete: operations['emptyTrash']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/common/upload-file/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** 삭제 */ + delete: operations['delete_13']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/teacher/{teacherId}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** 선생님 삭제 */ + delete: operations['delete_14']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/publish-focus-card-links/{linkId}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** 집중학습 카드 링크 삭제 */ + delete: operations['remove']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/problem-set/{id}/{problemId}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** 문제 세트에서 문제 삭제 */ + delete: operations['deleteItem']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/focus-card/issuance/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** 발급 취소 */ + delete: operations['revokeIssuance']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + QnAStatusUpdateDTO: { + /** + * @description Q&A 상태 + * @example QUESTIONING + * @enum {string} + */ + status: 'QUESTIONING' | 'RESOLVED' | 'QUESTIONING' | 'RESOLVED'; + }; + ChatResp: { + /** Format: int64 */ + id: number; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + isMine: boolean; + content: string; + files: components['schemas']['UploadFileResp'][]; + /** + * Format: int64 + * @description 답장 대상 채팅 ID + */ + replyToId?: number; + /** @description 답장 대상 채팅 내용 미리보기 */ + replyToContent?: string; + }; + QnAMetaResp: { + /** Format: int64 */ + id: number; + title: string; + /** @enum {string} */ + type: + | 'PROBLEM_CONTENT' + | 'PROBLEM_POINTING_QUESTION' + | 'PROBLEM_POINTING_COMMENT' + | 'PROBLEM_MAIN_ANALYSIS' + | 'PROBLEM_MAIN_HAND_ANALYSIS' + | 'PROBLEM_READING_TIP_CONTENT' + | 'PROBLEM_ONE_STEP_MORE' + | 'CHILD_PROBLEM_CONTENT' + | 'CHILD_PROBLEM_POINTING_QUESTION' + | 'CHILD_PROBLEM_POINTING_COMMENT' + | 'ADMIN_CHAT'; + /** @enum {string} */ + status: 'QUESTIONING' | 'RESOLVED'; + /** Format: date */ + publishDate: string; + /** Format: int64 */ + publishId?: number; + /** Format: int32 */ + unreadCount?: number; + studentName?: string; + /** + * Format: date-time + * @description 최신 메시지 시간 + */ + latestMessageTime?: string; + /** @description 최신 메시지 내용 미리보기 */ + latestMessageContent?: string; + }; + QnAResp: { + /** Format: int64 */ + id: number; + title: string; + /** @enum {string} */ + type: + | 'PROBLEM_CONTENT' + | 'PROBLEM_POINTING_QUESTION' + | 'PROBLEM_POINTING_COMMENT' + | 'PROBLEM_MAIN_ANALYSIS' + | 'PROBLEM_MAIN_HAND_ANALYSIS' + | 'PROBLEM_READING_TIP_CONTENT' + | 'PROBLEM_ONE_STEP_MORE' + | 'CHILD_PROBLEM_CONTENT' + | 'CHILD_PROBLEM_POINTING_QUESTION' + | 'CHILD_PROBLEM_POINTING_COMMENT' + | 'ADMIN_CHAT'; + /** @enum {string} */ + status: 'QUESTIONING' | 'RESOLVED'; + /** Format: date */ + publishDate: string; + /** Format: int64 */ + publishId?: number; + /** Format: int32 */ + unreadCount?: number; + studentName?: string; + /** + * Format: date-time + * @description 최신 메시지 시간 + */ + latestMessageTime?: string; + /** @description 최신 메시지 내용 미리보기 */ + latestMessageContent?: string; + contentTitle: string; + content: string; + question: string; + files: components['schemas']['UploadFileResp'][]; + /** Format: int64 */ + problemId?: number; + chats: components['schemas']['ChatResp'][]; + }; + UploadFileResp: { + /** Format: int64 */ + id: number; + fileName: string; + url: string; + /** @enum {string} */ + fileType: 'IMAGE' | 'DOCUMENT' | 'OTHER'; + }; + ChatUpdateRequest: { + content: string; + files?: number[]; + }; + NoticeUpdateRequest: { + title: string; + /** Format: date */ + startAt: string; + /** Format: date */ + endAt: string; + content: string; + }; + NoticeResp: { + /** Format: int64 */ + id: number; + student: components['schemas']['StudentResp']; + title: string; + /** Format: date */ + startAt: string; + /** Format: date */ + endAt: string; + isRead: boolean; + content: string; + }; + SchoolResp: { + /** Format: int64 */ + id: number; + name?: string; + sido?: string; + }; + StudentResp: { + /** Format: int64 */ + id: number; + isGteFourteen?: boolean; + isAgreeServiceUsage?: boolean; + isAgreePersonalInformation?: boolean; + isAgreeReceiveMarketing?: boolean; + /** Format: date-time */ + agreeAt?: string; + email: string; + name: string; + /** Format: date */ + birth?: string; + /** @enum {string} */ + gender?: 'MALE' | 'FEMALE'; + phoneNumber?: string; + /** @enum {string} */ + mobileCarrier?: 'KT' | 'SKT' | 'LG' | 'KT_MVNO' | 'SKT_MVNO' | 'LG_MVNO'; + /** Format: date-time */ + phoneNumberVerifiedAt?: string; + /** @enum {string} */ + grade: 'ONE' | 'TWO' | 'THREE' | 'N_TIME'; + /** @enum {string} */ + selectSubject?: 'MIJUKBUN' | 'HWAKTONG' | 'KEEHA'; + school?: components['schemas']['SchoolResp']; + /** Format: int32 */ + level?: number; + nickname?: string; + isAllowPush?: boolean; + /** @enum {string} */ + provider?: 'KAKAO' | 'GOOGLE' | 'APPLE'; + isFirstLogin: boolean; + /** Format: int64 */ + teacherId?: number; + teacherName?: string; + }; + 'TeacherPushDTO.UpdateSettingsRequest': { + /** @description 전체 푸시 알림 허용 여부 (마스터 토글) */ + isAllowPush?: boolean; + /** @description 서비스 알림 허용 여부 (학습 안내, 문장 등록 안내 등) */ + isAllowServicePush?: boolean; + /** @description QnA 채팅 알림 허용 여부 (출제진 피드백, 선생님 답변 알림 등) */ + isAllowQnaPush?: boolean; + /** @description 마케팅 알림 허용 여부 (이벤트 및 업데이트 관련 알림) */ + isAllowMarketingPush?: boolean; + }; + 'TeacherPushDTO.SettingsResponse': { + /** @description 전체 푸시 알림 허용 여부 (마스터 토글) */ + isAllowPush?: boolean; + /** @description 서비스 알림 허용 여부 (학습 안내, 문장 등록 안내 등) */ + isAllowServicePush?: boolean; + /** @description QnA 채팅 알림 허용 여부 (출제진 피드백, 선생님 답변 알림 등) */ + isAllowQnaPush?: boolean; + /** @description 마케팅 알림 허용 여부 (이벤트 및 업데이트 관련 알림) */ + isAllowMarketingPush?: boolean; + }; + StudyHandwritingUpdateRequest: { + /** @description 필기 데이터 (Base64 인코딩) */ + data?: string; + /** @description 필기 데이터 (JSON) */ + dataJson?: string; + }; + /** @description 학습 필기 데이터 응답 */ + StudyHandwritingResp: { + /** + * Format: int64 + * @description 발행 ID + */ + publishId: number; + /** + * Format: int64 + * @description 문제 ID + */ + problemId: number; + /** @description 필기 데이터 (Base64 인코딩) */ + data?: string; + /** @description 필기 데이터 (JSON) */ + dataJson?: string; + /** + * Format: date-time + * @description 필기 데이터 수정일시 (필기 없으면 null) + */ + updatedAt?: string; + }; + ScrapUpdateRequest: { + /** + * Format: int64 + * @description 폴더 ID (null이면 루트로 이동) + * @example 1 + */ + folderId?: number; + /** + * Format: int64 + * @description 썸네일 이미지 ID + * @example 456 + */ + thumbnailImageId?: number; + /** + * @description 텍스트 메모 + * @example 수정된 메모 내용 + */ + textBox?: string; + }; + ConceptCategoryResp: { + /** Format: int64 */ + id: number; + name: string; + }; + ConceptResp: { + /** Format: int64 */ + id: number; + name: string; + category: components['schemas']['ConceptCategoryResp']; + }; + PointingBubbleResp: { + /** Format: int64 */ + id: number; + /** Format: int32 */ + no: number; + contentJson: string; + extendContent?: string; + /** Format: int64 */ + actionNodeId?: number; + actionNodeName?: string; + /** @description ? 버튼 눌렀는지 여부 (학생 컨텍스트에서만 설정됨) */ + isQuestionPressed?: boolean; + }; + /** @description 포인팅 목록 */ + PointingResp: { + /** Format: int64 */ + id: number; + /** Format: int32 */ + no: number; + questionContent: string; + commentContent: string; + bubbles?: components['schemas']['PointingBubbleResp'][]; + concepts: components['schemas']['ConceptResp'][]; + }; + PracticeTestResp: { + /** Format: int64 */ + id: number; + /** Format: int32 */ + year: number; + /** Format: int32 */ + month: number; + /** Format: int32 */ + grade: number; + name: string; + displayName: string; + }; + /** @description 문제 정보 */ + ProblemExtendResp: { + /** Format: int64 */ + id: number; + /** @enum {string} */ + problemType: 'MAIN_PROBLEM' | 'CHILD_PROBLEM'; + /** Format: int64 */ + parentProblem?: number; + parentProblemTitle?: string; + customId: string; + /** @enum {string} */ + createType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; + practiceTest: components['schemas']['PracticeTestResp']; + /** Format: int32 */ + practiceTestNo: number; + problemContent: string; + title: string; + /** @enum {string} */ + answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; + /** Format: int32 */ + answer: number; + /** Format: int32 */ + difficulty: number; + /** Format: int32 */ + recommendedTimeSec: number; + memo: string; + concepts: components['schemas']['ConceptResp'][]; + mainAnalysisImage: components['schemas']['UploadFileResp']; + mainHandAnalysisImage: components['schemas']['UploadFileResp']; + readingTipContent: string; + oneStepMoreContent: string; + }; + ProblemMetaResp: { + /** Format: int64 */ + id: number; + /** @enum {string} */ + problemType: 'MAIN_PROBLEM' | 'CHILD_PROBLEM'; + /** Format: int64 */ + parentProblem?: number; + parentProblemTitle?: string; + customId: string; + /** @enum {string} */ + createType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; + practiceTest: components['schemas']['PracticeTestResp']; + /** Format: int32 */ + practiceTestNo: number; + problemContent: string; + title: string; + /** @enum {string} */ + answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; + /** Format: int32 */ + answer: number; + /** Format: int32 */ + difficulty: number; + /** Format: int32 */ + recommendedTimeSec: number; + memo: string; + concepts: components['schemas']['ConceptResp'][]; + }; + /** @description 스크랩 상세 정보 */ + ScrapDetailResp: { + /** + * Format: int64 + * @description 스크랩 ID + */ + id: number; + folder?: components['schemas']['ScrapFolderResp']; + problem?: components['schemas']['ProblemExtendResp']; + /** @description 썸네일 URL */ + thumbnailUrl?: string; + /** @description 스크랩 이름 */ + name?: string; + /** @description 텍스트 메모 */ + textBox?: string; + /** @description 포인팅 목록 */ + pointings: components['schemas']['PointingResp'][]; + /** @description 리딩팁 스크랩 여부 */ + isReadingTipScrapped: boolean; + /** @description 원스텝모어 스크랩 여부 */ + isOneStepMoreScrapped: boolean; + /** @description 오답 스크랩 여부 */ + isWrongAnswer: boolean; + /** @description 필기 데이터 존재 여부 */ + hasHandwriting: boolean; + /** + * Format: date-time + * @description 생성일시 + */ + createdAt: string; + /** + * Format: date-time + * @description 수정일시 + */ + updatedAt: string; + }; + /** @description 스크랩 폴더 응답 */ + ScrapFolderResp: { + /** + * Format: int64 + * @description 폴더 ID + */ + id: number; + /** @description 폴더 이름 */ + name: string; + /** + * Format: int64 + * @description 폴더 내 스크랩 개수 + */ + scrapCount: number; + /** @description 썸네일 이미지 URL */ + thumbnailUrl?: string; + /** @description 최근 스크랩 2개의 썸네일 URL (최신순) */ + top2ScrapThumbnail?: string[]; + /** + * Format: date-time + * @description 생성일시 + */ + createdAt: string; + /** + * Format: date-time + * @description 수정일시 + */ + updatedAt: string; + }; + ScrapThumbnailUpdateRequest: { + /** + * Format: int64 + * @description 썸네일 이미지 ID (null이면 썸네일 삭제) + */ + thumbnailImageId?: number; + }; + ScrapTextBoxUpdateRequest: { + /** + * @description 텍스트 메모 + * @example 메모 수정 + */ + textBox?: string; + }; + ScrapNameUpdateRequest: { + /** + * @description 스크랩 이름 + * @example 미적분 정리 + */ + name?: string; + }; + ScrapHandwritingUpdateRequest: { + /** @description 필기 데이터 (Base64 인코딩) */ + data?: string; + /** @description 필기 데이터 (JSON) */ + dataJson?: string; + }; + /** @description 필기 데이터 응답 */ + ScrapHandwritingResp: { + /** + * Format: int64 + * @description 스크랩 ID + */ + scrapId: number; + /** @description 필기 데이터 (Base64 인코딩) */ + data?: string; + /** @description 필기 데이터 (JSON) */ + dataJson?: string; + /** + * Format: date-time + * @description 필기 데이터 수정일시 (필기 없으면 null) + */ + updatedAt?: string; + }; + /** @description 복원할 항목 목록 (폴더/스크랩 혼합) */ + Item: { + /** + * Format: int64 + * @description 항목 ID + * @example 1 + */ + id: number; + /** + * @description 항목 타입 (FOLDER/SCRAP) + * @example FOLDER + * @enum {string} + */ + type: 'FOLDER' | 'SCRAP'; + }; + ScrapBatchRestoreRequest: { + /** @description 복원할 항목 목록 (폴더/스크랩 혼합) */ + items: components['schemas']['Item'][]; + }; + ScrapBatchMoveRequest: { + /** @description 이동할 스크랩 ID 목록 */ + scrapIds: number[]; + /** + * Format: int64 + * @description 대상 폴더 ID (null이면 루트로 이동) + * @example 2 + */ + targetFolderId?: number; + }; + ListRespScrapDetailResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['ScrapDetailResp'][]; + }; + ScrapFolderUpdateRequest: { + /** + * @description 폴더 이름 + * @example 기하 오답노트 + */ + name: string; + /** + * Format: int64 + * @description 썸네일 이미지 ID + */ + thumbnailImageId?: number; + }; + ScrapFolderThumbnailUpdateRequest: { + /** + * Format: int64 + * @description 썸네일 이미지 ID (null이면 썸네일 삭제) + */ + thumbnailImageId?: number; + }; + ScrapFolderNameUpdateRequest: { + /** + * @description 폴더 이름 + * @example 기하 오답노트 + */ + name: string; + }; + QnAUpdateRequest: { + question: string; + files?: number[]; + }; + StudentUpdateRequest: { + isGteFourteen?: boolean; + isAgreeServiceUsage?: boolean; + isAgreePersonalInformation?: boolean; + isAgreeReceiveMarketing?: boolean; + email?: string; + name?: string; + /** Format: date */ + birth?: string; + /** @enum {string} */ + gender?: 'MALE' | 'FEMALE'; + phoneNumber?: string; + /** @enum {string} */ + mobileCarrier?: 'KT' | 'SKT' | 'LG' | 'KT_MVNO' | 'SKT_MVNO' | 'LG_MVNO'; + /** Format: date-time */ + phoneNumberVerifiedAt?: string; + /** @enum {string} */ + grade?: 'ONE' | 'TWO' | 'THREE' | 'N_TIME'; + /** @enum {string} */ + selectSubject?: 'MIJUKBUN' | 'HWAKTONG' | 'KEEHA'; + /** Format: int64 */ + schoolId?: number; + /** Format: int32 */ + level?: number; + nickname?: string; + }; + 'StudentPushDTO.UpdateSettingsRequest': { + /** @description 전체 푸시 알림 허용 여부 (마스터 토글) */ + isAllowPush?: boolean; + /** @description 서비스 알림 허용 여부 (학습 안내, 문장 등록 안내 등) */ + isAllowServicePush?: boolean; + /** @description QnA 채팅 알림 허용 여부 (출제진 피드백, 선생님 답변 알림 등) */ + isAllowQnaPush?: boolean; + /** @description 마케팅 알림 허용 여부 (이벤트 및 업데이트 관련 알림) */ + isAllowMarketingPush?: boolean; + }; + 'StudentPushDTO.SettingsResponse': { + /** @description 전체 푸시 알림 허용 여부 (마스터 토글) */ + isAllowPush?: boolean; + /** @description 서비스 알림 허용 여부 (학습 안내, 문장 등록 안내 등) */ + isAllowServicePush?: boolean; + /** @description QnA 채팅 알림 허용 여부 (출제진 피드백, 선생님 답변 알림 등) */ + isAllowQnaPush?: boolean; + /** @description 마케팅 알림 허용 여부 (이벤트 및 업데이트 관련 알림) */ + isAllowMarketingPush?: boolean; + }; + AdminUpdateRequest: { + /** @description 이름. null/빈문자열이면 기존 값 유지 */ + name?: string; + email: string; + /** @description 비밀번호. null/빈문자열이면 기존 값 유지 */ + password?: string; + }; + AdminRoleAssignRequest: { + /** + * Format: int64 + * @description 역할 ID. null이면 역할 해제 (슈퍼 관리자 전환) + */ + roleId?: number; + }; + TeacherUpdateRequest: { + name: string; + email: string; + newPassword?: string; + }; + TeacherResp: { + /** Format: int64 */ + id: number; + name: string; + email: string; + students: components['schemas']['StudentResp'][]; + isAllowPush?: boolean; + }; + TeacherStudentAssignReq: { + students: number[]; + }; + AdminRoleUpdateRequest: { + name: string; + menuIds: number[]; + }; + BubbleRequest: { + /** Format: int64 */ + id?: number; + /** Format: int32 */ + no?: number; + contentJson?: string; + extendContent?: string; + /** Format: int64 */ + actionNodeId?: number; + }; + PointingUpdateRequest: { + /** Format: int64 */ + id?: number; + /** Format: int32 */ + no?: number; + questionContent?: string; + commentContent?: string; + bubbles?: components['schemas']['BubbleRequest'][]; + concepts?: number[]; + }; + ProblemUpdateRequest: { + /** @enum {string} */ + createType?: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; + /** Format: int64 */ + practiceTestId?: number; + /** Format: int32 */ + practiceTestNo?: number; + /** Format: int32 */ + no?: number; + title: string; + concepts?: number[]; + /** @enum {string} */ + answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; + /** Format: int32 */ + answer: number; + /** Format: int32 */ + difficulty: number; + /** Format: int32 */ + recommendedTimeSec: number; + memo?: string; + problemContent: string; + pointings?: components['schemas']['PointingUpdateRequest'][]; + /** Format: int64 */ + mainAnalysisImageId?: number; + /** Format: int64 */ + mainHandAnalysisImageId?: number; + readingTipContent?: string; + oneStepMoreContent?: string; + }; + AdminPointingBubbleResp: { + /** Format: int64 */ + id: number; + /** Format: int32 */ + no: number; + contentJson: string; + extendContent?: string; + /** Format: int64 */ + actionNodeId?: number; + actionNodeName?: string; + }; + AdminPointingResp: { + /** Format: int64 */ + id: number; + /** Format: int32 */ + no: number; + questionContent: string; + commentContent: string; + bubbles?: components['schemas']['AdminPointingBubbleResp'][]; + concepts: components['schemas']['ConceptResp'][]; + }; + ProblemInfoResp: { + /** Format: int64 */ + id: number; + /** @enum {string} */ + problemType: 'MAIN_PROBLEM' | 'CHILD_PROBLEM'; + /** Format: int64 */ + parentProblem?: number; + parentProblemTitle?: string; + customId: string; + /** @enum {string} */ + createType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; + practiceTest: components['schemas']['PracticeTestResp']; + /** Format: int32 */ + practiceTestNo: number; + problemContent: string; + title: string; + /** @enum {string} */ + answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; + /** Format: int32 */ + answer: number; + /** Format: int32 */ + difficulty: number; + /** Format: int32 */ + recommendedTimeSec: number; + memo: string; + concepts: components['schemas']['ConceptResp'][]; + mainAnalysisImage: components['schemas']['UploadFileResp']; + mainHandAnalysisImage: components['schemas']['UploadFileResp']; + readingTipContent: string; + oneStepMoreContent: string; + pointings: components['schemas']['AdminPointingResp'][]; + childProblems: components['schemas']['ProblemInfoResp'][]; + }; + ProblemSetItemRequest: { + /** Format: int32 */ + no: number; + /** Format: int64 */ + problemId: number; + }; + ProblemSetUpdateRequest: { + title: string; + /** @enum {string} */ + status: 'CONFIRMED' | 'DOING'; + problems?: components['schemas']['ProblemSetItemRequest'][]; + }; + ProblemSetItemResp: { + /** Format: int64 */ + id: number; + /** Format: int32 */ + no: number; + problem: components['schemas']['ProblemMetaResp']; + }; + ProblemSetResp: { + /** Format: int64 */ + id: number; + title: string; + /** @enum {string} */ + status: 'CONFIRMED' | 'DOING'; + firstProblem: components['schemas']['ProblemMetaResp']; + problems: components['schemas']['ProblemSetItemResp'][]; + }; + PracticeTestUpdateRequest: { + /** Format: int32 */ + year: number; + /** Format: int32 */ + month: number; + /** Format: int32 */ + grade: number; + name: string; + }; + PointingBubbleUpdateRequest: { + /** Format: int32 */ + no?: number; + contentJson?: string; + extendContent?: string; + /** Format: int64 */ + actionNodeId?: number; + }; + MockExamTypeUpdateRequest: { + displayName?: string; + /** Format: date */ + startDate?: string; + /** Format: date */ + endDate?: string; + }; + MockExamTypeResp: { + /** Format: int64 */ + id: number; + /** + * @description /api/student/mock-exam 제출 요청의 type에 그대로 넣는 값 + * @example 2026-06 + */ + type?: string; + /** + * @description 모의고사 타입 코드. 학생 제출 요청의 type과 동일한 값 + * @example 2026-06 + */ + code?: string; + /** + * @description 화면 표시용 모의고사 타입 이름 + * @example 2026년 6월 모의고사 + */ + displayName?: string; + /** + * Format: date + * @description 해당 타입 활성 시작일 + * @example 2026-06-01 + */ + startDate?: string; + /** + * Format: date + * @description 해당 타입 활성 종료일 + * @example 2026-06-30 + */ + endDate?: string; + }; + AdminMenuUpdateRequest: { + name: string; + /** + * Format: int64 + * @description 상위 메뉴 ID. null이면 최상위 메뉴로 이동 + */ + parentId?: number; + }; + DiagnosisUpdateReq: { + content?: string; + }; + DiagnosisResp: { + /** Format: int64 */ + id: number; + /** Format: int64 */ + studentId?: number; + /** Format: date-time */ + createdAt?: string; + content?: string; + }; + DailyCommentAdminUpdateRequest: { + /** + * @description 코멘트 내용 + * @example 수정된 코멘트입니다. + */ + contentJson?: string; + }; + AdminSummary: { + /** Format: int64 */ + id?: number; + name?: string; + }; + DailyCommentResp: { + /** Format: int64 */ + id?: number; + author?: components['schemas']['AdminSummary']; + contentJson?: string; + /** Format: date */ + commentDate?: string; + /** Format: date-time */ + expiryAt?: string; + }; + ConceptUpdateRequest: { + name: string; + /** Format: int64 */ + categoryId: number; + }; + ActionGraphCellUpdateRequest: { + conceptNodeIds: number[]; + }; + ActionEdgeTypeCodeResp: { + /** Format: int64 */ + id?: number; + code?: string; + label?: string; + description?: string; + }; + ConceptActionEdgeResp: { + /** Format: int64 */ + id?: number; + actionNode?: components['schemas']['ConceptNodeResp']; + role?: components['schemas']['ActionEdgeTypeCodeResp']; + conceptNode?: components['schemas']['ConceptNodeResp']; + }; + ConceptNodeResp: { + /** Format: int64 */ + id?: number; + name?: string; + nodeType?: components['schemas']['NodeTypeCodeResp']; + description?: string; + payload?: { + [key: string]: Record; + }; + }; + ListRespConceptActionEdgeResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['ConceptActionEdgeResp'][]; + }; + NodeTypeCodeResp: { + /** Format: int64 */ + id?: number; + code?: string; + label?: string; + description?: string; + }; + ConceptNodeUpdateRequest: { + name: string; + /** Format: int64 */ + nodeTypeId: number; + description?: string; + payload?: { + [key: string]: Record; + }; + }; + NodeTypeCodeUpdateRequest: { + code: string; + label: string; + description?: string; + }; + ConceptEdgeUpdateRequest: { + /** Format: int64 */ + fromNodeId: number; + /** Format: int64 */ + edgeTypeId: number; + /** Format: int64 */ + toNodeId: number; + }; + ConceptEdgeResp: { + /** Format: int64 */ + id?: number; + fromNode?: components['schemas']['ConceptNodeResp']; + edgeType?: components['schemas']['EdgeTypeCodeResp']; + toNode?: components['schemas']['ConceptNodeResp']; + }; + EdgeTypeCodeResp: { + /** Format: int64 */ + id?: number; + code?: string; + label?: string; + description?: string; + }; + EdgeTypeCodeUpdateRequest: { + code: string; + label: string; + description?: string; + }; + ConceptActionEdgeUpdateRequest: { + /** Format: int64 */ + actionNodeId: number; + /** Format: int64 */ + roleId: number; + /** Format: int64 */ + conceptNodeId: number; + }; + ActionEdgeTypeCodeUpdateRequest: { + code: string; + label: string; + description?: string; + }; + ConceptCategoryUpdateRequest: { + name: string; + }; + ChatCreateRequest: { + /** Format: int64 */ + qnaId: number; + content: string; + files?: number[]; + /** + * Format: int64 + * @description 답장 대상 채팅 ID + */ + replyToId?: number; + }; + NoticeCreateRequest: { + title: string; + /** Format: date */ + startAt: string; + /** Format: date */ + endAt: string; + content: string; + /** Format: int64 */ + studentId: number; + }; + 'TeacherPushDTO.UpdateTokenRequest': { + fcmToken: string; + }; + RefreshReq: { + refreshToken: string; + }; + JwtResp: { + accessToken: string; + refreshToken?: string; + }; + TeacherTokenResp: { + /** Format: int64 */ + id: number; + name: string; + email: string; + students: components['schemas']['StudentResp'][]; + isAllowPush?: boolean; + token?: components['schemas']['JwtResp']; + }; + TeacherLoginReq: { + email: string; + password: string; + }; + PointingFeedbackRequest: { + /** Format: int64 */ + pointingId: number; + /** + * Format: int64 + * @description 발행(숙제) ID + */ + publishId?: number; + /** @description 질문 이해 여부 */ + isQuestionUnderstood?: boolean; + /** @description 해설 이해 여부 */ + isCommentUnderstood?: boolean; + /** + * Format: int64 + * @description 포인팅에 머무른 시간 (밀리초) + */ + dwellTimeMs?: number; + /** + * Format: int64 + * @description O/X 응답까지 걸린 시간 (밀리초) + */ + responseTimeMs?: number; + }; + PointingBubbleQuestionRequest: { + /** Format: int64 */ + bubbleId: number; + /** + * Format: int64 + * @description 발행(숙제) ID + */ + publishId?: number; + }; + PointingBubbleQuestionResponse: { + extendContent?: string; + }; + SubmissionRequest: { + /** Format: int64 */ + publishId: number; + /** Format: int64 */ + problemId?: number; + /** Format: int32 */ + submitAnswer?: number; + /** + * Format: int64 + * @description 문항 풀이 시간 (밀리초) + */ + solveTimeMs?: number; + }; + SubmissionResp: { + /** @enum {string} */ + progress?: 'CORRECT' | 'INCORRECT' | 'SEMI_CORRECT' | 'NONE'; + /** Format: int32 */ + submitAnswer: number; + isCorrect: boolean; + isDone: boolean; + /** + * Format: int32 + * @description 제출 횟수 + */ + attemptCount?: number; + }; + StudyHandwritingSnapshotSaveRequest: { + /** + * @description 스냅샷 시점 + * @enum {string} + */ + type: 'AFTER_FIRST_SUBMIT' | 'AFTER_RETRY_SUBMIT' | 'AFTER_POINTING'; + /** @description 필기 데이터 (JSON) */ + dataJson?: string; + }; + /** @description 학습 필기 스냅샷 응답 */ + StudyHandwritingSnapshotResp: { + /** + * Format: int64 + * @description 발행 ID + */ + publishId: number; + /** + * Format: int64 + * @description 문제 ID + */ + problemId: number; + /** + * @description 스냅샷 시점 + * @enum {string} + */ + type: 'AFTER_FIRST_SUBMIT' | 'AFTER_RETRY_SUBMIT' | 'AFTER_POINTING'; + /** @description 필기 데이터 (JSON) */ + dataJson?: string; + /** + * Format: date-time + * @description 스냅샷 갱신일시 (없으면 null) + */ + updatedAt?: string; + }; + ScrapCreateRequest: { + /** + * Format: int64 + * @description 폴더 ID (null이면 루트에 생성) + * @example 1 + */ + folderId?: number; + /** + * Format: int64 + * @description 문제 ID (null 가능 - 이미지만 스크랩 시) + * @example 123 + */ + problemId?: number; + /** + * Format: int64 + * @description 썸네일 이미지 ID + * @example 456 + */ + thumbnailImageId?: number; + /** + * @description 텍스트 메모 + * @example 이 문제는 미적분 개념이 핵심 + */ + textBox?: string; + /** + * @description 포인팅 ID 목록 + * @example [ + * 1, + * 2, + * 3 + * ] + */ + pointingIds?: number[]; + }; + ScrapFromReadingTipCreateRequest: { + /** + * Format: int64 + * @description 문제 ID + * @example 123 + */ + problemId: number; + /** + * Format: int64 + * @description 폴더 ID (null이면 루트에 생성) + * @example 1 + */ + folderId?: number; + }; + /** @description 스크랩 토글 응답 */ + ScrapToggleResp: { + /** @description 토글 후 스크랩 상태 (true: 스크랩됨, false: 스크랩 취소됨) */ + isScraped: boolean; + scrap?: components['schemas']['ScrapDetailResp']; + }; + ScrapFromProblemCreateRequest: { + /** + * Format: int64 + * @description 문제 ID + * @example 123 + */ + problemId: number; + /** + * Format: int64 + * @description 폴더 ID (null이면 루트에 생성) + * @example 1 + */ + folderId?: number; + }; + ScrapFromPointingCreateRequest: { + /** + * Format: int64 + * @description 포인팅 ID + * @example 456 + */ + pointingId: number; + /** + * Format: int64 + * @description 폴더 ID (null이면 루트에 생성) + * @example 1 + */ + folderId?: number; + }; + ScrapFromOneStepMoreCreateRequest: { + /** + * Format: int64 + * @description 문제 ID + * @example 123 + */ + problemId: number; + /** + * Format: int64 + * @description 폴더 ID (null이면 루트에 생성) + * @example 1 + */ + folderId?: number; + }; + ScrapFromImageCreateRequest: { + /** + * Format: int64 + * @description 이미지 ID + * @example 789 + */ + imageId: number; + /** + * Format: int64 + * @description 폴더 ID (null이면 루트에 생성) + * @example 1 + */ + folderId?: number; + /** + * @description 텍스트 메모 + * @example 외부 문제 스크랩 + */ + textBox?: string; + }; + ScrapFolderCreateRequest: { + /** + * @description 폴더 이름 + * @example 수학 오답노트 + */ + name: string; + /** + * Format: int64 + * @description 썸네일 이미지 ID + */ + thumbnailImageId?: number; + }; + /** @description problemId, childProblemId, pointingId 중 하나만 입력 가능 */ + QnACreateRequest: { + /** Format: int64 */ + publishId: number; + /** @enum {string} */ + type: + | 'PROBLEM_CONTENT' + | 'PROBLEM_POINTING_QUESTION' + | 'PROBLEM_POINTING_COMMENT' + | 'PROBLEM_MAIN_ANALYSIS' + | 'PROBLEM_MAIN_HAND_ANALYSIS' + | 'PROBLEM_READING_TIP_CONTENT' + | 'PROBLEM_ONE_STEP_MORE' + | 'CHILD_PROBLEM_CONTENT' + | 'CHILD_PROBLEM_POINTING_QUESTION' + | 'CHILD_PROBLEM_POINTING_COMMENT' + | 'ADMIN_CHAT'; + /** Format: int64 */ + problemId?: number; + /** Format: int64 */ + pointingId?: number; + question: string; + files?: number[]; + }; + QnACheckRequest: { + /** Format: int64 */ + publishId: number; + /** @enum {string} */ + type: + | 'PROBLEM_CONTENT' + | 'PROBLEM_POINTING_QUESTION' + | 'PROBLEM_POINTING_COMMENT' + | 'PROBLEM_MAIN_ANALYSIS' + | 'PROBLEM_MAIN_HAND_ANALYSIS' + | 'PROBLEM_READING_TIP_CONTENT' + | 'PROBLEM_ONE_STEP_MORE' + | 'CHILD_PROBLEM_CONTENT' + | 'CHILD_PROBLEM_POINTING_QUESTION' + | 'CHILD_PROBLEM_POINTING_COMMENT' + | 'ADMIN_CHAT'; + /** + * Format: int64 + * @description 메인문제ID(메인 문제에 대한 질문일 경우) + */ + problemId?: number; + /** + * Format: int64 + * @description 포인팅ID(포인팅에 대한 질문일 경우) + */ + pointingId?: number; + }; + QnACheckResp: { + /** Format: int64 */ + id: number; + isExist: boolean; + }; + /** @description Native OAuth 로그인 요청 */ + NativeOAuthReq: { + /** + * @description OAuth 제공자 + * @example KAKAO + * @enum {string} + */ + provider: 'KAKAO' | 'GOOGLE' | 'APPLE'; + /** @description OAuth 토큰 (Kakao: access_token, Google/Apple: id_token) */ + token: string; + }; + /** @description Native OAuth 로그인 응답 */ + NativeOAuthResp: { + /** @description 로그인 성공 여부 */ + success?: boolean; + /** @description 응답 메시지 */ + message?: string; + /** @description JWT Access Token */ + accessToken?: string; + /** @description JWT Refresh Token */ + refreshToken?: string; + user?: components['schemas']['NativeOAuthResp.StudentInfo']; + }; + /** @description 학생 프로필 정보 */ + 'NativeOAuthResp.StudentInfo': { + /** + * Format: int64 + * @description 학생 ID + */ + id?: number; + /** @description 이메일 */ + email?: string; + /** @description 이름 */ + name?: string; + /** @description 닉네임 */ + nickname?: string; + /** + * Format: date + * @description 생년월일 + */ + birth?: string; + /** + * @description 성별 + * @enum {string} + */ + gender?: 'MALE' | 'FEMALE'; + /** + * @description 학년 + * @enum {string} + */ + grade?: 'ONE' | 'TWO' | 'THREE' | 'N_TIME'; + /** + * @description 선택과목 + * @enum {string} + */ + selectSubject?: 'MIJUKBUN' | 'HWAKTONG' | 'KEEHA'; + /** + * Format: int32 + * @description 수능 등급 + */ + level?: number; + /** + * @description OAuth 제공자 + * @enum {string} + */ + provider?: 'KAKAO' | 'GOOGLE' | 'APPLE'; + /** @description 최초 로그인 여부 (프로필 미완성) */ + isFirstLogin?: boolean; + /** + * Format: int64 + * @description 연결된 선생님 ID + */ + teacherId?: number; + }; + NotificationResp: { + /** Format: int64 */ + id: number; + /** Format: int64 */ + studentId: number; + studentName?: string; + /** @enum {string} */ + type: 'ASSIGNMENT' | 'SYSTEM' | 'QNA' | 'MARKETING'; + title: string; + /** Format: int64 */ + payload?: number; + url?: string; + isRead: boolean; + /** Format: date-time */ + createdAt: string; + }; + MockExamResultSubmitRequest: { + /** + * @description GET /api/student/mock-exam/current-type 응답의 type 값을 그대로 전달 + * @example 2026-06 + */ + type: string; + /** + * @description 틀린 문항 번호 목록 + * @example [ + * 1, + * 2, + * 3 + * ] + */ + incorrects: number[]; + /** + * @description 학습 고민 JSON 문자열 + * @example {"text":"문제 풀이 시간이 부족해요"} + */ + question?: string; + }; + MockExamResultResp: { + /** Format: int64 */ + id: number; + type?: string; + incorrects?: number[]; + question?: string; + /** Format: date-time */ + createdAt?: string; + /** Format: date-time */ + updatedAt?: string; + }; + 'StudentPushDTO.UpdateTokenRequest': { + fcmToken: string; + }; + 'StudentPushDTO.InitPushRequest': { + /** @description 푸시 허용 여부 (true: 전체 허용, false: 전체 차단) */ + allow: boolean; + }; + 'StudentPasswordDTO.UpdatePasswordRequest': { + newPassword: string; + }; + 'FeedbackDTO.Request': { + /** @description 피드백 내용 (최소 10자 이상) */ + content: string; + }; + StudentSignupReq: { + email: string; + password: string; + }; + StudentTokenResp: { + /** Format: int64 */ + id: number; + isGteFourteen?: boolean; + isAgreeServiceUsage?: boolean; + isAgreePersonalInformation?: boolean; + isAgreeReceiveMarketing?: boolean; + /** Format: date-time */ + agreeAt?: string; + email: string; + name: string; + /** Format: date */ + birth?: string; + /** @enum {string} */ + gender?: 'MALE' | 'FEMALE'; + phoneNumber?: string; + /** @enum {string} */ + mobileCarrier?: 'KT' | 'SKT' | 'LG' | 'KT_MVNO' | 'SKT_MVNO' | 'LG_MVNO'; + /** Format: date-time */ + phoneNumberVerifiedAt?: string; + /** @enum {string} */ + grade: 'ONE' | 'TWO' | 'THREE' | 'N_TIME'; + /** @enum {string} */ + selectSubject?: 'MIJUKBUN' | 'HWAKTONG' | 'KEEHA'; + school?: components['schemas']['SchoolResp']; + /** Format: int32 */ + level?: number; + nickname?: string; + isAllowPush?: boolean; + /** @enum {string} */ + provider?: 'KAKAO' | 'GOOGLE' | 'APPLE'; + isFirstLogin: boolean; + /** Format: int64 */ + teacherId?: number; + teacherName?: string; + token: components['schemas']['JwtResp']; + }; + 'StudentInitialRegisterDTO.Req': { + isGteFourteen: boolean; + isAgreeServiceUsage: boolean; + isAgreePersonalInformation: boolean; + isAgreeReceiveMarketing?: boolean; + email?: string; + name: string; + /** Format: date */ + birth?: string; + /** @enum {string} */ + gender?: 'MALE' | 'FEMALE'; + phoneNumber?: string; + /** @enum {string} */ + mobileCarrier?: 'KT' | 'SKT' | 'LG' | 'KT_MVNO' | 'SKT_MVNO' | 'LG_MVNO'; + /** Format: date-time */ + phoneNumberVerifiedAt?: string; + /** @enum {string} */ + grade: 'ONE' | 'TWO' | 'THREE' | 'N_TIME'; + /** @enum {string} */ + selectSubject?: 'MIJUKBUN' | 'HWAKTONG' | 'KEEHA'; + /** Format: int64 */ + schoolId?: number; + /** Format: int32 */ + level?: number; + nickname?: string; + }; + 'WithdrawDTO.Request': { + /** @description 탈퇴 사유 목록 (복수 선택 가능) */ + reasons: ( + | 'DIFFICULT_TO_USE' + | 'NOT_HELPFUL' + | 'LACK_OF_FEATURES' + | 'NO_LONGER_NEEDED' + | 'OTHER' + )[]; + /** @description 기타 사유 (OTHER 선택 시 입력, 선택) */ + otherReason?: string; + }; + 'PasswordResetDTO.ResetPasswordRequest': { + /** @description 이메일 */ + email: string; + /** @description 인증 코드 (6자리) */ + code: string; + /** @description 새 비밀번호 */ + newPassword: string; + }; + 'PasswordResetDTO.VerifyCodeRequest': { + /** @description 이메일 */ + email: string; + /** @description 인증 코드 (6자리) */ + code: string; + }; + BooleanResp: { + value: boolean; + }; + 'PasswordResetDTO.SendCodeRequest': { + /** @description 이메일 */ + email: string; + }; + SocialLoginReq: { + /** @enum {string} */ + provider: 'KAKAO' | 'GOOGLE' | 'APPLE'; + redirectUri: string; + }; + SocialLoginUrlResp: { + /** @enum {string} */ + provider: 'KAKAO' | 'GOOGLE' | 'APPLE'; + loginUrl: string; + }; + StudentLoginReq: { + /** @description 이메일 */ + email: string; + /** @description 비밀번호 */ + password: string; + }; + PreSignedReq: { + fileName: string; + /** + * @description 파일 유형 (지정하지 않으면 서버가 확장자로 판단) + * @enum {string} + */ + fileType?: 'IMAGE' | 'DOCUMENT' | 'OTHER'; + }; + PreSignedResp: { + file: components['schemas']['UploadFileResp']; + contentDisposition: string; + uploadUrl: string; + }; + /** @description 휴대폰 인증 코드 검증 요청 */ + PhoneAuthVerifyRequest: { + /** @description 휴대폰 번호 */ + phone: string; + /** @description 인증 용도 (예: signup, reset-password 등) */ + purpose?: string; + /** @description 인증 코드 */ + code: string; + }; + SimpleSuccessResp: { + success?: boolean; + message?: string; + }; + /** @description 휴대폰 인증 코드 발송 요청 */ + PhoneAuthSendRequest: { + /** @description 휴대폰 번호 */ + phone: string; + /** @description 인증 용도 (예: signup, reset-password 등) */ + purpose?: string; + }; + /** @description 휴대폰 인증 코드 재발송 요청 */ + PhoneAuthResendRequest: { + /** @description 휴대폰 번호 */ + phone: string; + /** @description 인증 용도 (예: signup, reset-password 등) */ + purpose?: string; + }; + /** @description 클라이언트 이벤트 배치 요청 */ + UserEventBatchRequest: { + /** @description 이벤트 목록 */ + events: components['schemas']['UserEventRequest'][]; + /** @description 클라이언트 세션 ID */ + sessionId: string; + /** + * @description 디바이스 타입 + * @enum {string} + */ + deviceType?: 'TABLET' | 'MOBILE' | 'DESKTOP' | 'UNKNOWN'; + }; + /** @description 개별 사용자 이벤트 */ + UserEventRequest: { + /** + * @description 이벤트 타입 + * @enum {string} + */ + eventType: + | 'SCREEN_ENTER' + | 'SCREEN_EXIT' + | 'BUTTON_CLICK' + | 'STUDY_START' + | 'STUDY_END' + | 'PROBLEM_VIEW' + | 'POINTING_VIEW' + | 'SESSION_START' + | 'SESSION_END'; + /** + * Format: date-time + * @description 이벤트 발생 시각 + */ + occurredAt: string; + /** + * @description 이벤트 추가 데이터 JSON 문자열. 이벤트 타입별 권장 필드는 API 설명을 참고하세요. + * @example {"screenName":"Problem","dwellTimeMs":120000,"exitReason":"navigation"} + */ + metadata?: string; + /** @description 클라이언트에서 생성한 이벤트 고유 ID (중복 방지용) */ + clientEventId?: string; + }; + AdminCreateRequest: { + name: string; + email: string; + password: string; + }; + TeacherCreateRequest: { + name: string; + email: string; + password: string; + }; + SchoolSaveRespDTO: { + /** Format: int32 */ + count?: number; + }; + AdminRoleCreateRequest: { + name: string; + menuIds: number[]; + }; + PublishFocusCardLinkSpec: { + /** Format: int64 */ + problemSetItemId: number; + /** Format: int64 */ + focusCardIssuanceId: number; + }; + ActionNodeSummary: { + /** Format: int64 */ + id: number; + name: string; + }; + FocusCardIssuanceResp: { + /** Format: int64 */ + id: number; + card: components['schemas']['FocusCardResp']; + /** Format: date */ + issuedDate: string; + /** @enum {string} */ + issuedType: 'SYSTEM' | 'ADMIN'; + /** Format: int64 */ + issuedByAdminId?: number; + }; + FocusCardResp: { + /** Format: int64 */ + id: number; + actionNode: components['schemas']['ActionNodeSummary']; + title: string; + description: string; + content: string; + }; + PublishFocusCardLinkResp: { + /** Format: int64 */ + id: number; + /** Format: int64 */ + publishId: number; + /** Format: int64 */ + problemSetItemId: number; + focusCardIssuance: components['schemas']['FocusCardIssuanceResp']; + }; + PublishCreateRequest: { + /** Format: int64 */ + problemSetId: number; + /** Format: int64 */ + studentId: number; + /** Format: date */ + publishAt: string; + focusCardLinks?: components['schemas']['PublishFocusCardLinkSpec'][]; + }; + /** @description 마지막 진행 상태 정보 */ + LastProgressInfo: { + /** + * Format: int64 + * @description 마지막 답변한 포인팅 ID + */ + lastAnsweredPointingId?: number; + /** + * Format: int32 + * @description 마지막 답변한 포인팅 번호 (no 기준) + */ + lastAnsweredPointingNo?: number; + /** + * Format: int64 + * @description 마지막 푼 문제 ID + */ + lastSolvedProblemId?: number; + /** + * Format: int32 + * @description 마지막 푼 새끼 문제 번호 (no 기준, null이면 새끼문제 없음) + */ + lastSolvedChildProblemNo?: number; + /** @description 메인 문제 풀이 여부 */ + isMainProblemSolved?: boolean; + /** + * Format: int32 + * @description 푼 새끼 문제 수 + */ + solvedChildProblemCount?: number; + /** + * Format: int32 + * @description 전체 새끼 문제 수 + */ + totalChildProblemCount?: number; + /** + * Format: int32 + * @description 답변한 포인팅 수 + */ + answeredPointingCount?: number; + /** + * Format: int32 + * @description 전체 포인팅 수 + */ + totalPointingCount?: number; + }; + PointingWithFeedbackResp: { + /** Format: int64 */ + id: number; + /** Format: int32 */ + no: number; + questionContent: string; + commentContent: string; + bubbles?: components['schemas']['PointingBubbleResp'][]; + concepts: components['schemas']['ConceptResp'][]; + isQuestionUnderstood?: boolean; + isCommentUnderstood?: boolean; + isScrapped?: boolean; + }; + ProblemRef: { + /** + * Format: int64 + * @description 부모문제인 경우 -> 첫 새끼문제, 새끼문제일 경우 -> 다음 새끼문제 + */ + prevChildId?: number; + /** + * Format: int64 + * @description 새끼문제일 경우에만 다음 새끼문제 + */ + nextChildId?: number; + /** + * Format: int64 + * @description 새끼문제일 경우에만 부모문제Id + */ + parentId?: number; + }; + /** @description 문제별 스크랩 정보 */ + ProblemScrapInfo: { + /** + * Format: int64 + * @description 스크랩 ID (스크랩이 없으면 null) + * @example 123 + */ + scrapId?: number; + /** + * @description 문제 스크랩 여부 + * @example true + */ + isProblemScrapped?: boolean; + /** + * @description 리딩팁 스크랩 여부 + * @example false + */ + isReadingTipScrapped?: boolean; + /** + * @description 원스텝모어 스크랩 여부 + * @example true + */ + isOneStepMoreScrapped?: boolean; + /** + * @description 오답 여부 + * @example false + */ + isWrongAnswer?: boolean; + /** + * @description 스크랩된 포인팅 ID 목록 + * @example [ + * 1, + * 2, + * 3 + * ] + */ + scrappedPointingIds?: number[]; + }; + ProblemWithStudyInfoResp: { + /** Format: int32 */ + no?: number; + /** Format: int64 */ + id: number; + /** @enum {string} */ + problemType: 'MAIN_PROBLEM' | 'CHILD_PROBLEM'; + /** Format: int64 */ + parentProblem?: number; + parentProblemTitle?: string; + customId: string; + /** @enum {string} */ + createType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; + practiceTest: components['schemas']['PracticeTestResp']; + /** Format: int32 */ + practiceTestNo: number; + problemContent: string; + title: string; + /** @enum {string} */ + answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; + /** Format: int32 */ + answer: number; + /** Format: int32 */ + difficulty: number; + /** Format: int32 */ + recommendedTimeSec: number; + memo: string; + concepts: components['schemas']['ConceptResp'][]; + mainAnalysisImage: components['schemas']['UploadFileResp']; + mainHandAnalysisImage: components['schemas']['UploadFileResp']; + readingTipContent: string; + oneStepMoreContent: string; + studentDisplayParentName?: string; + studentDisplayName?: string; + pointings: components['schemas']['PointingWithFeedbackResp'][]; + /** @enum {string} */ + progress?: 'CORRECT' | 'INCORRECT' | 'SEMI_CORRECT' | 'NONE'; + /** Format: int32 */ + submitAnswer: number; + isCorrect: boolean; + isDone: boolean; + /** + * Format: int32 + * @description 제출 횟수 + */ + attemptCount?: number; + scrapInfo?: components['schemas']['ProblemScrapInfo']; + childProblems: components['schemas']['ProblemWithStudyInfoResp'][]; + ref?: components['schemas']['ProblemRef']; + }; + PublishProblemGroupResp: { + /** Format: int32 */ + no: number; + /** Format: int64 */ + problemId: number; + /** @enum {string} */ + progress: 'DONE' | 'DOING' | 'NONE'; + problem: components['schemas']['ProblemWithStudyInfoResp']; + childProblems: components['schemas']['ProblemWithStudyInfoResp'][]; + lastProgressInfo?: components['schemas']['LastProgressInfo']; + /** + * Format: int32 + * @description 메인 문제 제출 횟수 + */ + attemptCount?: number; + /** @description 출제 근거 집중학습 카드 목록 (없으면 빈 배열) */ + focusCards?: components['schemas']['PublishFocusCardLinkResp'][]; + }; + PublishResp: { + /** Format: int64 */ + id: number; + /** Format: date */ + publishAt: string; + /** @enum {string} */ + progress: 'DONE' | 'DOING' | 'NONE'; + problemSet: components['schemas']['ProblemSetResp']; + data: components['schemas']['PublishProblemGroupResp'][]; + }; + PointingCreateRequest: { + /** Format: int32 */ + no?: number; + questionContent?: string; + commentContent?: string; + bubbles?: components['schemas']['BubbleRequest'][]; + concepts?: number[]; + }; + ProblemCreateRequest: { + /** @enum {string} */ + createType?: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; + /** Format: int64 */ + practiceTestId?: number; + /** Format: int32 */ + practiceTestNo?: number; + /** Format: int32 */ + no?: number; + /** @enum {string} */ + problemType: 'MAIN_PROBLEM' | 'CHILD_PROBLEM'; + title: string; + concepts?: number[]; + /** @enum {string} */ + answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; + /** Format: int32 */ + answer: number; + /** Format: int32 */ + difficulty: number; + /** Format: int32 */ + recommendedTimeSec: number; + memo?: string; + problemContent: string; + pointings?: components['schemas']['PointingCreateRequest'][]; + /** Format: int64 */ + mainAnalysisImageId?: number; + /** Format: int64 */ + mainHandAnalysisImageId?: number; + readingTipContent?: string; + oneStepMoreContent?: string; + }; + ProblemEntireCreateRequest: { + childProblems?: components['schemas']['ProblemCreateRequest'][]; + }; + ProblemSetCreateRequest: { + title: string; + problems?: components['schemas']['ProblemSetItemRequest'][]; + }; + PracticeTestCreateRequest: { + /** Format: int32 */ + year: number; + /** Format: int32 */ + month: number; + /** Format: int32 */ + grade: number; + name: string; + }; + FailedProblemInfo: { + /** Format: int64 */ + problemId?: number; + customId?: string; + title?: string; + reason?: string; + }; + PointingBubbleMigrateResp: { + /** Format: int32 */ + migratedCount?: number; + failed?: components['schemas']['FailedProblemInfo'][]; + }; + NotificationSendRequest: { + /** + * @description 알림 종류 + * @enum {string} + */ + type: 'ASSIGNMENT' | 'SYSTEM' | 'QNA' | 'MARKETING'; + /** @description 알림 제목 */ + title: string; + /** + * Format: int64 + * @description 페이로드 (관련 리소스 ID) + */ + payload?: number; + /** @description 앱 딥링크 URL */ + url?: string; + /** @description 전체 학생 발송 여부 */ + isAll: boolean; + /** @description 발송 대상 학생 ID 리스트 (isAll=false일 때 필수) */ + studentIds?: number[]; + }; + /** @description 학생별 FCM 발송 실패 사유 목록 */ + FcmDeliveryFailure: { + /** + * Format: int64 + * @description 대상 학생 ID + */ + studentId: number; + /** @description 대상 학생 이름 */ + studentName?: string; + /** @description 실패 사유 코드 */ + code: string; + /** @description 실패 사유 메시지 */ + message: string; + }; + NotificationSendResp: { + /** + * Format: int32 + * @description 발송 대상 학생 수 + */ + targetCount: number; + /** + * Format: int32 + * @description 알림 저장 성공 수 + */ + savedCount: number; + /** + * Format: int32 + * @description FCM 발송 시도 수 + */ + fcmAttemptCount: number; + /** + * Format: int32 + * @description FCM 발송 성공 수 + */ + fcmSuccessCount: number; + /** @description FCM 지원 여부 */ + fcmSupported: boolean; + /** @description 학생별 FCM 발송 실패 사유 목록 */ + failures: components['schemas']['FcmDeliveryFailure'][]; + }; + MockExamTypeCreateRequest: { + code: string; + displayName: string; + /** Format: date */ + startDate: string; + /** Format: date */ + endDate: string; + }; + AdminMenuCreateRequest: { + name: string; + /** + * Format: int64 + * @description 상위 메뉴 ID. null이면 최상위 메뉴로 생성 + */ + parentId?: number; + }; + FocusCardCreateRequest: { + /** Format: int64 */ + actionNodeId: number; + title: string; + description: string; + content: string; + }; + FocusCardEditContentRequest: { + title?: string; + description?: string; + content?: string; + }; + FocusCardIssueByAdminRequest: { + /** Format: int64 */ + studentId: number; + /** Format: int64 */ + actionNodeId: number; + /** Format: date */ + issuedDate?: string; + }; + ListRespFocusCardIssuanceResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['FocusCardIssuanceResp'][]; + }; + /** @description FCM 테스트 발송 요청 */ + FcmTestReq: { + /** + * @description FCM 토큰 + * @example dGVzdC10b2tlbi1mb3ItZmNtLXB1c2gtbm90aWZpY2F0aW9u + */ + token: string; + /** + * @description 알림 제목 + * @example 테스트 알림 + */ + title: string; + /** + * @description 알림 내용 + * @example FCM 푸시 테스트 메시지입니다. + */ + body: string; + /** + * @description 클릭 시 이동할 URL (선택) + * @example /home + */ + url?: string; + }; + /** @description FCM 테스트 발송 응답 */ + FcmTestResp: { + /** @description 발송 성공 여부 */ + success?: boolean; + /** @description 결과 메시지 */ + message?: string; + /** @description 에러 상세 (실패 시) */ + errorDetail?: string; + }; + DiagnosisCreateReq: { + /** Format: int64 */ + studentId?: number; + content?: string; + }; + DailyCommentAdminUpsertRequest: { + /** + * @description 학생 ID 목록 + * @example [ + * 1, + * 2, + * 3 + * ] + */ + studentIds?: number[]; + /** + * Format: date + * @description 코멘트 기준 일자 + * @example 2026-05-05 + */ + commentDate?: string; + /** + * @description 코멘트 내용 + * @example 오늘도 학습을 잘 진행했습니다. + */ + contentJson?: string; }; - NoticeResp: { + ListRespDailyCommentResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['DailyCommentResp'][]; + }; + ConceptCreateRequest: { + name: string; /** Format: int64 */ - id: number; - student: components['schemas']['StudentResp']; - title: string; - /** Format: date */ - startAt: string; - /** Format: date */ - endAt: string; - isRead: boolean; - content: string; + categoryId: number; }; - SchoolResp: { + ConceptNodeCreateRequest: { + name: string; /** Format: int64 */ - id: number; - name?: string; - sido?: string; + nodeTypeId: number; + description?: string; + payload?: { + [key: string]: Record; + }; }; - StudentResp: { + NodeTypeCodeCreateRequest: { + code: string; + label: string; + description?: string; + }; + ConceptEdgeCreateRequest: { /** Format: int64 */ - id: number; - isGteFourteen?: boolean; - isAgreeServiceUsage?: boolean; - isAgreePersonalInformation?: boolean; - isAgreeReceiveMarketing?: boolean; - /** Format: date-time */ - agreeAt?: string; - email: string; - name: string; - /** Format: date */ - birth?: string; - /** @enum {string} */ - gender?: 'MALE' | 'FEMALE'; - phoneNumber?: string; - /** @enum {string} */ - mobileCarrier?: 'KT' | 'SKT' | 'LG' | 'KT_MVNO' | 'SKT_MVNO' | 'LG_MVNO'; - /** Format: date-time */ - phoneNumberVerifiedAt?: string; - /** @enum {string} */ - grade: 'ONE' | 'TWO' | 'THREE' | 'N_TIME'; - /** @enum {string} */ - selectSubject?: 'MIJUKBUN' | 'HWAKTONG' | 'KEEHA'; - school?: components['schemas']['SchoolResp']; - /** Format: int32 */ - level?: number; - nickname?: string; - isAllowPush?: boolean; - /** @enum {string} */ - provider?: 'KAKAO' | 'GOOGLE' | 'APPLE'; - isFirstLogin: boolean; + fromNodeId: number; /** Format: int64 */ - teacherId?: number; - teacherName?: string; + edgeTypeId: number; + /** Format: int64 */ + toNodeId: number; }; - 'TeacherPushDTO.UpdateSettingsRequest': { - /** @description 전체 푸시 알림 허용 여부 (마스터 토글) */ - isAllowPush?: boolean; - /** @description 서비스 알림 허용 여부 (학습 안내, 문장 등록 안내 등) */ - isAllowServicePush?: boolean; - /** @description QnA 채팅 알림 허용 여부 (출제진 피드백, 선생님 답변 알림 등) */ - isAllowQnaPush?: boolean; - /** @description 마케팅 알림 허용 여부 (이벤트 및 업데이트 관련 알림) */ - isAllowMarketingPush?: boolean; + EdgeTypeCodeCreateRequest: { + code: string; + label: string; + description?: string; }; - 'TeacherPushDTO.SettingsResponse': { - /** @description 전체 푸시 알림 허용 여부 (마스터 토글) */ - isAllowPush?: boolean; - /** @description 서비스 알림 허용 여부 (학습 안내, 문장 등록 안내 등) */ - isAllowServicePush?: boolean; - /** @description QnA 채팅 알림 허용 여부 (출제진 피드백, 선생님 답변 알림 등) */ - isAllowQnaPush?: boolean; - /** @description 마케팅 알림 허용 여부 (이벤트 및 업데이트 관련 알림) */ - isAllowMarketingPush?: boolean; + ConceptActionEdgeCreateRequest: { + /** Format: int64 */ + actionNodeId: number; + /** Format: int64 */ + roleId: number; + /** Format: int64 */ + conceptNodeId: number; }; - ScrapUpdateRequest: { - /** - * Format: int64 - * @description 폴더 ID (null이면 루트로 이동) - * @example 1 - */ - folderId?: number; + ActionEdgeTypeCodeCreateRequest: { + code: string; + label: string; + description?: string; + }; + ConceptCategoryCreateRequest: { + name: string; + }; + /** @description 접근 가능 메뉴 목록 */ + AdminMenuResp: { + /** Format: int64 */ + id?: number; + name?: string; /** * Format: int64 - * @description 썸네일 이미지 ID - * @example 456 - */ - thumbnailImageId?: number; - /** - * @description 텍스트 메모 - * @example 수정된 메모 내용 + * @description 상위 메뉴 ID. null이면 최상위 메뉴 */ - textBox?: string; + parentId?: number; }; - ConceptCategoryResp: { + AdminResp: { /** Format: int64 */ id: number; name: string; + email: string; + /** @enum {string} */ + adminType: 'SUPER' | 'ROLE_BASED'; + /** + * Format: int64 + * @description 역할 ID. adminType=SUPER이면 null + */ + roleId?: number; + /** @description 역할 이름. adminType=SUPER이면 null */ + roleName?: string; }; - ConceptResp: { + AdminTokenResp: { /** Format: int64 */ id: number; name: string; - category: components['schemas']['ConceptCategoryResp']; + email: string; + /** @enum {string} */ + adminType: 'SUPER' | 'ROLE_BASED'; + /** + * Format: int64 + * @description 역할 ID. adminType=SUPER이면 null + */ + roleId?: number; + /** @description 역할 이름. adminType=SUPER이면 null */ + roleName?: string; + token: components['schemas']['JwtResp']; + /** @description 접근 가능 메뉴 목록 */ + accessibleMenus?: components['schemas']['AdminMenuResp'][]; }; - /** @description 포인팅 목록 */ - PointingResp: { - /** Format: int64 */ - id: number; + AdminLoginReq: { + email: string; + password: string; + }; + ListRespPublishResp: { + requestId: string; /** Format: int32 */ - no: number; - questionContent: string; - commentContent: string; - concepts: components['schemas']['ConceptResp'][]; + total: number; + data: components['schemas']['PublishResp'][]; }; - PracticeTestResp: { + PublishStudentProgressResp: { + /** Format: double */ + progress: number; + }; + ListRespStudentResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['StudentResp'][]; + }; + PageRespNotListQnAGroupByWeekResp: { + requestId: string; + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['QnAGroupByWeekResp']; + }; + QnAGroupByWeekResp: { + groups?: components['schemas']['QnAGroupItem'][]; + }; + QnAGroupItem: { + /** Format: int32 */ + order?: number; + weekName?: string; + data?: components['schemas']['QnAMetaResp'][]; + }; + ChatSearchResultResp: { /** Format: int64 */ - id: number; + qnaId?: number; + qnaTitle?: string; + /** @enum {string} */ + qnaType?: + | 'PROBLEM_CONTENT' + | 'PROBLEM_POINTING_QUESTION' + | 'PROBLEM_POINTING_COMMENT' + | 'PROBLEM_MAIN_ANALYSIS' + | 'PROBLEM_MAIN_HAND_ANALYSIS' + | 'PROBLEM_READING_TIP_CONTENT' + | 'PROBLEM_ONE_STEP_MORE' + | 'CHILD_PROBLEM_CONTENT' + | 'CHILD_PROBLEM_POINTING_QUESTION' + | 'CHILD_PROBLEM_POINTING_COMMENT' + | 'ADMIN_CHAT'; + /** @enum {string} */ + qnaStatus?: 'QUESTIONING' | 'RESOLVED'; + /** Format: date */ + publishDate?: string; + /** Format: int64 */ + matchedChatId?: number; + matchedChatPreview?: string; + }; + PageRespNotListListChatSearchResultResp: { + requestId: string; /** Format: int32 */ - year: number; + page: number; /** Format: int32 */ - month: number; + size: number; /** Format: int32 */ - grade: number; - name: string; - displayName: string; + lastPage: number; + data: components['schemas']['ChatSearchResultResp'][]; }; - /** @description 문제 정보 */ - ProblemExtendResp: { + QnASearchResp: { + qnaResults?: components['schemas']['PageRespNotListQnAGroupByWeekResp']; + chatResults?: components['schemas']['PageRespNotListListChatSearchResultResp']; + }; + ListRespNoticeResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['NoticeResp'][]; + }; + ListRespProblemEntireResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['ProblemEntireResp'][]; + }; + ProblemEntireResp: { + /** + * Format: int64 + * @description 문제 ID + */ + problemId: number; + /** @description 부모문제 여부 (true: 부모문제, false: 새끼문제) */ + isParent: boolean; /** Format: int64 */ id: number; /** @enum {string} */ @@ -3058,87 +5892,95 @@ export interface components { readingTipContent: string; oneStepMoreContent: string; }; - ProblemMetaResp: { + ListRespPointingEntireResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['PointingEntireResp'][]; + }; + PointingEntireResp: { + /** + * Format: int64 + * @description 포인팅이 속한 문제 ID + */ + problemId: number; + /** @description 부모문제 여부 (true: 부모문제, false: 새끼문제) */ + isParent: boolean; /** Format: int64 */ id: number; - /** @enum {string} */ - problemType: 'MAIN_PROBLEM' | 'CHILD_PROBLEM'; - /** Format: int64 */ - parentProblem?: number; - parentProblemTitle?: string; - customId: string; - /** @enum {string} */ - createType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; - practiceTest: components['schemas']['PracticeTestResp']; - /** Format: int32 */ - practiceTestNo: number; - problemContent: string; - title: string; - /** @enum {string} */ - answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; - /** Format: int32 */ - answer: number; - /** Format: int32 */ - difficulty: number; /** Format: int32 */ - recommendedTimeSec: number; - memo: string; + no: number; + questionContent: string; + commentContent: string; + bubbles?: components['schemas']['PointingBubbleResp'][]; concepts: components['schemas']['ConceptResp'][]; + isQuestionUnderstood?: boolean; + isCommentUnderstood?: boolean; + isScrapped?: boolean; }; - /** @description 스크랩 상세 정보 */ - ScrapDetailResp: { + ListRespTrashItemResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['TrashItemResp'][]; + }; + /** @description 휴지통 항목 */ + TrashItemResp: { /** * Format: int64 - * @description 스크랩 ID + * @description 항목 ID */ id: number; - folder?: components['schemas']['ScrapFolderResp']; - problem?: components['schemas']['ProblemExtendResp']; - /** @description 썸네일 URL */ + /** + * @description 항목 유형 (FOLDER/SCRAP) + * @enum {string} + */ + type: 'FOLDER' | 'SCRAP'; + /** @description 항목 이름 (폴더명 또는 문제 제목) */ + name: string; + /** + * Format: int32 + * @description 포함된 스크랩 수 (폴더인 경우) + */ + itemCount?: number; + /** @description 썸네일 URL (스크랩: 스크랩 썸네일, 폴더: 폴더 썸네일) */ thumbnailUrl?: string; - /** @description 스크랩 이름 */ - name?: string; - /** @description 텍스트 메모 */ - textBox?: string; - /** @description 포인팅 목록 */ - pointings: components['schemas']['PointingResp'][]; - /** @description 리딩팁 스크랩 여부 */ - isReadingTipScrapped: boolean; - /** @description 원스텝모어 스크랩 여부 */ - isOneStepMoreScrapped: boolean; - /** @description 오답 스크랩 여부 */ - isWrongAnswer: boolean; - /** @description 필기 데이터 존재 여부 */ - hasHandwriting: boolean; + /** @description 최근 스크랩 2개의 썸네일 URL (폴더인 경우) */ + top2ScrapThumbnail?: string[]; /** * Format: date-time - * @description 생성일시 + * @description 삭제일시 */ - createdAt: string; + deletedAt: string; /** - * Format: date-time - * @description 수정일시 + * Format: int32 + * @description 영구삭제까지 남은 일수 */ - updatedAt: string; + daysUntilPermanentDelete: number; }; - /** @description 스크랩 폴더 응답 */ - ScrapFolderResp: { + /** @description 스크랩/폴더 목록 아이템 */ + ScrapListItemResp: { + /** + * @description 유형 (FOLDER/SCRAP) + * @enum {string} + */ + type: 'FOLDER' | 'SCRAP'; /** * Format: int64 - * @description 폴더 ID + * @description 아이템 ID */ id: number; - /** @description 폴더 이름 */ + /** @description 표시 이름 (폴더명 또는 문제 제목) */ name: string; /** * Format: int64 - * @description 폴더 내 스크랩 개수 + * @description 폴더 ID (스크랩일 때) */ - scrapCount: number; - /** @description 썸네일 이미지 URL */ + folderId?: number; + /** @description 썸네일 URL (스크랩일 때) */ thumbnailUrl?: string; - /** @description 최근 스크랩 2개의 썸네일 URL (최신순) */ - top2ScrapThumbnail?: string[]; + /** @description 오답 스크랩 여부 (스크랩일 때) */ + isWrongAnswer?: boolean; /** * Format: date-time * @description 생성일시 @@ -3150,1903 +5992,1958 @@ export interface components { */ updatedAt: string; }; - ScrapThumbnailUpdateRequest: { - /** - * Format: int64 - * @description 썸네일 이미지 ID (null이면 썸네일 삭제) - */ - thumbnailImageId?: number; + /** @description 스크랩 검색 응답 */ + ScrapSearchResp: { + /** @description 검색된 폴더 목록 */ + folders: components['schemas']['ScrapFolderResp'][]; + /** @description 검색된 스크랩 목록 */ + scraps: components['schemas']['ScrapListItemResp'][]; }; - ScrapTextBoxUpdateRequest: { + ListRespScrapFolderResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['ScrapFolderResp'][]; + }; + ListRespScrapListItemResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['ScrapListItemResp'][]; + }; + ListRespSchoolResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['SchoolResp'][]; + }; + ListRespUploadFileResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['UploadFileResp'][]; + }; + ListRespQnaFileResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['QnaFileResp'][]; + }; + QnaFileResp: { + /** Format: int64 */ + id: number; + fileName: string; + url: string; + /** @enum {string} */ + fileType: 'IMAGE' | 'DOCUMENT' | 'OTHER'; + /** @description 스크랩 여부 */ + isScrapped: boolean; + }; + ListRespNotificationResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['NotificationResp'][]; + }; + NotificationUnreadCountResp: { /** - * @description 텍스트 메모 - * @example 메모 수정 + * Format: int32 + * @description 전체 알림 개수 */ - textBox?: string; - }; - ScrapNameUpdateRequest: { + totalCount: number; /** - * @description 스크랩 이름 - * @example 미적분 정리 + * Format: int32 + * @description 읽지 않은 알림 개수 */ - name?: string; + unreadCount: number; + latestNotification?: components['schemas']['NotificationResp']; }; - ScrapHandwritingUpdateRequest: { - /** @description 필기 데이터 (Base64 인코딩) */ - data: string; + PageRespNoticeResp: { + requestId: string; + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['NoticeResp'][]; }; - /** @description 필기 데이터 응답 */ - ScrapHandwritingResp: { + NoticeUnreadCountResp: { + /** Format: int64 */ + totalCount?: number; + /** Format: int64 */ + unreadCount?: number; + latestNotice?: components['schemas']['NoticeResp']; + }; + ListRespDiagnosisResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['DiagnosisResp'][]; + }; + /** @description Q&A 채팅 이벤트 (SSE event name: chat) */ + QnAChatEvent: { + /** + * @description Q&A 채팅 이벤트 타입 + * @example CREATED + * @enum {string} + */ + type?: 'CREATED' | 'UPDATED' | 'DELETED'; /** * Format: int64 - * @description 스크랩 ID + * @description Q&A ID + * @example 1 */ - scrapId: number; - /** @description 필기 데이터 (Base64 인코딩) */ - data: string; + qnaId?: number; /** - * Format: date-time - * @description 필기 데이터 수정일시 (필기 없으면 null) + * Format: int64 + * @description 채팅 메시지 ID + * @example 123 */ - updatedAt?: string; - }; - /** @description 복원할 항목 목록 (폴더/스크랩 혼합) */ - Item: { + chatId?: number; /** * Format: int64 - * @description 항목 ID + * @description 발신자 ID * @example 1 */ - id: number; + senderId?: number; /** - * @description 항목 타입 (FOLDER/SCRAP) - * @example FOLDER + * @description 발신자 타입 + * @example STUDENT * @enum {string} */ - type: 'FOLDER' | 'SCRAP'; - }; - ScrapBatchRestoreRequest: { - /** @description 복원할 항목 목록 (폴더/스크랩 혼합) */ - items: components['schemas']['Item'][]; + senderType?: 'ADMIN' | 'STUDENT' | 'TEACHER'; + /** + * @description 메시지 내용 + * @example 안녕하세요 + */ + content?: string; + /** + * Format: int64 + * @description 답장 대상 메시지 ID (답장인 경우) + * @example 122 + */ + replyToId?: number | null; + /** + * Format: date-time + * @description 이벤트 발생 시간 + */ + timestamp?: string; }; - ScrapBatchMoveRequest: { - /** @description 이동할 스크랩 ID 목록 */ - scrapIds: number[]; + /** @description Q&A 읽음 상태 이벤트 (SSE event name: read_status) */ + QnAReadStatusEvent: { /** * Format: int64 - * @description 대상 폴더 ID (null이면 루트로 이동) - * @example 2 + * @description Q&A ID + * @example 1 + */ + qnaId?: number; + /** + * Format: int64 + * @description 읽은 사용자 ID + * @example 1 + */ + userId?: number; + /** + * @description 사용자 타입 + * @example TEACHER + * @enum {string} + */ + userType?: 'ADMIN' | 'STUDENT' | 'TEACHER'; + /** + * Format: date-time + * @description 읽은 시간 */ - targetFolderId?: number; - }; - ListRespScrapDetailResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['ScrapDetailResp'][]; + readAt?: string; }; - ScrapFolderUpdateRequest: { + /** @description 학생별 QnA 리스트 변경 이벤트 (SSE event name: qna_list) */ + QnAListEvent: { /** - * @description 폴더 이름 - * @example 기하 오답노트 + * @description 학생별 QnA 리스트 이벤트 타입 + * @example NEW_MESSAGE + * @enum {string} */ - name: string; + type?: 'NEW_MESSAGE' | 'UNREAD_COUNT_CHANGED' | 'MESSAGE_DELETED'; /** * Format: int64 - * @description 썸네일 이미지 ID + * @description 변경된 Q&A ID + * @example 1 */ - thumbnailImageId?: number; - }; - ScrapFolderThumbnailUpdateRequest: { + qnaId?: number; /** * Format: int64 - * @description 썸네일 이미지 ID (null이면 썸네일 삭제) + * @description 대상 학생 ID + * @example 123 */ - thumbnailImageId?: number; - }; - ScrapFolderNameUpdateRequest: { + studentId?: number; /** - * @description 폴더 이름 - * @example 기하 오답노트 + * Format: int32 + * @description 안읽은 메시지 수 + * @example 5 */ - name: string; + unreadCount?: number | null; + /** + * @description 최신 메시지 미리보기 + * @example 안녕하세요, 문제에 대해... + */ + latestMessagePreview?: string | null; + /** + * Format: date-time + * @description 이벤트 발생 시간 + */ + timestamp?: string; }; - QnAUpdateRequest: { - question: string; - files?: number[]; + ListRespAdminResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['AdminResp'][]; }; - StudentUpdateRequest: { - isGteFourteen?: boolean; - isAgreeServiceUsage?: boolean; - isAgreePersonalInformation?: boolean; - isAgreeReceiveMarketing?: boolean; - email?: string; - name?: string; - /** Format: date */ - birth?: string; - /** @enum {string} */ - gender?: 'MALE' | 'FEMALE'; - phoneNumber?: string; - /** @enum {string} */ - mobileCarrier?: 'KT' | 'SKT' | 'LG' | 'KT_MVNO' | 'SKT_MVNO' | 'LG_MVNO'; - /** Format: date-time */ - phoneNumberVerifiedAt?: string; - /** @enum {string} */ - grade?: 'ONE' | 'TWO' | 'THREE' | 'N_TIME'; - /** @enum {string} */ - selectSubject?: 'MIJUKBUN' | 'HWAKTONG' | 'KEEHA'; - /** Format: int64 */ - schoolId?: number; + PageRespTeacherResp: { + requestId: string; /** Format: int32 */ - level?: number; - nickname?: string; + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['TeacherResp'][]; }; - 'StudentPushDTO.UpdateSettingsRequest': { - /** @description 전체 푸시 알림 허용 여부 (마스터 토글) */ - isAllowPush?: boolean; - /** @description 서비스 알림 허용 여부 (학습 안내, 문장 등록 안내 등) */ - isAllowServicePush?: boolean; - /** @description QnA 채팅 알림 허용 여부 (출제진 피드백, 선생님 답변 알림 등) */ - isAllowQnaPush?: boolean; - /** @description 마케팅 알림 허용 여부 (이벤트 및 업데이트 관련 알림) */ - isAllowMarketingPush?: boolean; + PageRespStudentResp: { + requestId: string; + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['StudentResp'][]; }; - 'StudentPushDTO.SettingsResponse': { - /** @description 전체 푸시 알림 허용 여부 (마스터 토글) */ - isAllowPush?: boolean; - /** @description 서비스 알림 허용 여부 (학습 안내, 문장 등록 안내 등) */ - isAllowServicePush?: boolean; - /** @description QnA 채팅 알림 허용 여부 (출제진 피드백, 선생님 답변 알림 등) */ - isAllowQnaPush?: boolean; - /** @description 마케팅 알림 허용 여부 (이벤트 및 업데이트 관련 알림) */ - isAllowMarketingPush?: boolean; + AdminRoleResp: { + /** Format: int64 */ + id?: number; + name?: string; + menus?: components['schemas']['AdminMenuResp'][]; }; - TeacherUpdateRequest: { - name: string; - email: string; - newPassword?: string; + ListRespAdminRoleResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['AdminRoleResp'][]; }; - TeacherResp: { - /** Format: int64 */ - id: number; - name: string; - email: string; - students: components['schemas']['StudentResp'][]; - isAllowPush?: boolean; + ListRespPublishFocusCardLinkResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['PublishFocusCardLinkResp'][]; }; - TeacherStudentAssignReq: { - students: number[]; + PageRespProblemMetaResp: { + requestId: string; + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['ProblemMetaResp'][]; }; - PointingUpdateRequest: { - /** Format: int64 */ - id?: number; + ListRespProblemInfoResp: { + requestId: string; /** Format: int32 */ - no?: number; - questionContent?: string; - commentContent?: string; - concepts?: number[]; + total: number; + data: components['schemas']['ProblemInfoResp'][]; }; - ProblemUpdateRequest: { - /** @enum {string} */ - createType?: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; - /** Format: int64 */ - practiceTestId?: number; + ProblemCustomIdResp: { + customId?: string; + }; + PageRespProblemSetResp: { + requestId: string; /** Format: int32 */ - practiceTestNo?: number; + page: number; /** Format: int32 */ - no?: number; - title: string; - concepts?: number[]; - /** @enum {string} */ - answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; + size: number; /** Format: int32 */ - answer: number; + lastPage: number; + data: components['schemas']['ProblemSetResp'][]; + }; + PageRespPracticeTestResp: { + requestId: string; /** Format: int32 */ - difficulty: number; + page: number; /** Format: int32 */ - recommendedTimeSec: number; - memo?: string; - problemContent: string; - pointings?: components['schemas']['PointingUpdateRequest'][]; - /** Format: int64 */ - mainAnalysisImageId?: number; - /** Format: int64 */ - mainHandAnalysisImageId?: number; - readingTipContent?: string; - oneStepMoreContent?: string; + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['PracticeTestResp'][]; }; - ProblemInfoResp: { - /** Format: int64 */ - id: number; - /** @enum {string} */ - problemType: 'MAIN_PROBLEM' | 'CHILD_PROBLEM'; - /** Format: int64 */ - parentProblem?: number; - parentProblemTitle?: string; - customId: string; - /** @enum {string} */ - createType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; - practiceTest: components['schemas']['PracticeTestResp']; + ListRespMockExamResultResp: { + requestId: string; /** Format: int32 */ - practiceTestNo: number; - problemContent: string; - title: string; - /** @enum {string} */ - answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; + total: number; + data: components['schemas']['MockExamResultResp'][]; + }; + ListRespMockExamTypeResp: { + requestId: string; /** Format: int32 */ - answer: number; + total: number; + data: components['schemas']['MockExamTypeResp'][]; + }; + ListRespAdminMenuResp: { + requestId: string; /** Format: int32 */ - difficulty: number; + total: number; + data: components['schemas']['AdminMenuResp'][]; + }; + ListRespFocusCardResp: { + requestId: string; /** Format: int32 */ - recommendedTimeSec: number; - memo: string; - concepts: components['schemas']['ConceptResp'][]; - mainAnalysisImage: components['schemas']['UploadFileResp']; - mainHandAnalysisImage: components['schemas']['UploadFileResp']; - readingTipContent: string; - oneStepMoreContent: string; - pointings: components['schemas']['PointingResp'][]; - childProblems: components['schemas']['ProblemInfoResp'][]; + total: number; + data: components['schemas']['FocusCardResp'][]; }; - ProblemSetItemRequest: { + /** @description FCM 상태 응답 */ + FcmStatusResp: { + /** @description Firebase 초기화 상태 */ + initialized?: boolean; + }; + PageRespConceptResp: { + requestId: string; /** Format: int32 */ - no: number; - /** Format: int64 */ - problemId: number; + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['ConceptResp'][]; }; - ProblemSetUpdateRequest: { - title: string; - /** @enum {string} */ - status: 'CONFIRMED' | 'DOING'; - problems?: components['schemas']['ProblemSetItemRequest'][]; + PageRespConceptNodeResp: { + requestId: string; + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['ConceptNodeResp'][]; }; - ProblemSetItemResp: { - /** Format: int64 */ - id: number; + PageRespConceptEdgeResp: { + requestId: string; + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; /** Format: int32 */ - no: number; - problem: components['schemas']['ProblemMetaResp']; + lastPage: number; + data: components['schemas']['ConceptEdgeResp'][]; }; - ProblemSetResp: { - /** Format: int64 */ - id: number; - title: string; - /** @enum {string} */ - status: 'CONFIRMED' | 'DOING'; - firstProblem: components['schemas']['ProblemMetaResp']; - problems: components['schemas']['ProblemSetItemResp'][]; + ActionGraphSheetResp: { + columns?: components['schemas']['ActionEdgeTypeCodeResp'][]; + rows?: components['schemas']['Row'][]; + }; + Cell: { + roleCode?: string; + conceptNodes?: components['schemas']['ConceptNodeResp'][]; }; - Request: { + PageRespNotListActionGraphSheetResp: { + requestId: string; /** Format: int32 */ - year: number; + page: number; /** Format: int32 */ - month: number; + size: number; /** Format: int32 */ - grade: number; - name: string; + lastPage: number; + data: components['schemas']['ActionGraphSheetResp']; }; - DiagnosisUpdateReq: { - content?: string; + Row: { + actionNode?: components['schemas']['ConceptNodeResp']; + cells?: components['schemas']['Cell'][]; }; - DiagnosisResp: { - /** Format: int64 */ - id: number; - /** Format: int64 */ - studentId?: number; - /** Format: date-time */ - createdAt?: string; - content?: string; + ListRespConceptNodeResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['ConceptNodeResp'][]; }; - ConceptUpdateRequest: { - name: string; - /** Format: int64 */ - categoryId: number; + ListRespNodeTypeCodeResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['NodeTypeCodeResp'][]; }; - ConceptCategoryUpdateRequest: { - name: string; + ListRespConceptEdgeResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['ConceptEdgeResp'][]; }; - ChatCreateRequest: { - /** Format: int64 */ - qnaId: number; - content: string; - files?: number[]; - /** - * Format: int64 - * @description 답장 대상 채팅 ID - */ - replyToId?: number; + ListRespEdgeTypeCodeResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['EdgeTypeCodeResp'][]; }; - NoticeCreateRequest: { - title: string; - /** Format: date */ - startAt: string; - /** Format: date */ - endAt: string; - content: string; - /** Format: int64 */ - studentId: number; + ListRespActionEdgeTypeCodeResp: { + requestId: string; + /** Format: int32 */ + total: number; + data: components['schemas']['ActionEdgeTypeCodeResp'][]; }; - 'TeacherPushDTO.UpdateTokenRequest': { - fcmToken: string; + PageRespConceptCategoryResp: { + requestId: string; + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['ConceptCategoryResp'][]; }; - RefreshReq: { - refreshToken: string; + /** @description 디바이스별 통계 */ + FeatureStat: { + /** @description 기능 이름 */ + featureName?: string; + /** + * Format: int64 + * @description 사용 횟수 + */ + count?: number; + /** + * Format: double + * @description 비율 (0-100) + */ + percentage?: number; }; - JwtResp: { - accessToken: string; - refreshToken?: string; + /** @description 디바이스별 첫 기능 사용 통계 */ + FirstFeatureStatResp: { + /** @description 디바이스별 통계 */ + deviceStats?: { + [key: string]: components['schemas']['FeatureStat'][]; + }; }; - TeacherTokenResp: { - /** Format: int64 */ - id: number; - name: string; - email: string; - students: components['schemas']['StudentResp'][]; - isAllowPush?: boolean; - token?: components['schemas']['JwtResp']; + /** @description 일별 데이터 */ + DailyCount: { + /** + * Format: date + * @description 날짜 + */ + date?: string; + /** + * Format: int64 + * @description 풀이 수 + */ + count?: number; }; - TeacherLoginReq: { - email: string; - password: string; + /** @description 일별 문제 풀이 수 응답 */ + DailySolveCountResp: { + /** + * Format: int64 + * @description 학생 ID + */ + studentId?: number; + /** + * Format: date + * @description 조회 시작 날짜 + */ + startDate?: string; + /** + * Format: date + * @description 조회 종료 날짜 + */ + endDate?: string; + /** + * Format: int64 + * @description 총 풀이 수 + */ + totalCount?: number; + /** + * Format: double + * @description 일평균 풀이 수 + */ + averagePerDay?: number; + /** + * Format: double + * @description 표준편차 + */ + standardDeviation?: number; + /** @description 일별 데이터 */ + dailyCounts?: components['schemas']['DailyCount'][]; }; - PointingFeedbackRequest: { - /** Format: int64 */ - pointingId: number; + /** @description 개념태그별 정답/오답 히스토리 */ + ConceptHistoryResp: { /** * Format: int64 - * @description 발행(숙제) ID + * @description 학생 ID */ - publishId?: number; - /** @description 질문 이해 여부 */ - isQuestionUnderstood?: boolean; - /** @description 해설 이해 여부 */ - isCommentUnderstood?: boolean; + studentId?: number; + /** @description 개념별 히스토리 */ + conceptStats?: components['schemas']['ConceptStat'][]; + }; + /** @description 개념별 히스토리 */ + ConceptStat: { /** * Format: int64 - * @description 포인팅에 머무른 시간 (밀리초) + * @description 개념 ID */ - dwellTimeMs?: number; + conceptId?: number; + /** @description 개념 이름 */ + conceptName?: string; + /** + * Format: int32 + * @description 총 시도 횟수 + */ + totalAttempts?: number; + /** + * Format: int32 + * @description 정답 횟수 + */ + correctCount?: number; + /** + * Format: int32 + * @description 오답 횟수 + */ + incorrectCount?: number; + /** + * Format: double + * @description 정답률 (0-100) + */ + correctRate?: number; + /** + * Format: date + * @description 최근 시도 날짜 + */ + lastAttemptDate?: string; + }; + /** @description 세트별 완료율 응답 */ + CompletionRateResp: { /** * Format: int64 - * @description O/X 응답까지 걸린 시간 (밀리초) + * @description 문제 세트 ID */ - responseTimeMs?: number; + problemSetId?: number; + /** @description 세트 제목 */ + title?: string; + /** + * Format: int32 + * @description 총 문제 수 + */ + totalProblems?: number; + /** @description 학생별 완료율 */ + studentRates?: components['schemas']['StudentCompletionRate'][]; }; - SubmissionRequest: { - /** Format: int64 */ - publishId: number; - /** Format: int64 */ - problemId?: number; - /** Format: int32 */ - submitAnswer?: number; + /** @description 학생별 완료율 */ + StudentCompletionRate: { /** * Format: int64 - * @description 문항 풀이 시간 (밀리초) + * @description 학생 ID */ - solveTimeMs?: number; + studentId?: number; + /** @description 학생 이름 */ + studentName?: string; + /** + * Format: int32 + * @description 완료한 문제 수 + */ + completedCount?: number; + /** + * Format: double + * @description 완료율 (0-100) + */ + completionRate?: number; }; - SubmissionResp: { - /** @enum {string} */ - progress?: 'CORRECT' | 'INCORRECT' | 'SEMI_CORRECT' | 'NONE'; - /** Format: int32 */ - submitAnswer: number; - isCorrect: boolean; - isDone: boolean; + /** @description 접속 통계 응답 */ + AccessStatResp: { + /** + * Format: date + * @description 조회 시작 날짜 + */ + startDate?: string; /** - * Format: int32 - * @description 제출 횟수 + * Format: date + * @description 조회 종료 날짜 */ - attemptCount?: number; - }; - ScrapCreateRequest: { + endDate?: string; /** * Format: int64 - * @description 폴더 ID (null이면 루트에 생성) - * @example 1 + * @description 총 접속 수 */ - folderId?: number; + totalAccess?: number; /** * Format: int64 - * @description 문제 ID (null 가능 - 이미지만 스크랩 시) - * @example 123 + * @description 고유 사용자 수 */ - problemId?: number; + uniqueUsers?: number; + /** @description 일별 접속 수 */ + dailyAccess?: components['schemas']['DailyAccess'][]; + /** @description 요일별 접속 비율 */ + dayOfWeekRatio?: { + [key: string]: number; + }; + }; + /** @description 일별 접속 수 */ + DailyAccess: { /** - * Format: int64 - * @description 썸네일 이미지 ID - * @example 456 + * Format: date + * @description 날짜 */ - thumbnailImageId?: number; + date?: string; /** - * @description 텍스트 메모 - * @example 이 문제는 미적분 개념이 핵심 + * Format: int64 + * @description 접속 수 */ - textBox?: string; + count?: number; /** - * @description 포인팅 ID 목록 - * @example [ - * 1, - * 2, - * 3 - * ] + * Format: int64 + * @description 고유 사용자 수 */ - pointingIds?: number[]; + uniqueUsers?: number; }; - ScrapFromReadingTipCreateRequest: { + ScrapBatchDeleteRequest: { + /** @description 삭제할 항목 목록 (폴더/스크랩 혼합) */ + items: components['schemas']['Item'][]; + }; + ScrapBatchPermanentDeleteRequest: { + /** @description 영구 삭제할 항목 목록 (폴더/스크랩 혼합) */ + items: components['schemas']['Item'][]; + }; + UnscrapFromProblemRequest: { /** * Format: int64 * @description 문제 ID * @example 123 */ problemId: number; + }; + UnscrapFromPointingRequest: { /** * Format: int64 - * @description 폴더 ID (null이면 루트에 생성) - * @example 1 + * @description 포인팅 ID + * @example 456 */ - folderId?: number; + pointingId: number; }; - /** @description 스크랩 토글 응답 */ - ScrapToggleResp: { - /** @description 토글 후 스크랩 상태 (true: 스크랩됨, false: 스크랩 취소됨) */ - isScraped: boolean; - scrap?: components['schemas']['ScrapDetailResp']; + ErrorResp: { + code?: string; + message?: string; + path?: string; + /** Format: date-time */ + timestamp?: string; + requestId?: string; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + updateStatus: { + parameters: { + query?: never; + header?: never; + path: { + qnaId: number; + }; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['QnAStatusUpdateDTO']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; + }; + }; + updateChat: { + parameters: { + query?: never; + header?: never; + path: { + chatId: number; + }; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['ChatUpdateRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; + }; + }; + deleteChat: { + parameters: { + query?: never; + header?: never; + path: { + chatId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; + }; + }; + update: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['NoticeUpdateRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['NoticeResp']; + }; + }; + }; + }; + delete: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + getPushSettings: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['TeacherPushDTO.SettingsResponse']; + }; + }; + }; + }; + updatePushSettings: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['TeacherPushDTO.UpdateSettingsRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['TeacherPushDTO.SettingsResponse']; + }; + }; + }; + }; + getHandwriting: { + parameters: { + query?: never; + header?: never; + path: { + publishId: number; + problemId: number; + }; + cookie?: never; }; - ScrapFromProblemCreateRequest: { - /** - * Format: int64 - * @description 문제 ID - * @example 123 - */ - problemId: number; - /** - * Format: int64 - * @description 폴더 ID (null이면 루트에 생성) - * @example 1 - */ - folderId?: number; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['StudyHandwritingResp']; + }; + }; }; - ScrapFromPointingCreateRequest: { - /** - * Format: int64 - * @description 포인팅 ID - * @example 456 - */ - pointingId: number; - /** - * Format: int64 - * @description 폴더 ID (null이면 루트에 생성) - * @example 1 - */ - folderId?: number; + }; + updateHandwriting: { + parameters: { + query?: never; + header?: never; + path: { + publishId: number; + problemId: number; + }; + cookie?: never; }; - ScrapFromOneStepMoreCreateRequest: { - /** - * Format: int64 - * @description 문제 ID - * @example 123 - */ - problemId: number; - /** - * Format: int64 - * @description 폴더 ID (null이면 루트에 생성) - * @example 1 - */ - folderId?: number; + requestBody: { + content: { + 'application/json': components['schemas']['StudyHandwritingUpdateRequest']; + }; }; - ScrapFromImageCreateRequest: { - /** - * Format: int64 - * @description 이미지 ID - * @example 789 - */ - imageId: number; - /** - * Format: int64 - * @description 폴더 ID (null이면 루트에 생성) - * @example 1 - */ - folderId?: number; - /** - * @description 텍스트 메모 - * @example 외부 문제 스크랩 - */ - textBox?: string; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['StudyHandwritingResp']; + }; + }; }; - ScrapFolderCreateRequest: { - /** - * @description 폴더 이름 - * @example 수학 오답노트 - */ - name: string; - /** - * Format: int64 - * @description 썸네일 이미지 ID - */ - thumbnailImageId?: number; + }; + deleteHandwriting: { + parameters: { + query?: never; + header?: never; + path: { + publishId: number; + problemId: number; + }; + cookie?: never; }; - /** @description problemId, childProblemId, pointingId 중 하나만 입력 가능 */ - QnACreateRequest: { - /** Format: int64 */ - publishId: number; - /** @enum {string} */ - type: - | 'PROBLEM_CONTENT' - | 'PROBLEM_POINTING_QUESTION' - | 'PROBLEM_POINTING_COMMENT' - | 'PROBLEM_MAIN_ANALYSIS' - | 'PROBLEM_MAIN_HAND_ANALYSIS' - | 'PROBLEM_READING_TIP_CONTENT' - | 'PROBLEM_ONE_STEP_MORE' - | 'CHILD_PROBLEM_CONTENT' - | 'CHILD_PROBLEM_POINTING_QUESTION' - | 'CHILD_PROBLEM_POINTING_COMMENT' - | 'ADMIN_CHAT'; - /** Format: int64 */ - problemId?: number; - /** Format: int64 */ - pointingId?: number; - question: string; - files?: number[]; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - QnACheckRequest: { - /** Format: int64 */ - publishId: number; - /** @enum {string} */ - type: - | 'PROBLEM_CONTENT' - | 'PROBLEM_POINTING_QUESTION' - | 'PROBLEM_POINTING_COMMENT' - | 'PROBLEM_MAIN_ANALYSIS' - | 'PROBLEM_MAIN_HAND_ANALYSIS' - | 'PROBLEM_READING_TIP_CONTENT' - | 'PROBLEM_ONE_STEP_MORE' - | 'CHILD_PROBLEM_CONTENT' - | 'CHILD_PROBLEM_POINTING_QUESTION' - | 'CHILD_PROBLEM_POINTING_COMMENT' - | 'ADMIN_CHAT'; - /** - * Format: int64 - * @description 메인문제ID(메인 문제에 대한 질문일 경우) - */ - problemId?: number; - /** - * Format: int64 - * @description 포인팅ID(포인팅에 대한 질문일 경우) - */ - pointingId?: number; + }; + updateScrap: { + parameters: { + query?: never; + header?: never; + path: { + scrapId: number; + }; + cookie?: never; }; - QnACheckResp: { - /** Format: int64 */ - id: number; - isExist: boolean; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapUpdateRequest']; + }; }; - NotificationResp: { - /** Format: int64 */ - id: number; - /** Format: int64 */ - studentId: number; - studentName?: string; - /** @enum {string} */ - type: 'ASSIGNMENT' | 'SYSTEM' | 'QNA' | 'MARKETING'; - title: string; - /** Format: int64 */ - payload?: number; - url?: string; - isRead: boolean; - /** Format: date-time */ - createdAt: string; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ScrapDetailResp']; + }; + }; }; - 'StudentPushDTO.UpdateTokenRequest': { - fcmToken: string; + }; + updateScrapThumbnail: { + parameters: { + query?: never; + header?: never; + path: { + scrapId: number; + }; + cookie?: never; }; - 'StudentPushDTO.InitPushRequest': { - /** @description 푸시 허용 여부 (true: 전체 허용, false: 전체 차단) */ - allow: boolean; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapThumbnailUpdateRequest']; + }; }; - 'StudentPasswordDTO.UpdatePasswordRequest': { - newPassword: string; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ScrapDetailResp']; + }; + }; }; - 'FeedbackDTO.Request': { - /** @description 피드백 내용 (최소 10자 이상) */ - content: string; + }; + updateScrapText: { + parameters: { + query?: never; + header?: never; + path: { + scrapId: number; + }; + cookie?: never; }; - StudentSignupReq: { - email: string; - password: string; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapTextBoxUpdateRequest']; + }; }; - StudentTokenResp: { - /** Format: int64 */ - id: number; - isGteFourteen?: boolean; - isAgreeServiceUsage?: boolean; - isAgreePersonalInformation?: boolean; - isAgreeReceiveMarketing?: boolean; - /** Format: date-time */ - agreeAt?: string; - email: string; - name: string; - /** Format: date */ - birth?: string; - /** @enum {string} */ - gender?: 'MALE' | 'FEMALE'; - phoneNumber?: string; - /** @enum {string} */ - mobileCarrier?: 'KT' | 'SKT' | 'LG' | 'KT_MVNO' | 'SKT_MVNO' | 'LG_MVNO'; - /** Format: date-time */ - phoneNumberVerifiedAt?: string; - /** @enum {string} */ - grade: 'ONE' | 'TWO' | 'THREE' | 'N_TIME'; - /** @enum {string} */ - selectSubject?: 'MIJUKBUN' | 'HWAKTONG' | 'KEEHA'; - school?: components['schemas']['SchoolResp']; - /** Format: int32 */ - level?: number; - nickname?: string; - isAllowPush?: boolean; - /** @enum {string} */ - provider?: 'KAKAO' | 'GOOGLE' | 'APPLE'; - isFirstLogin: boolean; - /** Format: int64 */ - teacherId?: number; - teacherName?: string; - token: components['schemas']['JwtResp']; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ScrapDetailResp']; + }; + }; }; - 'StudentInitialRegisterDTO.Req': { - isGteFourteen: boolean; - isAgreeServiceUsage: boolean; - isAgreePersonalInformation: boolean; - isAgreeReceiveMarketing?: boolean; - email?: string; - name: string; - /** Format: date */ - birth?: string; - /** @enum {string} */ - gender?: 'MALE' | 'FEMALE'; - phoneNumber?: string; - /** @enum {string} */ - mobileCarrier?: 'KT' | 'SKT' | 'LG' | 'KT_MVNO' | 'SKT_MVNO' | 'LG_MVNO'; - /** Format: date-time */ - phoneNumberVerifiedAt?: string; - /** @enum {string} */ - grade: 'ONE' | 'TWO' | 'THREE' | 'N_TIME'; - /** @enum {string} */ - selectSubject?: 'MIJUKBUN' | 'HWAKTONG' | 'KEEHA'; - /** Format: int64 */ - schoolId?: number; - /** Format: int32 */ - level?: number; - nickname?: string; + }; + updateScrapName: { + parameters: { + query?: never; + header?: never; + path: { + scrapId: number; + }; + cookie?: never; }; - 'WithdrawDTO.Request': { - /** @description 탈퇴 사유 목록 (복수 선택 가능) */ - reasons: ( - | 'DIFFICULT_TO_USE' - | 'NOT_HELPFUL' - | 'LACK_OF_FEATURES' - | 'NO_LONGER_NEEDED' - | 'OTHER' - )[]; - /** @description 기타 사유 (OTHER 선택 시 입력, 선택) */ - otherReason?: string; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapNameUpdateRequest']; + }; }; - 'PasswordResetDTO.ResetPasswordRequest': { - /** @description 이메일 */ - email: string; - /** @description 인증 코드 (6자리) */ - code: string; - /** @description 새 비밀번호 */ - newPassword: string; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ScrapDetailResp']; + }; + }; }; - 'PasswordResetDTO.VerifyCodeRequest': { - /** @description 이메일 */ - email: string; - /** @description 인증 코드 (6자리) */ - code: string; + }; + getHandwriting_1: { + parameters: { + query?: never; + header?: never; + path: { + scrapId: number; + }; + cookie?: never; }; - BooleanResp: { - value: boolean; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ScrapHandwritingResp']; + }; + }; }; - 'PasswordResetDTO.SendCodeRequest': { - /** @description 이메일 */ - email: string; + }; + updateHandwriting_1: { + parameters: { + query?: never; + header?: never; + path: { + scrapId: number; + }; + cookie?: never; }; - SocialLoginReq: { - /** @enum {string} */ - provider: 'KAKAO' | 'GOOGLE' | 'APPLE'; - redirectUri: string; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapHandwritingUpdateRequest']; + }; }; - SocialLoginUrlResp: { - /** @enum {string} */ - provider: 'KAKAO' | 'GOOGLE' | 'APPLE'; - loginUrl: string; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ScrapHandwritingResp']; + }; + }; }; - StudentLoginReq: { - /** @description 이메일 */ - email: string; - /** @description 비밀번호 */ - password: string; + }; + deleteHandwriting_1: { + parameters: { + query?: never; + header?: never; + path: { + scrapId: number; + }; + cookie?: never; }; - PreSignedReq: { - fileName: string; - /** - * @description 파일 유형 (지정하지 않으면 서버가 확장자로 판단) - * @enum {string} - */ - fileType?: 'IMAGE' | 'DOCUMENT' | 'OTHER'; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - PreSignedResp: { - file: components['schemas']['UploadFileResp']; - contentDisposition: string; - uploadUrl: string; + }; + restoreTrash: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - /** @description 휴대폰 인증 코드 검증 요청 */ - PhoneAuthVerifyRequest: { - /** @description 휴대폰 번호 */ - phone: string; - /** @description 인증 용도 (예: signup, reset-password 등) */ - purpose?: string; - /** @description 인증 코드 */ - code: string; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapBatchRestoreRequest']; + }; }; - SimpleSuccessResp: { - success?: boolean; - message?: string; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - /** @description 휴대폰 인증 코드 발송 요청 */ - PhoneAuthSendRequest: { - /** @description 휴대폰 번호 */ - phone: string; - /** @description 인증 용도 (예: signup, reset-password 등) */ - purpose?: string; + }; + moveScraps: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - /** @description 휴대폰 인증 코드 재발송 요청 */ - PhoneAuthResendRequest: { - /** @description 휴대폰 번호 */ - phone: string; - /** @description 인증 용도 (예: signup, reset-password 등) */ - purpose?: string; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapBatchMoveRequest']; + }; }; - /** @description 클라이언트 이벤트 배치 요청 */ - UserEventBatchRequest: { - /** @description 이벤트 목록 */ - events: components['schemas']['UserEventRequest'][]; - /** @description 클라이언트 세션 ID */ - sessionId: string; - /** - * @description 디바이스 타입 - * @enum {string} - */ - deviceType?: 'TABLET' | 'MOBILE' | 'DESKTOP' | 'UNKNOWN'; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ListRespScrapDetailResp']; + }; + }; }; - /** @description 개별 사용자 이벤트 */ - UserEventRequest: { - /** - * @description 이벤트 타입 - * @enum {string} - */ - eventType: - | 'SCREEN_ENTER' - | 'SCREEN_EXIT' - | 'BUTTON_CLICK' - | 'STUDY_START' - | 'STUDY_END' - | 'PROBLEM_VIEW' - | 'POINTING_VIEW' - | 'SESSION_START' - | 'SESSION_END'; - /** - * Format: date-time - * @description 이벤트 발생 시각 - */ - occurredAt: string; - /** - * @description 이벤트 추가 데이터. 이벤트 타입별 권장 필드는 API 설명을 참고하세요. - * @example { - * "screenName": "Problem", - * "dwellTimeMs": 120000, - * "exitReason": "navigation" - * } - */ - metadata?: { - [key: string]: Record; + }; + getFolderDetail: { + parameters: { + query?: never; + header?: never; + path: { + id: number; }; - /** @description 클라이언트에서 생성한 이벤트 고유 ID (중복 방지용) */ - clientEventId?: string; + cookie?: never; }; - AdminCreateRequest: { - email: string; - password: string; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ScrapFolderResp']; + }; + }; }; - TeacherCreateRequest: { - name: string; - email: string; - password: string; + }; + updateFolder: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - SchoolSaveRespDTO: { - /** Format: int32 */ - count?: number; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapFolderUpdateRequest']; + }; }; - PublishCreateRequest: { - /** Format: int64 */ - problemSetId: number; - /** Format: int64 */ - studentId: number; - /** Format: date */ - publishAt: string; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ScrapFolderResp']; + }; + }; }; - /** @description 마지막 진행 상태 정보 */ - LastProgressInfo: { - /** - * Format: int64 - * @description 마지막 답변한 포인팅 ID - */ - lastAnsweredPointingId?: number; - /** - * Format: int32 - * @description 마지막 답변한 포인팅 번호 (no 기준) - */ - lastAnsweredPointingNo?: number; - /** - * Format: int64 - * @description 마지막 푼 문제 ID - */ - lastSolvedProblemId?: number; - /** - * Format: int32 - * @description 마지막 푼 새끼 문제 번호 (no 기준, null이면 새끼문제 없음) - */ - lastSolvedChildProblemNo?: number; - /** @description 메인 문제 풀이 여부 */ - isMainProblemSolved?: boolean; - /** - * Format: int32 - * @description 푼 새끼 문제 수 - */ - solvedChildProblemCount?: number; - /** - * Format: int32 - * @description 전체 새끼 문제 수 - */ - totalChildProblemCount?: number; - /** - * Format: int32 - * @description 답변한 포인팅 수 - */ - answeredPointingCount?: number; - /** - * Format: int32 - * @description 전체 포인팅 수 - */ - totalPointingCount?: number; + }; + updateFolderThumbnail: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - PointingWithFeedbackResp: { - /** Format: int64 */ - id: number; - /** Format: int32 */ - no: number; - questionContent: string; - commentContent: string; - concepts: components['schemas']['ConceptResp'][]; - isQuestionUnderstood?: boolean; - isCommentUnderstood?: boolean; - isScrapped?: boolean; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapFolderThumbnailUpdateRequest']; + }; }; - ProblemRef: { - /** - * Format: int64 - * @description 부모문제인 경우 -> 첫 새끼문제, 새끼문제일 경우 -> 다음 새끼문제 - */ - prevChildId?: number; - /** - * Format: int64 - * @description 새끼문제일 경우에만 다음 새끼문제 - */ - nextChildId?: number; - /** - * Format: int64 - * @description 새끼문제일 경우에만 부모문제Id - */ - parentId?: number; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ScrapFolderResp']; + }; + }; }; - /** @description 문제별 스크랩 정보 */ - ProblemScrapInfo: { - /** - * Format: int64 - * @description 스크랩 ID (스크랩이 없으면 null) - * @example 123 - */ - scrapId?: number; - /** - * @description 문제 스크랩 여부 - * @example true - */ - isProblemScrapped?: boolean; - /** - * @description 리딩팁 스크랩 여부 - * @example false - */ - isReadingTipScrapped?: boolean; - /** - * @description 원스텝모어 스크랩 여부 - * @example true - */ - isOneStepMoreScrapped?: boolean; - /** - * @description 오답 여부 - * @example false - */ - isWrongAnswer?: boolean; - /** - * @description 스크랩된 포인팅 ID 목록 - * @example [ - * 1, - * 2, - * 3 - * ] - */ - scrappedPointingIds?: number[]; + }; + updateFolderName: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - ProblemWithStudyInfoResp: { - /** Format: int32 */ - no?: number; - /** Format: int64 */ - id: number; - /** @enum {string} */ - problemType: 'MAIN_PROBLEM' | 'CHILD_PROBLEM'; - /** Format: int64 */ - parentProblem?: number; - parentProblemTitle?: string; - customId: string; - /** @enum {string} */ - createType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; - practiceTest: components['schemas']['PracticeTestResp']; - /** Format: int32 */ - practiceTestNo: number; - problemContent: string; - title: string; - /** @enum {string} */ - answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; - /** Format: int32 */ - answer: number; - /** Format: int32 */ - difficulty: number; - /** Format: int32 */ - recommendedTimeSec: number; - memo: string; - concepts: components['schemas']['ConceptResp'][]; - mainAnalysisImage: components['schemas']['UploadFileResp']; - mainHandAnalysisImage: components['schemas']['UploadFileResp']; - readingTipContent: string; - oneStepMoreContent: string; - studentDisplayParentName?: string; - studentDisplayName?: string; - pointings: components['schemas']['PointingWithFeedbackResp'][]; - /** @enum {string} */ - progress?: 'CORRECT' | 'INCORRECT' | 'SEMI_CORRECT' | 'NONE'; - /** Format: int32 */ - submitAnswer: number; - isCorrect: boolean; - isDone: boolean; - /** - * Format: int32 - * @description 제출 횟수 - */ - attemptCount?: number; - scrapInfo?: components['schemas']['ProblemScrapInfo']; - childProblems: components['schemas']['ProblemWithStudyInfoResp'][]; - ref?: components['schemas']['ProblemRef']; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapFolderNameUpdateRequest']; + }; }; - PublishProblemGroupResp: { - /** Format: int32 */ - no: number; - /** Format: int64 */ - problemId: number; - /** @enum {string} */ - progress: 'DONE' | 'DOING' | 'NONE'; - problem: components['schemas']['ProblemWithStudyInfoResp']; - childProblems: components['schemas']['ProblemWithStudyInfoResp'][]; - lastProgressInfo?: components['schemas']['LastProgressInfo']; - /** - * Format: int32 - * @description 메인 문제 제출 횟수 - */ - attemptCount?: number; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ScrapFolderResp']; + }; + }; }; - PublishResp: { - /** Format: int64 */ - id: number; - /** Format: date */ - publishAt: string; - /** @enum {string} */ - progress: 'DONE' | 'DOING' | 'NONE'; - problemSet: components['schemas']['ProblemSetResp']; - data: components['schemas']['PublishProblemGroupResp'][]; + }; + getById: { + parameters: { + query?: never; + header?: never; + path: { + qnaId: number; + }; + cookie?: never; }; - PointingCreateRequest: { - /** Format: int32 */ - no?: number; - questionContent?: string; - commentContent?: string; - concepts?: number[]; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; }; - ProblemCreateRequest: { - /** @enum {string} */ - createType?: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; - /** Format: int64 */ - practiceTestId?: number; - /** Format: int32 */ - practiceTestNo?: number; - /** Format: int32 */ - no?: number; - /** @enum {string} */ - problemType: 'MAIN_PROBLEM' | 'CHILD_PROBLEM'; - title: string; - concepts?: number[]; - /** @enum {string} */ - answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; - /** Format: int32 */ - answer: number; - /** Format: int32 */ - difficulty: number; - /** Format: int32 */ - recommendedTimeSec: number; - memo?: string; - problemContent: string; - pointings?: components['schemas']['PointingCreateRequest'][]; - /** Format: int64 */ - mainAnalysisImageId?: number; - /** Format: int64 */ - mainHandAnalysisImageId?: number; - readingTipContent?: string; - oneStepMoreContent?: string; + }; + update_1: { + parameters: { + query?: never; + header?: never; + path: { + qnaId: number; + }; + cookie?: never; }; - ProblemEntireCreateRequest: { - childProblems?: components['schemas']['ProblemCreateRequest'][]; + requestBody: { + content: { + 'application/json': components['schemas']['QnAUpdateRequest']; + }; }; - ProblemSetCreateRequest: { - title: string; - problems?: components['schemas']['ProblemSetItemRequest'][]; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; }; - PracticeTestCreateRequest: { - /** Format: int32 */ - year: number; - /** Format: int32 */ - month: number; - /** Format: int32 */ - grade: number; - name: string; + }; + delete_1: { + parameters: { + query?: never; + header?: never; + path: { + qnaId: number; + }; + cookie?: never; }; - NotificationSendRequest: { - /** - * @description 알림 종류 - * @enum {string} - */ - type: 'ASSIGNMENT' | 'SYSTEM' | 'QNA' | 'MARKETING'; - /** @description 알림 제목 */ - title: string; - /** - * Format: int64 - * @description 페이로드 (관련 리소스 ID) - */ - payload?: number; - /** @description 앱 딥링크 URL */ - url?: string; - /** @description 전체 학생 발송 여부 */ - isAll: boolean; - /** @description 발송 대상 학생 ID 리스트 (isAll=false일 때 필수) */ - studentIds?: number[]; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + updateStatus_1: { + parameters: { + query?: never; + header?: never; + path: { + qnaId: number; + }; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['QnAStatusUpdateDTO']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; + }; + }; + updateChat_1: { + parameters: { + query?: never; + header?: never; + path: { + chatId: number; + }; + cookie?: never; }; - NotificationSendResp: { - /** - * Format: int32 - * @description 발송 대상 학생 수 - */ - targetCount: number; - /** - * Format: int32 - * @description 알림 저장 성공 수 - */ - savedCount: number; - /** - * Format: int32 - * @description FCM 발송 시도 수 - */ - fcmAttemptCount: number; - /** @description FCM 지원 여부 */ - fcmSupported: boolean; + requestBody: { + content: { + 'application/json': components['schemas']['ChatUpdateRequest']; + }; }; - /** @description FCM 테스트 발송 요청 */ - FcmTestReq: { - /** - * @description FCM 토큰 - * @example dGVzdC10b2tlbi1mb3ItZmNtLXB1c2gtbm90aWZpY2F0aW9u - */ - token: string; - /** - * @description 알림 제목 - * @example 테스트 알림 - */ - title: string; - /** - * @description 알림 내용 - * @example FCM 푸시 테스트 메시지입니다. - */ - body: string; - /** - * @description 클릭 시 이동할 URL (선택) - * @example /home - */ - url?: string; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; }; - /** @description FCM 테스트 발송 응답 */ - FcmTestResp: { - /** @description 발송 성공 여부 */ - success?: boolean; - /** @description 결과 메시지 */ - message?: string; - /** @description 에러 상세 (실패 시) */ - errorDetail?: string; + }; + deleteChat_1: { + parameters: { + query?: never; + header?: never; + path: { + chatId: number; + }; + cookie?: never; }; - DiagnosisCreateReq: { - /** Format: int64 */ - studentId?: number; - content?: string; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; }; - ConceptCreateRequest: { - name: string; - /** Format: int64 */ - categoryId: number; + }; + readNotice: { + parameters: { + query?: never; + header?: never; + path: { + noticeId: number; + }; + cookie?: never; }; - ConceptCategoryCreateRequest: { - name: string; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['NoticeResp']; + }; + }; }; - AdminTokenResp: { - /** Format: int64 */ - id: number; - email: string; - token: components['schemas']['JwtResp']; + }; + me: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - AdminLoginReq: { - email: string; - password: string; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['StudentResp']; + }; + }; }; - ListRespPublishResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['PublishResp'][]; + }; + update_2: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - PublishStudentProgressResp: { - /** Format: double */ - progress: number; + requestBody: { + content: { + 'application/json': components['schemas']['StudentUpdateRequest']; + }; }; - ListRespStudentResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['StudentResp'][]; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['StudentResp']; + }; + }; }; - PageRespNotListQnAGroupByWeekResp: { - /** Format: int32 */ - page: number; - /** Format: int32 */ - size: number; - /** Format: int32 */ - lastPage: number; - data: components['schemas']['QnAGroupByWeekResp']; + }; + getPushSettings_1: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - QnAGroupByWeekResp: { - groups?: components['schemas']['QnAGroupItem'][]; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['StudentPushDTO.SettingsResponse']; + }; + }; }; - QnAGroupItem: { - /** Format: int32 */ - order?: number; - weekName?: string; - data?: components['schemas']['QnAMetaResp'][]; + }; + updatePushSettings_1: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - ChatSearchResultResp: { - /** Format: int64 */ - qnaId?: number; - qnaTitle?: string; - /** @enum {string} */ - qnaType?: - | 'PROBLEM_CONTENT' - | 'PROBLEM_POINTING_QUESTION' - | 'PROBLEM_POINTING_COMMENT' - | 'PROBLEM_MAIN_ANALYSIS' - | 'PROBLEM_MAIN_HAND_ANALYSIS' - | 'PROBLEM_READING_TIP_CONTENT' - | 'PROBLEM_ONE_STEP_MORE' - | 'CHILD_PROBLEM_CONTENT' - | 'CHILD_PROBLEM_POINTING_QUESTION' - | 'CHILD_PROBLEM_POINTING_COMMENT' - | 'ADMIN_CHAT'; - /** @enum {string} */ - qnaStatus?: 'QUESTIONING' | 'RESOLVED'; - /** Format: date */ - publishDate?: string; - /** Format: int64 */ - matchedChatId?: number; - matchedChatPreview?: string; + requestBody: { + content: { + 'application/json': components['schemas']['StudentPushDTO.UpdateSettingsRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['StudentPushDTO.SettingsResponse']; + }; + }; + }; + }; + findById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - PageRespNotListListChatSearchResultResp: { - /** Format: int32 */ - page: number; - /** Format: int32 */ - size: number; - /** Format: int32 */ - lastPage: number; - data: components['schemas']['ChatSearchResultResp'][]; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['AdminResp']; + }; + }; }; - QnASearchResp: { - qnaResults?: components['schemas']['PageRespNotListQnAGroupByWeekResp']; - chatResults?: components['schemas']['PageRespNotListListChatSearchResultResp']; + }; + update_3: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - ListRespNoticeResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['NoticeResp'][]; + requestBody: { + content: { + 'application/json': components['schemas']['AdminUpdateRequest']; + }; }; - ListRespProblemEntireResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['ProblemEntireResp'][]; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - ProblemEntireResp: { - /** - * Format: int64 - * @description 문제 ID - */ - problemId: number; - /** @description 부모문제 여부 (true: 부모문제, false: 새끼문제) */ - isParent: boolean; - /** Format: int64 */ - id: number; - /** @enum {string} */ - problemType: 'MAIN_PROBLEM' | 'CHILD_PROBLEM'; - /** Format: int64 */ - parentProblem?: number; - parentProblemTitle?: string; - customId: string; - /** @enum {string} */ - createType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; - practiceTest: components['schemas']['PracticeTestResp']; - /** Format: int32 */ - practiceTestNo: number; - problemContent: string; - title: string; - /** @enum {string} */ - answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; - /** Format: int32 */ - answer: number; - /** Format: int32 */ - difficulty: number; - /** Format: int32 */ - recommendedTimeSec: number; - memo: string; - concepts: components['schemas']['ConceptResp'][]; - mainAnalysisImage: components['schemas']['UploadFileResp']; - mainHandAnalysisImage: components['schemas']['UploadFileResp']; - readingTipContent: string; - oneStepMoreContent: string; + }; + delete_2: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - ListRespPointingEntireResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['PointingEntireResp'][]; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - PointingEntireResp: { - /** - * Format: int64 - * @description 포인팅이 속한 문제 ID - */ - problemId: number; - /** @description 부모문제 여부 (true: 부모문제, false: 새끼문제) */ - isParent: boolean; - /** Format: int64 */ - id: number; - /** Format: int32 */ - no: number; - questionContent: string; - commentContent: string; - concepts: components['schemas']['ConceptResp'][]; - isQuestionUnderstood?: boolean; - isCommentUnderstood?: boolean; - isScrapped?: boolean; + }; + assignRole: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - ListRespTrashItemResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['TrashItemResp'][]; + requestBody: { + content: { + 'application/json': components['schemas']['AdminRoleAssignRequest']; + }; }; - /** @description 휴지통 항목 */ - TrashItemResp: { - /** - * Format: int64 - * @description 항목 ID - */ - id: number; - /** - * @description 항목 유형 (FOLDER/SCRAP) - * @enum {string} - */ - type: 'FOLDER' | 'SCRAP'; - /** @description 항목 이름 (폴더명 또는 문제 제목) */ - name: string; - /** - * Format: int32 - * @description 포함된 스크랩 수 (폴더인 경우) - */ - itemCount?: number; - /** @description 썸네일 URL (스크랩: 스크랩 썸네일, 폴더: 폴더 썸네일) */ - thumbnailUrl?: string; - /** @description 최근 스크랩 2개의 썸네일 URL (폴더인 경우) */ - top2ScrapThumbnail?: string[]; - /** - * Format: date-time - * @description 삭제일시 - */ - deletedAt: string; - /** - * Format: int32 - * @description 영구삭제까지 남은 일수 - */ - daysUntilPermanentDelete: number; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - /** @description 스크랩/폴더 목록 아이템 */ - ScrapListItemResp: { - /** - * @description 유형 (FOLDER/SCRAP) - * @enum {string} - */ - type: 'FOLDER' | 'SCRAP'; - /** - * Format: int64 - * @description 아이템 ID - */ - id: number; - /** @description 표시 이름 (폴더명 또는 문제 제목) */ - name: string; - /** - * Format: int64 - * @description 폴더 ID (스크랩일 때) - */ - folderId?: number; - /** @description 썸네일 URL (스크랩일 때) */ - thumbnailUrl?: string; - /** @description 오답 스크랩 여부 (스크랩일 때) */ - isWrongAnswer?: boolean; - /** - * Format: date-time - * @description 생성일시 - */ - createdAt: string; - /** - * Format: date-time - * @description 수정일시 - */ - updatedAt: string; + }; + update_4: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - /** @description 스크랩 검색 응답 */ - ScrapSearchResp: { - /** @description 검색된 폴더 목록 */ - folders: components['schemas']['ScrapFolderResp'][]; - /** @description 검색된 스크랩 목록 */ - scraps: components['schemas']['ScrapListItemResp'][]; + requestBody: { + content: { + 'application/json': components['schemas']['TeacherUpdateRequest']; + }; }; - ListRespScrapFolderResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['ScrapFolderResp'][]; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['TeacherResp']; + }; + }; }; - ListRespScrapListItemResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['ScrapListItemResp'][]; + }; + assignStudentsToTeacher: { + parameters: { + query?: never; + header?: never; + path: { + teacherId: number; + }; + cookie?: never; }; - ListRespSchoolResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['SchoolResp'][]; + requestBody: { + content: { + 'application/json': components['schemas']['TeacherStudentAssignReq']; + }; }; - ListRespUploadFileResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['UploadFileResp'][]; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['TeacherResp']; + }; + }; }; - ListRespQnaFileResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['QnaFileResp'][]; + }; + update_5: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - QnaFileResp: { - /** Format: int64 */ - id: number; - fileName: string; - url: string; - /** @enum {string} */ - fileType: 'IMAGE' | 'DOCUMENT' | 'OTHER'; - /** @description 스크랩 여부 */ - isScrapped: boolean; + requestBody: { + content: { + 'application/json': components['schemas']['AdminRoleUpdateRequest']; + }; }; - ListRespNotificationResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['NotificationResp'][]; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - NotificationUnreadCountResp: { - /** - * Format: int32 - * @description 전체 알림 개수 - */ - totalCount: number; - /** - * Format: int32 - * @description 읽지 않은 알림 개수 - */ - unreadCount: number; - latestNotification?: components['schemas']['NotificationResp']; + }; + delete_3: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - PageRespNoticeResp: { - /** Format: int32 */ - page: number; - /** Format: int32 */ - size: number; - /** Format: int32 */ - lastPage: number; - data: components['schemas']['NoticeResp'][]; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - NoticeUnreadCountResp: { - /** Format: int64 */ - totalCount?: number; - /** Format: int64 */ - unreadCount?: number; - latestNotice?: components['schemas']['NoticeResp']; + }; + updateStatus_2: { + parameters: { + query?: never; + header?: never; + path: { + qnaId: number; + }; + cookie?: never; }; - ListRespDiagnosisResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['DiagnosisResp'][]; + requestBody: { + content: { + 'application/json': components['schemas']['QnAStatusUpdateDTO']; + }; }; - /** @description Q&A 채팅 이벤트 (SSE event name: chat) */ - QnAChatEvent: { - /** - * @description Q&A 채팅 이벤트 타입 - * @example CREATED - * @enum {string} - */ - type?: 'CREATED' | 'UPDATED' | 'DELETED'; - /** - * Format: int64 - * @description Q&A ID - * @example 1 - */ - qnaId?: number; - /** - * Format: int64 - * @description 채팅 메시지 ID - * @example 123 - */ - chatId?: number; - /** - * Format: int64 - * @description 발신자 ID - * @example 1 - */ - senderId?: number; - /** - * @description 발신자 타입 - * @example STUDENT - * @enum {string} - */ - senderType?: 'ADMIN' | 'STUDENT' | 'TEACHER'; - /** - * @description 메시지 내용 - * @example 안녕하세요 - */ - content?: string; - /** - * Format: int64 - * @description 답장 대상 메시지 ID (답장인 경우) - * @example 122 - */ - replyToId?: number | null; - /** - * Format: date-time - * @description 이벤트 발생 시간 - */ - timestamp?: string; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; }; - /** @description Q&A 읽음 상태 이벤트 (SSE event name: read_status) */ - QnAReadStatusEvent: { - /** - * Format: int64 - * @description Q&A ID - * @example 1 - */ - qnaId?: number; - /** - * Format: int64 - * @description 읽은 사용자 ID - * @example 1 - */ - userId?: number; - /** - * @description 사용자 타입 - * @example TEACHER - * @enum {string} - */ - userType?: 'ADMIN' | 'STUDENT' | 'TEACHER'; - /** - * Format: date-time - * @description 읽은 시간 - */ - readAt?: string; + }; + updateChat_2: { + parameters: { + query?: never; + header?: never; + path: { + chatId: number; + }; + cookie?: never; }; - /** @description 학생별 QnA 리스트 변경 이벤트 (SSE event name: qna_list) */ - QnAListEvent: { - /** - * @description 학생별 QnA 리스트 이벤트 타입 - * @example NEW_MESSAGE - * @enum {string} - */ - type?: 'NEW_MESSAGE' | 'UNREAD_COUNT_CHANGED' | 'MESSAGE_DELETED'; - /** - * Format: int64 - * @description 변경된 Q&A ID - * @example 1 - */ - qnaId?: number; - /** - * Format: int64 - * @description 대상 학생 ID - * @example 123 - */ - studentId?: number; - /** - * Format: int32 - * @description 안읽은 메시지 수 - * @example 5 - */ - unreadCount?: number | null; - /** - * @description 최신 메시지 미리보기 - * @example 안녕하세요, 문제에 대해... - */ - latestMessagePreview?: string | null; - /** - * Format: date-time - * @description 이벤트 발생 시간 - */ - timestamp?: string; + requestBody: { + content: { + 'application/json': components['schemas']['ChatUpdateRequest']; + }; }; - PageRespTeacherResp: { - /** Format: int32 */ - page: number; - /** Format: int32 */ - size: number; - /** Format: int32 */ - lastPage: number; - data: components['schemas']['TeacherResp'][]; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; }; - PageRespStudentResp: { - /** Format: int32 */ - page: number; - /** Format: int32 */ - size: number; - /** Format: int32 */ - lastPage: number; - data: components['schemas']['StudentResp'][]; + }; + deleteChat_2: { + parameters: { + query?: never; + header?: never; + path: { + chatId: number; + }; + cookie?: never; }; - PageRespProblemMetaResp: { - /** Format: int32 */ - page: number; - /** Format: int32 */ - size: number; - /** Format: int32 */ - lastPage: number; - data: components['schemas']['ProblemMetaResp'][]; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; }; - ListRespProblemInfoResp: { - /** Format: int32 */ - total: number; - data: components['schemas']['ProblemInfoResp'][]; + }; + getProblem: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - ProblemCustomIdResp: { - customId?: string; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ProblemInfoResp']; + }; + }; }; - PageRespProblemSetResp: { - /** Format: int32 */ - page: number; - /** Format: int32 */ - size: number; - /** Format: int32 */ - lastPage: number; - data: components['schemas']['ProblemSetResp'][]; + }; + updateProblem: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - PageRespPracticeTestResp: { - /** Format: int32 */ - page: number; - /** Format: int32 */ - size: number; - /** Format: int32 */ - lastPage: number; - data: components['schemas']['PracticeTestResp'][]; + requestBody: { + content: { + 'application/json': components['schemas']['ProblemUpdateRequest']; + }; }; - /** @description FCM 상태 응답 */ - FcmStatusResp: { - /** @description Firebase 초기화 상태 */ - initialized?: boolean; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ProblemInfoResp']; + }; + }; }; - PageRespConceptResp: { - /** Format: int32 */ - page: number; - /** Format: int32 */ - size: number; - /** Format: int32 */ - lastPage: number; - data: components['schemas']['ConceptResp'][]; + }; + deleteProblem: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - PageRespConceptCategoryResp: { - /** Format: int32 */ - page: number; - /** Format: int32 */ - size: number; - /** Format: int32 */ - lastPage: number; - data: components['schemas']['ConceptCategoryResp'][]; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - /** @description 디바이스별 통계 */ - FeatureStat: { - /** @description 기능 이름 */ - featureName?: string; - /** - * Format: int64 - * @description 사용 횟수 - */ - count?: number; - /** - * Format: double - * @description 비율 (0-100) - */ - percentage?: number; + }; + getProblemSet: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - /** @description 디바이스별 첫 기능 사용 통계 */ - FirstFeatureStatResp: { - /** @description 디바이스별 통계 */ - deviceStats?: { - [key: string]: components['schemas']['FeatureStat'][]; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ProblemSetResp']; + }; }; }; - /** @description 일별 데이터 */ - DailyCount: { - /** - * Format: date - * @description 날짜 - */ - date?: string; - /** - * Format: int64 - * @description 풀이 수 - */ - count?: number; + }; + update_6: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - /** @description 일별 문제 풀이 수 응답 */ - DailySolveCountResp: { - /** - * Format: int64 - * @description 학생 ID - */ - studentId?: number; - /** - * Format: date - * @description 조회 시작 날짜 - */ - startDate?: string; - /** - * Format: date - * @description 조회 종료 날짜 - */ - endDate?: string; - /** - * Format: int64 - * @description 총 풀이 수 - */ - totalCount?: number; - /** - * Format: double - * @description 일평균 풀이 수 - */ - averagePerDay?: number; - /** - * Format: double - * @description 표준편차 - */ - standardDeviation?: number; - /** @description 일별 데이터 */ - dailyCounts?: components['schemas']['DailyCount'][]; + requestBody: { + content: { + 'application/json': components['schemas']['ProblemSetUpdateRequest']; + }; }; - /** @description 개념태그별 정답/오답 히스토리 */ - ConceptHistoryResp: { - /** - * Format: int64 - * @description 학생 ID - */ - studentId?: number; - /** @description 개념별 히스토리 */ - conceptStats?: components['schemas']['ConceptStat'][]; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ProblemSetResp']; + }; + }; }; - /** @description 개념별 히스토리 */ - ConceptStat: { - /** - * Format: int64 - * @description 개념 ID - */ - conceptId?: number; - /** @description 개념 이름 */ - conceptName?: string; - /** - * Format: int32 - * @description 총 시도 횟수 - */ - totalAttempts?: number; - /** - * Format: int32 - * @description 정답 횟수 - */ - correctCount?: number; - /** - * Format: int32 - * @description 오답 횟수 - */ - incorrectCount?: number; - /** - * Format: double - * @description 정답률 (0-100) - */ - correctRate?: number; - /** - * Format: date - * @description 최근 시도 날짜 - */ - lastAttemptDate?: string; + }; + delete_4: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - /** @description 세트별 완료율 응답 */ - CompletionRateResp: { - /** - * Format: int64 - * @description 문제 세트 ID - */ - problemSetId?: number; - /** @description 세트 제목 */ - title?: string; - /** - * Format: int32 - * @description 총 문제 수 - */ - totalProblems?: number; - /** @description 학생별 완료율 */ - studentRates?: components['schemas']['StudentCompletionRate'][]; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - /** @description 학생별 완료율 */ - StudentCompletionRate: { - /** - * Format: int64 - * @description 학생 ID - */ - studentId?: number; - /** @description 학생 이름 */ - studentName?: string; - /** - * Format: int32 - * @description 완료한 문제 수 - */ - completedCount?: number; - /** - * Format: double - * @description 완료율 (0-100) - */ - completionRate?: number; + }; + toggleStatus: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - /** @description 접속 통계 응답 */ - AccessStatResp: { - /** - * Format: date - * @description 조회 시작 날짜 - */ - startDate?: string; - /** - * Format: date - * @description 조회 종료 날짜 - */ - endDate?: string; - /** - * Format: int64 - * @description 총 접속 수 - */ - totalAccess?: number; - /** - * Format: int64 - * @description 고유 사용자 수 - */ - uniqueUsers?: number; - /** @description 일별 접속 수 */ - dailyAccess?: components['schemas']['DailyAccess'][]; - /** @description 요일별 접속 비율 */ - dayOfWeekRatio?: { - [key: string]: number; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ProblemSetResp']; + }; }; }; - /** @description 일별 접속 수 */ - DailyAccess: { - /** - * Format: date - * @description 날짜 - */ - date?: string; - /** - * Format: int64 - * @description 접속 수 - */ - count?: number; - /** - * Format: int64 - * @description 고유 사용자 수 - */ - uniqueUsers?: number; + }; + update_7: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - ScrapBatchDeleteRequest: { - /** @description 삭제할 항목 목록 (폴더/스크랩 혼합) */ - items: components['schemas']['Item'][]; + requestBody: { + content: { + 'application/json': components['schemas']['PracticeTestUpdateRequest']; + }; }; - ScrapBatchPermanentDeleteRequest: { - /** @description 영구 삭제할 항목 목록 (폴더/스크랩 혼합) */ - items: components['schemas']['Item'][]; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['PracticeTestResp']; + }; + }; }; - UnscrapFromProblemRequest: { - /** - * Format: int64 - * @description 문제 ID - * @example 123 - */ - problemId: number; + }; + delete_5: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - UnscrapFromPointingRequest: { - /** - * Format: int64 - * @description 포인팅 ID - * @example 456 - */ - pointingId: number; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - ErrorResp: { - code?: string; - message?: string; - path?: string; - /** Format: date-time */ - timestamp?: string; - rootCause?: string; - stackTrace?: string[]; + }; + update_8: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['PointingBubbleUpdateRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['AdminPointingBubbleResp']; + }; + }; }; }; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; -} -export type $defs = Record; -export interface operations { - updateStatus: { + update_9: { parameters: { query?: never; header?: never; path: { - qnaId: number; + id: number; }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['QnAStatusUpdateDTO']; + 'application/json': components['schemas']['NoticeUpdateRequest']; }; }; responses: { @@ -5056,23 +7953,43 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['QnAResp']; + '*/*': components['schemas']['NoticeResp']; }; }; }; }; - updateChat: { + delete_6: { parameters: { query?: never; header?: never; path: { - chatId: number; + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + updateType: { + parameters: { + query?: never; + header?: never; + path: { + id: number; }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ChatUpdateRequest']; + 'application/json': components['schemas']['MockExamTypeUpdateRequest']; }; }; responses: { @@ -5082,17 +7999,17 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['QnAResp']; + '*/*': components['schemas']['MockExamTypeResp']; }; }; }; }; - deleteChat: { + deleteType: { parameters: { query?: never; header?: never; path: { - chatId: number; + id: number; }; cookie?: never; }; @@ -5103,13 +8020,11 @@ export interface operations { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['QnAResp']; - }; + content?: never; }; }; }; - update: { + update_10: { parameters: { query?: never; header?: never; @@ -5120,7 +8035,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['NoticeUpdateRequest']; + 'application/json': components['schemas']['AdminMenuUpdateRequest']; }; }; responses: { @@ -5129,13 +8044,11 @@ export interface operations { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['NoticeResp']; - }; + content?: never; }; }; }; - delete: { + delete_7: { parameters: { query?: never; header?: never; @@ -5155,11 +8068,13 @@ export interface operations { }; }; }; - getPushSettings: { + getById_1: { parameters: { query?: never; header?: never; - path?: never; + path: { + id: number; + }; cookie?: never; }; requestBody?: never; @@ -5170,21 +8085,23 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['TeacherPushDTO.SettingsResponse']; + '*/*': components['schemas']['DiagnosisResp']; }; }; }; }; - updatePushSettings: { + update_11: { parameters: { query?: never; header?: never; - path?: never; + path: { + id: number; + }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['TeacherPushDTO.UpdateSettingsRequest']; + 'application/json': components['schemas']['DiagnosisUpdateReq']; }; }; responses: { @@ -5194,23 +8111,43 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['TeacherPushDTO.SettingsResponse']; + '*/*': components['schemas']['DiagnosisResp']; }; }; }; }; - updateScrap: { + delete_8: { parameters: { query?: never; header?: never; path: { - scrapId: number; + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + update_12: { + parameters: { + query?: never; + header?: never; + path: { + id: number; }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ScrapUpdateRequest']; + 'application/json': components['schemas']['DailyCommentAdminUpdateRequest']; }; }; responses: { @@ -5220,23 +8157,43 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapDetailResp']; + '*/*': components['schemas']['DailyCommentResp']; }; }; }; }; - updateScrapThumbnail: { + delete_9: { parameters: { query?: never; header?: never; path: { - scrapId: number; + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + update_13: { + parameters: { + query?: never; + header?: never; + path: { + conceptId: number; }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ScrapThumbnailUpdateRequest']; + 'application/json': components['schemas']['ConceptUpdateRequest']; }; }; responses: { @@ -5246,23 +8203,53 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapDetailResp']; + '*/*': components['schemas']['ConceptResp']; }; }; }; }; - updateScrapText: { + delete_10: { parameters: { query?: never; header?: never; path: { - scrapId: number; + conceptId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 삭제 성공 */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description 사용 중인 개념태그는 삭제할 수 없음 */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ErrorResp']; + }; + }; + }; + }; + replaceCell: { + parameters: { + query: { + actionNodeId: number; + roleId: number; }; + header?: never; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ScrapTextBoxUpdateRequest']; + 'application/json': components['schemas']['ActionGraphCellUpdateRequest']; }; }; responses: { @@ -5272,23 +8259,23 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapDetailResp']; + '*/*': components['schemas']['ListRespConceptActionEdgeResp']; }; }; }; }; - updateScrapName: { + updateNode: { parameters: { query?: never; header?: never; path: { - scrapId: number; + id: number; }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ScrapNameUpdateRequest']; + 'application/json': components['schemas']['ConceptNodeUpdateRequest']; }; }; responses: { @@ -5298,17 +8285,17 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapDetailResp']; + '*/*': components['schemas']['ConceptNodeResp']; }; }; }; }; - getHandwriting: { + deleteNode: { parameters: { query?: never; header?: never; path: { - scrapId: number; + id: number; }; cookie?: never; }; @@ -5319,24 +8306,22 @@ export interface operations { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['ScrapHandwritingResp']; - }; + content?: never; }; }; }; - updateHandwriting: { + updateNodeType: { parameters: { query?: never; header?: never; path: { - scrapId: number; + id: number; }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ScrapHandwritingUpdateRequest']; + 'application/json': components['schemas']['NodeTypeCodeUpdateRequest']; }; }; responses: { @@ -5346,17 +8331,17 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapHandwritingResp']; + '*/*': components['schemas']['NodeTypeCodeResp']; }; }; }; }; - deleteHandwriting: { + deleteNodeType: { parameters: { query?: never; header?: never; path: { - scrapId: number; + id: number; }; cookie?: never; }; @@ -5371,18 +8356,42 @@ export interface operations { }; }; }; - restoreTrash: { + updateEdge: { parameters: { query?: never; header?: never; - path?: never; + path: { + id: number; + }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ScrapBatchRestoreRequest']; + 'application/json': components['schemas']['ConceptEdgeUpdateRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ConceptEdgeResp']; + }; + }; + }; + }; + deleteEdge: { + parameters: { + query?: never; + header?: never; + path: { + id: number; }; + cookie?: never; }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -5393,16 +8402,18 @@ export interface operations { }; }; }; - moveScraps: { + updateEdgeType: { parameters: { query?: never; header?: never; - path?: never; + path: { + id: number; + }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ScrapBatchMoveRequest']; + 'application/json': components['schemas']['EdgeTypeCodeUpdateRequest']; }; }; responses: { @@ -5412,12 +8423,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ListRespScrapDetailResp']; + '*/*': components['schemas']['EdgeTypeCodeResp']; }; }; }; }; - getFolderDetail: { + deleteEdgeType: { parameters: { query?: never; header?: never; @@ -5427,6 +8438,30 @@ export interface operations { cookie?: never; }; requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + updateActionEdge: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['ConceptActionEdgeUpdateRequest']; + }; + }; responses: { /** @description OK */ 200: { @@ -5434,12 +8469,32 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapFolderResp']; + '*/*': components['schemas']['ConceptActionEdgeResp']; }; }; }; }; - updateFolder: { + deleteActionEdge: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + updateActionEdgeType: { parameters: { query?: never; header?: never; @@ -5450,7 +8505,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ScrapFolderUpdateRequest']; + 'application/json': components['schemas']['ActionEdgeTypeCodeUpdateRequest']; }; }; responses: { @@ -5460,12 +8515,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapFolderResp']; + '*/*': components['schemas']['ActionEdgeTypeCodeResp']; }; }; }; }; - updateFolderThumbnail: { + deleteActionEdgeType: { parameters: { query?: never; header?: never; @@ -5474,35 +8529,29 @@ export interface operations { }; cookie?: never; }; - requestBody: { - content: { - 'application/json': components['schemas']['ScrapFolderThumbnailUpdateRequest']; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['ScrapFolderResp']; - }; + content?: never; }; }; }; - updateFolderName: { + updateCategory: { parameters: { query?: never; header?: never; path: { - id: number; + categoryId: number; }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ScrapFolderNameUpdateRequest']; + 'application/json': components['schemas']['ConceptCategoryUpdateRequest']; }; }; responses: { @@ -5512,45 +8561,50 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapFolderResp']; + '*/*': components['schemas']['ConceptCategoryResp']; }; }; }; }; - getById: { + deleteCategory: { parameters: { query?: never; header?: never; path: { - qnaId: number; + categoryId: number; }; cookie?: never; }; requestBody?: never; responses: { - /** @description OK */ + /** @description 삭제 성공 */ 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description 사용 중인 대분류는 삭제할 수 없음 */ + 400: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['QnAResp']; + '*/*': components['schemas']['ErrorResp']; }; }; }; }; - update_1: { + addChat: { parameters: { query?: never; header?: never; - path: { - qnaId: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['QnAUpdateRequest']; + 'application/json': components['schemas']['ChatCreateRequest']; }; }; responses: { @@ -5565,13 +8619,13 @@ export interface operations { }; }; }; - delete_1: { + getsAll: { parameters: { - query?: never; - header?: never; - path: { - qnaId: number; + query: { + studentId: number; }; + header?: never; + path?: never; cookie?: never; }; requestBody?: never; @@ -5581,22 +8635,22 @@ export interface operations { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['ListRespNoticeResp']; + }; }; }; }; - updateStatus_1: { + create: { parameters: { query?: never; header?: never; - path: { - qnaId: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['QnAStatusUpdateDTO']; + 'application/json': components['schemas']['NoticeCreateRequest']; }; }; responses: { @@ -5606,23 +8660,21 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['QnAResp']; + '*/*': components['schemas']['NoticeResp']; }; }; }; }; - updateChat_1: { + updatePushToken: { parameters: { query?: never; header?: never; - path: { - chatId: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ChatUpdateRequest']; + 'application/json': components['schemas']['TeacherPushDTO.UpdateTokenRequest']; }; }; responses: { @@ -5632,18 +8684,16 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['QnAResp']; + '*/*': components['schemas']['TeacherResp']; }; }; }; }; - deleteChat_1: { + toggleAllowPush: { parameters: { query?: never; header?: never; - path: { - chatId: number; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -5654,21 +8704,23 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['QnAResp']; + '*/*': components['schemas']['TeacherResp']; }; }; }; }; - readNotice: { + refresh: { parameters: { query?: never; header?: never; - path: { - noticeId: number; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['RefreshReq']; + }; + }; responses: { /** @description OK */ 200: { @@ -5676,19 +8728,23 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['NoticeResp']; + '*/*': components['schemas']['TeacherTokenResp']; }; }; }; }; - me: { + login: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['TeacherLoginReq']; + }; + }; responses: { /** @description OK */ 200: { @@ -5696,12 +8752,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['StudentResp']; + '*/*': components['schemas']['TeacherTokenResp']; }; }; }; }; - update_2: { + feedback: { parameters: { query?: never; header?: never; @@ -5710,7 +8766,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['StudentUpdateRequest']; + 'application/json': components['schemas']['PointingFeedbackRequest']; }; }; responses: { @@ -5719,20 +8775,22 @@ export interface operations { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['StudentResp']; - }; + content?: never; }; }; }; - getPushSettings_1: { + recordBubbleQuestion: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['PointingBubbleQuestionRequest']; + }; + }; responses: { /** @description OK */ 200: { @@ -5740,12 +8798,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['StudentPushDTO.SettingsResponse']; + '*/*': components['schemas']['PointingBubbleQuestionResponse']; }; }; }; }; - updatePushSettings_1: { + submit: { parameters: { query?: never; header?: never; @@ -5754,7 +8812,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['StudentPushDTO.UpdateSettingsRequest']; + 'application/json': components['schemas']['SubmissionRequest']; }; }; responses: { @@ -5764,23 +8822,24 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['StudentPushDTO.SettingsResponse']; + '*/*': components['schemas']['SubmissionResp']; }; }; }; }; - update_3: { + saveSnapshot: { parameters: { query?: never; header?: never; path: { - id: number; + publishId: number; + problemId: number; }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['TeacherUpdateRequest']; + 'application/json': components['schemas']['StudyHandwritingSnapshotSaveRequest']; }; }; responses: { @@ -5790,23 +8849,21 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['TeacherResp']; + '*/*': components['schemas']['StudyHandwritingSnapshotResp']; }; }; }; }; - assignStudentsToTeacher: { + createScrap: { parameters: { query?: never; header?: never; - path: { - teacherId: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['TeacherStudentAssignReq']; + 'application/json': components['schemas']['ScrapCreateRequest']; }; }; responses: { @@ -5816,23 +8873,43 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['TeacherResp']; + '*/*': components['schemas']['ScrapDetailResp']; }; }; }; }; - updateStatus_2: { + deleteScraps: { parameters: { query?: never; header?: never; - path: { - qnaId: number; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapBatchDeleteRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; }; + }; + }; + toggleScrapFromReadingTip: { + parameters: { + query?: never; + header?: never; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['QnAStatusUpdateDTO']; + 'application/json': components['schemas']['ScrapFromReadingTipCreateRequest']; }; }; responses: { @@ -5842,23 +8919,21 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['QnAResp']; + '*/*': components['schemas']['ScrapToggleResp']; }; }; }; }; - updateChat_2: { + toggleScrapFromProblem: { parameters: { query?: never; header?: never; - path: { - chatId: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ChatUpdateRequest']; + 'application/json': components['schemas']['ScrapFromProblemCreateRequest']; }; }; responses: { @@ -5868,21 +8943,23 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['QnAResp']; + '*/*': components['schemas']['ScrapToggleResp']; }; }; }; }; - deleteChat_2: { + toggleScrapFromPointing: { parameters: { query?: never; header?: never; - path: { - chatId: number; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapFromPointingCreateRequest']; + }; + }; responses: { /** @description OK */ 200: { @@ -5890,21 +8967,23 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['QnAResp']; + '*/*': components['schemas']['ScrapToggleResp']; }; }; }; }; - getProblem: { + toggleScrapFromOneStepMore: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapFromOneStepMoreCreateRequest']; + }; + }; responses: { /** @description OK */ 200: { @@ -5912,23 +8991,21 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ProblemInfoResp']; + '*/*': components['schemas']['ScrapToggleResp']; }; }; }; }; - updateProblem: { + createScrapFromProblem: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ProblemUpdateRequest']; + 'application/json': components['schemas']['ScrapFromProblemCreateRequest']; }; }; responses: { @@ -5938,65 +9015,89 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ProblemInfoResp']; + '*/*': components['schemas']['ScrapDetailResp']; }; }; }; }; - deleteProblem: { + unscrapFromProblem: { parameters: { query?: never; header?: never; - path: { - id: number; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['UnscrapFromProblemRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; }; + }; + }; + createScrapFromPointing: { + parameters: { + query?: never; + header?: never; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapFromPointingCreateRequest']; + }; + }; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['ScrapDetailResp']; + }; }; }; }; - getProblemSet: { + unscrapFromPointing: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['UnscrapFromPointingRequest']; + }; + }; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['ProblemSetResp']; - }; + content?: never; }; }; }; - update_4: { + createScrapFromImage: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ProblemSetUpdateRequest']; + 'application/json': components['schemas']['ScrapFromImageCreateRequest']; }; }; responses: { @@ -6006,18 +9107,16 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ProblemSetResp']; + '*/*': components['schemas']['ScrapDetailResp']; }; }; }; }; - delete_2: { + getFolders: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -6027,20 +9126,24 @@ export interface operations { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['ListRespScrapFolderResp']; + }; }; }; }; - toggleStatus: { + createFolder: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['ScrapFolderCreateRequest']; + }; + }; responses: { /** @description OK */ 200: { @@ -6048,23 +9151,21 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ProblemSetResp']; + '*/*': components['schemas']['ScrapFolderResp']; }; }; }; }; - update_5: { + deleteFolders: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['Request']; + 'application/json': number[]; }; }; responses: { @@ -6073,19 +9174,17 @@ export interface operations { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['PracticeTestResp']; - }; + content?: never; }; }; }; - delete_3: { + gets: { parameters: { - query?: never; - header?: never; - path: { - id: number; + query?: { + query?: string; }; + header?: never; + path?: never; cookie?: never; }; requestBody?: never; @@ -6095,22 +9194,22 @@ export interface operations { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['PageRespNotListQnAGroupByWeekResp']; + }; }; }; }; - update_6: { + create_1: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['NoticeUpdateRequest']; + 'application/json': components['schemas']['QnACreateRequest']; }; }; responses: { @@ -6120,41 +9219,47 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['NoticeResp']; + '*/*': components['schemas']['QnAResp']; }; }; }; }; - delete_4: { + checkExists: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['QnACheckRequest']; + }; + }; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['QnACheckResp']; + }; }; }; }; - getById_1: { + addChat_1: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['ChatCreateRequest']; + }; + }; responses: { /** @description OK */ 200: { @@ -6162,71 +9267,63 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['DiagnosisResp']; + '*/*': components['schemas']['QnAResp']; }; }; }; }; - update_7: { + nativeLogin: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['DiagnosisUpdateReq']; + 'application/json': components['schemas']['NativeOAuthReq']; }; }; responses: { - /** @description OK */ + /** @description 로그인 성공 */ 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['DiagnosisResp']; + '*/*': components['schemas']['NativeOAuthResp']; }; }; - }; - }; - delete_5: { - parameters: { - query?: never; - header?: never; - path: { - id: number; + /** @description 유효하지 않은 토큰 (OAUTH_001) 또는 유효성 검증 실패 */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['NativeOAuthResp']; + }; }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { + /** @description OAuth 제공자 API 오류 (OAUTH_002) */ + 500: { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['NativeOAuthResp']; + }; }; }; }; - update_8: { + readNotification: { parameters: { query?: never; header?: never; path: { - conceptId: number; + notificationId: number; }; cookie?: never; }; - requestBody: { - content: { - 'application/json': components['schemas']['ConceptUpdateRequest']; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -6234,52 +9331,39 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ConceptResp']; + '*/*': components['schemas']['NotificationResp']; }; }; }; }; - delete_6: { + readAllNotifications: { parameters: { query?: never; header?: never; - path: { - conceptId: number; - }; + path?: never; cookie?: never; }; requestBody?: never; responses: { - /** @description 삭제 성공 */ + /** @description OK */ 200: { headers: { [name: string]: unknown; }; content?: never; }; - /** @description 사용 중인 개념태그는 삭제할 수 없음 */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResp']; - }; - }; }; }; - updateCategory: { + submit_1: { parameters: { query?: never; header?: never; - path: { - categoryId: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ConceptCategoryUpdateRequest']; + 'application/json': components['schemas']['MockExamResultSubmitRequest']; }; }; responses: { @@ -6289,41 +9373,36 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ConceptCategoryResp']; + '*/*': components['schemas']['MockExamResultResp']; }; }; }; }; - deleteCategory: { + updatePushToken_1: { parameters: { query?: never; header?: never; - path: { - categoryId: number; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['StudentPushDTO.UpdateTokenRequest']; + }; + }; responses: { - /** @description 삭제 성공 */ + /** @description OK */ 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description 사용 중인 대분류는 삭제할 수 없음 */ - 400: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResp']; + '*/*': components['schemas']['StudentResp']; }; }; }; }; - addChat: { + initPushSettings: { parameters: { query?: never; header?: never; @@ -6332,7 +9411,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ChatCreateRequest']; + 'application/json': components['schemas']['StudentPushDTO.InitPushRequest']; }; }; responses: { @@ -6342,16 +9421,14 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['QnAResp']; + '*/*': components['schemas']['StudentPushDTO.SettingsResponse']; }; }; }; }; - getsAll: { + toggleAllowPush_1: { parameters: { - query: { - studentId: number; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -6364,12 +9441,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ListRespNoticeResp']; + '*/*': components['schemas']['StudentResp']; }; }; }; }; - create: { + changePassword: { parameters: { query?: never; header?: never; @@ -6378,7 +9455,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['NoticeCreateRequest']; + 'application/json': components['schemas']['StudentPasswordDTO.UpdatePasswordRequest']; }; }; responses: { @@ -6388,12 +9465,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['NoticeResp']; + '*/*': components['schemas']['StudentResp']; }; }; }; }; - updatePushToken: { + submitFeedback: { parameters: { query?: never; header?: never; @@ -6402,29 +9479,31 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['TeacherPushDTO.UpdateTokenRequest']; + 'application/json': components['schemas']['FeedbackDTO.Request']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['TeacherResp']; - }; + content?: never; }; }; }; - toggleAllowPush: { + signup: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['StudentSignupReq']; + }; + }; responses: { /** @description OK */ 200: { @@ -6432,12 +9511,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['TeacherResp']; + '*/*': components['schemas']['StudentTokenResp']; }; }; }; }; - refresh: { + register: { parameters: { query?: never; header?: never; @@ -6446,7 +9525,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['RefreshReq']; + 'application/json': components['schemas']['StudentInitialRegisterDTO.Req']; }; }; responses: { @@ -6456,12 +9535,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['TeacherTokenResp']; + '*/*': components['schemas']['StudentResp']; }; }; }; }; - login: { + refresh_1: { parameters: { query?: never; header?: never; @@ -6470,7 +9549,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['TeacherLoginReq']; + 'application/json': components['schemas']['RefreshReq']; }; }; responses: { @@ -6480,12 +9559,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['TeacherTokenResp']; + '*/*': components['schemas']['StudentTokenResp']; }; }; }; }; - feedback: { + quit: { parameters: { query?: never; header?: never; @@ -6494,7 +9573,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['PointingFeedbackRequest']; + 'application/json': components['schemas']['WithdrawDTO.Request']; }; }; responses: { @@ -6507,7 +9586,7 @@ export interface operations { }; }; }; - submit: { + resetPassword: { parameters: { query?: never; header?: never; @@ -6516,7 +9595,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['SubmissionRequest']; + 'application/json': components['schemas']['PasswordResetDTO.ResetPasswordRequest']; }; }; responses: { @@ -6525,13 +9604,11 @@ export interface operations { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['SubmissionResp']; - }; + content?: never; }; }; }; - createScrap: { + verifyPasswordResetCode: { parameters: { query?: never; header?: never; @@ -6540,7 +9617,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ScrapCreateRequest']; + 'application/json': components['schemas']['PasswordResetDTO.VerifyCodeRequest']; }; }; responses: { @@ -6550,12 +9627,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapDetailResp']; + '*/*': components['schemas']['BooleanResp']; }; }; }; }; - deleteScraps: { + sendPasswordResetCode: { parameters: { query?: never; header?: never; @@ -6564,7 +9641,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ScrapBatchDeleteRequest']; + 'application/json': components['schemas']['PasswordResetDTO.SendCodeRequest']; }; }; responses: { @@ -6577,7 +9654,7 @@ export interface operations { }; }; }; - toggleScrapFromReadingTip: { + getSocialLoginUrl: { parameters: { query?: never; header?: never; @@ -6586,7 +9663,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ScrapFromReadingTipCreateRequest']; + 'application/json': components['schemas']['SocialLoginReq']; }; }; responses: { @@ -6596,12 +9673,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapToggleResp']; + '*/*': components['schemas']['SocialLoginUrlResp']; }; }; }; }; - toggleScrapFromProblem: { + login_1: { parameters: { query?: never; header?: never; @@ -6610,7 +9687,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ScrapFromProblemCreateRequest']; + 'application/json': components['schemas']['StudentLoginReq']; }; }; responses: { @@ -6620,12 +9697,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapToggleResp']; + '*/*': components['schemas']['StudentTokenResp']; }; }; }; }; - toggleScrapFromPointing: { + getPreSignedUrl: { parameters: { query?: never; header?: never; @@ -6634,7 +9711,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ScrapFromPointingCreateRequest']; + 'application/json': components['schemas']['PreSignedReq']; }; }; responses: { @@ -6644,12 +9721,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapToggleResp']; + '*/*': components['schemas']['PreSignedResp']; }; }; }; }; - toggleScrapFromOneStepMore: { + verify: { parameters: { query?: never; header?: never; @@ -6658,7 +9735,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ScrapFromOneStepMoreCreateRequest']; + 'application/json': components['schemas']['PhoneAuthVerifyRequest']; }; }; responses: { @@ -6668,12 +9745,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapToggleResp']; + '*/*': components['schemas']['SimpleSuccessResp']; }; }; }; }; - createScrapFromProblem: { + send: { parameters: { query?: never; header?: never; @@ -6682,7 +9759,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ScrapFromProblemCreateRequest']; + 'application/json': components['schemas']['PhoneAuthSendRequest']; }; }; responses: { @@ -6692,12 +9769,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapDetailResp']; + '*/*': components['schemas']['SimpleSuccessResp']; }; }; }; }; - unscrapFromProblem: { + resend: { parameters: { query?: never; header?: never; @@ -6706,7 +9783,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['UnscrapFromProblemRequest']; + 'application/json': components['schemas']['PhoneAuthResendRequest']; }; }; responses: { @@ -6715,11 +9792,13 @@ export interface operations { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['SimpleSuccessResp']; + }; }; }; }; - createScrapFromPointing: { + collectEvents: { parameters: { query?: never; header?: never; @@ -6728,44 +9807,47 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ScrapFromPointingCreateRequest']; + 'application/json': components['schemas']['UserEventBatchRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description 이벤트 저장 성공 */ + 204: { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['ScrapDetailResp']; + content?: never; + }; + /** @description 잘못된 요청 (검증 실패) */ + 400: { + headers: { + [name: string]: unknown; }; + content?: never; }; }; }; - unscrapFromPointing: { + findAll: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - 'application/json': components['schemas']['UnscrapFromPointingRequest']; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['ListRespAdminResp']; + }; }; }; }; - createScrapFromImage: { + create_2: { parameters: { query?: never; header?: never; @@ -6774,24 +9856,26 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ScrapFromImageCreateRequest']; + 'application/json': components['schemas']['AdminCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['ScrapDetailResp']; - }; + content?: never; }; }; }; - getFolders: { + search: { parameters: { - query?: never; + query?: { + query?: string; + page?: number; + size?: number; + }; header?: never; path?: never; cookie?: never; @@ -6804,12 +9888,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ListRespScrapFolderResp']; + '*/*': components['schemas']['PageRespTeacherResp']; }; }; }; }; - createFolder: { + create_3: { parameters: { query?: never; header?: never; @@ -6818,77 +9902,56 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ScrapFolderCreateRequest']; + 'application/json': components['schemas']['TeacherCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ScrapFolderResp']; + '*/*': components['schemas']['TeacherResp']; }; }; }; }; - deleteFolders: { + batch: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody: { + requestBody?: { content: { - 'application/json': number[]; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; + 'multipart/form-data': { + /** Format: binary */ + file: string; }; - content?: never; - }; - }; - }; - gets: { - parameters: { - query?: { - query?: string; }; - header?: never; - path?: never; - cookie?: never; }; - requestBody?: never; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['PageRespNotListQnAGroupByWeekResp']; + '*/*': components['schemas']['SchoolSaveRespDTO']; }; }; }; }; - create_1: { + findAll_1: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - 'application/json': components['schemas']['QnACreateRequest']; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -6896,12 +9959,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['QnAResp']; + '*/*': components['schemas']['ListRespAdminRoleResp']; }; }; }; }; - checkExists: { + create_4: { parameters: { query?: never; header?: never; @@ -6910,22 +9973,20 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['QnACheckRequest']; + 'application/json': components['schemas']['AdminRoleCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['QnACheckResp']; - }; + content?: never; }; }; }; - addChat_1: { + addChat_2: { parameters: { query?: never; header?: never; @@ -6938,8 +9999,8 @@ export interface operations { }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; @@ -6949,12 +10010,12 @@ export interface operations { }; }; }; - readNotification: { + list: { parameters: { query?: never; header?: never; path: { - notificationId: number; + publishId: number; }; cookie?: never; }; @@ -6966,41 +10027,49 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['NotificationResp']; + '*/*': components['schemas']['ListRespPublishFocusCardLinkResp']; }; }; }; }; - readAllNotifications: { + add: { parameters: { query?: never; header?: never; - path?: never; + path: { + publishId: number; + }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['PublishFocusCardLinkSpec']; + }; + }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['PublishFocusCardLinkResp']; + }; }; }; }; - updatePushToken_1: { + search_1: { parameters: { - query?: never; + query?: { + year?: number; + month?: number; + studentId?: number; + }; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - 'application/json': components['schemas']['StudentPushDTO.UpdateTokenRequest']; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -7008,12 +10077,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['StudentResp']; + '*/*': components['schemas']['ListRespPublishResp']; }; }; }; }; - initPushSettings: { + create_5: { parameters: { query?: never; header?: never; @@ -7022,53 +10091,36 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['StudentPushDTO.InitPushRequest']; + 'application/json': components['schemas']['PublishCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['StudentPushDTO.SettingsResponse']; + '*/*': components['schemas']['PublishResp']; }; }; }; }; - toggleAllowPush_1: { + search_2: { parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['StudentResp']; - }; + query?: { + customId?: string; + title?: string; + concepts?: number[]; + problemType?: 'MAIN_PROBLEM' | 'CHILD_PROBLEM'; + page?: number; + size?: number; }; - }; - }; - changePassword: { - parameters: { - query?: never; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - 'application/json': components['schemas']['StudentPasswordDTO.UpdatePasswordRequest']; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -7076,12 +10128,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['StudentResp']; + '*/*': components['schemas']['PageRespProblemMetaResp']; }; }; }; }; - submitFeedback: { + createProblem: { parameters: { query?: never; header?: never; @@ -7090,7 +10142,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['FeedbackDTO.Request']; + 'application/json': components['schemas']['ProblemCreateRequest']; }; }; responses: { @@ -7099,22 +10151,22 @@ export interface operations { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['ProblemInfoResp']; + }; }; }; }; - signup: { + getChildren: { parameters: { query?: never; header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - 'application/json': components['schemas']['StudentSignupReq']; + path: { + parentId: number; }; + cookie?: never; }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -7122,60 +10174,60 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['StudentTokenResp']; + '*/*': components['schemas']['ListRespProblemInfoResp']; }; }; }; }; - register: { + addChild: { parameters: { query?: never; header?: never; - path?: never; + path: { + parentId: number; + }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['StudentInitialRegisterDTO.Req']; + 'application/json': components['schemas']['ProblemCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['StudentResp']; + '*/*': components['schemas']['ProblemInfoResp']; }; }; }; }; - refresh_1: { + removeChildren: { parameters: { - query?: never; + query: { + childIds: number[]; + }; header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - 'application/json': components['schemas']['RefreshReq']; + path: { + parentId: number; }; + cookie?: never; }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['StudentTokenResp']; - }; + content?: never; }; }; }; - quit: { + createProblemWithChild: { parameters: { query?: never; header?: never; @@ -7184,42 +10236,47 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['WithdrawDTO.Request']; + 'application/json': components['schemas']['ProblemEntireCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['ProblemInfoResp']; + }; }; }; }; - resetPassword: { + search_3: { parameters: { - query?: never; + query?: { + setTitle?: string; + problemTitle?: string; + page?: number; + size?: number; + }; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - 'application/json': components['schemas']['PasswordResetDTO.ResetPasswordRequest']; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['PageRespProblemSetResp']; + }; }; }; }; - verifyPasswordResetCode: { + create_6: { parameters: { query?: never; header?: never; @@ -7228,44 +10285,49 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['PasswordResetDTO.VerifyCodeRequest']; + 'application/json': components['schemas']['ProblemSetCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['BooleanResp']; + '*/*': components['schemas']['ProblemSetResp']; }; }; }; }; - sendPasswordResetCode: { + search_4: { parameters: { - query?: never; + query?: { + query?: string; + year?: number; + month?: number; + grade?: number; + page?: number; + size?: number; + }; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - 'application/json': components['schemas']['PasswordResetDTO.SendCodeRequest']; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['PageRespPracticeTestResp']; + }; }; }; }; - getSocialLoginUrl: { + create_7: { parameters: { query?: never; header?: never; @@ -7274,33 +10336,29 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['SocialLoginReq']; + 'application/json': components['schemas']['PracticeTestCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['SocialLoginUrlResp']; + '*/*': components['schemas']['PracticeTestResp']; }; }; }; }; - login_1: { + migrateFromComment: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - 'application/json': components['schemas']['StudentLoginReq']; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -7308,12 +10366,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['StudentTokenResp']; + '*/*': components['schemas']['PointingBubbleMigrateResp']; }; }; }; }; - getPreSignedUrl: { + redirect: { parameters: { query?: never; header?: never; @@ -7322,7 +10380,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['PreSignedReq']; + 'application/json': string; }; }; responses: { @@ -7332,12 +10390,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['PreSignedResp']; + '*/*': string; }; }; }; }; - verify: { + sendNotification: { parameters: { query?: never; header?: never; @@ -7346,7 +10404,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['PhoneAuthVerifyRequest']; + 'application/json': components['schemas']['NotificationSendRequest']; }; }; responses: { @@ -7356,23 +10414,21 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['SimpleSuccessResp']; + '*/*': components['schemas']['NotificationSendResp']; }; }; }; }; - send: { + getsAll_1: { parameters: { - query?: never; + query: { + studentId: number; + }; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - 'application/json': components['schemas']['PhoneAuthSendRequest']; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -7380,12 +10436,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['SimpleSuccessResp']; + '*/*': components['schemas']['ListRespNoticeResp']; }; }; }; }; - resend: { + create_8: { parameters: { query?: never; header?: never; @@ -7394,51 +10450,42 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['PhoneAuthResendRequest']; + 'application/json': components['schemas']['NoticeCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['SimpleSuccessResp']; + '*/*': components['schemas']['NoticeResp']; }; }; }; }; - collectEvents: { + getAllTypes: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - 'application/json': components['schemas']['UserEventBatchRequest']; - }; - }; + requestBody?: never; responses: { - /** @description 이벤트 저장 성공 */ - 204: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content?: never; - }; - /** @description 잘못된 요청 (검증 실패) */ - 400: { - headers: { - [name: string]: unknown; + content: { + '*/*': components['schemas']['ListRespMockExamTypeResp']; }; - content?: never; }; }; }; - create_2: { + createType: { parameters: { query?: never; header?: never; @@ -7447,26 +10494,24 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['AdminCreateRequest']; + 'application/json': components['schemas']['MockExamTypeCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['MockExamTypeResp']; + }; }; }; }; - search: { + findAll_2: { parameters: { - query?: { - query?: string; - page?: number; - size?: number; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -7479,12 +10524,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['PageRespTeacherResp']; + '*/*': components['schemas']['ListRespAdminMenuResp']; }; }; }; }; - create_3: { + create_9: { parameters: { query?: never; header?: never; @@ -7493,9 +10538,27 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['TeacherCreateRequest']; + 'application/json': components['schemas']['AdminMenuCreateRequest']; }; }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + list_1: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -7503,48 +10566,47 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['TeacherResp']; + '*/*': components['schemas']['ListRespFocusCardResp']; }; }; }; }; - batch: { + create_10: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody?: { + requestBody: { content: { - 'multipart/form-data': { - /** Format: binary */ - file: string; - }; + 'application/json': components['schemas']['FocusCardCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['SchoolSaveRespDTO']; + '*/*': components['schemas']['FocusCardResp']; }; }; }; }; - addChat_2: { + editContent: { parameters: { query?: never; header?: never; - path?: never; + path: { + id: number; + }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ChatCreateRequest']; + 'application/json': components['schemas']['FocusCardEditContentRequest']; }; }; responses: { @@ -7554,17 +10616,17 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['QnAResp']; + '*/*': components['schemas']['FocusCardResp']; }; }; }; }; - search_1: { + issuanceHistory: { parameters: { - query?: { - year?: number; - month?: number; - studentId?: number; + query: { + studentId: number; + from: string; + to: string; }; header?: never; path?: never; @@ -7578,12 +10640,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ListRespPublishResp']; + '*/*': components['schemas']['ListRespFocusCardIssuanceResp']; }; }; }; }; - create_4: { + issue: { parameters: { query?: never; header?: never; @@ -7592,30 +10654,25 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['PublishCreateRequest']; + 'application/json': components['schemas']['FocusCardIssueByAdminRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['PublishResp']; + '*/*': components['schemas']['FocusCardIssuanceResp']; }; }; }; }; - search_2: { + autoIssue: { parameters: { - query?: { - customId?: string; - title?: string; - concepts?: number[]; - problemType?: 'MAIN_PROBLEM' | 'CHILD_PROBLEM'; - page?: number; - size?: number; + query: { + studentId: number; }; header?: never; path?: never; @@ -7629,12 +10686,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['PageRespProblemMetaResp']; + '*/*': components['schemas']['ListRespFocusCardIssuanceResp']; }; }; }; }; - createProblem: { + sendTestPush: { parameters: { query?: never; header?: never; @@ -7643,7 +10700,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ProblemCreateRequest']; + 'application/json': components['schemas']['FcmTestReq']; }; }; responses: { @@ -7653,18 +10710,18 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ProblemInfoResp']; + '*/*': components['schemas']['FcmTestResp']; }; }; }; }; - getChildren: { + gets_1: { parameters: { - query?: never; - header?: never; - path: { - parentId: number; + query: { + studentId: number; }; + header?: never; + path?: never; cookie?: never; }; requestBody?: never; @@ -7675,46 +10732,51 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ListRespProblemInfoResp']; + '*/*': components['schemas']['ListRespDiagnosisResp']; }; }; }; }; - addChild: { + create_11: { parameters: { query?: never; header?: never; - path: { - parentId: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ProblemCreateRequest']; + 'application/json': components['schemas']['DiagnosisCreateReq']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ProblemInfoResp']; + '*/*': components['schemas']['DiagnosisResp']; }; }; }; }; - removeChildren: { + getByStudentAndDate: { parameters: { - query: { - childIds: number[]; + query?: { + /** + * @description 학생 ID + * @example 1 + */ + studentId?: number; + /** + * @description 조회 기준 일자 + * @example 2026-05-05 + */ + commentDate?: string; }; header?: never; - path: { - parentId: number; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -7724,11 +10786,13 @@ export interface operations { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['ListRespDailyCommentResp']; + }; }; }; }; - createProblemWithChild: { + upsert: { parameters: { query?: never; header?: never; @@ -7737,7 +10801,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ProblemEntireCreateRequest']; + 'application/json': components['schemas']['DailyCommentAdminUpsertRequest']; }; }; responses: { @@ -7747,16 +10811,16 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ProblemInfoResp']; + '*/*': components['schemas']['ListRespDailyCommentResp']; }; }; }; }; - search_3: { + search_5: { parameters: { query?: { - setTitle?: string; - problemTitle?: string; + query?: string; + categoryId?: number; page?: number; size?: number; }; @@ -7772,12 +10836,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['PageRespProblemSetResp']; + '*/*': components['schemas']['PageRespConceptResp']; }; }; }; }; - create_5: { + create_12: { parameters: { query?: never; header?: never; @@ -7786,31 +10850,24 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ProblemSetCreateRequest']; + 'application/json': components['schemas']['ConceptCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ProblemSetResp']; + '*/*': components['schemas']['ConceptResp']; }; }; }; }; - search_4: { + getNodes: { parameters: { - query?: { - query?: string; - year?: number; - month?: number; - grade?: number; - page?: number; - size?: number; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -7823,12 +10880,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['PageRespPracticeTestResp']; + '*/*': components['schemas']['ListRespConceptNodeResp']; }; }; }; }; - create_6: { + createNode: { parameters: { query?: never; header?: never; @@ -7837,33 +10894,29 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['PracticeTestCreateRequest']; + 'application/json': components['schemas']['ConceptNodeCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['PracticeTestResp']; + '*/*': components['schemas']['ConceptNodeResp']; }; }; }; }; - redirect: { + getNodeTypes: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - requestBody: { - content: { - 'application/json': string; - }; - }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -7871,12 +10924,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': string; + '*/*': components['schemas']['ListRespNodeTypeCodeResp']; }; }; }; }; - sendNotification: { + createNodeType: { parameters: { query?: never; header?: never; @@ -7885,26 +10938,24 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['NotificationSendRequest']; + 'application/json': components['schemas']['NodeTypeCodeCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['NotificationSendResp']; + '*/*': components['schemas']['NodeTypeCodeResp']; }; }; }; }; - getsAll_1: { + getEdges: { parameters: { - query: { - studentId: number; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -7917,12 +10968,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ListRespNoticeResp']; + '*/*': components['schemas']['ListRespConceptEdgeResp']; }; }; }; }; - create_7: { + createEdge: { parameters: { query?: never; header?: never; @@ -7931,9 +10982,29 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['NoticeCreateRequest']; + 'application/json': components['schemas']['ConceptEdgeCreateRequest']; + }; + }; + responses: { + /** @description Created */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ConceptEdgeResp']; + }; }; }; + }; + getEdgeTypes: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; responses: { /** @description OK */ 200: { @@ -7941,12 +11012,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['NoticeResp']; + '*/*': components['schemas']['ListRespEdgeTypeCodeResp']; }; }; }; }; - sendTestPush: { + createEdgeType: { parameters: { query?: never; header?: never; @@ -7955,26 +11026,24 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['FcmTestReq']; + 'application/json': components['schemas']['EdgeTypeCodeCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['FcmTestResp']; + '*/*': components['schemas']['EdgeTypeCodeResp']; }; }; }; }; - gets_1: { + getActionEdges: { parameters: { - query: { - studentId: number; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -7987,12 +11056,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ListRespDiagnosisResp']; + '*/*': components['schemas']['ListRespConceptActionEdgeResp']; }; }; }; }; - create_8: { + createActionEdge: { parameters: { query?: never; header?: never; @@ -8001,29 +11070,24 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['DiagnosisCreateReq']; + 'application/json': components['schemas']['ConceptActionEdgeCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['DiagnosisResp']; + '*/*': components['schemas']['ConceptActionEdgeResp']; }; }; }; }; - search_5: { + getActionEdgeTypes: { parameters: { - query?: { - query?: string; - categoryId?: number; - page?: number; - size?: number; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -8036,12 +11100,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['PageRespConceptResp']; + '*/*': components['schemas']['ListRespActionEdgeTypeCodeResp']; }; }; }; }; - create_9: { + createActionEdgeType: { parameters: { query?: never; header?: never; @@ -8050,17 +11114,17 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ConceptCreateRequest']; + 'application/json': components['schemas']['ActionEdgeTypeCodeCreateRequest']; }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ConceptResp']; + '*/*': components['schemas']['ActionEdgeTypeCodeResp']; }; }; }; @@ -8102,8 +11166,8 @@ export interface operations { }; }; responses: { - /** @description OK */ - 200: { + /** @description Created */ + 201: { headers: { [name: string]: unknown; }; @@ -8602,6 +11666,30 @@ export interface operations { }; }; }; + getSnapshot: { + parameters: { + query?: never; + header?: never; + path: { + publishId: number; + problemId: number; + type: 'AFTER_FIRST_SUBMIT' | 'AFTER_RETRY_SUBMIT' | 'AFTER_POINTING'; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['StudyHandwritingSnapshotResp']; + }; + }; + }; + }; getEntireProblems: { parameters: { query?: never; @@ -8919,12 +12007,55 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ListRespQnaFileResp']; + '*/*': components['schemas']['ListRespQnaFileResp']; + }; + }; + }; + }; + getOrCreateAdminChatroom: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; + }; + }; + getNotifications: { + parameters: { + query?: { + /** @description 조회 기간 (일 단위, 예: 30이면 30일 전까지) */ + dayLimit?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ListRespNotificationResp']; }; }; }; }; - getOrCreateAdminChatroom: { + countUnread: { parameters: { query?: never; header?: never; @@ -8939,16 +12070,16 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['QnAResp']; + '*/*': components['schemas']['NotificationUnreadCountResp']; }; }; }; }; - getNotifications: { + getsAvailable_1: { parameters: { query?: { - /** @description 조회 기간 (일 단위, 예: 30이면 30일 전까지) */ - dayLimit?: number; + page?: number; + size?: number; }; header?: never; path?: never; @@ -8962,12 +12093,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ListRespNotificationResp']; + '*/*': components['schemas']['PageRespNoticeResp']; }; }; }; }; - countUnread: { + countAvailable: { parameters: { query?: never; header?: never; @@ -8982,17 +12113,14 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['NotificationUnreadCountResp']; + '*/*': components['schemas']['NoticeUnreadCountResp']; }; }; }; }; - getsAvailable_1: { + getCurrentType: { parameters: { - query?: { - page?: number; - size?: number; - }; + query?: never; header?: never; path?: never; cookie?: never; @@ -9005,14 +12133,16 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['PageRespNoticeResp']; + '*/*': components['schemas']['MockExamTypeResp']; }; }; }; }; - countAvailable: { + getCards: { parameters: { - query?: never; + query?: { + date?: string; + }; header?: never; path?: never; cookie?: never; @@ -9025,7 +12155,7 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': components['schemas']['NoticeUnreadCountResp']; + '*/*': components['schemas']['ListRespFocusCardIssuanceResp']; }; }; }; @@ -9092,6 +12222,32 @@ export interface operations { }; }; }; + getByDate: { + parameters: { + query?: { + /** + * @description 조회 기준 일자 + * @example 2026-05-05 + */ + commentDate?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['DailyCommentResp'][]; + }; + }; + }; + }; existsByEmail: { parameters: { query: { @@ -9175,26 +12331,6 @@ export interface operations { }; }; }; - throwException: { - parameters: { - query?: { - message?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; refresh_3: { parameters: { query?: never; @@ -9305,7 +12441,7 @@ export interface operations { }; }; }; - delete_7: { + delete_11: { parameters: { query?: never; header?: never; @@ -9390,6 +12526,93 @@ export interface operations { }; }; }; + getByStudent: { + parameters: { + query: { + studentId: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ListRespMockExamResultResp']; + }; + }; + }; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['FocusCardResp']; + }; + }; + }; + }; + delete_12: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + issuanceByDate: { + parameters: { + query: { + studentId: number; + issuedDate?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ListRespFocusCardIssuanceResp']; + }; + }; + }; + }; getStatus: { parameters: { query?: never; @@ -9410,6 +12633,87 @@ export interface operations { }; }; }; + getNodeSheet: { + parameters: { + query?: { + name?: string; + nodeTypeId?: number; + description?: string; + sort?: 'NAME' | 'NODE_TYPE' | 'DESCRIPTION'; + direction?: 'ASC' | 'DESC'; + page?: number; + size?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['PageRespConceptNodeResp']; + }; + }; + }; + }; + getEdgeSheet: { + parameters: { + query?: { + fromNodeName?: string; + edgeTypeId?: number; + toNodeName?: string; + sort?: 'FROM_NAME' | 'EDGE_TYPE' | 'TO_NAME'; + direction?: 'ASC' | 'DESC'; + page?: number; + size?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['PageRespConceptEdgeResp']; + }; + }; + }; + }; + getActionGraphSheet: { + parameters: { + query?: { + actionNodeName?: string; + direction?: 'ASC' | 'DESC'; + page?: number; + size?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['PageRespNotListActionGraphSheetResp']; + }; + }; + }; + }; issueTemporaryToken: { parameters: { query: { @@ -9620,7 +12924,7 @@ export interface operations { }; }; }; - delete_8: { + delete_13: { parameters: { query?: never; header?: never; @@ -9640,7 +12944,7 @@ export interface operations { }; }; }; - delete_9: { + delete_14: { parameters: { query?: never; header?: never; @@ -9660,6 +12964,26 @@ export interface operations { }; }; }; + remove: { + parameters: { + query?: never; + header?: never; + path: { + linkId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; deleteItem: { parameters: { query?: never; @@ -9683,4 +13007,24 @@ export interface operations { }; }; }; + revokeIssuance: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; }