[스키마] 학생 기록 조회 및 생성 Graphql 스키마

게이트웨이

변경된 타입과 Command

상담, 메모 관련 스키마

""" @deprecated 더 이상 사용하지 않습니다. 'CounselingType' Enum을 사용해주세요. """ enum StudentRecordType { SALES_COUNSELING } """ 상담 유형 """ enum CounselingType { "행정 문의" AdministrativeInquiry "학습 문의" LearningInquiry "컴플레인" Complaint "수업시간 조정" ClassScheduleAdjustment "아웃바운드" Outbound "서비스 안내" ServiceGuidance "학생정보 전달" StudentInformationTransfer "수업내용 조정" ClassContentAdjustment "긍정적 피드백" PositiveFeedback "수업중단 요청" ClassDiscontinuationRequest "특강" SpecialLecture "컨텐츠 관련 요청" ContentRequest "기타" Others "판매팀 상담" SalesCounseling } """ 메모 유형 """ enum MemoType { QUICK # 간편 메모 } "기록 유형" enum RecordType { "상담" COUNSELING "메모" MEMO } enum CounselingTarget { STUDENT PARENT } """ 기록의 화면 표시 중요도 """ enum RecordDisplayPriority { "중요 - 현재 학습 관리의 목표나 지속적으로 관리할 영역에 대한 기록" IMPORTANT "참고 - 학생 관련 참고 사항" REFERENCE "보관 - 완료했거나 현재는 사용하지 않는 기록" ARCHIVE } "상담 방식" enum CounselingMethod { "유선 상담" PHONE "카카오톡" KAKAO_TALK } interface StudentRecord { id: ID! type: StudentRecordType! @deprecated(reason: "더이상 사용하지 않습니다.") author: User! "수강 과목" subject: String! "기록 유형 (상담/메모)" recordType: RecordType! "화면 표시 중요도" recordDisplayPriority: RecordDisplayPriority! createdAt: DateTime! } interface Counseling { "상담 유형" counselingType: CounselingType! counselingTarget: CounselingTarget! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! } """ 메모 정보를 담는 인터페이스입니다. """ interface Memo { "제목" title: String! proseMirrorContent: ProseMirrorContent } """ @deprecated 더 이상 사용하지 않습니다. 'SalesCounseling' 타입을 사용해주세요. """ type SalesCounselingRecord implements StudentRecord { id: ID! type: StudentRecordType! "기록 유형 (상담/메모)" recordType: RecordType! "수강 과목" subject: String! "화면 표시 중요도" recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! attachedFiles: [Files!]! content: String! author: User! createdAt: DateTime! } type SalesCounseling implements StudentRecord & Counseling { id: ID! type: StudentRecordType! @deprecated(reason: "더이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") "기록 유형 (상담/메모)" recordType: RecordType! "수강 과목" subject: String! counselingType: CounselingType! "화면 표시 중요도" recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! "상담 일자" counselingDate: DateTime! "상담 시간" counselingTime: Duration! "상담 방식 (유선 상담/카카오톡)" counselingMethod: CounselingMethod! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! content: String author: User! createdAt: DateTime! } type LearningInquiryCounseling implements StudentRecord & Counseling { id: ID! type: StudentRecordType! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") recordType: RecordType! subject: String! counselingType: CounselingType! recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! counselingDate: DateTime! counselingTime: Duration! counselingMethod: CounselingMethod! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! content: String author: User! createdAt: DateTime! } type ComplaintCounseling implements StudentRecord & Counseling { id: ID! type: StudentRecordType! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") recordType: RecordType! subject: String! counselingType: CounselingType! recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! counselingDate: DateTime! counselingTime: Duration! counselingMethod: CounselingMethod! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! content: String author: User! createdAt: DateTime! } type ClassScheduleAdjustmentCounseling implements StudentRecord & Counseling { id: ID! type: StudentRecordType! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") recordType: RecordType! subject: String! counselingType: CounselingType! recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! counselingDate: DateTime! counselingTime: Duration! counselingMethod: CounselingMethod! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! content: String author: User! createdAt: DateTime! } type OutboundCounseling implements StudentRecord & Counseling { id: ID! type: StudentRecordType! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") recordType: RecordType! subject: String! counselingType: CounselingType! recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! counselingDate: DateTime! counselingTime: Duration! counselingMethod: CounselingMethod! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! content: String author: User! createdAt: DateTime! } type ServiceGuidanceCounseling implements StudentRecord & Counseling { id: ID! type: StudentRecordType! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") recordType: RecordType! subject: String! counselingType: CounselingType! recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! counselingDate: DateTime! counselingTime: Duration! counselingMethod: CounselingMethod! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! content: String author: User! createdAt: DateTime! } type StudentInformationTransferCounseling implements StudentRecord & Counseling { id: ID! type: StudentRecordType! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") recordType: RecordType! subject: String! counselingType: CounselingType! recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! counselingDate: DateTime! counselingTime: Duration! counselingMethod: CounselingMethod! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! content: String author: User! createdAt: DateTime! } type ClassContentAdjustmentCounseling implements StudentRecord & Counseling { id: ID! type: StudentRecordType! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") recordType: RecordType! subject: String! counselingType: CounselingType! recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! counselingDate: DateTime! counselingTime: Duration! counselingMethod: CounselingMethod! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! content: String author: User! createdAt: DateTime! } type PositiveFeedbackCounseling implements StudentRecord & Counseling { id: ID! type: StudentRecordType! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") recordType: RecordType! subject: String! counselingType: CounselingType! recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! counselingDate: DateTime! counselingTime: Duration! counselingMethod: CounselingMethod! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! content: String author: User! createdAt: DateTime! } type ClassDiscontinuationRequestCounseling implements StudentRecord & Counseling { id: ID! type: StudentRecordType! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") recordType: RecordType! subject: String! counselingType: CounselingType! recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! counselingDate: DateTime! counselingTime: Duration! counselingMethod: CounselingMethod! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! content: String author: User! createdAt: DateTime! } type SpecialLectureCounseling implements StudentRecord & Counseling { id: ID! type: StudentRecordType! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") recordType: RecordType! subject: String! counselingType: CounselingType! recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! counselingDate: DateTime! counselingTime: Duration! counselingMethod: CounselingMethod! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! content: String author: User! createdAt: DateTime! } type ContentRequestCounseling implements StudentRecord & Counseling { id: ID! type: StudentRecordType! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") recordType: RecordType! subject: String! counselingType: CounselingType! recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! counselingDate: DateTime! counselingTime: Duration! counselingMethod: CounselingMethod! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! content: String author: User! createdAt: DateTime! } type OthersCounseling implements StudentRecord & Counseling { id: ID! type: StudentRecordType! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") recordType: RecordType! subject: String! counselingType: CounselingType! recordDisplayPriority: RecordDisplayPriority! counselingTarget: CounselingTarget! counselingDate: DateTime! counselingTime: Duration! counselingMethod: CounselingMethod! proseMirrorContent: ProseMirrorContent attachedFiles: [Files!]! content: String author: User! createdAt: DateTime! } """ 간편 메모 """ type QuickMemo implements StudentRecord & Memo { # StudentRecord 인터페이스 필드 id: ID! "제목" title: String! type: StudentRecordType! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") counselingType: CounselingType! recordType: RecordType! counselingTarget: CounselingTarget! subject: String! recordDisplayPriority: RecordDisplayPriority! attachedFiles: [Files!]! content: String @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingContent' 필드를 사용해주세요.") proseMirrorContent: ProseMirrorContent author: User! createdAt: DateTime! } type PaginatedSalesCounselings { items: [SalesCounselingRecord!]! @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingType' 필드를 사용해주세요.") salesCounseling: [SalesCounseling!] totalCount: Int! limit: Int! offset: Int! } input AttachedInfo { fileInfos: [FileInfo!]! } input FileInfo { id: String! fileKey: String fileName: String! fileLastModifiedAt: DateTime! contentType: String! size: Int! duration: Duration! # Duration 없는 MIME type은 PT0S 로 보내주세요. } enum BusinessDomain { COUNSELING } input SalesCounselingInput { purchaseId: ID! counsellingTarget: CounselingTarget! # 상담 대상 content: String! # 상담 내용: 아직 타입은 미정 attachedInfo: AttachedInfo! } input CreateStudentRecordInput { type: StudentRecordType! salesCounselingInput: SalesCounselingInput } """ 상담 생성 입력값 """ input CreateCounselingInput { title: String! # 제목 counselingType: CounselingType! # 상담 유형 recordType: RecordType! # 기록 유형 counselingTarget: CounselingTarget! # 상담 대상 subject: String! # 수강 과목 recordDisplayPriority: RecordDisplayPriority! # 기록 표시 우선순위 counselingDate: DateTime! # 상담 일자 counselingTime: Duration # 상담 시간 counselingMethod: CounselingMethod! # 상담 방법 fileInfos: [FileInfo!]! # 첨부 파일 content: String @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingContent' 필드를 사용해주세요.") # 기존 상담 내용 proseMirrorContentInput: ProseMirrorContentInput # 상담 내용 ProseMirrorContent } """ 상담 수정 입력값 """ input UpdateCounselingInput { id: ID! title: String! # 제목 counselingType: CounselingType! # 상담 유형 recordType: RecordType! # 기록 유형 counselingTarget: CounselingTarget! # 상담 대상 subject: String! # 수강 과목 recordDisplayPriority: RecordDisplayPriority! # 기록 표시 우선순위 counselingDate: DateTime! # 상담 일자 counselingTime: Duration # 상담 시간 counselingMethod: CounselingMethod! # 상담 방법 fileInfos: [FileInfo!]! # 첨부 파일 content: String @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingContent' 필드를 사용해주세요.") # 기존 상담 내용 proseMirrorContentInput: ProseMirrorContentInput # 상담 내용 ProseMirrorContent } """ 상담 메모 생성 입력값 """ input CreateCounselingMemoInput { title: String! # 제목 subject: String! # 수강 과목 recordDisplayPriority: RecordDisplayPriority! # 기록 표시 우선순위 fileInfos: [FileInfo!]! # 첨부 파일 content: String @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingContent' 필드를 사용해주세요.") proseMirrorContentInput: ProseMirrorContentInput # 상담 내용 ProseMirrorContent } """ 상담 메모 수정 입력값 """ input UpdateCounselingMemoInput { id: ID! title: String! # 제목 subject: String! # 수강 과목 recordDisplayPriority: RecordDisplayPriority! # 기록 표시 우선순위 fileInfos: [FileInfo!]! # 첨부 파일 content: String @deprecated(reason: "더 이상 사용하지 않습니다. 'counselingContent' 필드를 사용해주세요.") proseMirrorContentInput: ProseMirrorContentInput # 상담 내용 ProseMirrorContent } type CreateStudentRecordPayload { studentRecord: StudentRecord! } input UpdateStudentRecordInput { type: StudentRecordType! salesCounselingInput: SalesCounselingInput } extend type Query { studentRecord(id: ID!): StudentRecord! } extend type Mutation { createStudentRecord(input: CreateStudentRecordInput!): CreateStudentRecordPayload! updateStudentRecord(id: ID!, input: UpdateStudentRecordInput!): StudentRecord! deleteStudentRecord(id: ID!): Boolean! createCounseling(input: CreateCounselingInput!): StudentRecord! createCounselingMemo(input: CreateCounselingMemoInput!): StudentRecord! updateCounseling(id: ID!, input: UpdateCounselingInput!): StudentRecord! deleteCounseling(id: ID!): Boolean! updateCounselingMemo(id: ID!, input: UpdateCounselingMemoInput!): StudentRecord! deleteCounselingMemo(id: ID!): Boolean! }
GraphQL
복사

학생 등록 정보 관련 스키마

""" 학생 등록 정보 항목 """ type StudentRegistrationInfoItem { id: ID! name: String! teamName: [String!]! courses: [String!]! teachers: [String!]! email: String! studentPhone: String! parentPhone: String! } """ 학생 등록 정보 조회를 위한 필터 """ input StudentRegistrationInfoItemFilter { """학생 이름""" name: String """팀 ID""" teamId: ID """수강과목""" course: String """학생 이메일""" email: String """학생 전화번호""" studentPhone: String """학생 부모 전화번호""" parentPhone: String } """ 학생 등록 정보 페이지네이션 결과 """ type PaginatedStudentRegistrationInfoItem { items: [StudentRegistrationInfoItem!]! totalCount: Int! limit: Int! offset: Int! } """ 원생 등록 정보 """ type RegistrationCard { id: ID! # 기본 정보 name: String parentRelation: String parentPhone: String # 학교 정보 schoolType: String # 학교급 schoolName: String # 학교명(data) # 거주지 city: String # 시/도 district: String # 구/군 addressDetail: String # 상세 주소 # 성적 정보 mockTestGrade: String # 모의 고사 등급 schoolTestGrade: String # 학교 시험 등급 schoolTestScore: Int # 학교 시험 점수 desireSchoolTest: String # 내신 희망 여부 englishTextbook: String # 학교 교과서(영어) preLearning: String # 선행 학습 정보 # 이전 학습 정보 previousLearningMethod: String # 이전 학습방식 previousLearningDetail: String # 이전 학습방식 상세 previousLearningPeriod: String # 학습기간 learningStopReason: String # 학습중단 사유 isMegaPassSubscription: String # 메가 패스 수강 여부 } """ 학생 등록 정보 """ type StudentRegistrationInfo { id: ID! email: String! # 원생 등록 정보 registrationCard: RegistrationCard! # 요청사항 customerRequest: String # 고객 요청사항 sellerRequest: String # 판매자 요청사항 diagnosticRequest: String # 진단 요청사항 } """ 팀 정보 """ type Team { id: ID! name: String! parentTeamId: ID } extend type Query { """ 학생 등록 정보 목록 조회 """ studentRegistrationInfoItems( filter: StudentRegistrationInfoItemFilter limit: Int = 50 offset: Int = 0 ): PaginatedStudentRegistrationInfoItem! """ 학생 등록 정보 단건 조회 """ studentRegistrationInfo(id: ID!): StudentRegistrationInfo """ 팀 목록 조회 """ teams: [Team!]! """ 수강과목 목록 조회 """ courses: [String!]! }
GraphQL
복사
@1/7/2025, 1:57:00 PM

원생등록지 graphql 스키마 변경

데이터 구조
학생 > 계약 > 원생등록지
학생: 계약 ⇒ 1:N
계약: 원생등록지 ⇒ 1:1
원생등록지: 진단고사 ⇒ 1:1
추가 질문
연장하는 경우?
계약 새로 생성
결제
결제: 계약 관계
일반적인 경우 1:1
메가스터디 N:1
AS-IS
"""학생 등록 정보""" type StudentRegistrationInfo { """ 요청사항""" customerRequest: String """ 판매자 요청사항""" diagnosticRequest: String email: String! id: ID! """ 원생 등록 정보 """ registrationCard: RegistrationCard! """ 고객 요청사항""" sellerRequest: String }
GraphQL
복사
TO-BE
"""학생 등록 정보""" type StudentRegistrationInfo { email: String! id: ID! studentContractInfos: [StudentContractInfo!]! } type StudentContractInfo { """계약 ID""" id: ID! """ 원생 등록 정보 """ registrationCard: RegistrationCard! """ 고객 요청사항""" sellerRequest: String """ 요청사항""" customerRequest: String """ 판매자 요청사항""" diagnosticRequest: String }
GraphQL
복사