Altsis νκ΅ μ 보 μμ€ν
μ MongoDB μ€ν€λ§(Mongoose) μ 체 λͺ
μΈμ
λλ€. λͺ¨λ λͺ¨λΈμ backend/src/models/ λλ ν 리μ μ μλμ΄ μμ΅λλ€.
- Academy (μμΉ΄λ°λ―Έ)
- User (μ¬μ©μ)
- School (νκ΅)
- Season (νκΈ°)
- Registration (νκΈ° λ±λ‘)
- Syllabus (κ°μκ³νμ)
- Enrollment (μκ°)
- Archive (κΈ°λ‘)
- Form (μμ)
- Board (보λ)
- Post (κ²μκΈ)
- Comment (λκΈ)
- Notification (μλ¦Ό)
- NotificationSetting (μλ¦Ό μ€μ )
- CalendarEvent (μΊλ¦°λ μΌμ )
- UserCalendar (μ¬μ©μ μΊλ¦°λ)
- ChatRoom (μ±ν λ°©)
- ChatMessage (μ±ν λ©μμ§)
- ChatFile (μ±ν νμΌ)
- Reminder (리λ§μΈλ)
- ThemeSetting (ν λ§ μ€μ )
- Apps (μ±)
- TimeBlock (μκ° λΈλ‘)
- AltForm (μμ λΉλ)
- AltSheet (μνΈ)
- AltSheetRow (μνΈ ν)
- AltSheetOpen (μνΈ μ΄λ)
- AIChatSession (AI μ±ν μΈμ )
- AIChatMessage (AI μ±ν λ©μμ§)
- AIUsageLog (AI μ¬μ©λ λ‘κ·Έ)
- BoardFavorite (보λ μ¦κ²¨μ°ΎκΈ°)
- SurveyResponse (μ€λ¬Έ μλ΅)
- RequestStat (μμ² ν΅κ³)
μμΉ΄λ°λ―Έλ μμ€ν
μ μ΅μμ λ¨μμ
λλ€. μμΉ΄λ°λ―Έ λ¬Έμλ λ£¨νΈ DBμ μ μ₯λλ©°, κ° μμΉ΄λ°λ―Έλ λ
립μ μΈ λ°μ΄ν°λ² μ΄μ€({academyId}-db)λ₯Ό κ°μ§λλ€.
νμΌ:
backend/src/models/Academy.jsDB: λ£¨νΈ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
academyId_1 |
UNIQUE |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
academyId |
String |
O | - | μμΉ΄λ°λ―Έ κ³ μ ID (μ ν¨μ± κ²μ¬ μ μ©) |
academyName |
String |
O | - | μμΉ΄λ°λ―Έ μ΄λ¦ (μ ν¨μ± κ²μ¬ μ μ©) |
email |
String |
X | - | μ΄λ©μΌ (μ ν¨μ± κ²μ¬ μ μ©) |
tel |
String |
X | - | μ νλ²νΈ (μ ν¨μ± κ²μ¬ μ μ©) |
adminId |
String |
O | - | κ΄λ¦¬μ μ¬μ©μ ID (μ ν¨μ± κ²μ¬ μ μ©) |
adminName |
String |
O | - | κ΄λ¦¬μ μ΄λ¦ (μ ν¨μ± κ²μ¬ μ μ©) |
dbName |
String |
μλ | - | μμΉ΄λ°λ―Έ DBλͺ
({academyId}-db). API μλ΅μμ μ μΈ (select: false) |
isActivated |
Boolean |
X | true |
νμ±ν μν. falseμ΄λ©΄ λ‘κ·ΈμΈ λΆκ° |
chatEnabled |
Boolean |
X | false |
μ±ν κΈ°λ₯ νμ±ν μν |
boardEnabled |
Boolean |
X | false |
보λ κΈ°λ₯ νμ±ν μν |
aiEnabled |
Boolean |
X | false |
AI κΈ°λ₯ νμ±ν μν |
aiProvider |
String |
X | "gemini" |
AI μ 곡μ (openai / anthropic / gemini) |
aiApiKey |
String |
X | - | μ νν μ 곡μμ API ν€. API μλ΅μμ μ μΈ (select: false) |
aiModel |
String |
X | "gemini-3.6-flash" |
μ¬μ© AI λͺ¨λΈλͺ |
aiUsageLimits |
Object |
X | { enabled: false, dailyUserAlts: 0 } |
μ¬μ©μλ³ μΌ(UTC) Alt νλ |
aiUsageLimits.enabled |
Boolean |
X | false |
νλ μ μ© μ¬λΆ |
aiUsageLimits.dailyUserAlts |
Number |
X | 0 |
1μΈλΉ μΌμΌ Alt νλ (1 Alt = 10,000 ν ν°) |
createdAt |
Date |
μλ | - | μμ± μκ° (timestamps) |
updatedAt |
Date |
μλ | - | μμ μκ° (timestamps) |
academyIdκ° λ³κ²½λλ©΄dbNameμ{academyId}-dbλ‘ μλ μ€μ ν©λλ€.
μ¬μ©μ κ³μ μ 보μ λλ€. λΉλ°λ²νΈλ bcryptλ‘ ν΄μνλμ΄ μ μ₯λ©λλ€.
νμΌ:
backend/src/models/User.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
userId_1 |
UNIQUE |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
userId |
String |
O | - | μ¬μ©μ κ³ μ ID (μ ν¨μ± κ²μ¬ μ μ©) |
userName |
String |
O | - | μ¬μ©μ μ΄λ¦ (μ ν¨μ± κ²μ¬ μ μ©) |
password |
String |
O | - | λΉλ°λ²νΈ. bcrypt ν΄μ. API μλ΅μμ μ μΈ (select: false) |
auth |
String |
X | "member" |
κΆν λ±κΈ. enum: "owner", "admin", "manager", "member" |
email |
String |
X | - | μ΄λ©μΌ (μ ν¨μ± κ²μ¬ μ μ©) |
tel |
String |
X | - | μ νλ²νΈ (μ ν¨μ± κ²μ¬ μ μ©) |
snsId |
Object |
X | - | μμ λ‘κ·ΈμΈ κ³μ |
snsId.google |
String |
X | - | μ°κ²°λ Google μ΄λ©μΌ |
schools |
Array |
X | [] |
λ±λ‘λ νκ΅ λͺ©λ‘ |
schools[].school |
ObjectId |
- | - | νκ΅ _id |
schools[].schoolId |
String |
- | - | νκ΅ ID |
schools[].schoolName |
String |
- | - | νκ΅ μ΄λ¦ |
profile |
String |
X | - | νλ‘ν μ¬μ§ URL |
academyId |
String |
X | - | μμ μμΉ΄λ°λ―Έ ID |
academyName |
String |
X | - | μμ μμΉ΄λ°λ―Έ μ΄λ¦ |
createdAt |
Date |
μλ | - | μμ± μκ° (timestamps) |
updatedAt |
Date |
μλ | - | μμ μκ° (timestamps) |
passwordκ° λ³κ²½λλ©΄ bcryptλ‘ ν΄μννμ¬ μ μ₯ν©λλ€ (salt rounds: νκ²½λ³μsaltRounds).
comparePassword(plainPassword): νλ¬Έ λΉλ°λ²νΈλ₯Ό ν΄μμ λΉκ΅ν©λλ€.
νκ΅ μ 보μ κΈ°λ‘ μμ(FormArchive)μ κ΄λ¦¬ν©λλ€.
νμΌ:
backend/src/models/School.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
schoolId_1 |
UNIQUE |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
schoolId |
String |
O | - | νκ΅ κ³ μ ID (μ ν¨μ± κ²μ¬ μ μ©) |
schoolName |
String |
O | - | νκ΅ μ΄λ¦ (μ ν¨μ± κ²μ¬ μ μ©) |
formArchive |
Array |
X | [] |
κΈ°λ‘ μμ λͺ©λ‘ |
deletedFormArchive |
Array |
X | [] |
μμ λ κΈ°λ‘ μμ (ν΄μ§ν΅) |
links |
Array |
X | [] |
μΈλΆ λ§ν¬ λͺ©λ‘ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
| νλ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|
label |
String |
- | μμ μ΄λ¦ |
dataType |
String |
"array" |
λ°μ΄ν° νμ
. enum: "array", "object" |
fields |
Array |
- | νλ μ μ λ°°μ΄ |
fields[].label |
String |
- | νλ μ΄λ¦ |
fields[].type |
String |
"input" |
enum: "select", "input", "input-number", "file", "file-image" |
fields[].options |
String[] |
[] |
μ νμ§ |
fields[].runningTotal |
Boolean |
false |
λμ ν©κ³ νμ |
fields[].total |
Boolean |
false |
ν©κ³ νμ |
authTeacher |
String |
"undefined" |
enum: "undefined", "viewAndEditStudents", "viewAndEditMyStudents" |
authStudent |
String |
"undefined" |
enum: "undefined", "view", "viewAndEdit" |
authManager |
String |
"undefined" |
enum: "undefined", "viewAndEdit" |
FormArchiveItemκ³Ό λμΌν ꡬ쑰μ deletedAt νλκ° μΆκ°λ©λλ€.
| νλ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|
deletedAt |
Date |
Date.now |
μμ μμ |
| νλ | νμ | μ€λͺ |
|---|---|---|
url |
String |
URL (μ: https://www.naver.com) |
title |
String |
λ§ν¬ μ λͺ© (μ: "λ€μ΄λ²") |
νκΈ° μ 보λ‘, κΈ°κ°, κ΅κ³Όλͺ©, κ°μμ€, μμ, κΆν λ±μ ν¬ν¨ν©λλ€.
νμΌ:
backend/src/models/Season.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
school_1, year_-1, term_1 |
UNIQUE, COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
school |
ObjectId |
O | - | νκ΅ _id |
schoolId |
String |
O | - | νκ΅ ID |
schoolName |
String |
O | - | νκ΅ μ΄λ¦ |
year |
String |
O | - | νλ λ (μ: "2024νλ λ") |
term |
String |
O | - | νκΈ° (μ: "1νκΈ°") |
period |
Object |
X | {start:"", end:""} |
κΈ°κ° |
period.start |
String |
- | "" |
μμμΌ (YYYY-MM-DD λλ λΉ λ¬Έμμ΄) |
period.end |
String |
- | "" |
μ’
λ£μΌ (YYYY-MM-DD λλ λΉ λ¬Έμμ΄) |
classrooms |
String[] |
X | [] |
κ°μμ€ λͺ©λ‘ |
subjects |
Object |
X | {label:[], data:[]} |
κ΅κ³Όλͺ© |
subjects.label |
String[] |
- | [] |
λΆλ₯ λΌλ²¨ (μ: ["κ΅κ³Ό","κ³Όλͺ©"]) |
subjects.data |
String[][] |
- | [] |
κ΅κ³Όλͺ© λ°μ΄ν° (μ: [["κ΅μ΄","νλμ"]]) |
formTimetable |
Object |
X | - | μκ°ν μμ ({title, data}) |
formSyllabus |
Object |
X | - | κ°μκ³νμ μμ ({title, data}) |
formEvaluation |
Array |
X | [] |
νκ° μμ νλͺ© λ°°μ΄ |
permissionSyllabusV2 |
Object |
X | (μλ μ°Έμ‘°) | μμ κ°μ€ κΆν |
permissionEnrollmentV2 |
Object |
X | (μλ μ°Έμ‘°) | μκ°μ μ² κΆν |
permissionEvaluationV2 |
Object |
X | (μλ μ°Έμ‘°) | νκ° κΆν |
aiSettings |
Object |
X | (μλ μ°Έμ‘°) | AI μ€μ |
isActivated |
Boolean |
X | false |
νμ±ν μν |
isActivatedFirst |
Boolean |
X | false |
μ΅μ΄ νμ±ν μ¬λΆ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
κΈ°λ³Έκ°: { teacher: false, student: false, exceptions: [] }
| νλ | νμ | μ€λͺ |
|---|---|---|
teacher |
Boolean |
κ΅μ¬ μν νμ© μ¬λΆ |
student |
Boolean |
νμ μν νμ© μ¬λΆ |
exceptions |
Array |
μμΈ μ¬μ©μ λͺ©λ‘ |
exceptions[].registration |
String |
Registration _id |
exceptions[].role |
String |
μν |
exceptions[].user |
String |
μ¬μ©μ _id |
exceptions[].userId |
String |
μ¬μ©μ ID |
exceptions[].userName |
String |
μ¬μ©μ μ΄λ¦ |
exceptions[].isAllowed |
Boolean |
νμ© μ¬λΆ |
| νλ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|
label |
String |
- | νκ° νλͺ©λͺ (μ: "λ©ν νκ°") |
type |
String |
"input" |
enum: "input", "input-number", "select" |
options |
String[] |
[] |
μ νμ§ (typeμ΄ selectμΈ κ²½μ°) |
combineBy |
String |
"term" |
λκΈ°ν λ¨μ. enum: "term", "year" |
authOption |
String |
"editByTeacher" |
κΆν μ΅μ
. enum: "editByStudent", "editByTeacher", "editByTeacherAndStudentCanView" |
auth |
Object |
- | authOptionμ λ°λΌ μλ μ€μ |
auth.edit |
Object |
- | νΈμ§ κΆν ({teacher, student}) |
auth.view |
Object |
- | μ΄λ κΆν ({teacher, student}) |
κΈ°λ³Έκ°: { enabled: false, permission: {teacher: false, student: false}, guidelines: "", references: [], examples: {} }
| νλ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|
enabled |
Boolean |
false |
AI νμ±ν |
permission.teacher |
Boolean |
false |
κ΅μ¬ AI μ¬μ© κΆν |
permission.student |
Boolean |
false |
νμ AI μ¬μ© κΆν |
guidelines |
String |
"" |
AI κΈ°λ³Έ μ§μΉ¨ |
examples |
Object |
{} |
μμ νλλͺ β λͺ¨λ² λ¬Έμ₯ |
references |
Array |
[] |
μ°Έκ³ μλ£ λ°°μ΄ |
references[].title |
String |
- | μλ£ μ λͺ© |
references[].content |
String |
- | μλ£ λ΄μ© |
references[].fileName |
String |
- | νμΌλͺ |
references[].fileKey |
String |
- | S3 ν€ |
references[].fileSize |
Number |
- | νμΌ ν¬κΈ° |
references[].mimeType |
String |
- | MIME νμ |
getSubdocument(): λ€λ₯Έ λͺ¨λΈμ λ΄μ₯ν νκΈ° νμ λ¬Έμλ₯Ό λ°νν©λλ€.
μ¬μ©μμ νκΈ°λ³ λ±λ‘ μ 보(μν , νλ , λ΄λΉκ΅μ¬ λ±)λ₯Ό κ΄λ¦¬ν©λλ€.
νμΌ:
backend/src/models/Registration.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
season_1, user_1 |
UNIQUE, COMPOUND |
user_1 |
INDEX |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
season |
ObjectId |
O | - | νκΈ° _id |
school |
ObjectId |
X | - | νκ΅ _id |
schoolId |
String |
X | - | νκ΅ ID |
schoolName |
String |
X | - | νκ΅ μ΄λ¦ |
year |
String |
X | - | νλ λ |
term |
String |
X | - | νκΈ° |
period |
Object |
X | - | κΈ°κ° (Seasonμμ 볡μ¬) |
user |
ObjectId |
O | - | μ¬μ©μ _id |
userId |
String |
O | - | μ¬μ©μ ID |
userName |
String |
O | - | μ¬μ©μ μ΄λ¦ |
role |
String |
O | "student" |
μν . enum: "student", "teacher" |
grade |
String |
X | - | νλ |
group |
String |
X | - | κ·Έλ£Ή |
teacher |
ObjectId |
X | - | λ΄λΉ κ΅μ¬ _id |
teacherId |
String |
X | - | λ΄λΉ κ΅μ¬ ID |
teacherName |
String |
X | - | λ΄λΉ κ΅μ¬ μ΄λ¦ |
subTeacher |
ObjectId |
X | - | λΆλ΄λΉ κ΅μ¬ _id |
subTeacherId |
String |
X | - | λΆλ΄λΉ κ΅μ¬ ID |
subTeacherName |
String |
X | - | λΆλ΄λΉ κ΅μ¬ μ΄λ¦ |
isActivated |
Boolean |
X | false |
νκΈ° νμ±ν μν (Seasonμμ λκΈ°ν) |
memos |
Array |
X | [] |
λ©λͺ¨ λ°°μ΄ |
memos[].title |
String |
- | - | λ©λͺ¨ μ λͺ© |
memos[].day |
String |
- | - | μμΌ |
memos[].start |
String |
- | - | μμ μκ° |
memos[].end |
String |
- | - | μ’ λ£ μκ° |
memos[].memo |
String |
- | - | λ©λͺ¨ λ΄μ© |
permissionSyllabusV2 |
Boolean |
X | false |
μμ κ°μ€ κΆν |
permissionEnrollmentV2 |
Boolean |
X | false |
μκ°μ μ² κΆν |
permissionEvaluationV2 |
Boolean |
X | false |
νκ° κΆν |
formEvaluation |
Array |
X | [] |
νκ° μμ (Seasonμμ 볡μ¬) |
μμ κ°μ€ μ 보λ₯Ό κ΄λ¦¬ν©λλ€.
νμΌ:
backend/src/models/Syllabus.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
season_1 |
INDEX |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
season |
ObjectId |
O | - | νκΈ° _id |
school |
ObjectId |
X | - | νκ΅ _id |
schoolId |
String |
X | - | νκ΅ ID |
schoolName |
String |
X | - | νκ΅ μ΄λ¦ |
year |
String |
X | - | νλ λ |
term |
String |
X | - | νκΈ° |
user |
ObjectId |
O | - | κ°μ€μ _id |
userId |
String |
O | - | κ°μ€μ μ¬μ©μ ID |
userName |
String |
O | - | κ°μ€μ μ΄λ¦ |
classTitle |
String |
O | - | μμ μ λͺ© |
time |
Array |
X | [] |
μμ μκ° (TimeBlock λ°°μ΄) |
classroom |
String |
X | - | κ°μμ€ |
subject |
String[] |
X | [] |
κ΅κ³Όλͺ© λΆλ₯ |
point |
Number |
X | 0 |
νμ |
limit |
Number |
X | 0 |
μκ° μ μ (0: 무μ ν) |
count |
Number |
X | 0 |
νμ¬ μκ°μ μ |
count_limit |
String |
X | - | μκ°/μ μ νμ λ¬Έμμ΄ |
info |
Object |
X | - | μΈλΆ μ 보 (μλν° λ°μ΄ν°) |
teachers |
Array |
O | - | λ©ν (κ΅μ¬) λͺ©λ‘ (μ΅μ 1λͺ νμ) |
teachers[]._id |
ObjectId |
O | - | κ΅μ¬ _id |
teachers[].userId |
String |
O | - | κ΅μ¬ μ¬μ©μ ID |
teachers[].userName |
String |
O | - | κ΅μ¬ μ΄λ¦ |
teachers[].confirmed |
Boolean |
X | false |
μΉμΈ μν |
teachers[].isHiddenFromCalendar |
Boolean |
X | false |
μΊλ¦°λ μ¨κΉ |
coverImage |
String |
X | - | μ»€λ² μ΄λ―Έμ§ URL |
coverColor |
String |
X | - | μ»€λ² λ°°κ²½ μμ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
timeμ΄ λ³κ²½λλ©΄ μμΌ+μμμκ° μμΌλ‘ μλ μ λ ¬ν©λλ€.
νμμ μκ° μ 보μ νκ° λ°μ΄ν°λ₯Ό κ΄λ¦¬ν©λλ€. νκ° λ°μ΄ν°λ μνΈνλμ΄ μ μ₯λ©λλ€.
νμΌ:
backend/src/models/Enrollment.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€ μνΈν:mongoose-encryption(evaluationνλ)
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
syllabus_1, student_1 |
UNIQUE, COMPOUND |
student_1, season_1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
| κ°μκ³νμ λ°μ΄ν° | ||||
syllabus |
ObjectId |
O | - | κ°μκ³νμ _id |
season |
ObjectId |
X | - | νκΈ° _id |
school |
ObjectId |
X | - | νκ΅ _id |
schoolId |
String |
X | - | νκ΅ ID |
schoolName |
String |
X | - | νκ΅ μ΄λ¦ |
year |
String |
X | - | νλ λ |
term |
String |
X | - | νκΈ° |
user |
ObjectId |
X | - | κ°μ€μ _id |
userId |
String |
X | - | κ°μ€μ μ¬μ©μ ID |
userName |
String |
X | - | κ°μ€μ μ΄λ¦ |
classTitle |
String |
X | - | μμ μ λͺ© |
time |
Array |
X | [] |
μμ μκ° |
classroom |
String |
X | - | κ°μμ€ |
subject |
String[] |
X | [] |
κ΅κ³Όλͺ© |
point |
Number |
X | - | νμ |
limit |
Number |
X | - | μκ° μ μ |
count_limit |
String |
X | - | μκ°/μ μ νμ |
info |
Object |
X | - | μΈλΆ μ 보 |
teachers |
Array |
X | - | λ©ν λͺ©λ‘ |
coverImage |
String |
X | - | μ»€λ² μ΄λ―Έμ§ |
coverColor |
String |
X | - | μ»€λ² μμ |
| μκ° λ°μ΄ν° | ||||
student |
ObjectId |
O | - | μκ°μ(νμ) _id |
studentId |
String |
X | - | νμ μ¬μ©μ ID |
studentName |
String |
X | - | νμ μ΄λ¦ |
studentGrade |
String |
X | - | νμ νλ |
evaluation |
Object |
X | - | νκ° λ°μ΄ν°. μνΈν μ μ₯. μ: {"λ©ν νκ°": "...", "μΆμλ±κΈ": "A"} |
memo |
String |
X | - | λ©λͺ¨ |
isHiddenFromCalendar |
Boolean |
X | false |
μΊλ¦°λ μ¨κΉ μ€μ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
μ€μ:
evaluationνλλmongoose-encryptionμΌλ‘ μνΈνλ©λλ€. νκ° μ‘°ν μ μ© API(GET /api/enrollments/evaluation)μμλ§ λ³΅νΈνλ λ°μ΄ν°κ° λ°νλ©λλ€.
νμμ κΈ°λ‘ λ°μ΄ν°λ₯Ό κ΄λ¦¬ν©λλ€. νκ΅μ κΈ°λ‘ μμ(FormArchive)μ λ°λΌ ꡬ쑰νλ λ°μ΄ν°κ° μνΈνλμ΄ μ μ₯λ©λλ€.
νμΌ:
backend/src/models/Archive.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€ μνΈν:mongoose-encryption(dataνλ)
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
school_1, user_1 |
UNIQUE, COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
user |
ObjectId |
O | - | μ¬μ©μ _id |
userId |
String |
X | - | μ¬μ©μ ID |
userName |
String |
X | - | μ¬μ©μ μ΄λ¦ |
school |
ObjectId |
O | - | νκ΅ _id |
schoolId |
String |
X | - | νκ΅ ID |
schoolName |
String |
X | - | νκ΅ μ΄λ¦ |
data |
Object |
X | {} |
κΈ°λ‘ λ°μ΄ν°. μνΈν μ μ₯. μ: {"μΈμ μ¬ν": {"μ΄λ¦": "νκΈΈλ"}, "μ±μ κΈ°λ‘": [{...}]} |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
μκ°ν, κ°μκ³νμ, μΈμμ© μμ λ±μ λ¬Έμ ν νλ¦Ώμ κ΄λ¦¬ν©λλ€.
νμΌ:
backend/src/models/Form.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
userId |
String |
X | - | μμ±μ μ¬μ©μ ID |
userName |
String |
X | - | μμ±μ μ΄λ¦ |
type |
String |
O | - | μμ νμ
(μ: "timetable", "syllabus", "print") |
title |
String |
O | - | μμ μ λͺ© |
archived |
Boolean |
X | false |
λ³΄κ΄ μ²λ¦¬ μ€μ |
data |
Array |
X | - | μλν°μ μν΄ μ€μ λ μμ λ°μ΄ν° |
permissionView |
Object |
X | (μλ μ°Έμ‘°) | λ¬Έμ μ΄λ κΆν |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
κΈ°λ³Έκ°: { teacher: true, student: false, exceptions: [] }
| νλ | νμ | μ€λͺ |
|---|---|---|
teacher |
Boolean |
κ΅μ¬ μ΄λ κΆν |
student |
Boolean |
νμ μ΄λ κΆν |
exceptions |
Array |
μμΈ μ¬μ©μ λͺ©λ‘ |
exceptions[].user |
ObjectId |
μ¬μ©μ _id |
exceptions[].userId |
String |
μ¬μ©μ ID |
exceptions[].userName |
String |
μ¬μ©μ μ΄λ¦ |
exceptions[].isAllowed |
Boolean |
νμ© μ¬λΆ |
νκ΅λ³ 보λλ₯Ό κ΄λ¦¬ν©λλ€. Alt Board λͺ¨λμμλ μμ(Form), μνΈ(Sheet), 보λ μ±ν μ μ§μν©λλ€. μμ±/μ½κΈ°/λκΈ κΆνμ μν λ³λ‘ μΈλ°νκ² μ€μ ν μ μμ΅λλ€.
νμΌ:
backend/src/models/Board.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
school_1 |
INDEX |
school_1, slug_1 |
UNIQUE, COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
school |
ObjectId |
O | - | νκ΅ _id |
schoolId |
String |
O | - | νκ΅ ID |
schoolName |
String |
O | - | νκ΅ μ΄λ¦ |
name |
String |
O | - | κ²μν μ΄λ¦ |
slug |
String |
O | - | URL μ¬λ¬κ·Έ |
description |
String |
X | "" |
κ²μν μ€λͺ |
creator |
ObjectId |
X | - | μμ±μ _id |
creatorId |
String |
X | - | μμ±μ μ¬μ©μ ID |
creatorName |
String |
X | - | μμ±μ μ΄λ¦ |
permissionWrite |
Object |
X | {manager:true, teacher:true, student:false} |
κ²μκΈ μμ± κΆν |
permissionRead |
Object |
X | {manager:true, teacher:true, student:true} |
κ²μκΈ μ½κΈ° κΆν |
permissionComment |
Object |
X | {manager:true, teacher:true, student:true} |
λκΈ μμ± κΆν |
isDefault |
Boolean |
X | false |
κΈ°λ³Έ κ²μν (곡μ§μ¬ν) μ¬λΆ |
isActive |
Boolean |
X | true |
νμ±ν μν |
order |
Number |
X | 0 |
μ λ ¬ μμ |
postCount |
Number |
X | 0 |
κ²μκΈ μ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
| νλ | νμ | μ€λͺ |
|---|---|---|
manager |
Boolean |
μ΄μμ κΆν |
teacher |
Boolean |
κ΅μ¬ κΆν |
student |
Boolean |
νμ κΆν |
exceptions |
Array |
μμΈ μ¬μ©μ λͺ©λ‘ |
κ²μνμ κ²μκΈμ κ΄λ¦¬ν©λλ€.
νμΌ:
backend/src/models/Post.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
board_1, createdAt_-1 |
COMPOUND |
board_1, isPinned_-1, createdAt_-1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
board |
ObjectId |
O | - | κ²μν _id |
author |
ObjectId |
O | - | μμ±μ _id |
authorId |
String |
O | - | μμ±μ μ¬μ©μ ID |
authorName |
String |
O | - | μμ±μ μ΄λ¦ |
authorProfile |
String |
X | - | μμ±μ νλ‘ν μ¬μ§ URL |
title |
String |
O | - | μ λͺ© |
content |
String |
O | - | λ΄μ© (Markdown) |
category |
String |
X | - | μΉ΄ν κ³ λ¦¬ |
isPinned |
Boolean |
X | false |
μλ¨ κ³ μ μ¬λΆ |
isActive |
Boolean |
X | true |
νμ±ν μν (soft delete) |
viewCount |
Number |
X | 0 |
μ‘°νμ |
targetAudience |
Object |
X | - | λμ μ§μ (μλ¦Ό λ°μ‘ λμ) |
targetAudience.type |
String |
X | "all" |
enum: "all", "manager", "teacher", "student", "custom" |
targetAudience.users |
Array |
X | - | customμΈ κ²½μ° μ¬μ©μ λͺ©λ‘ |
targetAudience.grade |
Number |
X | - | νλ μ§μ |
attachments |
Array |
X | [] |
첨λΆνμΌ λ°°μ΄ |
attachments[].url |
String |
- | - | νμΌ URL |
attachments[].fileName |
String |
- | - | νμΌλͺ |
attachments[].fileSize |
Number |
- | - | νμΌ ν¬κΈ° (bytes) |
attachments[].mimeType |
String |
- | - | MIME νμ |
attachments[].key |
String |
- | - | S3 ν€ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
κ²μκΈμ λκΈμ κ΄λ¦¬ν©λλ€. λλκΈ(λ΅κΈ)μ μ§μν©λλ€.
νμΌ:
backend/src/models/Comment.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
post_1, createdAt_1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
post |
ObjectId |
O | - | κ²μκΈ _id |
author |
ObjectId |
O | - | μμ±μ _id |
authorId |
String |
O | - | μμ±μ μ¬μ©μ ID |
authorName |
String |
O | - | μμ±μ μ΄λ¦ |
authorProfile |
String |
X | - | μμ±μ νλ‘ν μ¬μ§ URL |
content |
String |
O | - | λκΈ λ΄μ© |
isActive |
Boolean |
X | true |
νμ±ν μν (soft delete) |
parentComment |
ObjectId |
X | null |
λΆλͺ¨ λκΈ _id (λλκΈμΈ κ²½μ°) |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
λ°μ λ° μμ μλ¦Όμ κ΄λ¦¬ν©λλ€.
νμΌ:
backend/src/models/Notification.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
user_1, createdAt_-1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
type |
String |
O | - | μλ¦Ό μ ν. enum: "sent", "received" |
user |
ObjectId |
O | - | μμ μ _id |
userId |
String |
O | - | μμ μ μ¬μ©μ ID |
userName |
String |
O | - | μμ μ μ΄λ¦ |
λ°μ (type: "sent") |
||||
toUserList |
Array |
X | - | μμ μ λͺ©λ‘ |
toUserList[].user |
ObjectId |
O | - | μμ μ _id |
toUserList[].userId |
String |
O | - | μμ μ μ¬μ©μ ID |
toUserList[].userName |
String |
O | - | μμ μ μ΄λ¦ |
μμ (type: "received") |
||||
fromUser |
ObjectId |
X | - | λ°μ μ _id |
fromUserId |
String |
X | - | λ°μ μ μ¬μ©μ ID |
fromUserName |
String |
X | - | λ°μ μ μ΄λ¦ |
checked |
Boolean |
X | - | νμΈ μ¬λΆ |
| κ³΅ν΅ | ||||
category |
String |
X | - | μΉ΄ν κ³ λ¦¬ |
title |
String |
O | - | μλ¦Ό μ λͺ© |
description |
String |
X | - | μλ¦Ό μ€λͺ |
date |
Date |
X | - | μλ¦Ό μΌμ |
notificationType |
String |
X | "direct" |
μλ¦Ό μ ν. enum: "direct", "classInvitation", "classCancellation", "classApproval", "classApprovalCancel", "scheduleStart", "newPost", "reminder" |
relatedEntity |
Object |
X | - | κ΄λ ¨ μν°ν° |
relatedEntity.type |
String |
X | - | enum: "enrollment", "syllabus", "calendarEvent", "post", "reminder" |
relatedEntity.id |
ObjectId |
X | - | κ΄λ ¨ μν°ν° _id |
autoDeleteOnCheck |
Boolean |
X | true |
νμΈ μ μλ μμ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
μ¬μ©μλ³ μλ¦Ό μμ μ€μ μ κ΄λ¦¬ν©λλ€.
νμΌ:
backend/src/models/NotificationSetting.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
user_1 |
UNIQUE |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
user |
ObjectId |
O | - | μ¬μ©μ _id |
userId |
String |
O | - | μ¬μ©μ ID |
userName |
String |
O | - | μ¬μ©μ μ΄λ¦ |
settings |
Object |
X | (μλ μ°Έμ‘°) | μλ¦Ό μ€μ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
| νλ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|
classInvitation |
Boolean |
true |
μμ μ΄λ μλ¦Ό |
classCancellation |
Boolean |
true |
μμ μ΄λ μ·¨μ μλ¦Ό |
classApproval |
Boolean |
true |
μμ μΉμΈ μλ¦Ό |
classApprovalCancel |
Boolean |
true |
μμ μΉμΈ μ·¨μ μλ¦Ό |
scheduleStart |
Boolean |
true |
μΌμ μμ μλ¦Ό |
newPost |
Boolean |
true |
μ κ²μκΈ μλ¦Ό |
directMessage |
Boolean |
true |
μ§μ λ©μμ§ μλ¦Ό |
soundEnabled |
Boolean |
true |
μλ¦Όμ νμ±ν |
reminder |
Boolean |
true |
리λ§μΈλ μλ¦Ό |
eventReminderDefault |
Number |
15 |
κΈ°λ³Έ μ΄λ²€νΈ 리λ§μΈλ (λΆ) |
μΊλ¦°λ μΌμ μ κ΄λ¦¬ν©λλ€. μλ μμ± μΌμ μΈμ μκ°/κ°μκ³νμ/λ©λͺ¨λ‘λΆν° μλ λκΈ°νλ μΌμ λ ν¬ν¨λ©λλ€.
νμΌ:
backend/src/models/CalendarEvent.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
school_1, scope_1 |
COMPOUND |
user_1, scope_1 |
COMPOUND |
user_1, sourceType_1, sourceId_1 |
COMPOUND |
user_1, recurrence.type_1, start_1, end_1 |
COMPOUND |
school_1, recurrence.type_1, start_1, end_1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
title |
String |
O | - | μΌμ μ λͺ© |
description |
String |
X | "" |
μΌμ μ€λͺ |
start |
Date |
O | - | μμ μΌμ |
end |
Date |
O | - | μ’ λ£ μΌμ |
isAllDay |
Boolean |
X | false |
μ’ μΌ μΌμ μ¬λΆ |
scope |
String |
O | - | λ²μ. enum: "school", "personal" |
school |
ObjectId |
X | - | νκ΅ _id (scopeκ° schoolμΈ κ²½μ°) |
user |
ObjectId |
O | - | μμ±μ _id |
recurrence |
Object |
X | {type:"none"} |
λ°λ³΅ μ€μ |
recurrence.type |
String |
X | "none" |
enum: "none", "daily", "weekly", "monthly" |
recurrence.endDate |
Date |
X | - | λ°λ³΅ μ’ λ£μΌ |
recurrence.days |
Number[] |
X | - | λ°λ³΅ μμΌ (0=μΌ, 1=μ, ..., 6=ν ) |
color |
String |
X | "#4285f4" |
μΌμ μμ |
reminder |
Object |
X | {enabled:false, useDefault:true} |
리λ§μΈλ μ€μ |
reminder.enabled |
Boolean |
X | false |
리λ§μΈλ νμ±ν |
reminder.minutesBefore |
Number |
X | - | λͺ λΆ μ μλ¦Ό |
reminder.useDefault |
Boolean |
X | true |
κΈ°λ³Έ μ€μ μ¬μ© |
scheduleStart |
Object |
X | {enabled:false} |
μΌμ μμ μλ¦Ό (μ΅νΈμΈ) |
scheduleStart.enabled |
Boolean |
X | false |
μΌμ μμ μλ¦Ό νμ±ν |
notifySchool |
Boolean |
X | false |
νκ΅ μ 체 μλ¦Ό (scope=schoolμΌ λλ§ μ ν¨) |
sourceType |
String |
X | "manual" |
μΆμ² μ ν. enum: "manual", "enrollment", "syllabus", "memo" |
sourceId |
String |
X | - | μΆμ² ID |
syllabusId |
ObjectId |
X | - | μ°κ²°λ κ°μκ³νμ _id |
calendarId |
ObjectId |
X | - | μμ μ¬μ©μ μΊλ¦°λ _id |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
μ¬μ©μ μΊλ¦°λ κ·Έλ£Ήμ κ΄λ¦¬ν©λλ€. μΌμ μ μΊλ¦°λλ³λ‘ λΆλ₯νκ³ μμμ μ€μ ν μ μμ΅λλ€.
νμΌ:
backend/src/models/UserCalendar.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
user_1 |
INDEX |
user_1, school_1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
user |
ObjectId |
O | - | μμ μ _id |
school |
ObjectId |
X | - | νκ΅ _id (scopeκ° schoolμΈ κ²½μ°) |
name |
String |
O | - | μΊλ¦°λ μ΄λ¦ |
color |
String |
X | "#4285f4" |
μΊλ¦°λ μμ |
scope |
String |
X | "personal" |
enum: "school", "personal" |
isDefault |
Boolean |
X | false |
κΈ°λ³Έ μΊλ¦°λ μ¬λΆ (μμ λΆκ°) |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
1:1 μ±ν (direct) λ° κ·Έλ£Ή μ±ν (group)μ κ΄λ¦¬ν©λλ€.
νμΌ:
backend/src/models/ChatRoom.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
participants.user_1 |
INDEX |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
type |
String |
O | - | λ°© μ ν. enum: "direct", "group" |
name |
String |
X | - | λ°© μ΄λ¦ (κ·Έλ£Ή μ±ν μ©) |
creator |
ObjectId |
X | - | μμ±μ _id |
creatorId |
String |
X | - | μμ±μ μ¬μ©μ ID |
creatorName |
String |
X | - | μμ±μ μ΄λ¦ |
participants |
Array |
X | - | μ°Έκ°μ λͺ©λ‘ |
participants[].user |
ObjectId |
O | - | μ°Έκ°μ _id |
participants[].userId |
String |
O | - | μ°Έκ°μ μ¬μ©μ ID |
participants[].userName |
String |
O | - | μ°Έκ°μ μ΄λ¦ |
participants[].profile |
String |
X | - | νλ‘ν μ΄λ―Έμ§ URL |
participants[].joinedAt |
Date |
X | Date.now |
μ°Έκ° μκ° |
participants[].lastReadAt |
Date |
X | - | λ§μ§λ§ μ½μ μκ° |
lastMessage |
Object |
X | - | λ§μ§λ§ λ©μμ§ λ―Έλ¦¬λ³΄κΈ° |
lastMessage.content |
String |
X | - | λ©μμ§ λ΄μ© (μμ½) |
lastMessage.sender |
ObjectId |
X | - | λ°μ μ _id |
lastMessage.senderName |
String |
X | - | λ°μ μ μ΄λ¦ |
lastMessage.sentAt |
Date |
X | - | λ°μ μκ° |
isActive |
Boolean |
X | true |
νμ±ν μν |
settings |
Object |
X | - | λ°© μ€μ |
settings.allowInvites |
Boolean |
X | true |
μ΄λ νμ© μ¬λΆ |
settings.allowChat |
Boolean |
X | true |
μ±ν νμ© μ¬λΆ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
μ±ν λ°©μ κ°λ³ λ©μμ§λ₯Ό κ΄λ¦¬ν©λλ€.
νμΌ:
backend/src/models/ChatMessage.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
room_1 |
INDEX |
room_1, createdAt_-1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
room |
ObjectId |
O | - | μ±ν
λ°© _id |
sender |
ObjectId |
O | - | λ°μ μ _id |
senderId |
String |
O | - | λ°μ μ μ¬μ©μ ID |
senderName |
String |
O | - | λ°μ μ μ΄λ¦ |
content |
String |
O | - | λ©μμ§ λ΄μ© |
messageType |
String |
X | "text" |
λ©μμ§ μ ν. enum: "text", "image", "file", "system" |
attachment |
Object |
X | - | μ²¨λΆ νμΌ (image/file λ©μμ§μΈ κ²½μ°) |
attachment.url |
String |
X | - | νμΌ URL |
attachment.fileName |
String |
X | - | νμΌλͺ |
attachment.fileSize |
Number |
X | - | νμΌ ν¬κΈ° (bytes) |
attachment.mimeType |
String |
X | - | MIME νμ |
attachment.key |
String |
X | - | S3 ν€ |
readBy |
Array |
X | - | μ½μ μ¬μ©μ λͺ©λ‘ |
readBy[].user |
ObjectId |
X | - | μ¬μ©μ _id |
readBy[].readAt |
Date |
X | - | μ½μ μκ° |
isDeleted |
Boolean |
X | false |
μμ μ¬λΆ (soft delete) |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
μ±ν μμ 곡μ λ νμΌμ μ¬μ©μλ³λ‘ κ΄λ¦¬ν©λλ€.
νμΌ:
backend/src/models/ChatFile.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
user_1, createdAt_-1 |
COMPOUND |
user_1, fileType_1, createdAt_-1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
user |
ObjectId |
O | - | μμ μ _id |
userId |
String |
O | - | μμ μ μ¬μ©μ ID |
room |
ObjectId |
O | - | μ±ν
λ°© _id |
message |
ObjectId |
X | - | μ±ν
λ©μμ§ _id |
fileName |
String |
O | - | μλ³Έ νμΌλͺ |
fileSize |
Number |
O | - | νμΌ ν¬κΈ° (bytes) |
mimeType |
String |
O | - | MIME νμ |
key |
String |
O | - | S3 ν€ |
url |
String |
O | - | νμΌ URL |
fileType |
String |
O | - | νμΌ μ ν. enum: "image", "file" |
isDeleted |
Boolean |
X | false |
μμ μ¬λΆ (soft delete) |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
μ¬μ©μ 리λ§μΈλλ₯Ό κ΄λ¦¬ν©λλ€.
νμΌ:
backend/src/models/Reminder.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
user_1, completed_1, reminderTime_1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
user |
ObjectId |
O | - | μ¬μ©μ _id |
userId |
String |
O | - | μ¬μ©μ ID |
userName |
String |
O | - | μ¬μ©μ μ΄λ¦ |
title |
String |
O | - | 리λ§μΈλ μ λͺ© |
memo |
String |
X | "" |
λ©λͺ¨ |
reminderTime |
Date |
O | - | μλ¦Ό μκ° |
completed |
Boolean |
X | false |
μλ£ μ¬λΆ |
notified |
Boolean |
X | false |
μλ¦Ό λ°μ‘ μ¬λΆ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
μ¬μ©μλ³ ν λ§ μ€μ μ κ΄λ¦¬ν©λλ€.
νμΌ:
backend/src/models/ThemeSetting.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
user_1 |
UNIQUE |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
user |
ObjectId |
O | - | μ¬μ©μ _id |
userId |
String |
O | - | μ¬μ©μ ID |
userName |
String |
O | - | μ¬μ©μ μ΄λ¦ |
selectedTheme |
String |
X | "light" |
μ νλ ν
λ§. κ°λ₯ν κ°: "light", "dark", "high-contrast", "sepia", "system", "custom" |
colors |
Object |
X | (μλ μ°Έμ‘°) | μ¬μ©μ μ μ μμ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
| νλ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|
primaryColor |
"#313775" |
μ£Ό λΈλλ μμ |
backgroundColor |
"#ffffff" |
νμ΄μ§ λ°°κ²½μ |
componentColor |
"#f5f5f5" |
μ»΄ν¬λνΈ λ°°κ²½μ |
textColor |
"#000000" |
κΈ°λ³Έ ν μ€νΈ μμ |
accentColor |
"#007aff" |
κ°μ‘°/νμ΄λΌμ΄νΈ μμ |
successColor |
"#52c41a" |
μ±κ³΅ μν μμ |
errorColor |
"#ff4d4f" |
μ€λ₯ μν μμ |
μμ€ν μ λ±λ‘λ μ± λͺ©λ‘μ κ΄λ¦¬ν©λλ€.
νμΌ:
backend/src/models/Apps.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
title_1 |
UNIQUE |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
title |
String |
X | - | μ± μ λͺ© (κ³ μ ) |
description |
String |
X | - | μ± μ€λͺ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
μμ μκ°νμ κ°λ³ μκ° λΈλ‘μ λλ€. Syllabus, Enrollment λ±μμ μλΈ λνλ¨ΌνΈλ‘ μ¬μ©λ©λλ€.
νμΌ:
backend/src/models/TimeBlock.js
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
label |
String |
O | μκ° λΌλ²¨ (μ: "μ8", "μ3") |
day |
String |
X | μμΌ (μ: "μ", "ν", "μ", "λͺ©", "κΈ", "ν ", "μΌ") |
start |
String |
X | μμ μκ° (μ: "10:00") |
end |
String |
X | μ’ λ£ μκ° (μ: "11:00") |
μ°Έκ³ :
_idκ° μλ μλΈ λνλ¨ΌνΈμ λλ€ ({ _id: false }).
Alt Boardμ μμ λΉλλ‘, λ°μ΄ν° μμ§μ© Formμ κ΄λ¦¬ν©λλ€. Form μμ± μ μ°κ²°λ AltSheetκ° μλ μμ±λ©λλ€.
νμΌ:
backend/src/models/AltForm.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
board_1 |
INDEX |
board_1, createdAt_-1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
board |
ObjectId |
O | - | 보λ _id |
school |
ObjectId |
X | - | νκ΅ _id |
creator |
ObjectId |
X | - | μμ±μ _id |
creatorId |
String |
X | - | μμ±μ μ¬μ©μ ID |
creatorName |
String |
X | - | μμ±μ μ΄λ¦ |
title |
String |
O | - | μμ μ λͺ© |
description |
String |
X | "" |
μμ μ€λͺ |
fields |
Array |
X | [] |
νλ μ μ λ°°μ΄ |
fields[].label |
String |
O | - | νλλͺ |
fields[].type |
String |
O | - | νλ νμ (text, textarea, number, date, file, select, multiSelect, checkbox, radio, userSelect, approval, rating, scale, counter) |
fields[].permission |
String |
X | "respondent" |
respondent λλ owner |
fields[].visibleToRespondent |
Boolean |
X | false |
owner νλλ₯Ό μλ΅μμκ² κ³΅κ° |
fields[].required |
Boolean |
X | false |
νμ μ λ ₯ μ¬λΆ |
fields[].options |
[String] |
X | [] |
μ νμ§ (select/radio/checkboxμ©) |
fields[].validation |
Mixed |
X | - | νμ λ³ μ ν¨μ± κ²μ¬ κ·μΉ |
fields[].order |
Number |
X | - | νμ μμ |
settings |
Object |
X | - | Form μ€μ |
settings.openAt |
Date |
X | - | κ³΅κ° μμ μκ° |
settings.closeAt |
Date |
X | - | κ³΅κ° μ’ λ£ μκ° |
settings.allowResubmit |
Boolean |
X | false |
μ¬μ μΆ νμ© |
settings.allowMultipleResponses |
Boolean |
X | false |
볡μ μλ΅ νμ© |
settings.requiredMode |
Boolean |
X | false |
νμ μλ΅(λ―Έμ μΆ ν μΌ) |
settings.requiredResponseCount |
Number |
X | - | νμ+볡μμΌ λ λͺ©ν μ μΆ νμ |
settings.weekdaySchedule |
Object |
X | - | μμΌλ§λ€ νμ°¨ μ°½ (enabled, daysOfWeek 0=μΌβ¦6=ν , startTime/endTime HH:mm, Asia/Seoul). μ μ : requiredMode + allowMultipleResponses + openAt + closeAt |
settings.quizMode |
Boolean |
X | false |
ν΄μ¦ λͺ¨λ |
settings.shareResponses |
Boolean |
X | false |
μλ΅ κ³΅μ |
sheet |
ObjectId |
X | - | μ°κ²°λ AltSheet _id |
isActive |
Boolean |
X | true |
νμ±ν μν |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
AltFormμ 1:1λ‘ μ°κ²°λλ λ°μ΄ν° μνΈμ λλ€. Form μμ± μ μλ μμ±λ©λλ€.
νμΌ:
backend/src/models/AltSheet.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
form_1 |
UNIQUE |
board_1 |
INDEX |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
form |
ObjectId |
O | - | AltForm _id (1:1) |
board |
ObjectId |
X | - | 보λ _id |
school |
ObjectId |
X | - | νκ΅ _id |
name |
String |
X | - | μνΈ μ΄λ¦ (= Form μ λͺ©) |
isActive |
Boolean |
X | true |
νμ±ν μν |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
AltSheetμ κ°λ³ ν λ°μ΄ν°μ λλ€. Form μλ΅ μ μΆ μ λλ κ΅μ¬ μ§μ μ λ ₯μΌλ‘ μμ±λ©λλ€.
νμΌ:
backend/src/models/AltSheetRow.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
sheet_1, _respondent_1 |
COMPOUND |
sheet_1, createdAt_-1 |
COMPOUND |
form_1 |
INDEX |
form_1, createdAt_1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
sheet |
ObjectId |
O | - | AltSheet _id |
form |
ObjectId |
X | - | AltForm _id |
board |
ObjectId |
X | - | 보λ _id |
_respondent |
ObjectId |
X | - | μλ΅μ _id |
_respondentId |
String |
X | - | μλ΅μ μ¬μ©μ ID |
_respondentName |
String |
X | - | μλ΅μ μ΄λ¦ |
data |
Map<String, Mixed> |
X | - | νλ _id β κ° λ§€ν |
_submittedAt |
Date |
X | - | μλ΅ μκ° |
_updatedAt |
Date |
X | - | μμ μκ° |
isActive |
Boolean |
X | true |
νμ±ν μν |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
κ΄λ¦¬μ/μμ±μκ° μμ κΈ°λ‘(μνΈ)μ λ§μ§λ§μΌλ‘ μ° μκ°μ μ¬μ©μΒ·μμ λ¨μλ‘ μ μ₯ν©λλ€. λͺ©λ‘ APIμ unreadResponseCountλ μ΄ μκ° μ΄ν μμ±λ μλ΅ ν μμ
λλ€. κΈ°λ‘μ΄ μμΌλ©΄ unreadλ 0μ
λλ€.
νμΌ:
backend/src/models/AltSheetOpen.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
user_1, form_1 |
UNIQUE |
user_1, board_1 |
COMPOUND |
user_1 / form_1 / board_1 |
INDEX |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
user |
ObjectId |
O | - | μ΄λμ User _id |
form |
ObjectId |
O | - | AltForm _id |
board |
ObjectId |
O | - | Board _id |
lastOpenedAt |
Date |
O | Date.now |
λ§μ§λ§ κΈ°λ‘ μ΄λ μκ° |
λͺ©λ‘ λ©ν (
RAltForms, admin/writer):responseCount,unreadResponseCount(μ΄λ κΈ°μ€ μ΄ν μ κ· μλ΅ μ).
AI μ±ν (Alter)μ μΈμ μ 보λ₯Ό κ΄λ¦¬ν©λλ€. 보λλΉ νμ 1μΈ 1μΈμ ꡬ쑰μ λλ€.
νμΌ:
backend/src/models/AIChatSession.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
board_1, student_1 |
UNIQUE, COMPOUND |
board_1, lastMessageAt_-1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
board |
ObjectId |
O | - | 보λ _id |
student |
ObjectId |
O | - | νμ _id |
studentId |
String |
O | - | νμ μ¬μ©μ ID |
studentName |
String |
O | - | νμ μ΄λ¦ |
isActive |
Boolean |
X | true |
μΈμ νμ± μ¬λΆ |
lastMessageAt |
Date |
X | - | λ§μ§λ§ λ©μμ§ μκ° |
lastMessagePreview |
String |
X | - | λ§μ§λ§ λ©μμ§ λ―Έλ¦¬λ³΄κΈ° |
messageCount |
Number |
X | 0 |
λ©μμ§ μ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
AI μ±ν μΈμ μ κ°λ³ λ©μμ§μ λλ€. νμ, AI, κ΅μ¬ 3κ°μ§ λ°μ μ μ νμ μ§μν©λλ€.
νμΌ:
backend/src/models/AIChatMessage.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
session_1, createdAt_-1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
session |
ObjectId |
O | - | AIChatSession _id |
board |
ObjectId |
O | - | 보λ _id |
senderType |
String |
O | - | λ°μ μ μ ν. enum: "student", "ai", "teacher" |
sender |
ObjectId |
X | null |
λ°μ μ _id (AIμΈ κ²½μ° null) |
senderId |
String |
X | null |
λ°μ μ μ¬μ©μ ID |
senderName |
String |
O | - | λ°μ μ μ΄λ¦ |
content |
String |
O | - | λ©μμ§ λ΄μ© |
tokenUsage |
Object |
X | - | ν ν° μ¬μ©λ (AI μλ΅ μ) |
tokenUsage.promptTokens |
Number |
X | - | ν둬ννΈ ν ν° μ |
tokenUsage.candidatesTokens |
Number |
X | - | μλ΅ ν ν° μ |
tokenUsage.totalTokens |
Number |
X | - | μ΄ ν ν° μ |
isDeleted |
Boolean |
X | false |
μννΈ μμ μ¬λΆ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
μ°Έκ³ :
tokenUsageλ_idκ° μλ μλΈ λνλ¨ΌνΈμ λλ€ ({ _id: false }).
AI κΈ°λ₯ μ¬μ©λμ μΆμ νλ λ‘κ·Έμ λλ€. μμ²λ³ ν ν° μ¬μ©λμ κΈ°λ‘ν©λλ€.
νμΌ:
backend/src/models/AIUsageLog.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
createdAt_1 |
INDEX |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
user |
ObjectId |
O | - | μ¬μ©μ _id |
userId |
String |
O | - | μ¬μ©μ ID |
userName |
String |
O | - | μ¬μ©μ μ΄λ¦ |
provider |
String |
X | "unknown" |
AI μ 곡μ (openai / anthropic / gemini) |
model |
String |
O | - | AI λͺ¨λΈλͺ |
feature |
String |
X | "unknown" |
κΈ°λ₯ (syllabus / chat λ±) |
success |
Boolean |
X | true |
νΈμΆ μ±κ³΅ μ¬λΆ |
errorCode |
String |
X | - | μ€ν¨ μ μλ¬ μ½λ |
promptTokens |
Number |
X | 0 |
ν둬ννΈ ν ν° μ |
candidatesTokens |
Number |
X | 0 |
μλ΅ ν ν° μ |
thoughtsTokens |
Number |
X | 0 |
μ¬κ³ ν ν° μ |
totalTokens |
Number |
X | 0 |
μ΄ ν ν° μ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
μ¬μ©μμ 보λ μ¦κ²¨μ°ΎκΈ° μ 보μ λλ€. μ¬μ©μλΉ λ³΄λ 1κ°μ μ¦κ²¨μ°ΎκΈ°λ₯Ό 보μ₯ν©λλ€.
νμΌ:
backend/src/models/BoardFavorite.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
user_1, school_1 |
COMPOUND |
user_1, board_1 |
UNIQUE, COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
user |
ObjectId |
O | - | μ¬μ©μ _id |
board |
ObjectId |
O | - | 보λ _id |
school |
ObjectId |
O | - | νκ΅ _id |
order |
Number |
X | 0 |
μ λ ¬ μμ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
κ²μκΈμ 첨λΆλ μ€λ¬Έμ κ°λ³ μλ΅μ λλ€. μ€λ¬ΈλΉ μλ΅μ 1μΈ 1μλ΅μ 보μ₯ν©λλ€.
νμΌ:
backend/src/models/SurveyResponse.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
post_1 |
INDEX |
post_1, surveyId_1, respondent_1 |
UNIQUE, COMPOUND |
post_1, surveyId_1, createdAt_-1 |
COMPOUND |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
post |
ObjectId |
O | - | κ²μκΈ _id |
surveyId |
ObjectId |
O | - | μ€λ¬Έ _id |
respondent |
ObjectId |
O | - | μλ΅μ _id |
respondentId |
String |
O | - | μλ΅μ μ¬μ©μ ID |
respondentName |
String |
O | - | μλ΅μ μ΄λ¦ |
answers |
Array |
O | - | λ΅λ³ λ°°μ΄ |
answers[].questionId |
String |
O | - | μ§λ¬Έ ID |
answers[].value |
Mixed |
X | - | λ΅λ³ κ° |
answers[].files |
Array |
X | [] |
μ²¨λΆ νμΌ λͺ©λ‘ |
answers[].files[].fileName |
String |
X | - | νμΌ μ΄λ¦ |
answers[].files[].fileSize |
Number |
X | - | νμΌ ν¬κΈ° (bytes) |
answers[].files[].mimeType |
String |
X | - | MIME νμ |
answers[].files[].key |
String |
X | - | S3 ν€ |
createdAt |
Date |
μλ | - | μμ± μκ° |
updatedAt |
Date |
μλ | - | μμ μκ° |
μ°Έκ³ :
answers[]λ°answers[].files[]λ_idκ° μλ μλΈ λνλ¨ΌνΈμ λλ€ ({ _id: false }).
μΌλ³ API μμ² ν΅κ³λ₯Ό μ§κ³νλ λͺ¨λΈμ λλ€. λ μ§λ³ 1κ°μ λ¬Έμλ‘ κ΄λ¦¬λ©λλ€.
νμΌ:
backend/src/models/RequestStat.jsDB: μμΉ΄λ°λ―Έ λ°μ΄ν°λ² μ΄μ€
| μΈλ±μ€ | μμ± |
|---|---|
_id |
UNIQUE |
date_1 |
UNIQUE |
| νλ | νμ | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|---|
_id |
ObjectId |
μλ | - | MongoDB κΈ°λ³Έ ν€ |
date |
String |
O | - | λ μ§ μλ³μ (YYYY-MM-DD) |
requests |
Number |
X | 0 |
μ΄ μμ² μ |
totalResponseTime |
Number |
X | 0 |
μλ΅ μκ° ν©κ³ (ms) |
dataIn |
Number |
X | 0 |
μμ λ°μ΄ν°λ (bytes) |
dataOut |
Number |
X | 0 |
μ‘μ λ°μ΄ν°λ (bytes) |
uniqueUsers |
[String] |
X | [] |
κ³ μ μ¬μ©μ ID λͺ©λ‘ |
Academy (λ£¨νΈ DB)
|
+-- [μμΉ΄λ°λ―Έ DB]
|
+-- User
| |
| +-- schools[] --> School
|
+-- School
| |
| +-- formArchive[]
| +-- deletedFormArchive[]
| +-- links[]
|
+-- Season
| |
| +-- school --> School
| +-- subjects, classrooms, formEvaluation
| +-- permissionSyllabusV2, permissionEnrollmentV2, permissionEvaluationV2
| +-- aiSettings
|
+-- Registration
| |
| +-- season --> Season
| +-- user --> User
| +-- teacher --> User (λ΄λΉ κ΅μ¬)
|
+-- Syllabus
| |
| +-- season --> Season
| +-- user --> User (κ°μ€μ)
| +-- teachers[] --> User
| +-- time[] (TimeBlock)
|
+-- Enrollment
| |
| +-- syllabus --> Syllabus
| +-- student --> User
| +-- evaluation (μνΈν)
|
+-- Archive
| |
| +-- user --> User
| +-- school --> School
| +-- data (μνΈν)
|
+-- Board --> Post --> Comment
| |
| +-- AltForm --> AltSheet --> AltSheetRow
| | +-- AltSheetOpen (userλ³ μ΄λ)
| +-- BoardFavorite
| +-- SurveyResponse (via Post)
|
+-- AIChatSession --> AIChatMessage
+-- AIUsageLog
|
+-- Notification, NotificationSetting
|
+-- CalendarEvent, UserCalendar
|
+-- ChatRoom --> ChatMessage, ChatFile
|
+-- Reminder, ThemeSetting, Form, Apps
|
+-- RequestStat