μμ κ΄λ ¨ APIλ μΈ κ°μ§ 리μμ€λ‘ ꡬμ±λ©λλ€:
- κ°μκ³νμ(Syllabus): μμ κ°μ€ μ 보 (μ λͺ©, μκ°, κ΅κ³Όλͺ©, λ©ν λ±)
- μκ°(Enrollment): νμμ μκ°μ μ² λ° νκ° μ 보
- νκΈ° λ±λ‘(Registration): μ¬μ©μμ νκΈ°λ³ μν (νμ/κ΅μ¬) λ±λ‘
μ΄ μΈ λ¦¬μμ€κ° μ κΈ°μ μΌλ‘ μ°κ²°λμ΄ μμ μ μ 체 μμ μ£ΌκΈ°λ₯Ό κ΄λ¦¬ν©λλ€.
λΌμ°νΈ νμΌ:
backend/src/routes/syllabuses.js컨νΈλ‘€λ¬ νμΌ:backend/src/controllers/syllabuses.jsλͺ¨λΈ νμΌ:backend/src/models/Syllabus.js
| λ©μλ | κ²½λ‘ | μ€λͺ | κΆν |
|---|---|---|---|
POST |
/api/syllabuses |
κ°μκ³νμ μμ± | isLoggedIn |
GET |
/api/syllabuses/:_id? |
κ°μκ³νμ μ‘°ν (λͺ©λ‘/μμΈ) | isLoggedIn |
POST |
/api/syllabuses/:_id/confirmed |
μμ μΉμΈ | isLoggedIn |
DELETE |
/api/syllabuses/:_id/confirmed |
μμ μΉμΈ μ·¨μ | isLoggedIn |
PUT |
/api/syllabuses/:_id |
κ°μκ³νμ μμ | isLoggedIn |
PUT |
/api/syllabuses/:_id/subject |
κ΅κ³Όλͺ© μμ | isLoggedIn |
PUT |
/api/syllabuses/:_id/cover-image |
μ»€λ² μ΄λ―Έμ§ μ€μ | isLoggedIn |
DELETE |
/api/syllabuses/:_id/cover-image |
μ»€λ² μ΄λ―Έμ§ μμ | isLoggedIn |
PUT |
/api/syllabuses/:_id/hide |
μΊλ¦°λ μ¨κΉ | isLoggedIn |
PUT |
/api/syllabuses/:_id/show |
μΊλ¦°λ νμ | isLoggedIn |
DELETE |
/api/syllabuses/:_id |
κ°μκ³νμ μμ | isLoggedIn |
κ΅μ¬(λ©ν )κ° μμ
μ κ°μ€ν©λλ€. νκΈ°μ permissionSyllabusV2 κΆν μ€μ μ λ°λΌ κ°μ€ κ°λ₯ μ¬λΆκ° κ²°μ λ©λλ€.
POST /api/syllabuses
κΆν: isLoggedIn (νκΈ° κΆνμ λ°λΌ μΆκ° μ ν)
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
season |
string |
O | νκΈ° ObjectId |
classTitle |
string |
O | μμ μ λͺ© |
time |
object[] |
X | μμ μκ° λ°°μ΄ |
time[].label |
string |
O | μκ° λΌλ²¨ (μ: "μ8") |
time[].day |
string |
O | μμΌ (μ, ν, μ, λͺ©, κΈ, ν , μΌ) |
time[].start |
string |
O | μμ μκ° (μ: "10:00") |
time[].end |
string |
O | μ’ λ£ μκ° (μ: "11:00") |
classroom |
string |
X | κ°μμ€ |
subject |
string[] |
X | κ΅κ³Όλͺ© λΆλ₯ λ°°μ΄ (μ: ["μν", "λ―Έμ λΆ"]) |
point |
number |
X | νμ (κΈ°λ³Έκ°: 0) |
limit |
number |
X | μκ° μ μ (0μ΄λ©΄ 무μ ν, κΈ°λ³Έκ°: 0) |
teachers |
object[] |
O | λ©ν λͺ©λ‘ (μ΅μ 1λͺ ) |
teachers[]._id |
string |
O | κ΅μ¬ ObjectId |
teachers[].userId |
string |
O | κ΅μ¬ μ¬μ©μ ID |
teachers[].userName |
string |
O | κ΅μ¬ μ΄λ¦ |
info |
object |
X | μΈλΆ μ 보 (μλν° λ°μ΄ν°) |
{
"season": "507f1f77bcf86cd799439021",
"classTitle": "λ―Έμ λΆ κΈ°μ΄λ°",
"time": [
{ "label": "μ3", "day": "μ", "start": "10:00", "end": "10:50" },
{ "label": "μ3", "day": "μ", "start": "10:00", "end": "10:50" }
],
"classroom": "101νΈ",
"subject": ["μν", "λ―Έμ λΆ"],
"point": 2,
"limit": 30,
"teachers": [
{
"_id": "507f1f77bcf86cd799439011",
"userId": "teacher01",
"userName": "κΉκ΅μ¬"
}
]
}{
"syllabus": {
"_id": "507f1f77bcf86cd799439031",
"season": "507f1f77bcf86cd799439021",
"school": "507f1f77bcf86cd799439011",
"schoolId": "highschool01",
"schoolName": "ν
μ€νΈ κ³ λ±νκ΅",
"year": "2024νλ
λ",
"term": "1νκΈ°",
"user": "507f1f77bcf86cd799439011",
"userId": "teacher01",
"userName": "κΉκ΅μ¬",
"classTitle": "λ―Έμ λΆ κΈ°μ΄λ°",
"time": [
{ "label": "μ3", "day": "μ", "start": "10:00", "end": "10:50" },
{ "label": "μ3", "day": "μ", "start": "10:00", "end": "10:50" }
],
"classroom": "101νΈ",
"subject": ["μν", "λ―Έμ λΆ"],
"point": 2,
"limit": 30,
"count": 0,
"teachers": [
{
"_id": "507f1f77bcf86cd799439011",
"userId": "teacher01",
"userName": "κΉκ΅μ¬",
"confirmed": false,
"isHiddenFromCalendar": false
}
]
}
}μ°Έκ³ :
timeλ°°μ΄μ μ μ₯ μ μμΌ+μμμκ° μμΌλ‘ μλ μ λ ¬λ©λλ€. μμΌ μμ: μ(0) ~ μΌ(6).
GET /api/syllabuses/:_id?
κΆν: isLoggedIn
| νλΌλ―Έν° | νμ | νμ | μ€λͺ |
|---|---|---|---|
season |
string |
X | νκΈ° ObjectIdλ‘ νν°λ§ |
school |
string |
X | νκ΅ ObjectIdλ‘ νν°λ§ |
user |
string |
X | κ°μ€μ ObjectIdλ‘ νν°λ§ |
{
"syllabuses": [
{
"_id": "...",
"classTitle": "λ―Έμ λΆ κΈ°μ΄λ°",
"subject": ["μν", "λ―Έμ λΆ"],
"time": [...],
"classroom": "101νΈ",
"count": 15,
"limit": 30,
"teachers": [...]
}
]
}λ©ν (κ΅μ¬)κ° μμ μ΄ ν¬ν¨λ μμ μ μΉμΈν©λλ€.
POST /api/syllabuses/:_id/confirmed
DELETE /api/syllabuses/:_id/confirmed
PUT /api/syllabuses/:_id
κΆν: isLoggedIn
μμ± μμ λμΌν νλλ₯Ό μμ κ°λ₯ν©λλ€ (classTitle, time, classroom, subject, point, limit, teachers, info λ±).
PUT /api/syllabuses/:_id/subject
κΆν: isLoggedIn
PUT /api/syllabuses/:_id/cover-image
DELETE /api/syllabuses/:_id/cover-image
λ©ν κ° μμ μ μΊλ¦°λμμ ν΄λΉ μμ μ νμ μ¬λΆλ₯Ό μ€μ ν©λλ€.
PUT /api/syllabuses/:_id/hide
PUT /api/syllabuses/:_id/show
DELETE /api/syllabuses/:_id
κΆν: isLoggedIn
μ£Όμ: μκ°μμ΄ μλ μμ μ μμ νλ©΄ ν΄λΉ μκ°(Enrollment) λ°μ΄ν°λ ν¨κ» μμ λ©λλ€.
λΌμ°νΈ νμΌ:
backend/src/routes/enrollments.js컨νΈλ‘€λ¬ νμΌ:backend/src/controllers/enrollments.jsλͺ¨λΈ νμΌ:backend/src/models/Enrollment.js
| λ©μλ | κ²½λ‘ | μ€λͺ | κΆν |
|---|---|---|---|
POST |
/api/enrollments |
μκ°μ μ² | isLoggedIn |
GET |
/api/enrollments/:_id? |
μκ° μ‘°ν (λͺ©λ‘/μμΈ) | isLoggedIn |
GET |
/api/enrollments/evaluation |
νκ° λ°μ΄ν° μ‘°ν | isLoggedIn |
PUT |
/api/enrollments/:_id/evaluation |
νκ° μ λ ₯ | isLoggedIn |
PUT |
/api/enrollments/:_id/memo |
λ©λͺ¨ μμ | isLoggedIn |
PUT |
/api/enrollments/:_id/hide |
μΊλ¦°λ μ¨κΉ | isLoggedIn |
PUT |
/api/enrollments/:_id/show |
μΊλ¦°λ νμ | isLoggedIn |
DELETE |
/api/enrollments/:_id |
μκ° μ·¨μ | isLoggedIn |
νμμ΄ μμ
μ μκ°μ μ²ν©λλ€. νκΈ°μ permissionEnrollmentV2 κΆν μ€μ μ λ°λΌ μ μ² κ°λ₯ μ¬λΆκ° κ²°μ λ©λλ€.
POST /api/enrollments
κΆν: isLoggedIn (νκΈ° κΆνμ λ°λΌ μΆκ° μ ν)
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
syllabus |
string |
O | κ°μκ³νμ ObjectId |
student |
string |
O | νμ(μ¬μ©μ) ObjectId |
studentId |
string |
O | νμ μ¬μ©μ ID |
studentName |
string |
O | νμ μ΄λ¦ |
{
"syllabus": "507f1f77bcf86cd799439031",
"student": "507f1f77bcf86cd799439041",
"studentId": "student01",
"studentName": "μ΄νμ"
}{
"enrollment": {
"_id": "507f1f77bcf86cd799439051",
"syllabus": "507f1f77bcf86cd799439031",
"season": "507f1f77bcf86cd799439021",
"school": "507f1f77bcf86cd799439011",
"year": "2024νλ
λ",
"term": "1νκΈ°",
"classTitle": "λ―Έμ λΆ κΈ°μ΄λ°",
"time": [...],
"classroom": "101νΈ",
"subject": ["μν", "λ―Έμ λΆ"],
"teachers": [...],
"student": "507f1f77bcf86cd799439041",
"studentId": "student01",
"studentName": "μ΄νμ",
"studentGrade": "2",
"memo": "",
"isHiddenFromCalendar": false
}
}| μν μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
400 |
FIELD_REQUIRED(...) |
νμ νλ λλ½ |
409 |
μ€λ³΅ μΈλ±μ€ μλ¬ | μ΄λ―Έ μκ°μ μ²ν μμ |
409 |
ENROLLMENT_LIMIT_EXCEEDED |
μκ° μ μ μ΄κ³Ό |
409 |
TIME_OVERLAPPED |
μκ°ν μΆ©λ |
μ°Έκ³ : μκ°μ μ² μ κ°μκ³νμμ
countκ° μλμΌλ‘ 1 μ¦κ°ν©λλ€.
GET /api/enrollments/:_id?
κΆν: isLoggedIn
| νλΌλ―Έν° | νμ | νμ | μ€λͺ |
|---|---|---|---|
season |
string |
X | νκΈ° ObjectId |
syllabus |
string |
X | κ°μκ³νμ ObjectId |
student |
string |
X | νμ ObjectId |
{
"enrollments": [
{
"_id": "...",
"classTitle": "λ―Έμ λΆ κΈ°μ΄λ°",
"studentId": "student01",
"studentName": "μ΄νμ",
"time": [...],
"classroom": "101νΈ"
}
]
}μ°Έκ³ : μΌλ° μ‘°ν μ
evaluationνλλ μνΈνλμ΄ μμ΄ μλ΅μ ν¬ν¨λμ§ μμ΅λλ€.
μκ° λͺ©λ‘κ³Ό ν¨κ» 볡νΈνλ νκ° λ°μ΄ν°λ₯Ό μ‘°νν©λλ€.
GET /api/enrollments/evaluation
κΆν: isLoggedIn
| νλΌλ―Έν° | νμ | νμ | μ€λͺ |
|---|---|---|---|
syllabus |
string |
X | κ°μκ³νμ ObjectId |
student |
string |
X | νμ ObjectId |
season |
string |
X | νκΈ° ObjectId |
{
"enrollments": [
{
"_id": "...",
"classTitle": "λ―Έμ λΆ κΈ°μ΄λ°",
"studentId": "student01",
"studentName": "μ΄νμ",
"evaluation": {
"λ©ν νκ°": "μμ
μ°Έμ¬λκ° λκ³ μ±μ€ν©λλ€.",
"μκΈ°νκ°": "λ―Έμ λΆ κ°λ
μ μ μ΄ν΄νμ΅λλ€.",
"μΆμλ±κΈ": "A"
}
}
]
}νμ λλ κ΅μ¬κ° νκ°λ₯Ό μ
λ ₯ν©λλ€. νκΈ°μ permissionEvaluationV2 κΆν μ€μ κ³Ό νκ° νλͺ©μ authOptionμ λ°λΌ μ
λ ₯ κΆνμ΄ κ²°μ λ©λλ€.
PUT /api/enrollments/:_id/evaluation
κΆν: isLoggedIn (νκ° νλͺ©λ³ κΆνμ λ°λΌ μΆκ° μ ν)
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
evaluation |
object |
O | νκ° λ°μ΄ν° (ν€: νκ° νλͺ© λΌλ²¨, κ°: μ λ ₯κ°) |
{
"evaluation": {
"λ©ν νκ°": "μμ
μ°Έμ¬λκ° λκ³ μ±μ€ν©λλ€.",
"μΆμλ±κΈ": "A"
}
}μ°Έκ³ :
evaluationλ°μ΄ν°λmongoose-encryptionμΌλ‘ μνΈνλμ΄ MongoDBμ μ μ₯λ©λλ€.
PUT /api/enrollments/:_id/memo
κΆν: isLoggedIn
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
memo |
string |
O | λ©λͺ¨ λ΄μ© |
μκ° μΌμ μ μΊλ¦°λ νμ μ¬λΆλ₯Ό μ€μ ν©λλ€.
PUT /api/enrollments/:_id/hide
PUT /api/enrollments/:_id/show
DELETE /api/enrollments/:_id
κΆν: isLoggedIn
μ°Έκ³ : μκ° μ·¨μ μ κ°μκ³νμμ
countκ° μλμΌλ‘ 1 κ°μν©λλ€.
λΌμ°νΈ νμΌ:
backend/src/routes/registrations.js컨νΈλ‘€λ¬ νμΌ:backend/src/controllers/registrations.jsλͺ¨λΈ νμΌ:backend/src/models/Registration.js
| λ©μλ | κ²½λ‘ | μ€λͺ | κΆν |
|---|---|---|---|
POST |
/api/registrations |
νκΈ° λ±λ‘ | admin|manager |
POST |
/api/registrations/copy |
νκΈ° λ³΅μ¬ λ±λ‘ | admin|manager |
GET |
/api/registrations/:_id? |
λ±λ‘ μ‘°ν (λͺ©λ‘/μμΈ) | isLoggedIn |
PUT |
/api/registrations/:_id |
λ±λ‘ μμ | admin|manager |
DELETE |
/api/registrations/:_id |
λ±λ‘ μμ | admin|manager |
μ¬μ©μλ₯Ό νΉμ νκΈ°μ νμ λλ κ΅μ¬λ‘ λ±λ‘ν©λλ€.
POST /api/registrations
κΆν: admin λλ manager
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
season |
string |
O | νκΈ° ObjectId |
user |
string |
O | μ¬μ©μ ObjectId |
userId |
string |
O | μ¬μ©μ ID |
userName |
string |
O | μ¬μ©μ μ΄λ¦ |
role |
string |
O | μν ("student" λλ "teacher") |
grade |
string |
X | νλ (νμμΈ κ²½μ°) |
group |
string |
X | κ·Έλ£Ή |
teacher |
string |
X | λ΄λΉ κ΅μ¬ ObjectId (νμμΈ κ²½μ°) |
{
"season": "507f1f77bcf86cd799439021",
"user": "507f1f77bcf86cd799439041",
"userId": "student01",
"userName": "μ΄νμ",
"role": "student",
"grade": "2"
}{
"registration": {
"_id": "507f1f77bcf86cd799439061",
"season": "507f1f77bcf86cd799439021",
"school": "507f1f77bcf86cd799439011",
"schoolId": "highschool01",
"schoolName": "ν
μ€νΈ κ³ λ±νκ΅",
"year": "2024νλ
λ",
"term": "1νκΈ°",
"period": { "start": "2024-03-04", "end": "2024-07-19" },
"user": "507f1f77bcf86cd799439041",
"userId": "student01",
"userName": "μ΄νμ",
"role": "student",
"grade": "2",
"isActivated": true,
"permissionSyllabusV2": false,
"permissionEnrollmentV2": true,
"permissionEvaluationV2": false,
"formEvaluation": [...]
}
}| μν μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
409 |
μ€λ³΅ μΈλ±μ€ μλ¬ | λμΌ νκΈ°μ μ΄λ―Έ λ±λ‘λ¨ (season + user κ³ μ ) |
μ΄μ νκΈ°μ λ±λ‘ μ 보λ₯Ό μ νκΈ°λ‘ λ³΅μ¬ν©λλ€.
POST /api/registrations/copy
κΆν: admin λλ manager
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
fromSeason |
string |
O | μλ³Έ νκΈ° ObjectId |
toSeason |
string |
O | λμ νκΈ° ObjectId |
GET /api/registrations/:_id?
κΆν: isLoggedIn
| νλΌλ―Έν° | νμ | νμ | μ€λͺ |
|---|---|---|---|
season |
string |
X | νκΈ° ObjectId |
user |
string |
X | μ¬μ©μ ObjectId |
school |
string |
X | νκ΅ ObjectId |
role |
string |
X | μν νν° (student, teacher) |
{
"registrations": [
{
"_id": "...",
"userId": "student01",
"userName": "μ΄νμ",
"role": "student",
"grade": "2",
"year": "2024νλ
λ",
"term": "1νκΈ°",
"isActivated": true
}
]
}PUT /api/registrations/:_id
κΆν: admin λλ manager
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
role |
string |
X | μν λ³κ²½ |
grade |
string |
X | νλ λ³κ²½ |
group |
string |
X | κ·Έλ£Ή λ³κ²½ |
teacher |
string |
X | λ΄λΉ κ΅μ¬ λ³κ²½ |
DELETE /api/registrations/:_id
κΆν: admin λλ manager
μ£Όμ: λ±λ‘ μμ μ ν΄λΉ λ±λ‘μ μ°κ²°λ μκ°(Enrollment) λ°μ΄ν°κ° μν₯μ λ°μ μ μμ΅λλ€.
| ν¨μλͺ | λ©μλ | κ²½λ‘ | μ€λͺ |
|---|---|---|---|
CSyllabus |
POST | /api/syllabuses |
κ°μκ³νμ μμ± |
RSyllabuses |
GET | /api/syllabuses |
κ°μκ³νμ λͺ©λ‘ |
RSyllabus |
GET | /api/syllabuses/:_id |
κ°μκ³νμ μμΈ |
USyllabus |
PUT | /api/syllabuses/:_id |
κ°μκ³νμ μμ |
CConfirmSyllabus |
POST | /api/syllabuses/:_id/confirmed |
μμ μΉμΈ |
DCancelConfirmSyllabus |
DELETE | /api/syllabuses/:_id/confirmed |
μμ μΉμΈ μ·¨μ |
DSyllabus |
DELETE | /api/syllabuses/:_id |
κ°μκ³νμ μμ |
| ν¨μλͺ | λ©μλ | κ²½λ‘ | μ€λͺ |
|---|---|---|---|
CEnrollment |
POST | /api/enrollments |
μκ°μ μ² |
REnrollments |
GET | /api/enrollments |
μκ° λͺ©λ‘ |
REnrollment |
GET | /api/enrollments/:_id |
μκ° μμΈ |
REnrollmentEvaluation |
GET | /api/enrollments/evaluation |
νκ° λ°μ΄ν° μ‘°ν |
UEvaluation |
PUT | /api/enrollments/:_id/evaluation |
νκ° μ λ ₯ |
UEnrollmentMemo |
PUT | /api/enrollments/:_id/memo |
λ©λͺ¨ μμ |
DEnrollment |
DELETE | /api/enrollments/:_id |
μκ° μ·¨μ |
| ν¨μλͺ | λ©μλ | κ²½λ‘ | μ€λͺ |
|---|---|---|---|
CRegistration |
POST | /api/registrations |
νκΈ° λ±λ‘ |
CRegistrationCopy |
POST | /api/registrations/copy |
νκΈ° λ³΅μ¬ λ±λ‘ |
RRegistrations |
GET | /api/registrations |
λ±λ‘ λͺ©λ‘ |
RRegistration |
GET | /api/registrations/:_id |
λ±λ‘ μμΈ |
URegistration |
PUT | /api/registrations/:_id |
λ±λ‘ μμ |
DRegistration |
DELETE | /api/registrations/:_id |
λ±λ‘ μμ |