diff --git a/apps/service/package.json b/apps/service/package.json index 95153592..2cf1f7a2 100644 --- a/apps/service/package.json +++ b/apps/service/package.json @@ -7,7 +7,7 @@ "build": "next build", "start": "next start", "lint": "next lint", - "openapi": "pnpm dlx openapi-typescript https://dev.math-pointer.com/v3/api-docs --output ./src/types/api/schema.d.ts && prettier --write ./src/types/api/schema.d.ts" + "openapi": "pnpm dlx openapi-typescript https://api.math-pointer.com/v3/api-docs --output ./src/types/api/schema.d.ts && prettier --write ./src/types/api/schema.d.ts" }, "dependencies": { "@next/third-parties": "^15.2.4", @@ -15,6 +15,7 @@ "@tanstack/react-query": "^5.66.0", "@tanstack/react-query-devtools": "^5.66.0", "dayjs": "^1.11.13", + "clsx": "^2.1.1", "next": "15.1.4", "openapi-fetch": "^0.13.4", "openapi-react-query": "^0.3.0", diff --git a/apps/service/src/apis/authMiddleware.ts b/apps/service/src/apis/authMiddleware.ts index 87fc26fb..33de2eaf 100644 --- a/apps/service/src/apis/authMiddleware.ts +++ b/apps/service/src/apis/authMiddleware.ts @@ -1,29 +1,39 @@ 'use client'; import { Middleware } from 'openapi-fetch'; -import { getAccessToken, setAccessToken } from '@utils'; +import { getAccessToken, setAccessToken, setName, setRefreshToken } from '@utils'; +import { postRefreshToken } from '@/apis/controller/auth'; -const UNPROTECTED_ROUTES = ['/api/v1/auth/admin/login', '/api/v1/auth/oauth/social-login']; +const UNPROTECTED_ROUTES = ['/api/student/auth/social/login', '/api/common/auth/refresh']; const reissueToken = async () => { - try { - const response = await fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/v1/auth/reissue`, { - method: 'GET', - credentials: 'include', - }); + let accessToken = getAccessToken(); - if (!response.ok) throw new Error('Token reissue failed'); - - const data = await response.json(); - const accessToken = data.data.accessToken; - setAccessToken(accessToken); + if (accessToken) { return accessToken; - } catch (error) { - console.error('Reissue failed:', error); + } + + const result = await postRefreshToken(); + + if (!result.isSuccess || !result.data) { + console.error('액세스토큰 갱신 실패:', result.error); localStorage.removeItem('accessToken'); + localStorage.removeItem('refreshToken'); window.location.href = '/login'; return null; } + + if (result.data?.token.accessToken) { + setAccessToken(result.data.token.accessToken); + accessToken = result.data.token.accessToken; + } + if (result.data?.token.refreshToken) { + setRefreshToken(result.data.token.refreshToken); + } + if (result.data?.name) { + setName(result.data.name); + } + return accessToken; }; const authMiddleware: Middleware = { @@ -32,18 +42,12 @@ const authMiddleware: Middleware = { return undefined; } - let accessToken = getAccessToken(); + const accessToken = await reissueToken(); - if (!accessToken) { - accessToken = await reissueToken(); - - if (!accessToken) { - console.error('Access token reissue failed. Logging out...'); - return request; - } + if (accessToken) { + request.headers.set('Authorization', `Bearer ${accessToken}`); } - request.headers.set('Authorization', `Bearer ${accessToken}`); return request; }, diff --git a/apps/service/src/apis/controller/auth/index.ts b/apps/service/src/apis/controller/auth/index.ts index bdae8e16..216426b3 100644 --- a/apps/service/src/apis/controller/auth/index.ts +++ b/apps/service/src/apis/controller/auth/index.ts @@ -1,4 +1,5 @@ -import postLogin from './postLogin'; import postKakaoLogin from './postKakaoLogin'; +import postUserInfo from './postUserInfo'; +import postRefreshToken from './postRefreshToken'; -export { postLogin, postKakaoLogin }; +export { postKakaoLogin, postUserInfo, postRefreshToken }; diff --git a/apps/service/src/apis/controller/auth/postKakaoLogin.ts b/apps/service/src/apis/controller/auth/postKakaoLogin.ts index f79e80eb..bc4be7fb 100644 --- a/apps/service/src/apis/controller/auth/postKakaoLogin.ts +++ b/apps/service/src/apis/controller/auth/postKakaoLogin.ts @@ -1,54 +1,24 @@ 'use client'; -import { setAccessToken, setName } from '@utils'; import { client } from '@/apis/client'; -const postKakaoAccessToken = async (code: string) => { - const response = await fetch(`https://kauth.kakao.com/oauth/token`, { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8', - }, - body: `grant_type=authorization_code&client_id=${process.env.NEXT_PUBLIC_REST_API_KEY}&redirect_uri=${process.env.NEXT_PUBLIC_REDIRECT_URI}&code=${code}`, - }); - const jsonData = await response.json(); - return jsonData.access_token; -}; - -const postKakaoLogin = async (code: string) => { - const accessToken = await postKakaoAccessToken(code); - const response = await client.POST('/api/v1/auth/oauth/social-login', { - params: { - header: { - social_access_token: accessToken, - }, - query: { - provider: 'KAKAO', - }, +const postKakaoLogin = async () => { + const response = await client.POST('/api/student/auth/login/social', { + body: { + provider: 'KAKAO', + redirectUri: process.env.NEXT_PUBLIC_REDIRECT_URI ?? '', }, }); try { - if ( - response && - response.data && - response.data.data && - response.data.data.name && - response.data.data.accessToken - ) { - const { accessToken, name } = response.data.data; - setAccessToken(accessToken); - setName(name); - - window.location.href = '/'; + if (response && response.data) { + return { isSuccess: true, loginUrl: response.data.loginUrl }; } else { - console.error('accessToken을 찾을 수 없습니다:', response); + return { isSuccess: false, error: '데이터를 찾을 수 없습니다.' }; } } catch (error) { - console.error('소셜 로그인 요청 오류:', error); + return { isSuccess: false, error: error }; } - - return response; }; export default postKakaoLogin; diff --git a/apps/service/src/apis/controller/auth/postLogin.ts b/apps/service/src/apis/controller/auth/postLogin.ts deleted file mode 100644 index fd73e233..00000000 --- a/apps/service/src/apis/controller/auth/postLogin.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { client } from '@apis'; - -const postLogin = async (email: string, password: string) => { - return await client.POST('/api/v1/auth/admin/login', { - body: { - email, - password, - }, - credentials: 'include', - }); -}; - -export default postLogin; diff --git a/apps/service/src/apis/controller/auth/postRefreshToken.ts b/apps/service/src/apis/controller/auth/postRefreshToken.ts new file mode 100644 index 00000000..251b73a7 --- /dev/null +++ b/apps/service/src/apis/controller/auth/postRefreshToken.ts @@ -0,0 +1,17 @@ +'use client'; + +const postRefreshToken = async () => { + try { + const res = await fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/common/auth/refresh`, { + method: 'GET', + }); + if (!res.ok) throw new Error('Refresh failed'); + + const data = await res.json(); + return { isSuccess: true, data }; + } catch (e) { + return { isSuccess: false, error: e }; + } +}; + +export default postRefreshToken; diff --git a/apps/service/src/apis/controller/auth/postUserInfo.ts b/apps/service/src/apis/controller/auth/postUserInfo.ts new file mode 100644 index 00000000..029832ad --- /dev/null +++ b/apps/service/src/apis/controller/auth/postUserInfo.ts @@ -0,0 +1,17 @@ +import { client } from '@apis'; + +const postUserInfo = async (name: string, grade: number) => { + try { + const response = await client.POST('/api/student/auth/register/social', { + body: { + name: name, + grade: grade, + }, + }); + return { isSuccess: true, data: response.data }; + } catch (error) { + return { isSuccess: false, error: error }; + } +}; + +export default postUserInfo; diff --git a/apps/service/src/app/api/auth/callback/kakao/page.tsx b/apps/service/src/app/api/auth/callback/kakao/page.tsx index d9f216cb..4f772dac 100644 --- a/apps/service/src/app/api/auth/callback/kakao/page.tsx +++ b/apps/service/src/app/api/auth/callback/kakao/page.tsx @@ -1,19 +1,32 @@ 'use client'; -import { useSearchParams } from 'next/navigation'; +import { useRouter, useSearchParams } from 'next/navigation'; import { useEffect } from 'react'; -import { postKakaoLogin } from '@apis'; +import { setAccessToken, setRefreshToken } from '@utils'; const Page = () => { const searchParams = useSearchParams(); - const code = searchParams.get('code'); + const router = useRouter(); + const { success, isFirstLogin, accessToken, refreshToken } = Object.fromEntries( + searchParams.entries() + ); useEffect(() => { - if (code) { - postKakaoLogin(code); + if (!success || !accessToken) { + router.replace('/login'); + return; } - }, [code]); + + setAccessToken(accessToken); + setRefreshToken(refreshToken); + + if (isFirstLogin) { + router.replace('/onboarding'); + } else { + router.replace('/'); + } + }, [searchParams]); return <>; }; diff --git a/apps/service/src/app/layout.tsx b/apps/service/src/app/layout.tsx index 10f0b628..6238ae9d 100644 --- a/apps/service/src/app/layout.tsx +++ b/apps/service/src/app/layout.tsx @@ -50,7 +50,7 @@ export default function RootLayout({ modal: React.ReactNode; }>) { return ( - + diff --git a/apps/service/src/app/login/page.tsx b/apps/service/src/app/login/page.tsx index 9f04fe5a..1472d028 100644 --- a/apps/service/src/app/login/page.tsx +++ b/apps/service/src/app/login/page.tsx @@ -3,18 +3,21 @@ import { useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { getAccessToken, trackEvent } from '@utils'; +import { postKakaoLogin } from '@apis'; import { LogoLogin } from '@/assets/svg/logo'; import { KakaoButton } from '@/components/login'; const Page = () => { const router = useRouter(); - const kakaoLoginUrl = `https://kauth.kakao.com/oauth/authorize?client_id=${ - process.env.NEXT_PUBLIC_REST_API_KEY - }&redirect_uri=${process.env.NEXT_PUBLIC_REDIRECT_URI}&response_type=code`; - const handleLoginClick = () => { + const handleLoginClick = async () => { trackEvent('kakao_login_click'); - window.location.replace(kakaoLoginUrl); + const result = await postKakaoLogin(); + if (result.isSuccess && result.loginUrl) { + router.push(result.loginUrl); + } else { + console.error('로그인 URL을 가져오는 데 실패했습니다.'); + } }; useEffect(() => { diff --git a/apps/service/src/app/onboarding/page.tsx b/apps/service/src/app/onboarding/page.tsx new file mode 100644 index 00000000..bae6d5d1 --- /dev/null +++ b/apps/service/src/app/onboarding/page.tsx @@ -0,0 +1,75 @@ +'use client'; + +import { useForm, FormProvider } from 'react-hook-form'; +import { useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; + +import { Button, Header } from '@components'; +import { postUserInfo } from '@/apis/controller/auth'; +import { setName } from '@utils'; +import UserInfoForm from '@/components/onboarding/UserInfoForm'; + +const Page = () => { + type FormValues = { name: string; grade: string }; + const router = useRouter(); + const [isFormFilled, setIsFormFilled] = useState(false); + + const methods = useForm({ + mode: 'onChange', + }); + const { register, formState, getFieldState } = methods; + const handleSubmitForm = async () => { + const result = await postUserInfo( + methods.getValues('name'), + Number(methods.getValues('grade')) + ); + if (result.isSuccess) { + if (result.data) { + setName(result.data.name); + } + router.push('/'); + } else { + console.error('회원 정보 입력 실패:', result.error); + router.push('/login'); + } + }; + + useEffect(() => { + const isNameValid = getFieldState('name', formState); + const isGradeValid = getFieldState('grade', formState); + + if ( + !isNameValid.invalid && + !isGradeValid.invalid && + isNameValid.isDirty && + isGradeValid.isDirty + ) { + setIsFormFilled(true); + } else { + setIsFormFilled(false); + } + }, [formState, methods]); + + return ( + <> +
+
+ +
+

+ 포인터 + 에 오신 걸
+ 환영합니다! +

+ +
+ +
+
+ + ); +}; + +export default Page; diff --git a/apps/service/src/components/common/Header.tsx b/apps/service/src/components/common/Header.tsx index d6a43b91..40569dde 100644 --- a/apps/service/src/components/common/Header.tsx +++ b/apps/service/src/components/common/Header.tsx @@ -6,7 +6,7 @@ import { IcHome, IcLeft } from '@svg'; interface HeaderProps { title: string; - iconType?: 'home' | 'back'; + iconType?: 'home' | 'back' | 'none'; } const Header = ({ title, iconType = 'home' }: HeaderProps) => { @@ -22,6 +22,7 @@ const Header = ({ title, iconType = 'home' }: HeaderProps) => {
{iconType === 'home' && } {iconType === 'back' && router.back()} />} + {iconType === 'none' &&
}

{title}

diff --git a/apps/service/src/components/common/Inputs/Input.tsx b/apps/service/src/components/common/Inputs/Input.tsx index 6ddffc1c..5668e4ab 100644 --- a/apps/service/src/components/common/Inputs/Input.tsx +++ b/apps/service/src/components/common/Inputs/Input.tsx @@ -5,7 +5,7 @@ const Input = forwardRef return ( ); diff --git a/apps/service/src/components/common/Inputs/UserInfoInput.tsx b/apps/service/src/components/common/Inputs/UserInfoInput.tsx new file mode 100644 index 00000000..6590ac37 --- /dev/null +++ b/apps/service/src/components/common/Inputs/UserInfoInput.tsx @@ -0,0 +1,28 @@ +import { forwardRef } from 'react'; +import clsx from 'clsx'; + +import { Input } from '@components'; + +interface UserInfoInputProps { + type?: 'name' | 'grade'; + error?: boolean; +} + +const UserInfoInput = forwardRef( + ({ type, error = false, ...props }, ref) => { + return ( +
+ {type === 'name' && } + {type === 'grade' && } +

+ {type === 'name' && '2자 이상, 5자 이하로 입력해주세요'} + {type === 'grade' && '1~3 사이 숫자만 입력해주세요'} +

+
+ ); + } +); + +UserInfoInput.displayName = 'UserInfoInput'; + +export default UserInfoInput; diff --git a/apps/service/src/components/onboarding/UserInfoForm.tsx b/apps/service/src/components/onboarding/UserInfoForm.tsx new file mode 100644 index 00000000..21f4c0a1 --- /dev/null +++ b/apps/service/src/components/onboarding/UserInfoForm.tsx @@ -0,0 +1,36 @@ +import { UseFormStateReturn, UseFormRegister } from 'react-hook-form'; + +import { UserInfoFormData } from '@/types'; +import { GRADE_VALIDATION_RULES, NAME_VALIDATION_RULES } from '@/constants/validationRules'; + +import UserInfoInput from '../common/Inputs/UserInfoInput'; + +type UserInfoFormProps = { + formState: UseFormStateReturn; + register: UseFormRegister; +}; + +const UserInfoForm = ({ formState, register }: UserInfoFormProps) => { + return ( + <> +
+

이름이 무엇인가요?

+ +
+
+

몇학년인가요?

+ +
+ + ); +}; + +export default UserInfoForm; diff --git a/apps/service/src/constants/validationRules.ts b/apps/service/src/constants/validationRules.ts new file mode 100644 index 00000000..2abdb0c4 --- /dev/null +++ b/apps/service/src/constants/validationRules.ts @@ -0,0 +1,25 @@ +export const NAME_VALIDATION_RULES = { + required: { + value: true, + message: '', + }, + minLength: { + value: 2, + message: '', + }, + maxLength: { + value: 5, + message: '', + }, +}; + +export const GRADE_VALIDATION_RULES = { + required: { + value: true, + message: '', + }, + pattern: { + value: /^[1-3]$/, + message: '', + }, +}; diff --git a/apps/service/src/types/api/schema.d.ts b/apps/service/src/types/api/schema.d.ts index 0f76b3e6..03418032 100644 --- a/apps/service/src/types/api/schema.d.ts +++ b/apps/service/src/types/api/schema.d.ts @@ -4,60 +4,169 @@ */ export interface paths { - '/api/v1/problems/{id}': { + '/api/teacher/qna/chat/{chatId}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 문항 조회 - * @description 문항를 조회합니다. - */ + get?: never; + /** 채팅메시지 수정 */ + put: operations['updateChat']; + post?: never; + /** 채팅메시지 삭제 */ + delete: operations['deleteChat']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/teacher/notice/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** 수정 */ + put: operations['update']; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/qna/{qnaId}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Q&A 상세 조회 */ + get: operations['getById']; + /** Q&A 수정 */ + put: operations['update_1']; + post?: never; + /** Q&A 삭제 */ + delete: operations['delete']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/qna/chat/{chatId}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** 채팅메시지 수정 */ + put: operations['updateChat_1']; + post?: never; + /** 채팅메시지 삭제 */ + delete: operations['deleteChat_1']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/notice/read/{noticeId}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** 공지사항 읽기 */ + put: operations['readNotice']; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/me': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 내 정보 조회 */ + get: operations['me']; + /** 내 정보 수정 */ + put: operations['update_2']; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/teacher/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** 수정 */ + put: operations['update_3']; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/problem/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 상세 조회 */ get: operations['getProblem']; - /** - * 문항 업데이트 - * @description 문제를 업데이트합니다. 새끼문항은 들어온 list의 순서로 저장됩니다. - */ + /** 수정 */ put: operations['updateProblem']; post?: never; - /** 문항 삭제 */ + /** 삭제 */ delete: operations['deleteProblem']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/problemSet/{problemSetId}': { + '/api/admin/problem-set/{id}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 문항세트 개별 조회 - * @description 문항세트를 조회합니다. - */ + /** 상세 조회 */ get: operations['getProblemSet']; - /** - * 문항세트 수정 - * @description 문항세트의 이름 및 문항 리스트를 수정합니다. - */ - put: operations['updateProblemSet']; + /** 수정 */ + put: operations['update_4']; post?: never; - /** - * 문항세트 삭제 - * @description 문항세트를 삭제합니다. (soft delete) - */ - delete: operations['deleteProblemSet_1']; + /** 삭제 */ + delete: operations['delete_1']; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/problemSet/{problemSetId}/confirm': { + '/api/admin/problem-set/{id}/status': { parameters: { query?: never; header?: never; @@ -65,11 +174,8 @@ export interface paths { cookie?: never; }; get?: never; - /** - * 문항세트 컨펌 토글 - * @description 문항세트의 컨펌 상태를 토글합니다. - */ - put: operations['toggleConfirmProblemSet']; + /** 수정 */ + put: operations['update_5']; post?: never; delete?: never; options?: never; @@ -77,7 +183,7 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/client/problemSubmit': { + '/api/admin/problem-set/toggle-status/{id}': { parameters: { query?: never; header?: never; @@ -85,23 +191,34 @@ export interface paths { cookie?: never; }; get?: never; - /** - * 문항 제출 업데이트 - * @description 제출한 답안을 바탕으로 문항 제출의 상태를 업데이트합니다. - */ - put: operations['updateProblemSubmit']; - /** - * 문항 제출 생성 - * @description 문항 제출을 '진행중'으로 생성합니다. - */ - post: operations['createProblemSubmit']; + /** 컨펌 여부 토글 */ + put: operations['toggleStatus']; + post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/client/childProblemSubmit': { + '/api/admin/practice-test/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** 수정 */ + put: operations['update_6']; + post?: never; + /** 삭제 */ + delete: operations['delete_2']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/notice/{id}': { parameters: { query?: never; header?: never; @@ -109,23 +226,34 @@ export interface paths { cookie?: never; }; get?: never; - /** - * 새끼문항 제출 업데이트 - * @description 제출한 답안을 바탕으로 문항 제출의 상태를 업데이트합니다. - */ - put: operations['updateChildProblemSubmit']; - /** - * 새끼문항 제출 생성 - * @description 문항에 속한 새끼문항들을 '시작전'으로 생성합니다. - */ - post: operations['createProblemSubmit_1']; + /** 수정 */ + put: operations['update_7']; + post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/client/childProblemSubmit/incorrect': { + '/api/admin/concept/{conceptId}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** 개념태그 수정 */ + put: operations['update_8']; + post?: never; + /** 개념태그 삭제 */ + delete: operations['delete_3']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/concept/category/{categoryId}': { parameters: { query?: never; header?: never; @@ -133,19 +261,52 @@ export interface paths { cookie?: never; }; get?: never; - /** - * 새끼문항 제출 틀림 업데이트 - * @description 새끼문항 제출의 상태를 틀림으로 업데이트합니다. - */ - put: operations['updateChildProblemSubmitIncorrect']; + /** 대분류 수정 */ + put: operations['updateCategory']; post?: never; + /** 대분류 삭제 */ + delete: operations['deleteCategory']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/teacher/qna/chat': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 채팅메시지 생성 */ + post: operations['addChat']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/teacher/notice': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 학생 별 공지사항 전체 조회 */ + get: operations['getsAll']; + put?: never; + /** 생성 */ + post: operations['create']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/publish': { + '/api/teacher/auth/refresh': { parameters: { query?: never; header?: never; @@ -154,18 +315,15 @@ export interface paths { }; get?: never; put?: never; - /** - * 발행 생성하기 - * @description 특정 날짜에 문항세트를 발행합니다. - */ - post: operations['postPublish']; + /** 토큰 갱신 */ + post: operations['refresh']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/problems': { + '/api/teacher/auth/login/local': { parameters: { query?: never; header?: never; @@ -174,18 +332,15 @@ export interface paths { }; get?: never; put?: never; - /** - * 문항 생성 - * @description 문제를 생성합니다. 기출/변형 문제는 모든 값이 필수이며 창작 문제는 문항 타입만 필수 입니다. - */ - post: operations['createProblem']; + /** 이메일 로그인 */ + post: operations['login']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/problems/{problemId}/child-problems': { + '/api/student/study/submit/pointing': { parameters: { query?: never; header?: never; @@ -194,18 +349,15 @@ export interface paths { }; get?: never; put?: never; - /** - * 새끼문항 추가 - * @description 추가되는 새끼 문항의 id를 반환합니다. 컨펌 이후에는 새끼 문항 추가가 불가능합니다. - */ - post: operations['createChildProblem']; + /** 포인팅 피드백(이해했어요/모르겠어요) 제출 */ + post: operations['feedback']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/problemSet': { + '/api/student/study/submit/answer': { parameters: { query?: never; header?: never; @@ -214,18 +366,33 @@ export interface paths { }; get?: never; put?: never; - /** - * 문항세트 생성 - * @description 문항세트를 생성합니다. 문항은 요청 순서대로 저장합니다. - */ - post: operations['createProblemSet']; + /** 답안 제출 */ + post: operations['submit']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/qna': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Q&A 목록 조회 */ + get: operations['gets']; + put?: never; + /** Q&A 생성 */ + post: operations['create_1']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/auth/oauth/social-login': { + '/api/student/qna/exist': { parameters: { query?: never; header?: never; @@ -234,18 +401,15 @@ export interface paths { }; get?: never; put?: never; - /** - * 소셜 로그인 - * @description 소셜 액세스 토큰으로 로그인하여 자체 액세스 토큰을 발급받고 리프레시 토큰을 쿠키에 설정합니다. - */ - post: operations['socialLogin']; + /** Q&A 존재 여부 확인, 사용자가 동일한 항목에 대해 QnA 작성 여부 확인 */ + post: operations['checkExists']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/auth/admin/login': { + '/api/student/qna/chat': { parameters: { query?: never; header?: never; @@ -254,257 +418,303 @@ export interface paths { }; get?: never; put?: never; - /** - * 어드민 로그인 - * @description 이메일과 비밀번호로 로그인하여 액세스 토큰을 발급받고 리프레시 토큰을 쿠키에 설정합니다. - */ - post: operations['adminLogin']; + /** 채팅메시지 생성 */ + post: operations['addChat_1']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/publish/{year}/{month}': { + '/api/student/auth/register/social': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 연월별 발행 조회 - * @description 연월별로 발행된 세트들을 조회합니다. - */ - get: operations['getPublishMonth']; + get?: never; put?: never; - post?: never; + /** 소셜 로그인 이후, 정보 등록 */ + post: operations['registerSocial']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/problems/search': { + '/api/student/auth/refresh': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 문제 검색 - * @description 문항 ID, 문제명, 개념 태그리스트로 문제를 검색합니다. 개념 태그리스트는 OR 조건으로 검색하며 값이 없으면 쿼리파라미터에서 빼주세요 - */ - get: operations['search']; + get?: never; put?: never; - post?: never; + /** 토큰 갱신 */ + post: operations['refresh_1']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/problemSet/search': { + '/api/student/auth/login/social': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 문항세트 검색 - * @description 문항세트 타이틀, 문항세트 내 포함된 개념태그, 문항세트 내 포함된 문항 타이틀로 검색합니다. 발행상태는 발행이면 CONFIRMED, 아니면 NOT_CONFIRMED 입니다. - */ - get: operations['search_1']; + get?: never; put?: never; - post?: never; + /** 소셜 로그인 URL 요청 [네이버만 완료] */ + post: operations['getSocialLoginUrl']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/problemSet/confirm/search': { + '/api/common/upload-file': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 발행용 문항세트 검색 - * @description 문항세트 타이틀, 문항세트 내 포함된 개념태그, 문항세트 내 포함된 문항 타이틀로 검색합니다. 발행상태가 CONFIRMED 문항세트만 조회됩니다.. - */ - get: operations['confirmSearch']; + get?: never; put?: never; - post?: never; + /** 파일 업로드, (응답의 uploadUrl로 AWS S3 업로드 해야합니다) */ + post: operations['getPreSignedUrl']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/practiceTestTags': { + '/api/admin/user': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 모의고사 목록 조회 */ - get: operations['getPracticeTestTags']; + get?: never; put?: never; - post?: never; + /** 관리자 계정 생성 */ + post: operations['create_2']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/member/me': { + '/api/admin/teacher': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 내 정보 조회 - * @description jwt accessToken을 통해 내 정보를 조회합니다. - */ - get: operations['getMyInfo']; + /** 전체 조회 */ + get: operations['gets_1']; put?: never; - post?: never; + /** 생성 */ + post: operations['create_3']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/images/{fileName}': { + '/api/admin/teacher/assign/{teacherId}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 이미지 업로드 완료 후 URL 조회 */ - get: operations['getImageUrl']; + get?: never; put?: never; - post?: never; + /** 선생님에게 학생 배정 */ + post: operations['assignStudentsToTeacher']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/images/problem/{problemId}/presigned-url': { + '/api/admin/publish': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 이미지 업로드를 위한 presigned URL 발급 */ - get: operations['getProblemImagePresignedUrl']; + /** 검색 */ + get: operations['search']; put?: never; - post?: never; + /** 생성 */ + post: operations['create_4']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/conceptTags': { + '/api/admin/problem': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** 모든 개념 태그 리스트 조회 */ - get: operations['getConceptTags']; + /** 검색 */ + get: operations['search_1']; put?: never; - post?: never; + /** 생성 */ + post: operations['createProblem']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/client/problem/{publishId}': { + '/api/admin/problem-set': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 특정 발행 속 문항들 조회 - * @description 사용자에게 보여지는 특정 발행에 속한 문항을 조회합니다. - */ - get: operations['getProblemsInPublish']; + /** 검색 */ + get: operations['search_2']; put?: never; - post?: never; + /** 생성 */ + post: operations['create_5']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/client/problem/{publishId}/{problemId}': { + '/api/admin/practice-test': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 문항 조회 - * @description 사용자에게 보여지는 문항을 조회합니다. - */ - get: operations['getProblem_1']; + /** 검색 */ + get: operations['search_3']; put?: never; - post?: never; + /** 생성 */ + post: operations['create_6']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/client/problem/{publishId}/{problemId}/{childProblemId}': { + '/api/admin/notice': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 새끼문항 조회 - * @description 사용자에게 보여지는 새끼문항을 조회합니다. - */ - get: operations['getChildProblem']; + /** 학생 별 공지사항 전체 조회 */ + get: operations['getsAll_1']; put?: never; - post?: never; + /** 생성 */ + post: operations['create_7']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/concept': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 개념 태그 검색 */ + get: operations['search_4']; + put?: never; + /** 개념태그 생성 */ + post: operations['create_8']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/concept/category': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 대분류 검색 */ + get: operations['searchCategory']; + put?: never; + /** 대분류 생성 */ + post: operations['createCategory']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/auth/refresh': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 토큰 갱신 */ + post: operations['refresh_2']; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/client/problem/thumbnail/{publishId}/{problemId}': { + '/api/admin/auth/login/local': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 문항 썸네일 조회 - * @description 바로 풀어보기/단계별로 풀어보기 화면에서 필요한 문항을 조회합니다. - */ - get: operations['getProblemThumbnail']; + get?: never; + put?: never; + /** 이메일 로그인 */ + post: operations['login_1']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/your-redirect-url': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 소셜 로그인 콜백 example */ + get: operations['oauthRedirectExample']; put?: never; post?: never; delete?: never; @@ -513,18 +723,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/client/problem/child/{publishId}/{problemId}': { + '/api/teacher/study/publish/weekly': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 문항에 포함된 새끼문항 정보 조회 - * @description 단계별로 풀어보기 이후 화면들에서 필요한 정보들을 조회합니다. - */ - get: operations['getChildProblems']; + /** 학생 주간 발행(숙제) 조회 */ + get: operations['search_5']; put?: never; post?: never; delete?: never; @@ -533,18 +740,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/client/problem/all/{year}/{month}': { + '/api/teacher/study/publish/monthly': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 전체 문제 조회 - * @description 월별 문제들에 대한 진행도와 정보들을 조회합니다. - */ - get: operations['getAllProblem']; + /** 학생 월간 발행(숙제) 조회 */ + get: operations['searchMonthly']; put?: never; post?: never; delete?: never; @@ -553,18 +757,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/client/home-feed': { + '/api/teacher/study/publish/detail/{id}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 홈 피드 조회 - * @description 회원의 홈 피드 정보를 조회합니다. - */ - get: operations['getHomeFeed']; + /** 발행(숙제) 상세 조회 */ + get: operations['getPublishById']; put?: never; post?: never; delete?: never; @@ -573,18 +774,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/client/commentary': { + '/api/teacher/study/progress/weekly': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 해설 조회 - * @description 문항 별 해설/처방을 조회합니다. - */ - get: operations['getCommentary']; + /** 학생 주간 학습 진행 상황 조회 */ + get: operations['getWeeklyProgress']; put?: never; post?: never; delete?: never; @@ -593,18 +791,15 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/auth/reissue': { + '/api/teacher/study/problem/{id}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** - * 토큰 재발급 - * @description 리프레시 토큰을 통해 새로운 액세스 토큰을 발급하고 새로운 리프레시 토큰을 쿠키에 설정합니다. - */ - get: operations['reissueToken']; + /** 문제 상세 조회 */ + get: operations['getProblemById']; put?: never; post?: never; delete?: never; @@ -613,495 +808,1914 @@ export interface paths { patch?: never; trace?: never; }; - '/api/v1/publish/{publishId}': { + '/api/teacher/study/child-problem/{id}': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; + /** 새끼 문제 상세 조회 */ + get: operations['getChildProblemById']; put?: never; post?: never; - /** - * 발행 삭제 - * @description 발행을 삭제합니다. - */ - delete: operations['deleteProblemSet']; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - '/api/v1/problems/{problemId}/child-problems/{childProblemId}': { + '/api/teacher/students': { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; + /** 내 학생 전체 조회 */ + get: operations['getMyStudents']; put?: never; post?: never; - /** - * 새끼 문항 삭제 - * @description 컨펌 이후에는 새끼 문항 삭제가 불가능합니다. - */ - delete: operations['deleteChildProblem']; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; -} -export type webhooks = Record; -export interface components { - schemas: { - ErrorResponse: { - message: string; - /** @enum {string} */ - status: - | '100 CONTINUE' - | '101 SWITCHING_PROTOCOLS' - | '102 PROCESSING' - | '103 EARLY_HINTS' - | '103 CHECKPOINT' - | '200 OK' - | '201 CREATED' - | '202 ACCEPTED' - | '203 NON_AUTHORITATIVE_INFORMATION' - | '204 NO_CONTENT' - | '205 RESET_CONTENT' - | '206 PARTIAL_CONTENT' - | '207 MULTI_STATUS' - | '208 ALREADY_REPORTED' - | '226 IM_USED' - | '300 MULTIPLE_CHOICES' - | '301 MOVED_PERMANENTLY' - | '302 FOUND' - | '302 MOVED_TEMPORARILY' - | '303 SEE_OTHER' - | '304 NOT_MODIFIED' - | '305 USE_PROXY' - | '307 TEMPORARY_REDIRECT' - | '308 PERMANENT_REDIRECT' - | '400 BAD_REQUEST' - | '401 UNAUTHORIZED' - | '402 PAYMENT_REQUIRED' - | '403 FORBIDDEN' - | '404 NOT_FOUND' - | '405 METHOD_NOT_ALLOWED' - | '406 NOT_ACCEPTABLE' - | '407 PROXY_AUTHENTICATION_REQUIRED' - | '408 REQUEST_TIMEOUT' - | '409 CONFLICT' - | '410 GONE' - | '411 LENGTH_REQUIRED' - | '412 PRECONDITION_FAILED' - | '413 PAYLOAD_TOO_LARGE' - | '413 REQUEST_ENTITY_TOO_LARGE' - | '414 URI_TOO_LONG' - | '414 REQUEST_URI_TOO_LONG' - | '415 UNSUPPORTED_MEDIA_TYPE' - | '416 REQUESTED_RANGE_NOT_SATISFIABLE' - | '417 EXPECTATION_FAILED' - | '418 I_AM_A_TEAPOT' - | '419 INSUFFICIENT_SPACE_ON_RESOURCE' - | '420 METHOD_FAILURE' - | '421 DESTINATION_LOCKED' - | '422 UNPROCESSABLE_ENTITY' - | '423 LOCKED' - | '424 FAILED_DEPENDENCY' - | '425 TOO_EARLY' - | '426 UPGRADE_REQUIRED' - | '428 PRECONDITION_REQUIRED' - | '429 TOO_MANY_REQUESTS' - | '431 REQUEST_HEADER_FIELDS_TOO_LARGE' - | '451 UNAVAILABLE_FOR_LEGAL_REASONS' - | '500 INTERNAL_SERVER_ERROR' - | '501 NOT_IMPLEMENTED' - | '502 BAD_GATEWAY' - | '503 SERVICE_UNAVAILABLE' - | '504 GATEWAY_TIMEOUT' - | '505 HTTP_VERSION_NOT_SUPPORTED' - | '506 VARIANT_ALSO_NEGOTIATES' - | '507 INSUFFICIENT_STORAGE' - | '508 LOOP_DETECTED' - | '509 BANDWIDTH_LIMIT_EXCEEDED' - | '510 NOT_EXTENDED' - | '511 NETWORK_AUTHENTICATION_REQUIRED'; - }; - ChildProblemUpdateRequest: { - /** Format: int64 */ - childProblemId: number; - imageUrl?: string; - /** @enum {string} */ - answerType?: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; - answer?: string; - conceptTagIds: number[]; - prescriptionImageUrls: string[]; + '/api/teacher/qna': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - ProblemUpdateRequest: { + /** Q&A 목록 조회 */ + get: operations['gets_2']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/teacher/qna/{qnaId}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Q&A 상세 조회 */ + get: operations['getById_1']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/teacher/notice/available': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 학생 별 유효 공지사항(현재 학생이 볼 수 있는 공지사항) 조회 */ + get: operations['getsAvailable']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/teacher/me': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 내 정보 조회 */ + get: operations['getTeacherMe']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/study/publish/weekly': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 주간 발행(숙제) 조회 */ + get: operations['search_6']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/study/publish/monthly': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 월간 발행(숙제) 조회 */ + get: operations['searchMonthly_1']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/study/publish/detail/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 발행(숙제) 상세 조회 */ + get: operations['getPublishById_1']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/study/progress/weekly': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 학생 주간 학습 진행 상황 조회 */ + get: operations['getWeeklyProgress_1']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/study/problem/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 문제 상세 조회 */ + get: operations['getProblemById_1']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/student/study/child-problem/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 새끼 문제 상세 조회 */ + get: operations['getChildProblemById_1']; + 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; + }; + /** 공지사항 목록 조회 */ + 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/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_7']; + 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_2']; + put?: never; + post?: never; + /** 삭제 */ + delete: operations['delete_4']; + 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/common/upload-file/{id}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** 삭제 */ + delete: operations['delete_5']; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/admin/teacher/{teacherId}/{studentId}': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** 선생님으로부터 학생 제거 */ + delete: operations['removeStudentFromTeacher']; + 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; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + ChatUpdateRequest: { + content: string; + images?: number[]; + }; + ChatResp: { + /** Format: int64 */ + id: number; + isMine: boolean; + content: string; + images: components['schemas']['UploadFileResp'][]; + }; + ContentBlockResp: { + /** Format: int64 */ + id: number; + style: string; + /** Format: int32 */ + rank: number; + /** @enum {string} */ + type: 'TEXT' | 'IMAGE'; + data: string; + }; + ContentResp: { + /** Format: int64 */ + id: number; + blocks: components['schemas']['ContentBlockResp'][]; + }; + 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'; + /** Format: date */ + publishDate: 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'; + /** Format: date */ + publishDate: string; + contentTitle: string; + content: components['schemas']['ContentResp']; + question: string; + chats: components['schemas']['ChatResp'][]; + }; + UploadFileResp: { + /** Format: int64 */ + id: number; + fileName: string; + url: string; + }; + NoticeUpdateRequest: { + /** Format: date */ + startAt: string; + /** Format: date */ + endAt: string; + content: string; + }; + NoticeResp: { + /** Format: int64 */ + id: number; + student: components['schemas']['StudentResp']; + /** Format: date */ + startAt: string; + /** Format: date */ + endAt: string; + isRead: boolean; + content: string; + }; + StudentResp: { + /** Format: int64 */ + id: number; + name: string; + /** Format: int32 */ + grade: number; + isFirstLogin: boolean; + }; + QnAUpdateRequest: { + question: string; + }; + StudentUpdateRequest: { + name: string; + /** Format: int32 */ + grade: number; + }; + TeacherUpdateRequest: { + name: string; + email: string; + newPassword?: string; + }; + TeacherResp: { + /** Format: int64 */ + id: number; + name: string; + email: string; + students: components['schemas']['StudentResp'][]; + }; + 'ChildProblemUpdateDTO.Request': { + /** Format: int64 */ + id?: number; + /** Format: int32 */ + no?: number; + problemContent?: components['schemas']['ContentUpdateRequest']; + /** @enum {string} */ + answerType?: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; + /** Format: int32 */ + answer?: number; + concepts?: number[]; + pointings?: components['schemas']['PointingUpdateRequest'][]; + }; + ContentBlockUpdateRequest: { + /** Format: int64 */ + id: number; + /** Format: int32 */ + rank: number; + /** @enum {string} */ + type?: 'TEXT' | 'IMAGE'; + data?: string; + }; + ContentUpdateRequest: { + /** Format: int64 */ + id?: number; + blocks?: components['schemas']['ContentBlockUpdateRequest'][]; + }; + PointingUpdateRequest: { + /** Format: int64 */ + id?: number; + /** Format: int32 */ + no?: number; + questionContent?: components['schemas']['ContentUpdateRequest']; + commentContent?: components['schemas']['ContentUpdateRequest']; + concepts?: number[]; + }; + ProblemUpdateRequest: { + customId: string; + /** @enum {string} */ + problemType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; + /** Format: int64 */ + practiceTestId?: number; + /** Format: int32 */ + practiceTestNo?: 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: components['schemas']['ContentUpdateRequest']; + pointings?: components['schemas']['PointingUpdateRequest'][]; + /** Format: int64 */ + mainAnalysisImageId?: number; + /** Format: int64 */ + mainHandAnalysisImageId?: number; + readingTipContent?: components['schemas']['ContentUpdateRequest']; + oneStepMoreContent?: components['schemas']['ContentUpdateRequest']; + childProblems?: components['schemas']['ChildProblemUpdateDTO.Request'][]; + }; + ChildProblemWithStudyInfoResp: { + /** Format: int64 */ + id: number; + /** Format: int32 */ + no: number; + problemContent: components['schemas']['ContentResp']; + /** @enum {string} */ + answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; + /** Format: int32 */ + answer: number; + concepts: components['schemas']['ConceptResp'][]; + pointings: components['schemas']['PointingWithFeedbackResp'][]; + /** Format: int32 */ + submitAnswer: number; + isCorrect: boolean; + isDone: boolean; + }; + ConceptCategoryResp: { + /** Format: int64 */ + id: number; + name: string; + }; + ConceptResp: { + /** Format: int64 */ + id: number; + name: string; + category: components['schemas']['ConceptCategoryResp']; + }; + PointingResp: { + /** Format: int64 */ + id: number; + /** Format: int32 */ + no: number; + questionContent: components['schemas']['ContentResp']; + commentContent: components['schemas']['ContentResp']; + concepts: components['schemas']['ConceptResp'][]; + }; + PointingWithFeedbackResp: { + /** Format: int64 */ + id: number; + /** Format: int32 */ + no: number; + questionContent: components['schemas']['ContentResp']; + commentContent: components['schemas']['ContentResp']; + concepts: components['schemas']['ConceptResp'][]; + isUnderstood?: boolean; + }; + PracticeTestResp: { + /** Format: int64 */ + id: number; + /** Format: int32 */ + year: number; + /** Format: int32 */ + month: number; + /** Format: int32 */ + grade: number; + name: string; + displayName: string; + }; + ProblemInfoResp: { + /** Format: int64 */ + id: number; + customId: string; /** @enum {string} */ problemType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; + practiceTest: components['schemas']['PracticeTestResp']; + /** Format: int32 */ + practiceTestNo: number; + problemContent: components['schemas']['ContentResp']; + 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: components['schemas']['ContentResp']; + oneStepMoreContent: components['schemas']['ContentResp']; + pointings: components['schemas']['PointingResp'][]; + childProblems: components['schemas']['ChildProblemWithStudyInfoResp'][]; + }; + ProblemMetaResp: { /** Format: int64 */ - practiceTestId?: number; + id: number; + customId: string; + /** @enum {string} */ + problemType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; + practiceTest: components['schemas']['PracticeTestResp']; /** Format: int32 */ - number?: number; - conceptTagIds: number[]; - answer?: string; - title?: string; + practiceTestNo: number; + problemContent: components['schemas']['ContentResp']; + title: string; + /** @enum {string} */ + answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; /** Format: int32 */ - difficulty?: number; - memo?: string; - mainProblemImageUrl?: string; - mainAnalysisImageUrl?: string; - mainHandwritingExplanationImageUrl?: string; - readingTipImageUrl?: string; - seniorTipImageUrl?: string; - prescriptionImageUrls?: string[]; + answer: number; + /** Format: int32 */ + difficulty: number; + /** Format: int32 */ + recommendedTimeSec: number; + memo: string; + concepts: components['schemas']['ConceptResp'][]; + }; + SubmissionResp: { + /** Format: int32 */ + submitAnswer: number; + isCorrect: boolean; + isDone: boolean; + }; + 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']; + }; + ProblemSetMetaResp: { + /** Format: int64 */ + id: number; + title: string; + /** @enum {string} */ + status: 'CONFIRMED' | 'DOING'; + firstProblem: components['schemas']['ProblemMetaResp']; + }; + ProblemSetResp: { + /** Format: int64 */ + id: number; + title: string; + /** @enum {string} */ + status: 'CONFIRMED' | 'DOING'; + firstProblem: components['schemas']['ProblemMetaResp']; + problems: components['schemas']['ProblemSetItemResp'][]; + }; + ProblemSetUpdateStatusReq: { + /** @enum {string} */ + status: 'CONFIRMED' | 'DOING'; + }; + Request: { + /** Format: int32 */ + year: number; + /** Format: int32 */ + month: number; + /** Format: int32 */ + grade: number; + name: string; + }; + ConceptUpdateRequest: { + name: string; + /** Format: int64 */ + categoryId: number; + }; + ConceptCategoryUpdateRequest: { + name: string; + }; + ChatCreateRequest: { + /** Format: int64 */ + qnaId: number; + content: string; + images?: number[]; + }; + NoticeCreateRequest: { + /** Format: date */ + startAt: string; + /** Format: date */ + endAt: string; + content: string; + /** Format: int64 */ + studentId: number; + }; + RefreshReq: { + refreshToken: string; + }; + JwtResp: { + accessToken: string; + refreshToken?: string; + }; + TeacherTokenResp: { + /** Format: int64 */ + id: number; + name: string; + email: string; + students: components['schemas']['StudentResp'][]; + token?: components['schemas']['JwtResp']; + }; + TeacherLoginReq: { + email: string; + password: string; + }; + PointingFeedbackRequest: { + /** Format: int64 */ + pointingId: number; + isUnderstood: boolean; + }; + SubmissionRequest: { + /** Format: int64 */ + publishId: number; + /** Format: int64 */ + problemId?: number; + /** Format: int64 */ + childProblemId?: number; + /** Format: int32 */ + submitAnswer: 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'; + /** Format: int64 */ + problemId?: number; + /** Format: int64 */ + childProblemId?: number; + /** Format: int64 */ + pointingId?: number; + question: string; + }; + 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'; + /** + * Format: int64 + * @description 메인문제ID(메인 문제에 대한 질문일 경우) + */ + problemId?: number; + /** + * Format: int64 + * @description 새끼문제ID(새끼 문제에 대한 질문일 경우) + */ + childProblemId?: number; + /** + * Format: int64 + * @description 포인팅ID(포인팅에 대한 질문일 경우) + */ + pointingId?: number; + }; + QnACheckResp: { + /** Format: int64 */ + id: number; + isExist: boolean; + }; + StudentTokenResp: { + /** Format: int64 */ + id: number; + name: string; + /** Format: int32 */ + grade: number; + isFirstLogin: boolean; + token: components['schemas']['JwtResp']; + }; + SocialLoginReq: { + /** @enum {string} */ + provider: 'KAKAO' | 'GOOGLE'; + redirectUri: string; + }; + SocialLoginUrlResp: { + /** @enum {string} */ + provider: 'KAKAO' | 'GOOGLE'; + loginUrl: string; + }; + PreSignedReq: { + fileName: string; + }; + PreSignedResp: { + file: components['schemas']['UploadFileResp']; + contentDisposition: string; + uploadUrl: string; + }; + AdminCreateRequest: { + email: string; + password: string; + }; + TeacherCreateRequest: { + name: string; + email: string; + password: string; + }; + TeacherStudentAssignReq: { + students: number[]; + }; + PublishCreateRequest: { + /** Format: int64 */ + problemSetId: number; + /** Format: int64 */ + studentId: number; + /** Format: date */ + publishAt: string; + }; + ProblemWithStudyInfoResp: { + /** Format: int64 */ + id: number; + customId: string; + /** @enum {string} */ + problemType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; + practiceTest: components['schemas']['PracticeTestResp']; + /** Format: int32 */ + practiceTestNo: number; + problemContent: components['schemas']['ContentResp']; + 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: components['schemas']['ContentResp']; + oneStepMoreContent: components['schemas']['ContentResp']; + pointings: components['schemas']['PointingWithFeedbackResp'][]; + /** Format: int32 */ + submitAnswer: number; + isCorrect: boolean; + isDone: boolean; + childProblems: components['schemas']['ChildProblemWithStudyInfoResp'][]; + }; + PublishMetaResp: { + /** Format: int64 */ + id: number; + /** Format: date */ + publishAt: string; + /** @enum {string} */ + progress: 'DONE' | 'DOING' | 'NONE'; + problemSet: components['schemas']['ProblemSetMetaResp']; + }; + PublishProblemGroupResp: { + /** Format: int32 */ + no: number; + /** @enum {string} */ + progress: 'DONE' | 'DOING' | 'NONE'; + problem: components['schemas']['ProblemWithStudyInfoResp']; + childProblems: components['schemas']['ChildProblemWithStudyInfoResp'][]; + }; + PublishResp: { + /** Format: int64 */ + id: number; + /** Format: date */ + publishAt: string; + /** @enum {string} */ + progress: 'DONE' | 'DOING' | 'NONE'; + problemSet: components['schemas']['ProblemSetMetaResp']; + data: components['schemas']['PublishProblemGroupResp'][]; + }; + ChildProblemCreateRequest: { + /** Format: int32 */ + no?: number; + problemContent?: components['schemas']['ContentCreateRequest']; /** @enum {string} */ answerType?: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; - updateChildProblems: components['schemas']['ChildProblemUpdateRequest'][]; /** Format: int32 */ - recommendedMinute?: number; + answer?: number; + concepts?: number[]; + pointings?: components['schemas']['PointingCreateRequest'][]; + }; + ContentBlockCreateRequest: { + /** Format: int32 */ + rank: number; + /** @enum {string} */ + type?: 'TEXT' | 'IMAGE'; + data?: string; + style?: string; + }; + ContentCreateRequest: { + blocks?: components['schemas']['ContentBlockCreateRequest'][]; + }; + PointingCreateRequest: { + /** Format: int32 */ + no?: number; + questionContent?: components['schemas']['ContentCreateRequest']; + commentContent?: components['schemas']['ContentCreateRequest']; + concepts?: number[]; + }; + ProblemCreateRequest: { + customId: string; + /** @enum {string} */ + problemType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; + /** Format: int64 */ + practiceTestId?: number; + /** Format: int32 */ + practiceTestNo?: 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: components['schemas']['ContentCreateRequest']; + pointings?: components['schemas']['PointingCreateRequest'][]; + /** Format: int64 */ + mainAnalysisImageId?: number; + /** Format: int64 */ + mainHandAnalysisImageId?: number; + readingTipContent?: components['schemas']['ContentCreateRequest']; + oneStepMoreContent?: components['schemas']['ContentCreateRequest']; + childProblems?: components['schemas']['ChildProblemCreateRequest'][]; + }; + ProblemSetCreateRequest: { + title: string; + problems?: components['schemas']['ProblemSetItemRequest'][]; + }; + PracticeTestCreateRequest: { + /** Format: int32 */ + year: number; + /** Format: int32 */ + month: number; + /** Format: int32 */ + grade: number; + name: string; + }; + ConceptCreateRequest: { + name: string; + /** Format: int64 */ + categoryId: number; + }; + ConceptCategoryCreateRequest: { + name: string; + }; + AdminTokenResp: { + /** Format: int64 */ + id: number; + email: string; + token: components['schemas']['JwtResp']; + }; + AdminLoginReq: { + email: string; + password: string; + }; + ListRespPublishMetaResp: { + /** Format: int32 */ + total: number; + data: components['schemas']['PublishMetaResp'][]; + }; + PublishStudentProgressResp: { + /** Format: double */ + progress: number; + }; + ListRespStudentResp: { + /** Format: int32 */ + total: number; + data: components['schemas']['StudentResp'][]; + }; + PageRespQnAMetaResp: { + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['QnAMetaResp'][]; + }; + ListRespNoticeResp: { + /** Format: int32 */ + total: number; + data: components['schemas']['NoticeResp'][]; + }; + NoticeUnreadCountResp: { + /** Format: int64 */ + totalCount?: number; + /** Format: int64 */ + unreadCount?: number; + latestNotice?: components['schemas']['NoticeResp']; + }; + ListRespTeacherResp: { + /** Format: int32 */ + total: number; + data: components['schemas']['TeacherResp'][]; + }; + PageRespStudentResp: { + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['StudentResp'][]; + }; + PageRespProblemMetaResp: { + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['ProblemMetaResp'][]; + }; + PageRespProblemSetResp: { + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; /** Format: int32 */ - recommendedSecond?: number; + lastPage: number; + data: components['schemas']['ProblemSetResp'][]; + }; + PageRespPracticeTestResp: { + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['PracticeTestResp'][]; + }; + PageRespConceptResp: { + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['ConceptResp'][]; + }; + PageRespConceptCategoryResp: { + /** Format: int32 */ + page: number; + /** Format: int32 */ + size: number; + /** Format: int32 */ + lastPage: number; + data: components['schemas']['ConceptCategoryResp'][]; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + 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']; + }; + }; + }; + }; + getById: { + parameters: { + query?: never; + header?: never; + path: { + qnaId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; + }; + }; + update_1: { + parameters: { + query?: never; + header?: never; + path: { + qnaId: number; + }; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['QnAUpdateRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; + }; + }; + delete: { + parameters: { + query?: never; + header?: never; + path: { + qnaId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + updateChat_1: { + 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_1: { + parameters: { + query?: never; + header?: never; + path: { + chatId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; + }; + }; + readNotice: { + parameters: { + query?: never; + header?: never; + path: { + noticeId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['NoticeResp']; + }; + }; + }; + }; + me: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['StudentResp']; + }; + }; + }; + }; + update_2: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['StudentUpdateRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['StudentResp']; + }; + }; + }; + }; + update_3: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['TeacherUpdateRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['TeacherResp']; + }; + }; + }; + }; + getProblem: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ProblemInfoResp']; + }; + }; + }; + }; + updateProblem: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - ChildProblemGetResponse: { - /** Format: int64 */ - childProblemId: number; - imageUrl?: string; - /** @enum {string} */ - answerType?: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; - answer?: string; - conceptTagIds: number[]; - prescriptionImageUrls: string[]; + requestBody: { + content: { + 'application/json': components['schemas']['ProblemUpdateRequest']; + }; }; - ProblemGetResponse: { - /** Format: int64 */ - id: number; - problemCustomId: string; - conceptTagIds: number[]; - isConfirmed?: boolean; - /** Format: int64 */ - practiceTestId?: number; - /** Format: int32 */ - number?: number; - /** Format: int32 */ - difficulty?: number; - title?: string; - answer?: string; - memo?: string; - /** @enum {string} */ - problemType?: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; - /** @enum {string} */ - answerType?: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; - mainProblemImageUrl?: string; - mainHandwritingExplanationImageUrl?: string; - mainAnalysisImageUrl?: string; - readingTipImageUrl?: string; - seniorTipImageUrl?: string; - prescriptionImageUrls: string[]; - childProblems: components['schemas']['ChildProblemGetResponse'][]; - /** Format: int32 */ - recommendedMinute?: number; - /** Format: int32 */ - recommendedSecond?: number; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ProblemInfoResp']; + }; + }; }; - ProblemSetUpdateRequest: { - problemSetTitle?: string; - problemIds: number[]; + }; + deleteProblem: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - ProblemSubmitUpdateRequest: { - /** Format: int64 */ - publishId: number; - /** Format: int64 */ - problemId: number; - answer?: string; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - ChildProblemSubmitUpdateRequest: { - /** Format: int64 */ - publishId: number; - /** Format: int64 */ - childProblemId: number; - answer?: string; + }; + getProblemSet: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - ChildProblemSubmitUpdateResponse: { - /** @enum {string} */ - status: 'CORRECT' | 'INCORRECT' | 'RETRY_CORRECT' | 'NOT_STARTED'; - answer: string; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ProblemSetResp']; + }; + }; }; - ChildProblemSubmitUpdateIncorrectRequest: { - /** Format: int64 */ - publishId: number; - /** Format: int64 */ - childProblemId: number; + }; + update_4: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - PublishPostRequest: { - /** Format: date */ - publishedDate: string; - /** Format: int64 */ - problemSetId: number; + requestBody: { + content: { + 'application/json': components['schemas']['ProblemSetUpdateRequest']; + }; }; - IdResponse: { - /** Format: int64 */ - id: number; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ProblemSetResp']; + }; + }; }; - ProblemPostRequest: { - /** @enum {string} */ - problemType: 'GICHUL_PROBLEM' | 'VARIANT_PROBLEM' | 'CREATION_PROBLEM'; - /** Format: int64 */ - practiceTestId?: number; - /** Format: int32 */ - number?: number; + }; + delete_1: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - ProblemPostResponse: { - /** Format: int64 */ - id: number; - problemCustomId: string; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - ProblemSubmitCreateRequest: { - /** Format: int64 */ - publishId: number; - /** Format: int64 */ - problemId: number; + }; + update_5: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; }; - ChildProblemSubmitCreateRequest: { - /** Format: int64 */ - publishId: number; - /** Format: int64 */ - problemId: number; + requestBody: { + content: { + 'application/json': components['schemas']['ProblemSetUpdateStatusReq']; + }; }; - LoginResponse: { - /** Format: int64 */ - memberId?: number; - name?: string; - email?: string; - accessToken?: string; - refreshToken?: string; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ProblemSetResp']; + }; + }; }; - AccessTokenResponse: { - accessToken: string; + }; + toggleStatus: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ProblemSetResp']; + }; + }; + }; + }; + update_6: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['Request']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['PracticeTestResp']; + }; + }; + }; + }; + delete_2: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + update_7: { + 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']; + }; + }; + }; + }; + update_8: { + parameters: { + query?: never; + header?: never; + path: { + conceptId: number; + }; + cookie?: never; }; - AdminLoginRequest: { - email: string; - password: string; + requestBody: { + content: { + 'application/json': components['schemas']['ConceptUpdateRequest']; + }; }; - PublishMonthGetResponse: { - /** Format: int64 */ - publishId?: number; - /** Format: date */ - date?: string; - problemSetInfo?: components['schemas']['PublishProblemSetResponse']; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ConceptResp']; + }; + }; }; - PublishProblemSetResponse: { - /** Format: int64 */ - id?: number; - title?: string; + }; + delete_3: { + parameters: { + query?: never; + header?: never; + path: { + conceptId: number; + }; + cookie?: never; }; - ProblemSearchGetResponse: { - /** Format: int64 */ - problemId: number; - problemCustomId: string; - problemTitle?: string; - memo?: string; - mainProblemImageUrl?: string; - tagNames: string[]; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - ProblemSetGetResponse: { - /** Format: int64 */ - id?: number; - title?: string; - /** @enum {string} */ - confirmStatus?: 'CONFIRMED' | 'NOT_CONFIRMED'; - publishedDates: string[]; - problemSummaries: components['schemas']['ProblemSummaryResponse'][]; + }; + updateCategory: { + parameters: { + query?: never; + header?: never; + path: { + categoryId: number; + }; + cookie?: never; }; - ProblemSummaryResponse: { - /** Format: int64 */ - problemId: number; - problemCustomId: string; - problemTitle?: string; - memo?: string; - mainProblemImageUrl?: string; - tagNames: string[]; + requestBody: { + content: { + 'application/json': components['schemas']['ConceptCategoryUpdateRequest']; + }; }; - ProblemSetSearchGetResponse: { - /** Format: int64 */ - id: number; - problemSetTitle?: string; - /** @enum {string} */ - confirmStatus?: 'CONFIRMED' | 'NOT_CONFIRMED'; - problemThumbnailResponses: components['schemas']['ProblemThumbnailResponse'][]; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ConceptCategoryResp']; + }; + }; }; - ProblemThumbnailResponse: { - problemTitle?: string; - problemMemo?: string; - mainProblemImageUrl?: string; + }; + deleteCategory: { + parameters: { + query?: never; + header?: never; + path: { + categoryId: number; + }; + cookie?: never; }; - PracticeTestTagResponse: { - /** Format: int64 */ - id: number; - name: string; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - MemberGetResponse: { - /** Format: int64 */ - id?: number; - name?: string; - email?: string; + }; + addChat: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - PresignedUrlResponse: { - presignedUrl: string; + requestBody: { + content: { + 'application/json': components['schemas']['ChatCreateRequest']; + }; }; - ConceptTagResponse: { - /** Format: int64 */ - id: number; - name: string; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['QnAResp']; + }; + }; }; - ProblemFeedProgressesGetResponse: { - /** Format: int64 */ - problemId?: number; - /** @enum {string} */ - status?: 'CORRECT' | 'INCORRECT' | 'IN_PROGRESS' | 'RETRY_CORRECT' | 'NOT_STARTED'; - childProblemStatuses?: ('CORRECT' | 'INCORRECT' | 'RETRY_CORRECT' | 'NOT_STARTED')[]; + }; + getsAll: { + parameters: { + query: { + studentId: number; + }; + header?: never; + path?: never; + cookie?: never; }; - PublishClientGetResponse: { - /** Format: int64 */ - publishId?: number; - /** Format: date */ - date?: string; - title?: string; - problems?: components['schemas']['ProblemFeedProgressesGetResponse'][]; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['ListRespNoticeResp']; + }; + }; }; - ProblemClientGetResponse: { - /** Format: int32 */ - number: number; - imageUrl: string; - /** Format: int32 */ - recommendedMinute: number; - /** Format: int32 */ - recommendedSecond: number; - /** @enum {string} */ - status: 'CORRECT' | 'INCORRECT' | 'IN_PROGRESS' | 'RETRY_CORRECT' | 'NOT_STARTED'; - childProblemStatuses: ('CORRECT' | 'INCORRECT' | 'RETRY_CORRECT' | 'NOT_STARTED')[]; - /** @enum {string} */ - answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; - answer: string; + }; + create: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - ChildProblemClientGetResponse: { - /** Format: int32 */ - problemNumber: number; - /** Format: int32 */ - childProblemNumber: number; - imageUrl: string; - /** @enum {string} */ - status: 'CORRECT' | 'INCORRECT' | 'RETRY_CORRECT' | 'NOT_STARTED'; - /** @enum {string} */ - answerType: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; - answer: string; + requestBody: { + content: { + 'application/json': components['schemas']['NoticeCreateRequest']; + }; }; - ProblemClientThumbnailResponse: { - /** Format: int32 */ - number?: number; - imageUrl?: string; - /** Format: int32 */ - recommendedMinute?: number; - /** Format: int32 */ - recommendedSecond?: number; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['NoticeResp']; + }; + }; }; - ChildProblemsClientGetResponse: { - mainProblemImageUrl: string; - childProblemIds: number[]; + }; + refresh: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - AllProblemGetResponse: { - /** Format: int64 */ - publishId?: number; - /** Format: date */ - date?: string; - /** @enum {string} */ - progress?: 'COMPLETE' | 'INCOMPLETE' | 'IN_PROGRESS'; - problemStatuses?: ( - | 'CORRECT' - | 'INCORRECT' - | 'IN_PROGRESS' - | 'RETRY_CORRECT' - | 'NOT_STARTED' - )[]; - mainProblemImageUrl?: string; - }; - DailyProgressResponse: { - /** Format: date */ - date?: string; - /** @enum {string} */ - progressStatus?: 'COMPLETED' | 'IN_PROGRESS' | 'NOT_STARTED'; + requestBody: { + content: { + 'application/json': components['schemas']['RefreshReq']; + }; }; - HomeFeedResponse: { - dailyProgresses?: components['schemas']['DailyProgressResponse'][]; - problemSets?: components['schemas']['ProblemSetHomeFeedResponse'][]; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['TeacherTokenResp']; + }; + }; }; - ProblemHomeFeedResponse: { - /** Format: int64 */ - problemId?: number; - mainProblemImageUrl?: string; + }; + login: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - ProblemSetHomeFeedResponse: { - /** Format: date */ - date?: string; - /** Format: int64 */ - publishId?: number; - title?: string; - /** Format: int64 */ - submitCount?: number; - problemHomeFeedResponse?: components['schemas']['ProblemHomeFeedResponse']; + requestBody: { + content: { + 'application/json': components['schemas']['TeacherLoginReq']; + }; }; - ChildProblemDetailResponse: { - imageUrl?: string; - prescriptionImageUrls?: string[]; - /** @enum {string} */ - submitStatus?: 'CORRECT' | 'INCORRECT' | 'RETRY_CORRECT' | 'NOT_STARTED'; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + '*/*': components['schemas']['TeacherTokenResp']; + }; + }; }; - CommentaryGetResponse: { - /** Format: int32 */ - problemNumber?: number; - answer?: string; - mainAnalysisImageUrl?: string; - mainHandwritingExplanationImageUrl?: string; - readingTipImageUrl?: string; - seniorTipImageUrl?: string; - /** @enum {string} */ - answerType?: 'MULTIPLE_CHOICE' | 'SHORT_ANSWER'; - prescription?: components['schemas']['PrescriptionResponse']; + }; + feedback: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - PrescriptionResponse: { - childProblem?: components['schemas']['ChildProblemDetailResponse'][]; - mainProblem?: components['schemas']['ProblemDetailResponse']; + requestBody: { + content: { + 'application/json': components['schemas']['PointingFeedbackRequest']; + }; }; - ProblemDetailResponse: { - imageUrl?: string; - prescriptionImageUrls?: string[]; - /** @enum {string} */ - submitStatus?: 'CORRECT' | 'INCORRECT' | 'IN_PROGRESS' | 'RETRY_CORRECT' | 'NOT_STARTED'; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; }; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; -} -export type $defs = Record; -export interface operations { - getProblem: { + submit: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['SubmissionRequest']; + }; + }; responses: { /** @description OK */ 200: { @@ -1109,34 +2723,41 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['ProblemGetResponse']; - }; + '*/*': components['schemas']['SubmissionResp']; }; }; - /** @description Internal Server Error */ - 500: { + }; + }; + gets: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['PageRespQnAMetaResp']; }; }; }; }; - updateProblem: { + create_1: { parameters: { query?: never; header?: never; - path: { - id: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ProblemUpdateRequest']; + 'application/json': components['schemas']['QnACreateRequest']; }; }; responses: { @@ -1146,61 +2767,47 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['ProblemGetResponse']; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['QnAResp']; }; }; }; }; - deleteProblem: { + 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; - }; - /** @description Internal Server Error */ - 500: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['QnACheckResp']; }; }; }; }; - getProblemSet: { + addChat_1: { parameters: { query?: never; header?: never; - path: { - problemSetId: number; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['ChatCreateRequest']; + }; + }; responses: { /** @description OK */ 200: { @@ -1208,94 +2815,71 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['ProblemSetGetResponse']; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['QnAResp']; }; }; }; }; - updateProblemSet: { + registerSocial: { parameters: { query?: never; header?: never; - path: { - problemSetId: number; - }; + path?: never; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ProblemSetUpdateRequest']; + 'application/json': components['schemas']['StudentUpdateRequest']; }; }; responses: { /** @description OK */ 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Internal Server Error */ - 500: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['StudentResp']; }; }; }; }; - deleteProblemSet_1: { + refresh_1: { parameters: { query?: never; header?: never; - path: { - problemSetId: number; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['RefreshReq']; + }; + }; responses: { /** @description OK */ 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Internal Server Error */ - 500: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['StudentTokenResp']; }; }; }; }; - toggleConfirmProblemSet: { + getSocialLoginUrl: { parameters: { query?: never; header?: never; - path: { - problemSetId: number; - }; + path?: never; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + 'application/json': components['schemas']['SocialLoginReq']; + }; + }; responses: { /** @description OK */ 200: { @@ -1303,24 +2887,36 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - /** @enum {string} */ - data: 'CONFIRMED' | 'NOT_CONFIRMED'; - }; + '*/*': components['schemas']['SocialLoginUrlResp']; }; }; - /** @description Internal Server Error */ - 500: { + }; + }; + getPreSignedUrl: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['PreSignedReq']; + }; + }; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['PreSignedResp']; }; }; }; }; - updateProblemSubmit: { + create_2: { parameters: { query?: never; header?: never; @@ -1329,7 +2925,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ProblemSubmitUpdateRequest']; + 'application/json': components['schemas']['AdminCreateRequest']; }; }; responses: { @@ -1338,25 +2934,31 @@ export interface operations { headers: { [name: string]: unknown; }; - content: { - '*/*': { - /** @enum {string} */ - data: 'CORRECT' | 'INCORRECT' | 'IN_PROGRESS' | 'RETRY_CORRECT' | 'NOT_STARTED'; - }; - }; + content?: never; }; - /** @description Internal Server Error */ - 500: { + }; + }; + gets_1: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ListRespTeacherResp']; }; }; }; }; - createProblemSubmit: { + create_3: { parameters: { query?: never; header?: never; @@ -1365,38 +2967,33 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ProblemSubmitCreateRequest']; + 'application/json': components['schemas']['TeacherCreateRequest']; }; }; responses: { /** @description OK */ 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Internal Server Error */ - 500: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['TeacherResp']; }; }; }; }; - updateChildProblemSubmit: { + assignStudentsToTeacher: { parameters: { query?: never; header?: never; - path?: never; + path: { + teacherId: number; + }; cookie?: never; }; requestBody: { content: { - 'application/json': components['schemas']['ChildProblemSubmitUpdateRequest']; + 'application/json': components['schemas']['TeacherStudentAssignReq']; }; }; responses: { @@ -1406,23 +3003,36 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['ChildProblemSubmitUpdateResponse']; - }; + '*/*': components['schemas']['TeacherResp']; }; }; - /** @description Internal Server Error */ - 500: { + }; + }; + search: { + parameters: { + query?: { + year?: number; + month?: number; + studentId?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ListRespPublishMetaResp']; }; }; }; }; - createProblemSubmit_1: { + create_4: { parameters: { query?: never; header?: never; @@ -1431,7 +3041,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ChildProblemSubmitCreateRequest']; + 'application/json': components['schemas']['PublishCreateRequest']; }; }; responses: { @@ -1440,20 +3050,39 @@ export interface operations { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['PublishResp']; + }; + }; + }; + }; + search_1: { + parameters: { + query?: { + customId?: string; + title?: string; + concepts?: number[]; + page?: number; + size?: number; }; - /** @description Internal Server Error */ - 500: { + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['PageRespProblemMetaResp']; }; }; }; }; - updateChildProblemSubmitIncorrect: { + createProblem: { parameters: { query?: never; header?: never; @@ -1462,7 +3091,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ChildProblemSubmitUpdateIncorrectRequest']; + 'application/json': components['schemas']['ProblemCreateRequest']; }; }; responses: { @@ -1471,20 +3100,38 @@ export interface operations { headers: { [name: string]: unknown; }; - content?: never; + content: { + '*/*': components['schemas']['ProblemInfoResp']; + }; + }; + }; + }; + search_2: { + parameters: { + query?: { + setTitle?: string; + problemTitle?: string; + page?: number; + size?: number; }; - /** @description Internal Server Error */ - 500: { + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['PageRespProblemSetResp']; }; }; }; }; - postPublish: { + create_5: { parameters: { query?: never; header?: never; @@ -1493,7 +3140,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['PublishPostRequest']; + 'application/json': components['schemas']['ProblemSetCreateRequest']; }; }; responses: { @@ -1503,23 +3150,39 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['IdResponse']; - }; + '*/*': components['schemas']['ProblemSetResp']; }; }; - /** @description Internal Server Error */ - 500: { + }; + }; + search_3: { + parameters: { + query?: { + query?: string; + year?: number; + month?: number; + grade?: number; + page?: number; + size?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['PageRespPracticeTestResp']; }; }; }; }; - createProblem: { + create_6: { parameters: { query?: never; header?: never; @@ -1528,7 +3191,7 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['ProblemPostRequest']; + 'application/json': components['schemas']['PracticeTestCreateRequest']; }; }; responses: { @@ -1538,29 +3201,18 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['ProblemPostResponse']; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['PracticeTestResp']; }; }; }; }; - createChildProblem: { + getsAll_1: { parameters: { - query?: never; - header?: never; - path: { - problemId: number; + query: { + studentId: number; }; + header?: never; + path?: never; cookie?: never; }; requestBody?: never; @@ -1571,25 +3223,42 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['IdResponse']; - }; + '*/*': components['schemas']['ListRespNoticeResp']; }; }; - /** @description Internal Server Error */ - 500: { + }; + }; + create_7: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['NoticeCreateRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['NoticeResp']; }; }; }; }; - createProblemSet: { + search_4: { parameters: { - query?: never; + query?: { + query?: string; + page?: number; + size?: number; + }; header?: never; path?: never; cookie?: never; @@ -1602,71 +3271,108 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['IdResponse']; - }; + '*/*': components['schemas']['PageRespConceptResp']; }; }; - /** @description Internal Server Error */ - 500: { + }; + }; + create_8: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['ConceptCreateRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ConceptResp']; }; }; }; }; - socialLogin: { + searchCategory: { parameters: { - query: { - provider: string; - }; - header: { - social_access_token: string; + query?: { + query?: string; + page?: number; + size?: number; }; + header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { - /** @description 로그인 성공 */ + /** @description OK */ 200: { headers: { - /** @description 발급된 액세스 토큰 */ - Authorization?: string; - /** @description 리프레시 토큰이 담긴 HTTP Only 쿠키 */ - 'Set-Cookie'?: string; [name: string]: unknown; }; content: { - 'application/json': { - data: components['schemas']['LoginResponse']; - }; + '*/*': components['schemas']['PageRespConceptCategoryResp']; }; }; - /** @description 유효하지 않은 소셜 액세스 토큰 */ - 401: { + }; + }; + createCategory: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['ConceptCategoryCreateRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ConceptCategoryResp']; }; }; - /** @description Internal Server Error */ - 500: { + }; + }; + refresh_2: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + 'application/json': components['schemas']['RefreshReq']; + }; + }; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['AdminTokenResp']; }; }; }; }; - adminLogin: { + login_1: { parameters: { query?: never; header?: never; @@ -1675,51 +3381,57 @@ export interface operations { }; requestBody: { content: { - 'application/json': components['schemas']['AdminLoginRequest']; + 'application/json': components['schemas']['AdminLoginReq']; }; }; responses: { - /** @description 로그인 성공 */ + /** @description OK */ 200: { headers: { - /** @description 리프레시 토큰이 담긴 HTTP Only 쿠키 */ - 'Set-Cookie'?: string; [name: string]: unknown; }; content: { - 'application/json': { - data: components['schemas']['AccessTokenResponse']; - }; + '*/*': components['schemas']['AdminTokenResp']; }; }; - /** @description 인증 실패 (잘못된 이메일 또는 비밀번호) */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; - }; + }; + }; + oauthRedirectExample: { + parameters: { + query: { + /** @description 성공 여부 */ + isSuccess: boolean; + /** @description 첫 로그인 여부 */ + isFirstLogin: boolean; + /** @description 응답 메시지 */ + message: string; + /** @description accessToken */ + accessToken: string; + /** @description refreshToken */ + refreshToken: string; }; - /** @description Internal Server Error */ - 500: { + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['ErrorResponse']; - }; + content?: never; }; }; }; - getPublishMonth: { + search_5: { parameters: { - query?: never; - header?: never; - path: { - year: number; - month: number; + query: { + studentId: number; }; + header?: never; + path?: never; cookie?: never; }; requestBody?: never; @@ -1730,28 +3442,15 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['PublishMonthGetResponse'][]; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ListRespPublishMetaResp']; }; }; }; }; - search: { + searchMonthly: { parameters: { - query?: { - problemCustomId?: string; - title?: string; - conceptTagIds?: number[]; + query: { + studentId: number; }; header?: never; path?: never; @@ -1765,27 +3464,37 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['ProblemSearchGetResponse'][]; - }; + '*/*': components['schemas']['ListRespPublishMetaResp']; }; }; - /** @description Internal Server Error */ - 500: { + }; + }; + getPublishById: { + parameters: { + query?: never; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['PublishResp']; }; }; }; }; - search_1: { + getWeeklyProgress: { parameters: { - query?: { - problemSetTitle?: string; - problemTitle?: string; + query: { + studentId: number; }; header?: never; path?: never; @@ -1799,30 +3508,20 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['ProblemSetSearchGetResponse'][]; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['PublishStudentProgressResp']; }; }; }; }; - confirmSearch: { + getProblemById: { parameters: { - query?: { - problemSetTitle?: string; - problemTitle?: string; + query: { + studentId: number; }; header?: never; - path?: never; + path: { + id: number; + }; cookie?: never; }; requestBody?: never; @@ -1833,23 +3532,36 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['ProblemSetSearchGetResponse'][]; - }; + '*/*': components['schemas']['ProblemWithStudyInfoResp']; }; }; - /** @description Internal Server Error */ - 500: { + }; + }; + getChildProblemById: { + parameters: { + query: { + studentId: number; + }; + header?: never; + path: { + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ChildProblemWithStudyInfoResp']; }; }; }; }; - getPracticeTestTags: { + getMyStudents: { parameters: { query?: never; header?: never; @@ -1864,23 +3576,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['PracticeTestTagResponse'][]; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ListRespStudentResp']; }; }; }; }; - getMyInfo: { + gets_2: { parameters: { query?: never; header?: never; @@ -1895,28 +3596,17 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['MemberGetResponse']; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['PageRespQnAMetaResp']; }; }; }; }; - getImageUrl: { + getById_1: { parameters: { query?: never; header?: never; path: { - fileName: string; + qnaId: number; }; cookie?: never; }; @@ -1928,39 +3618,18 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: string; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['QnAResp']; }; }; }; }; - getProblemImagePresignedUrl: { + getsAvailable: { parameters: { query: { - 'image-type': - | 'MAIN_PROBLEM' - | 'MAIN_ANALYSIS' - | 'MAIN_HANDWRITING_EXPLANATION' - | 'READING_TIP' - | 'SENIOR_TIP' - | 'MAIN_PRESCRIPTION' - | 'CHILD_PROBLEM' - | 'CHILD_PRESCRIPTION'; + studentId: number; }; header?: never; - path: { - problemId: number; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -1971,23 +3640,12 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['PresignedUrlResponse']; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ListRespNoticeResp']; }; }; }; }; - getConceptTags: { + getTeacherMe: { parameters: { query?: never; header?: never; @@ -2002,29 +3660,16 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['ConceptTagResponse'][]; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['TeacherResp']; }; }; }; }; - getProblemsInPublish: { + search_6: { parameters: { query?: never; header?: never; - path: { - publishId: number; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -2035,30 +3680,16 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['PublishClientGetResponse']; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ListRespPublishMetaResp']; }; }; }; }; - getProblem_1: { + searchMonthly_1: { parameters: { query?: never; header?: never; - path: { - publishId: number; - problemId: number; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -2069,30 +3700,17 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['ProblemClientGetResponse']; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ListRespPublishMetaResp']; }; }; }; }; - getChildProblem: { + getPublishById_1: { parameters: { query?: never; header?: never; path: { - publishId: number; - problemId: number; - childProblemId: number; + id: number; }; cookie?: never; }; @@ -2104,30 +3722,16 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['ChildProblemClientGetResponse']; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['PublishResp']; }; }; }; }; - getProblemThumbnail: { + getWeeklyProgress_1: { parameters: { query?: never; header?: never; - path: { - publishId: number; - problemId: number; - }; + path?: never; cookie?: never; }; requestBody?: never; @@ -2138,29 +3742,17 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['ProblemClientThumbnailResponse']; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['PublishStudentProgressResp']; }; }; }; }; - getChildProblems: { + getProblemById_1: { parameters: { query?: never; header?: never; path: { - publishId: number; - problemId: number; + id: number; }; cookie?: never; }; @@ -2172,29 +3764,17 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['ChildProblemsClientGetResponse']; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ProblemWithStudyInfoResp']; }; }; }; }; - getAllProblem: { + getChildProblemById_1: { parameters: { query?: never; header?: never; path: { - year: number; - month: number; + id: number; }; cookie?: never; }; @@ -2206,23 +3786,32 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['AllProblemGetResponse'][]; - }; + '*/*': components['schemas']['ChildProblemWithStudyInfoResp']; }; }; - /** @description Internal Server Error */ - 500: { + }; + }; + getsAvailable_1: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ListRespNoticeResp']; }; }; }; }; - getHomeFeed: { + countAvailable: { parameters: { query?: never; header?: never; @@ -2237,27 +3826,37 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['HomeFeedResponse']; - }; + '*/*': components['schemas']['NoticeUnreadCountResp']; }; }; - /** @description Internal Server Error */ - 500: { + }; + }; + refresh_3: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['JwtResp']; }; }; }; }; - getCommentary: { + search_7: { parameters: { query?: { - publishId?: number; - problemId?: number; + query?: string; + page?: number; + size?: number; }; header?: never; path?: never; @@ -2271,79 +3870,81 @@ export interface operations { [name: string]: unknown; }; content: { - '*/*': { - data: components['schemas']['CommentaryGetResponse']; - }; - }; - }; - /** @description Internal Server Error */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['PageRespStudentResp']; }; }; }; }; - reissueToken: { + getById_2: { parameters: { query?: never; header?: never; - path?: never; + path: { + id: number; + }; cookie?: never; }; requestBody?: never; responses: { - /** @description 토큰 재발급 성공 */ + /** @description OK */ 200: { headers: { - /** @description 새로운 리프레시 토큰이 담긴 HTTP Only 쿠키 */ - 'Set-Cookie'?: string; [name: string]: unknown; }; content: { - 'application/json': { - data: components['schemas']['AccessTokenResponse']; - }; + '*/*': components['schemas']['PublishResp']; }; }; - /** @description 유효하지 않은 리프레시 토큰 */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - '*/*': components['schemas']['ErrorResponse']; - }; + }; + }; + delete_4: { + parameters: { + query?: never; + header?: never; + path: { + id: number; }; - /** @description 리프레시 토큰 쿠키 없음 */ - 404: { + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; - content: { - '*/*': components['schemas']['ErrorResponse']; - }; + content?: never; + }; + }; + }; + getsAvailable_2: { + parameters: { + query: { + studentId: number; }; - /** @description Internal Server Error */ - 500: { + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ListRespNoticeResp']; }; }; }; }; - deleteProblemSet: { + delete_5: { parameters: { query?: never; header?: never; path: { - publishId: number; + id: number; }; cookie?: never; }; @@ -2356,24 +3957,38 @@ export interface operations { }; content?: never; }; - /** @description Internal Server Error */ - 500: { + }; + }; + removeStudentFromTeacher: { + parameters: { + query?: never; + header?: never; + path: { + teacherId: number; + studentId: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['TeacherResp']; }; }; }; }; - deleteChildProblem: { + deleteItem: { parameters: { query?: never; header?: never; path: { + id: number; problemId: number; - childProblemId: number; }; cookie?: never; }; @@ -2381,18 +3996,11 @@ export interface operations { responses: { /** @description OK */ 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Internal Server Error */ - 500: { headers: { [name: string]: unknown; }; content: { - '*/*': components['schemas']['ErrorResponse']; + '*/*': components['schemas']['ProblemSetResp']; }; }; }; diff --git a/apps/service/src/types/index.ts b/apps/service/src/types/index.ts index bb824842..2ead463f 100644 --- a/apps/service/src/types/index.ts +++ b/apps/service/src/types/index.ts @@ -1 +1,2 @@ export * from './component'; +export * from './onboarding'; diff --git a/apps/service/src/types/onboarding.ts b/apps/service/src/types/onboarding.ts new file mode 100644 index 00000000..bc7848b2 --- /dev/null +++ b/apps/service/src/types/onboarding.ts @@ -0,0 +1,4 @@ +export type UserInfoFormData = { + name: string; + grade: string; +}; diff --git a/apps/service/src/utils/common/auth.ts b/apps/service/src/utils/common/auth.ts index 8aeb2b5e..3ffebfad 100644 --- a/apps/service/src/utils/common/auth.ts +++ b/apps/service/src/utils/common/auth.ts @@ -1,6 +1,9 @@ const getAccessToken = () => localStorage.getItem('accessToken'); const setAccessToken = (accessToken: string) => localStorage.setItem('accessToken', accessToken); +const getRefreshToken = () => localStorage.getItem('refreshToken'); +const setRefreshToken = (refreshToken: string) => + localStorage.setItem('refreshToken', refreshToken); const getName = () => localStorage.getItem('name'); const setName = (name: string) => localStorage.setItem('name', name); -export { getAccessToken, setAccessToken, getName, setName }; +export { getAccessToken, setAccessToken, getRefreshToken, setRefreshToken, getName, setName }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f08613b..59a92bec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -183,6 +183,9 @@ importers: '@tanstack/react-query-devtools': specifier: ^5.66.0 version: 5.81.5(@tanstack/react-query@5.81.5(react@19.1.0))(react@19.1.0) + clsx: + specifier: ^2.1.1 + version: 2.1.1 dayjs: specifier: ^1.11.13 version: 1.11.13 @@ -8058,7 +8061,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: @@ -8080,7 +8083,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.30.1(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3