Skip to content

Latest commit

Β 

History

History
324 lines (249 loc) Β· 10.6 KB

File metadata and controls

324 lines (249 loc) Β· 10.6 KB

학생 기둝 API

학생 기둝(Archive) APIμž…λ‹ˆλ‹€. 학ꡐ별 ν•™μƒμ˜ 개인 기둝 데이터λ₯Ό μ‘°νšŒν•˜κ³  μˆ˜μ •ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. 기둝 λ°μ΄ν„°λŠ” 학ꡐ κ΄€λ¦¬μžκ°€ μ •μ˜ν•œ 양식(formArchive)에 따라 κ΅¬μ‘°ν™”λ©λ‹ˆλ‹€.

라우트 파일: backend/src/routes/archives.js 컨트둀러 파일: backend/src/controllers/archives.js λͺ¨λΈ 파일: backend/src/models/Archive.js


μ—”λ“œν¬μΈνŠΈ μš”μ•½

λ©”μ„œλ“œ 경둜 μ„€λͺ… κΆŒν•œ
GET /api/archives 학생 기둝 쑰회 isLoggedIn
PUT /api/archives/:_id 학생 기둝 μˆ˜μ • isLoggedIn

학생 기둝 쑰회

ν•™μƒμ˜ 기둝을 μ‘°νšŒν•©λ‹ˆλ‹€. label νŒŒλΌλ―Έν„° μœ λ¬΄μ— 따라 전체 기둝 λ˜λŠ” νŠΉμ • 양식 μ„Ήμ…˜μ„ μ‘°νšŒν•©λ‹ˆλ‹€. ν•΄λ‹Ή ν•™μƒμ˜ 기둝이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.

GET /api/archives

κΆŒν•œ: isLoggedIn

쿼리 νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„° νƒ€μž… ν•„μˆ˜ μ„€λͺ…
registration string O 학생 등둝(Registration)의 ObjectId
label string X μ‘°νšŒν•  양식 μ„Ήμ…˜ 라벨 (예: "인적 사항")

κΆŒν•œ λͺ¨λΈ

label νŒŒλΌλ―Έν„°κ°€ 제곡된 경우, ν•™κ΅μ˜ formArchive 섀정에 따라 μ„ΈλΆ„ν™”λœ κΆŒν•œ 검사가 μˆ˜ν–‰λ©λ‹ˆλ‹€.

μ—­ν•  쑰건 μ„€λͺ…
κ΄€λ¦¬μž (manager) authManager === "viewAndEdit" ν•΄λ‹Ή 양식 μ„Ήμ…˜μ— λŒ€ν•œ κ΄€λ¦¬μž μ ‘κ·Ό ν—ˆμš©
학생 (본인) authStudent === "view" λ˜λŠ” "viewAndEdit" 본인의 기둝만 쑰회 κ°€λŠ₯
ꡐ사 (전체) authTeacher === "viewAndEditStudents" 같은 학기에 κ΅μ‚¬λ‘œ λ“±λ‘λœ 경우 λͺ¨λ“  학생 기둝 쑰회 κ°€λŠ₯
ꡐ사 (λ‹΄λ‹Ή) authTeacher === "viewAndEditMyStudents" 등둝(Registration)의 teacher λ˜λŠ” subTeacher둜 μ§€μ •λœ ν•™μƒλ§Œ 쑰회 κ°€λŠ₯

label νŒŒλΌλ―Έν„°κ°€ μ—†λŠ” 경우, 본인의 κΈ°λ‘μ΄κ±°λ‚˜ 같은 학기에 κ΅μ‚¬λ‘œ λ“±λ‘λœ 경우 전체 기둝을 μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

label 없이 쑰회 (전체 기둝)

학생 본인 λ˜λŠ” ν•΄λ‹Ή ν•™κΈ°μ˜ ꡐ사가 전체 기둝을 μ‘°νšŒν•©λ‹ˆλ‹€.

μš”μ²­ μ˜ˆμ‹œ

GET /api/archives?registration=507f1f77bcf86cd799439011

응닡 (200)

