์์(Form) API์
๋๋ค. ๊ฐ์๊ณํ์, ์๊ฐํ, ์ถ๋ ฅ๋ฌผ ๋ฑ์ ์์์ ๊ด๋ฆฌํฉ๋๋ค. ์์์ ์์ฑ, ๋ณต์ฌ, ๋ณด๊ด, ๋ณต์, ์ด๋ ๊ถํ ์ค์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ผ์ฐํธ ํ์ผ : backend/src/routes/forms.js
์ปจํธ๋กค๋ฌ ํ์ผ : backend/src/controllers/forms.js
๋ชจ๋ธ ํ์ผ : backend/src/models/Form.js
๋ฉ์๋
๊ฒฝ๋ก
์ค๋ช
๊ถํ
POST
/api/forms
์์ ์์ฑ
admin|manager
POST
/api/forms/:_id/copy
์์ ๋ณต์ฌ
admin|manager
GET
/api/forms
์์ ๋ชฉ๋ก ์กฐํ
isLoggedIn
GET
/api/forms/:_id
์์ ์์ธ ์กฐํ
isLoggedIn
PUT
/api/forms/:_id
์์ ์์
admin|manager
PUT
/api/forms/:_id/archive
์์ ๋ณด๊ด
admin|manager
PUT
/api/forms/:_id/restore
์์ ๋ณต์
admin|manager
DELETE
/api/forms/:_id
์์ ์ญ์
admin|manager
PUT
/api/forms/:_id/permission
์ด๋ ๊ถํ ์์
admin|manager
POST
/api/forms/:_id/permission/exceptions
์ด๋ ๊ถํ ์์ธ ์ถ๊ฐ
admin|manager
DELETE
/api/forms/:_id/permission/exceptions
์ด๋ ๊ถํ ์์ธ ์ญ์
admin|manager
ํ๋
ํ์
๊ธฐ๋ณธ๊ฐ
์ค๋ช
_id
ObjectId
์๋์์ฑ
์์ ๊ณ ์ ID
userId
string
-
์์ฑ์ ์ฌ์ฉ์ ID
userName
string
-
์์ฑ์ ์ด๋ฆ
type
string
-
์์ ์ ํ ("syllabus", "timetable", "print")
title
string
-
์์ ์ ๋ชฉ
data
object[]
-
์์ ๋ฐ์ดํฐ (์๋ํฐ์ ์ํด ์ค์ )
archived
boolean
false
๋ณด๊ด ์ฒ๋ฆฌ ์ฌ๋ถ
permissionView
object
{ teacher: true, student: false, exceptions: [] }
์ด๋ ๊ถํ ์ค์
createdAt
Date
์๋์์ฑ
์์ฑ์ผ์
updatedAt
Date
์๋์์ฑ
์์ ์ผ์
ํ๋
ํ์
๊ธฐ๋ณธ๊ฐ
์ค๋ช
teacher
boolean
true
๊ต์ฌ ์ด๋ ํ์ฉ ์ฌ๋ถ
student
boolean
false
ํ์ ์ด๋ ํ์ฉ ์ฌ๋ถ
exceptions
object[]
[]
์ฌ์ฉ์๋ณ ์์ธ ๋ชฉ๋ก
permissionView.exceptions[]
ํ๋
ํ์
์ค๋ช
user
ObjectId
์ฌ์ฉ์ _id
userId
string
์ฌ์ฉ์ ID
userName
string
์ฌ์ฉ์ ์ด๋ฆ
isAllowed
boolean
์ด๋ ํ์ฉ ์ฌ๋ถ
์ด๋ ๊ถํ ํ์ ๋ก์ง
admin ๋๋ manager๋ ํญ์ ์ด๋ ๊ฐ๋ฅ
permissionView.exceptions์ ํด๋น ์ฌ์ฉ์๊ฐ ์์ผ๋ฉด isAllowed ๊ฐ ์ ์ฉ
์ฌ์ฉ์์ ์ญํ (teacher/student)์ ๋ํ permissionView ์ค์ ๊ฐ ์ ์ฉ
์ ์กฐ๊ฑด์ ํด๋นํ์ง ์์ผ๋ฉด ์ด๋ ๋ถ๊ฐ
์๋ก์ด ์์์ ์์ฑํฉ๋๋ค. ๋์ผ ์ ํ(type) ๋ด์์ ์ ๋ชฉ์ด ์ค๋ณต๋๋ฉด 409 ์๋ฌ๋ฅผ ๋ฐํํฉ๋๋ค.
๊ถํ : admin ๋๋ manager
ํ๋
ํ์
ํ์
์ค๋ช
type
string
O
์์ ์ ํ ("syllabus", "timetable", "print")
title
string
O
์์ ์ ๋ชฉ
data
object[]
O
์์ ๋ฐ์ดํฐ ๋ฐฐ์ด
{
"type" : " syllabus" ,
"title" : " 2024ํ๋
๋ ๊ฐ์๊ณํ์" ,
"data" : [
{
"label" : " ๊ต๊ณผ๋ชฉ๋ช
" ,
"type" : " input"
},
{
"label" : " ๋ด๋น๊ต์ฌ" ,
"type" : " input"
}
]
}
{
"form" : {
"_id" : " 507f1f77bcf86cd799439011" ,
"type" : " syllabus" ,
"title" : " 2024ํ๋
๋ ๊ฐ์๊ณํ์" ,
"data" : [
{
"label" : " ๊ต๊ณผ๋ชฉ๋ช
" ,
"type" : " input"
},
{
"label" : " ๋ด๋น๊ต์ฌ" ,
"type" : " input"
}
],
"userId" : " admin01" ,
"userName" : " ๊ด๋ฆฌ์" ,
"archived" : false ,
"permissionView" : {
"teacher" : true ,
"student" : false ,
"exceptions" : []
},
"createdAt" : " 2024-03-01T09:00:00.000Z" ,
"updatedAt" : " 2024-03-01T09:00:00.000Z"
}
}
์ํ ์ฝ๋
๋ฉ์์ง
์ค๋ช
400
FIELD_REQUIRED({ํ๋๋ช
})
ํ์ ํ๋ ๋๋ฝ (title, type, data)
409
FIELD_IN_USE(title)
๋์ผ ์ ํ ๋ด ์ ๋ชฉ ์ค๋ณต
๊ธฐ์กด ์์์ ๋ณต์ฌํ์ฌ ์๋ก์ด ์์์ ์์ฑํฉ๋๋ค. ๋ณต์ฌ๋ ์์์ ์ ๋ชฉ์ ์๋ณธ ์ ๋ชฉ์ "์ ์ฌ๋ณธ"์ด ์ถ๊ฐ๋ฉ๋๋ค.
POST /api/forms/:_id/copy
๊ถํ : admin ๋๋ manager
ํ๋ผ๋ฏธํฐ
ํ์
์ค๋ช
_id
string
๋ณต์ฌํ ์์์ ObjectId
{
"form" : {
"_id" : " 507f1f77bcf86cd799439012" ,
"type" : " syllabus" ,
"title" : " 2024ํ๋
๋ ๊ฐ์๊ณํ์์ ์ฌ๋ณธ" ,
"data" : [
{
"label" : " ๊ต๊ณผ๋ชฉ๋ช
" ,
"type" : " input"
},
{
"label" : " ๋ด๋น๊ต์ฌ" ,
"type" : " input"
}
],
"userId" : " admin01" ,
"userName" : " ๊ด๋ฆฌ์" ,
"archived" : false ,
"permissionView" : {
"teacher" : true ,
"student" : false ,
"exceptions" : []
},
"createdAt" : " 2024-03-01T10:00:00.000Z" ,
"updatedAt" : " 2024-03-01T10:00:00.000Z"
}
}
์ํ ์ฝ๋
๋ฉ์์ง
์ค๋ช
404
FORM_NOT_FOUND
์๋ณธ ์์์ ์ฐพ์ ์ ์์
์์ ๋ชฉ๋ก์ ์กฐํํฉ๋๋ค. admin/manager๋ ๋ชจ๋ ์์์ ์กฐํํ ์ ์์ผ๋ฉฐ, ์ผ๋ฐ ์ฌ์ฉ์๋ ์ด๋ ๊ถํ(permissionView)์ ๋ฐ๋ผ ํํฐ๋ง๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ต๋๋ค. ๋ชฉ๋ก ์กฐํ ์ data ํ๋๋ ์ ์ธ๋ฉ๋๋ค.
๊ถํ : isLoggedIn (๋ก๊ทธ์ธ ํ์)
ํ๋ผ๋ฏธํฐ
ํ์
ํ์
์ค๋ช
type
string
X
์์ ์ ํ ํํฐ ("syllabus", "timetable", "print")
archived
string
X
๋ณด๊ด ์ฌ๋ถ ํํฐ ("true" ๋๋ "false")
{
"forms" : [
{
"_id" : " 507f1f77bcf86cd799439011" ,
"type" : " syllabus" ,
"title" : " 2024ํ๋
๋ ๊ฐ์๊ณํ์" ,
"userId" : " admin01" ,
"userName" : " ๊ด๋ฆฌ์" ,
"archived" : false ,
"permissionView" : {
"teacher" : true ,
"student" : false ,
"exceptions" : []
},
"createdAt" : " 2024-03-01T09:00:00.000Z" ,
"updatedAt" : " 2024-03-01T09:00:00.000Z"
},
{
"_id" : " 507f1f77bcf86cd799439012" ,
"type" : " timetable" ,
"title" : " ์ฃผ๊ฐ ์๊ฐํ" ,
"userId" : " admin01" ,
"userName" : " ๊ด๋ฆฌ์" ,
"archived" : false ,
"permissionView" : {
"teacher" : true ,
"student" : true ,
"exceptions" : []
},
"createdAt" : " 2024-03-02T09:00:00.000Z" ,
"updatedAt" : " 2024-03-02T09:00:00.000Z"
}
]
}
์ฐธ๊ณ : ์๋ต์ data ํ๋๊ฐ ํฌํจ๋์ง ์์ต๋๋ค. ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ค๋ฉด ์์ ์์ธ ์กฐํ API๋ฅผ ์ฌ์ฉํ์ธ์.
ํน์ ์์์ ์ ์ฒด ์ ๋ณด๋ฅผ ์กฐํํฉ๋๋ค. data ํ๋๋ฅผ ํฌํจํ ์ ์ฒด ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค. admin/manager๋ ํญ์ ์กฐํ ๊ฐ๋ฅํ๋ฉฐ, ์ผ๋ฐ ์ฌ์ฉ์๋ ์ด๋ ๊ถํ์ ๋ฐ๋ผ ์ ๊ทผ์ด ์ ํ๋ฉ๋๋ค.
๊ถํ : isLoggedIn (๋ก๊ทธ์ธ ํ์)
ํ๋ผ๋ฏธํฐ
ํ์
์ค๋ช
_id
string
์์ ObjectId
{
"form" : {
"_id" : " 507f1f77bcf86cd799439011" ,
"type" : " syllabus" ,
"title" : " 2024ํ๋
๋ ๊ฐ์๊ณํ์" ,
"data" : [
{
"label" : " ๊ต๊ณผ๋ชฉ๋ช
" ,
"type" : " input"
},
{
"label" : " ๋ด๋น๊ต์ฌ" ,
"type" : " input"
}
],
"userId" : " admin01" ,
"userName" : " ๊ด๋ฆฌ์" ,
"archived" : false ,
"permissionView" : {
"teacher" : true ,
"student" : false ,
"exceptions" : []
},
"createdAt" : " 2024-03-01T09:00:00.000Z" ,
"updatedAt" : " 2024-03-01T09:00:00.000Z"
}
}
์ํ ์ฝ๋
๋ฉ์์ง
์ค๋ช
403
PERMISSION_DENIED
์ด๋ ๊ถํ ์์
404
FORM_NOT_FOUND
์์์ ์ฐพ์ ์ ์์
์์์ ์ ๋ชฉ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์์ ํฉ๋๋ค.
๊ถํ : admin ๋๋ manager
ํ๋ผ๋ฏธํฐ
ํ์
์ค๋ช
_id
string
์์ ObjectId
ํ๋
ํ์
ํ์
์ค๋ช
title
string
O
์์ ํ ์์ ์ ๋ชฉ
data
object[]
O
์์ ํ ์์ ๋ฐ์ดํฐ ๋ฐฐ์ด
{
"title" : " 2024ํ๋
๋ ๊ฐ์๊ณํ์ (์์ )" ,
"data" : [
{
"label" : " ๊ต๊ณผ๋ชฉ๋ช
" ,
"type" : " input"
},
{
"label" : " ๋ด๋น๊ต์ฌ" ,
"type" : " input"
},
{
"label" : " ์์
๋ชฉํ" ,
"type" : " textarea"
}
]
}
{
"form" : {
"_id" : " 507f1f77bcf86cd799439011" ,
"type" : " syllabus" ,
"title" : " 2024ํ๋
๋ ๊ฐ์๊ณํ์ (์์ )" ,
"data" : [
{
"label" : " ๊ต๊ณผ๋ชฉ๋ช
" ,
"type" : " input"
},
{
"label" : " ๋ด๋น๊ต์ฌ" ,
"type" : " input"
},
{
"label" : " ์์
๋ชฉํ" ,
"type" : " textarea"
}
],
"userId" : " admin01" ,
"userName" : " ๊ด๋ฆฌ์" ,
"archived" : false ,
"permissionView" : {
"teacher" : true ,
"student" : false ,
"exceptions" : []
},
"createdAt" : " 2024-03-01T09:00:00.000Z" ,
"updatedAt" : " 2024-03-05T14:30:00.000Z"
}
}
์ํ ์ฝ๋
๋ฉ์์ง
์ค๋ช
400
FIELD_REQUIRED({ํ๋๋ช
})
ํ์ ํ๋ ๋๋ฝ (title, data)
404
FORM_NOT_FOUND
์์์ ์ฐพ์ ์ ์์
์์์ ๋ณด๊ด ์ฒ๋ฆฌํฉ๋๋ค. archived ํ๋๋ฅผ true๋ก ์ค์ ํ๋ ์ํํธ ๋ณด๊ด ๋ฐฉ์์
๋๋ค.
PUT /api/forms/:_id/archive
๊ถํ : admin ๋๋ manager
ํ๋ผ๋ฏธํฐ
ํ์
์ค๋ช
_id
string
์์ ObjectId
{
"form" : {
"_id" : " 507f1f77bcf86cd799439011" ,
"type" : " syllabus" ,
"title" : " 2024ํ๋
๋ ๊ฐ์๊ณํ์" ,
"archived" : true ,
"permissionView" : {
"teacher" : true ,
"student" : false ,
"exceptions" : []
},
"createdAt" : " 2024-03-01T09:00:00.000Z" ,
"updatedAt" : " 2024-06-01T09:00:00.000Z"
}
}
์ํ ์ฝ๋
๋ฉ์์ง
์ค๋ช
404
FORM_NOT_FOUND
์์์ ์ฐพ์ ์ ์์
๋ณด๊ด๋ ์์์ ๋ณต์ํฉ๋๋ค. archived ํ๋๋ฅผ false๋ก ์ค์ ํฉ๋๋ค.
PUT /api/forms/:_id/restore
๊ถํ : admin ๋๋ manager
ํ๋ผ๋ฏธํฐ
ํ์
์ค๋ช
_id
string
์์ ObjectId
{
"form" : {
"_id" : " 507f1f77bcf86cd799439011" ,
"type" : " syllabus" ,
"title" : " 2024ํ๋
๋ ๊ฐ์๊ณํ์" ,
"archived" : false ,
"permissionView" : {
"teacher" : true ,
"student" : false ,
"exceptions" : []
},
"createdAt" : " 2024-03-01T09:00:00.000Z" ,
"updatedAt" : " 2024-06-15T09:00:00.000Z"
}
}
์ํ ์ฝ๋
๋ฉ์์ง
์ค๋ช
404
FORM_NOT_FOUND
์์์ ์ฐพ์ ์ ์์
์์์ ์๊ตฌ ์ญ์ ํฉ๋๋ค.
๊ถํ : admin ๋๋ manager
์ฃผ์ : ์ด ์์
์ ๋๋๋ฆด ์ ์์ต๋๋ค. ์์ ๋ฐ์ดํฐ๊ฐ ์๊ตฌ์ ์ผ๋ก ์ญ์ ๋ฉ๋๋ค.
ํ๋ผ๋ฏธํฐ
ํ์
์ค๋ช
_id
string
์์ ObjectId
์ํ ์ฝ๋
๋ฉ์์ง
์ค๋ช
404
FORM_NOT_FOUND
์์์ ์ฐพ์ ์ ์์
์์์ ์ญํ ๋ณ ์ด๋ ๊ถํ์ ์์ ํฉ๋๋ค. ๊ธฐ์กด ์์ธ ๋ชฉ๋ก(exceptions)์ ์ ์ง๋ฉ๋๋ค.
PUT /api/forms/:_id/permission
๊ถํ : admin ๋๋ manager
ํ๋ผ๋ฏธํฐ
ํ์
์ค๋ช
_id
string
์์ ObjectId
ํ๋
ํ์
ํ์
์ค๋ช
teacher
boolean
X
๊ต์ฌ ์ด๋ ํ์ฉ ์ฌ๋ถ
student
boolean
X
ํ์ ์ด๋ ํ์ฉ ์ฌ๋ถ
{
"teacher" : true ,
"student" : true
}
{
"form" : {
"_id" : " 507f1f77bcf86cd799439011" ,
"type" : " syllabus" ,
"title" : " 2024ํ๋
๋ ๊ฐ์๊ณํ์" ,
"archived" : false ,
"permissionView" : {
"teacher" : true ,
"student" : true ,
"exceptions" : []
},
"createdAt" : " 2024-03-01T09:00:00.000Z" ,
"updatedAt" : " 2024-03-10T11:00:00.000Z"
}
}
์ํ ์ฝ๋
๋ฉ์์ง
์ค๋ช
404
FORM_NOT_FOUND
์์์ ์ฐพ์ ์ ์์
์ด๋ ๊ถํ ์์ธ ์ถ๊ฐ
ํน์ ์ฌ์ฉ์์ ๋ํ ์ด๋ ๊ถํ ์์ธ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ด๋ฏธ ๋ฑ๋ก๋ ์ฌ์ฉ์์ ์์ธ๋ ๋ฎ์ด์๋๋ค.
POST /api/forms/:_id/permission/exceptions
๊ถํ : admin ๋๋ manager
ํ๋ผ๋ฏธํฐ
ํ์
์ค๋ช
_id
string
์์ ObjectId
ํ๋
ํ์
ํ์
์ค๋ช
user
string
O
์ฌ์ฉ์ _id (ObjectId)
userId
string
O
์ฌ์ฉ์ ID
userName
string
O
์ฌ์ฉ์ ์ด๋ฆ
isAllowed
boolean
O
์ด๋ ํ์ฉ ์ฌ๋ถ (true: ํ์ฉ, false: ์ฐจ๋จ)
{
"user" : " 507f1f77bcf86cd799439099" ,
"userId" : " teacher01" ,
"userName" : " ๊น๊ต์ฌ" ,
"isAllowed" : false
}
{
"form" : {
"_id" : " 507f1f77bcf86cd799439011" ,
"type" : " syllabus" ,
"title" : " 2024ํ๋
๋ ๊ฐ์๊ณํ์" ,
"archived" : false ,
"permissionView" : {
"teacher" : true ,
"student" : false ,
"exceptions" : [
{
"user" : " 507f1f77bcf86cd799439099" ,
"userId" : " teacher01" ,
"userName" : " ๊น๊ต์ฌ" ,
"isAllowed" : false
}
]
},
"createdAt" : " 2024-03-01T09:00:00.000Z" ,
"updatedAt" : " 2024-03-10T11:30:00.000Z"
}
}
์ํ ์ฝ๋
๋ฉ์์ง
์ค๋ช
400
FIELD_REQUIRED({ํ๋๋ช
})
ํ์ ํ๋ ๋๋ฝ (user, userId, userName, isAllowed)
404
FORM_NOT_FOUND
์์์ ์ฐพ์ ์ ์์
์ด๋ ๊ถํ ์์ธ ์ญ์
ํน์ ์ฌ์ฉ์์ ๋ํ ์ด๋ ๊ถํ ์์ธ๋ฅผ ์ญ์ ํฉ๋๋ค.
DELETE /api/forms/:_id/permission/exceptions?userId={userId}
๊ถํ : admin ๋๋ manager
ํ๋ผ๋ฏธํฐ
ํ์
์ค๋ช
_id
string
์์ ObjectId
ํ๋ผ๋ฏธํฐ
ํ์
ํ์
์ค๋ช
userId
string
O
์ญ์ ํ ์์ธ์ ์ฌ์ฉ์ ID
{
"form" : {
"_id" : " 507f1f77bcf86cd799439011" ,
"type" : " syllabus" ,
"title" : " 2024ํ๋
๋ ๊ฐ์๊ณํ์" ,
"archived" : false ,
"permissionView" : {
"teacher" : true ,
"student" : false ,
"exceptions" : []
},
"createdAt" : " 2024-03-01T09:00:00.000Z" ,
"updatedAt" : " 2024-03-10T12:00:00.000Z"
}
}
์ํ ์ฝ๋
๋ฉ์์ง
์ค๋ช
400
FIELD_REQUIRED(userId)
userId ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๋๋ฝ
404
FORM_NOT_FOUND
์์์ ์ฐพ์ ์ ์์
ํ๋ก ํธ์๋ API ํจ์ (useAPIv2)
ํจ์๋ช
๋ฉ์๋
๊ฒฝ๋ก
์ค๋ช
CForm
POST
/api/forms
์์ ์์ฑ
CCopyForm
POST
/api/forms/:_id/copy
์์ ๋ณต์ฌ
RForms
GET
/api/forms
์์ ๋ชฉ๋ก ์กฐํ
RForm
GET
/api/forms/:_id
์์ ์์ธ ์กฐํ
UForm
PUT
/api/forms/:_id
์์ ์์
UArchiveForm
PUT
/api/forms/:_id/archive
์์ ๋ณด๊ด
URestoreForm
PUT
/api/forms/:_id/restore
์์ ๋ณต์
DForm
DELETE
/api/forms/:_id
์์ ์ญ์
UFormPermission
PUT
/api/forms/:_id/permission
์ด๋ ๊ถํ ์์
CFormPermissionException
POST
/api/forms/:_id/permission/exceptions
์ด๋ ๊ถํ ์์ธ ์ถ๊ฐ
DFormPermissionException
DELETE
/api/forms/:_id/permission/exceptions
์ด๋ ๊ถํ ์์ธ ์ญ์