{
  "archive": {
    "_id": "60a7b2c3d4e5f6a7b8c9d0e1",
    "user": "507f1f77bcf86cd799439022",
    "school": "507f1f77bcf86cd799439033",
    "schoolId": "school01",
    "schoolName": "ν•œκ΅­κ³ λ“±ν•™κ΅",
    "userId": "student01",
    "userName": "홍길동",
    "data": {
      "인적 사항": {
        "이름": { "value": "홍길동" },
        "μ£Όλ―Όλ“±λ‘λ²ˆν˜Έ": { "value": "010101-3123456" },
        "μ£Όμ†Œ": { "value": "μ„œμšΈνŠΉλ³„μ‹œ 강남ꡬ" },
        "μ„±λͺ…(λΆ€)": { "value": "홍아버지" },
        "생년월일(λΆ€)": { "value": "1975λ…„03μ›”15일" },
        "μ„±λͺ…(λͺ¨)": { "value": "κΉ€μ–΄λ¨Έλ‹ˆ" },
        "생년월일(λͺ¨)": { "value": "1978λ…„07μ›”22일" }
      },
      "ν•™μ—… 기둝": {
        "λΉ„κ³ ": { "value": "우수 학생" }
      }
    }
  }
}

label둜 쑰회 (νŠΉμ • 양식 μ„Ήμ…˜)

νŠΉμ • 양식 μ„Ήμ…˜λ§Œ μ‘°νšŒν•©λ‹ˆλ‹€. κΆŒν•œ λͺ¨λΈμ— 따라 접근이 μ œν•œλ©λ‹ˆλ‹€.

μš”μ²­ μ˜ˆμ‹œ

GET /api/archives?registration=507f1f77bcf86cd799439011&label=인적 사항

응닡 (200)

{
  "archive": {
    "_id": "60a7b2c3d4e5f6a7b8c9d0e1",
    "user": "507f1f77bcf86cd799439022",
    "data": {
      "인적 사항": {
        "이름": { "value": "홍길동" },
        "μ£Όλ―Όλ“±λ‘λ²ˆν˜Έ": { "value": "010101-3123456" },
        "μ£Όμ†Œ": { "value": "μ„œμšΈνŠΉλ³„μ‹œ 강남ꡬ" },
        "μ„±λͺ…(λΆ€)": { "value": "홍아버지" },
        "생년월일(λΆ€)": { "value": "1975λ…„03μ›”15일" },
        "μ„±λͺ…(λͺ¨)": { "value": "κΉ€μ–΄λ¨Έλ‹ˆ" },
        "생년월일(λͺ¨)": { "value": "1978λ…„07μ›”22일" }
      }
    }
  }
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 FIELD_REQUIRED(registration) registration νŒŒλΌλ―Έν„° λˆ„λ½
400 (빈 응닡) registration ObjectId ν˜•μ‹ 였λ₯˜
403 PERMISSION_DENIED ν•΄λ‹Ή 양식 μ„Ήμ…˜μ— λŒ€ν•œ μ ‘κ·Ό κΆŒν•œ μ—†μŒ
404 __NOT_FOUND(registration(student)) 학생 등둝 정보λ₯Ό 찾을 수 μ—†μŒ
404 __NOT_FOUND(registration(teacher)) ꡐ사 등둝 정보λ₯Ό 찾을 수 μ—†μŒ (label 없이 쑰회 μ‹œ)
404 __NOT_FOUND(school) 학ꡐλ₯Ό 찾을 수 μ—†μŒ
404 __NOT_FOUND(formArchive_item) ν•΄λ‹Ή 라벨의 양식 ν•­λͺ©μ„ 찾을 수 μ—†μŒ

학생 기둝 μˆ˜μ •

학생 기둝의 νŠΉμ • 양식 μ„Ήμ…˜ 데이터λ₯Ό μˆ˜μ •ν•©λ‹ˆλ‹€. κΈ°μ‘΄ 데이터에 μƒˆλ‘œμš΄ 데이터λ₯Ό 병합(merge)ν•©λ‹ˆλ‹€.

PUT /api/archives/:_id

κΆŒν•œ: isLoggedIn

경둜 νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„° νƒ€μž… μ„€λͺ…
_id string 기둝(Archive)의 ObjectId

μš”μ²­ λ³Έλ¬Έ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ μ„€λͺ…
registration string O 학생 등둝(Registration)의 ObjectId
label string O μˆ˜μ •ν•  양식 μ„Ήμ…˜ 라벨
data object O μˆ˜μ •ν•  데이터

κΆŒν•œ λͺ¨λΈ

ν•™κ΅μ˜ formArchive 섀정에 따라 μ„ΈλΆ„ν™”λœ κΆŒν•œ 검사가 μˆ˜ν–‰λ©λ‹ˆλ‹€. 쑰회(GET)와 λ™μΌν•œ μ—­ν•  λͺ¨λΈμ΄μ§€λ§Œ, μˆ˜μ • κΆŒν•œμ΄ ν•„μš”ν•©λ‹ˆλ‹€.

μ—­ν•  쑰건 μ„€λͺ…
κ΄€λ¦¬μž (manager) authManager === "viewAndEdit" ν•΄λ‹Ή 양식 μ„Ήμ…˜μ— λŒ€ν•œ κ΄€λ¦¬μž μˆ˜μ • ν—ˆμš©
학생 (본인) authStudent === "viewAndEdit" 본인의 기둝만 μˆ˜μ • κ°€λŠ₯ ("view"λ§ŒμœΌλ‘œλŠ” μˆ˜μ • λΆˆκ°€)
ꡐ사 (전체) authTeacher === "viewAndEditStudents" 같은 학기에 κ΅μ‚¬λ‘œ λ“±λ‘λœ 경우 λͺ¨λ“  학생 기둝 μˆ˜μ • κ°€λŠ₯
ꡐ사 (λ‹΄λ‹Ή) authTeacher === "viewAndEditMyStudents" 등둝(Registration)의 teacher λ˜λŠ” subTeacher둜 μ§€μ •λœ ν•™μƒλ§Œ μˆ˜μ • κ°€λŠ₯

μš”μ²­ μ˜ˆμ‹œ

{
  "registration": "507f1f77bcf86cd799439011",
  "label": "인적 사항",
  "data": {
    "이름": { "value": "홍길동" },
    "μ£Όμ†Œ": { "value": "μ„œμšΈνŠΉλ³„μ‹œ μ„œμ΄ˆκ΅¬" },
    "μ„±λͺ…(λΆ€)": { "value": "홍아버지" },
    "생년월일(λΆ€)": { "value": "1975λ…„03μ›”15일" }
  }
}

응닡 (200)

{
  "archive": {
    "_id": "60a7b2c3d4e5f6a7b8c9d0e1",
    "user": "507f1f77bcf86cd799439022",
    "data": {
      "인적 사항": {
        "이름": { "value": "홍길동" },
        "μ£Όμ†Œ": { "value": "μ„œμšΈνŠΉλ³„μ‹œ μ„œμ΄ˆκ΅¬" },
        "μ„±λͺ…(λΆ€)": { "value": "홍아버지" },
        "생년월일(λΆ€)": { "value": "1975λ…„03μ›”15일" }
      }
    }
  }
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 FIELD_INVALID(_id) _id 경둜 νŒŒλΌλ―Έν„° ObjectId ν˜•μ‹ 였λ₯˜
400 FIELD_REQUIRED(label) label ν•„λ“œ λˆ„λ½
400 FIELD_REQUIRED(data) data ν•„λ“œ λˆ„λ½
400 FIELD_REQUIRED(registration) registration ν•„λ“œ λˆ„λ½
400 (빈 응닡) κΆŒν•œ 쑰건에 ν•΄λ‹Ήν•˜μ§€ μ•ŠλŠ” 경우
403 PERMISSION_DENIED ν•΄λ‹Ή 양식 μ„Ήμ…˜μ— λŒ€ν•œ μˆ˜μ • κΆŒν•œ μ—†μŒ
404 __NOT_FOUND(archive) 기둝을 찾을 수 μ—†μŒ
404 __NOT_FOUND(school) 학ꡐλ₯Ό 찾을 수 μ—†μŒ
404 __NOT_FOUND(formArchive_Item) ν•΄λ‹Ή 라벨의 양식 ν•­λͺ©μ„ 찾을 수 μ—†μŒ

데이터 ꡬ쑰

archive.data

archive.dataλŠ” 양식 라벨을 ν‚€λ‘œ, 각 ν•„λ“œ 라벨과 값을 쀑첩 객체둜 κ°€μ§€λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.

{
  "[양식 라벨]": {
    "[ν•„λ“œ 라벨]": {
      "value": "κ°’",
      "key": "ν•„λ“œ ν‚€ (선택)"
    }
  }
}

μ˜ˆμ‹œ

{
  "인적 사항": {
    "이름": { "value": "홍길동" },
    "μ£Όλ―Όλ“±λ‘λ²ˆν˜Έ": { "value": "010101-3123456" },
    "μ£Όμ†Œ": { "value": "μ„œμšΈνŠΉλ³„μ‹œ 강남ꡬ" },
    "μ„±λͺ…(λΆ€)": { "value": "홍아버지" },
    "생년월일(λΆ€)": { "value": "1975λ…„03μ›”15일" },
    "μ„±λͺ…(λͺ¨)": { "value": "κΉ€μ–΄λ¨Έλ‹ˆ" },
    "생년월일(λͺ¨)": { "value": "1978λ…„07μ›”22일" }
  },
  "ν•™μ—… 기둝": {
    "λΉ„κ³ ": { "value": "우수 학생" }
  }
}

λ°μ΄ν„°λ² μ΄μŠ€ λͺ¨λΈ

Archive μŠ€ν‚€λ§ˆ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ μ„€λͺ…
_id ObjectId μžλ™ 기둝 고유 ID
school ObjectId O 학ꡐ ID (School._id)
schoolId string X 학ꡐ μ‹λ³„μž
schoolName string X 학ꡐ 이름
user ObjectId O μ‚¬μš©μž ID (User._id)
userId string X μ‚¬μš©μž μ‹λ³„μž
userName string X μ‚¬μš©μž 이름
data Object X 기둝 데이터 (κΈ°λ³Έκ°’: {})
createdAt Date μžλ™ 생성 μ‹œκ°
updatedAt Date μžλ™ μˆ˜μ • μ‹œκ°

인덱슀

인덱슀 ν•„λ“œ 속성
_id _id UNIQUE
school_1_user_1 { school: 1, user: 1 } UNIQUE, COMPOUND

μ•”ν˜Έν™”

data ν•„λ“œλŠ” mongoose-encryption ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•˜μ—¬ μ•”ν˜Έν™”λ˜μ–΄ μ €μž₯λ©λ‹ˆλ‹€.

  • μ•”ν˜Έν™” ν‚€: ENCKEY_A (ν™˜κ²½ λ³€μˆ˜)
  • μ„œλͺ… ν‚€: SIGKEY_A (ν™˜κ²½ λ³€μˆ˜)
  • μ•”ν˜Έν™” λŒ€μƒ ν•„λ“œ: data

clean() λ©”μ„œλ“œ

clean() μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” λ―Όκ°ν•œ κ°œμΈμ •λ³΄λ₯Ό 더미 λ°μ΄ν„°λ‘œ λŒ€μ²΄ν•©λ‹ˆλ‹€. λ°±μ—…/ν…ŒμŠ€νŠΈ μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

ν•„λ“œ λŒ€μ²΄ κ°’
인적 사항.μ£Όλ―Όλ“±λ‘λ²ˆν˜Έ "000000-111111"
인적 사항.μ£Όμ†Œ "μ•„λ¦„λ‹€μš΄ 이땅에 κΈˆμˆ˜κ°•μ‚°μ—"
인적 사항.μ„±λͺ…(λΆ€) "아버지"
인적 사항.생년월일(λΆ€) "2022λ…„11μ›”16일"
인적 사항.μ„±λͺ…(λͺ¨) "μ–΄λ¨Έλ‹ˆ"
인적 사항.생년월일(λͺ¨) "2022λ…„11μ›”16일"

파일 μ—…λ‘œλ“œ/λ‹€μš΄λ‘œλ“œ

기둝에 첨뢀 νŒŒμΌμ„ μ—…λ‘œλ“œν•˜κ±°λ‚˜ λ‹€μš΄λ‘œλ“œν•˜λŠ” κΈ°λŠ₯은 λ³„λ„μ˜ 파일 APIλ₯Ό 톡해 μ œκ³΅λ©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ files.mdλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

λ©”μ„œλ“œ 경둜 μ„€λͺ…
POST /api/files/archive 기둝 첨뢀 파일 μ—…λ‘œλ“œ (CUploadFileArchive)
GET /api/files/archive/signed 기둝 첨뢀 파일 μ„œλͺ…λœ URL 쑰회 (RSignedUrlArchive)

μ°Έκ³ : 파일 API의 κΆŒν•œ λͺ¨λΈμ€ 기둝 쑰회/μˆ˜μ •κ³Ό λ™μΌν•œ formArchive 기반 κΆŒν•œ 검사λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.


ν”„λ‘ νŠΈμ—”λ“œ API ν•¨μˆ˜ (useAPIv2)

ν•¨μˆ˜λͺ… λ©”μ„œλ“œ 경둜 μ„€λͺ…
RArchiveByRegistration GET /api/archives 학생 기둝 쑰회
UArchiveByRegistration PUT /api/archives/:_id 학생 기둝 μˆ˜μ •