Skip to content

Latest commit

Β 

History

History
1180 lines (916 loc) Β· 31.4 KB

File metadata and controls

1180 lines (916 loc) Β· 31.4 KB

κ²Œμ‹œνŒ API

κ²Œμ‹œνŒ(Board), κ²Œμ‹œκΈ€(Post), λŒ“κΈ€(Comment) APIμž…λ‹ˆλ‹€. 학ꡐ별 κ²Œμ‹œνŒ 생성, κ²Œμ‹œκΈ€ μž‘μ„±/쑰회, λŒ“κΈ€ 관리 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

라우트 파일: backend/src/routes/boards.js, backend/src/routes/posts.js, backend/src/routes/comments.js 컨트둀러 파일: backend/src/controllers/boards.js, backend/src/controllers/posts.js, backend/src/controllers/comments.js λͺ¨λΈ 파일: backend/src/models/Board.js, backend/src/models/Post.js, backend/src/models/Comment.js


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

κ²Œμ‹œνŒ (Board)

λ©”μ„œλ“œ 경둜 μ„€λͺ… κΆŒν•œ
POST /api/boards κ²Œμ‹œνŒ 생성 admin|manager
GET /api/boards/:_id κ²Œμ‹œνŒ 쑰회 둜그인 + 읽기 κΆŒν•œ
GET /api/boards?school= κ²Œμ‹œνŒ λͺ©λ‘ 둜그인
PUT /api/boards/:_id κ²Œμ‹œνŒ μˆ˜μ • admin|manager
PUT /api/boards/:_id/permission/:type κΆŒν•œ μˆ˜μ • admin|manager
POST /api/boards/:_id/permission/:type/exceptions κΆŒν•œ μ˜ˆμ™Έ μΆ”κ°€ admin|manager
DELETE /api/boards/:_id/permission/:type/exceptions?userId= κΆŒν•œ μ˜ˆμ™Έ μ‚­μ œ admin|manager
DELETE /api/boards/:_id κ²Œμ‹œνŒ μ‚­μ œ admin|manager

κ²Œμ‹œκΈ€ (Post)

λ©”μ„œλ“œ 경둜 μ„€λͺ… κΆŒν•œ
POST /api/posts κ²Œμ‹œκΈ€ μž‘μ„± 둜그인 + μ“°κΈ° κΆŒν•œ
GET /api/posts/:_id κ²Œμ‹œκΈ€ 쑰회 둜그인 + 읽기 κΆŒν•œ
GET /api/posts?board=&limit=&before= κ²Œμ‹œκΈ€ λͺ©λ‘ 둜그인 + 읽기 κΆŒν•œ
PUT /api/posts/:_id κ²Œμ‹œκΈ€ μˆ˜μ • 둜그인 (μž‘μ„±μž λ˜λŠ” κ΄€λ¦¬μž)
PUT /api/posts/:_id/pin κ²Œμ‹œκΈ€ κ³ μ • admin|manager
DELETE /api/posts/:_id κ²Œμ‹œκΈ€ μ‚­μ œ 둜그인 (μž‘μ„±μž λ˜λŠ” κ΄€λ¦¬μž)

λŒ“κΈ€ (Comment)

λ©”μ„œλ“œ 경둜 μ„€λͺ… κΆŒν•œ
POST /api/comments λŒ“κΈ€ μž‘μ„± 둜그인 + λŒ“κΈ€ κΆŒν•œ
GET /api/comments?post= λŒ“κΈ€ λͺ©λ‘ 둜그인 + 읽기 κΆŒν•œ
PUT /api/comments/:_id λŒ“κΈ€ μˆ˜μ • 둜그인 (μž‘μ„±μž λ˜λŠ” κ΄€λ¦¬μž)
DELETE /api/comments/:_id λŒ“κΈ€ μ‚­μ œ 둜그인 (μž‘μ„±μž λ˜λŠ” κ΄€λ¦¬μž)

κ²Œμ‹œνŒ 생성

κ²Œμ‹œνŒμ„ μƒμ„±ν•©λ‹ˆλ‹€. κ²Œμ‹œνŒ 이름을 기반으둜 URL μŠ¬λŸ¬κ·Έκ°€ μžλ™ μƒμ„±λ˜λ©°, 같은 학ꡐ λ‚΄μ—μ„œ μŠ¬λŸ¬κ·Έκ°€ 쀑볡될 수 μ—†μŠ΅λ‹ˆλ‹€.

POST /api/boards

κΆŒν•œ: admin λ˜λŠ” manager (isAdManager)

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

ν•„λ“œ νƒ€μž… ν•„μˆ˜ μ„€λͺ…
school string O 학ꡐ _id
name string O κ²Œμ‹œνŒ 이름
description string X κ²Œμ‹œνŒ μ„€λͺ…
permissionWrite object X μ“°κΈ° κΆŒν•œ μ„€μ • (κΈ°λ³Έ: κ΄€λ¦¬μž+ꡐ사)
permissionRead object X 읽기 κΆŒν•œ μ„€μ • (κΈ°λ³Έ: 전체)

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

{
  "school": "507f1f77bcf86cd799439011",
  "name": "μžμœ κ²Œμ‹œνŒ",
  "description": "자유둭게 글을 μž‘μ„±ν•  수 μžˆλŠ” κ²Œμ‹œνŒμž…λ‹ˆλ‹€.",
  "permissionWrite": {
    "manager": true,
    "teacher": true,
    "student": true,
    "exceptions": []
  },
  "permissionRead": {
    "manager": true,
    "teacher": true,
    "student": true,
    "exceptions": []
  }
}

응닡 (200)

{
  "board": {
    "_id": "507f1f77bcf86cd799439022",
    "school": "507f1f77bcf86cd799439011",
    "schoolId": "school-01",
    "schoolName": "ν…ŒμŠ€νŠΈ 학ꡐ",
    "name": "μžμœ κ²Œμ‹œνŒ",
    "slug": "μžμœ κ²Œμ‹œνŒ",
    "description": "자유둭게 글을 μž‘μ„±ν•  수 μžˆλŠ” κ²Œμ‹œνŒμž…λ‹ˆλ‹€.",
    "creator": "507f1f77bcf86cd799439033",
    "creatorId": "admin01",
    "creatorName": "κ΄€λ¦¬μž",
    "permissionWrite": {
      "manager": true,
      "teacher": true,
      "student": true,
      "exceptions": []
    },
    "permissionRead": {
      "manager": true,
      "teacher": true,
      "student": true,
      "exceptions": []
    },
    "permissionComment": {
      "manager": true,
      "teacher": true,
      "student": true,
      "exceptions": []
    },
    "isDefault": false,
    "isActive": true,
    "order": 0,
    "postCount": 0,
    "createdAt": "2024-03-15T09:00:00.000Z",
    "updatedAt": "2024-03-15T09:00:00.000Z"
  }
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 FIELD_REQUIRED({ν•„λ“œλͺ…}) ν•„μˆ˜ ν•„λ“œ λˆ„λ½ (school, name)
404 __NOT_FOUND(school) 학ꡐλ₯Ό 찾을 수 μ—†μŒ
409 FIELD_IN_USE(board) 같은 학ꡐ λ‚΄ 쀑볡 슬러그

κ²Œμ‹œνŒ 쑰회

κ²Œμ‹œνŒμ„ 단일 λ˜λŠ” λͺ©λ‘μœΌλ‘œ μ‘°νšŒν•©λ‹ˆλ‹€. λͺ©λ‘ 쑰회 μ‹œ κΈ°λ³Έ κ²Œμ‹œνŒ(곡지사항)이 μ—†μœΌλ©΄ μžλ™ μƒμ„±λ©λ‹ˆλ‹€.

단일 쑰회

GET /api/boards/:_id

κΆŒν•œ: 둜그인 (isLoggedIn) + 읽기 κΆŒν•œ 확인

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

νŒŒλΌλ―Έν„° νƒ€μž… μ„€λͺ…
_id string κ²Œμ‹œνŒ _id

응닡 (200)

{
  "board": {
    "_id": "507f1f77bcf86cd799439022",
    "school": "507f1f77bcf86cd799439011",
    "schoolId": "school-01",
    "schoolName": "ν…ŒμŠ€νŠΈ 학ꡐ",
    "name": "곡지사항",
    "slug": "announcements",
    "description": "학ꡐ κ³΅μ§€μ‚¬ν•­μž…λ‹ˆλ‹€.",
    "permissionWrite": {
      "manager": true,
      "teacher": true,
      "student": false,
      "exceptions": []
    },
    "permissionRead": {
      "manager": true,
      "teacher": true,
      "student": true,
      "exceptions": []
    },
    "permissionComment": {
      "manager": true,
      "teacher": true,
      "student": true,
      "exceptions": []
    },
    "isDefault": true,
    "isActive": true,
    "order": 0,
    "postCount": 15,
    "createdAt": "2024-01-01T09:00:00.000Z",
    "updatedAt": "2024-03-15T09:00:00.000Z"
  }
}

λͺ©λ‘ 쑰회

GET /api/boards?school={school._id}

κΆŒν•œ: 둜그인 (isLoggedIn)

μ°Έκ³ : ν•΄λ‹Ή 학ꡐ에 κΈ°λ³Έ κ²Œμ‹œνŒ(곡지사항)이 μ—†λŠ” 경우 μžλ™μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€. 읽기 κΆŒν•œμ΄ μžˆλŠ” κ²Œμ‹œνŒλ§Œ λ°˜ν™˜λ©λ‹ˆλ‹€.

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

νŒŒλΌλ―Έν„° νƒ€μž… ν•„μˆ˜ μ„€λͺ…
school string O 학ꡐ _id

응닡 (200)

{
  "boards": [
    {
      "_id": "507f1f77bcf86cd799439022",
      "name": "곡지사항",
      "slug": "announcements",
      "description": "학ꡐ κ³΅μ§€μ‚¬ν•­μž…λ‹ˆλ‹€.",
      "isDefault": true,
      "isActive": true,
      "order": 0,
      "postCount": 15,
      "permissionWrite": { "manager": true, "teacher": true, "student": false, "exceptions": [] },
      "permissionRead": { "manager": true, "teacher": true, "student": true, "exceptions": [] },
      "permissionComment": { "manager": true, "teacher": true, "student": true, "exceptions": [] }
    },
    {
      "_id": "507f1f77bcf86cd799439023",
      "name": "μžμœ κ²Œμ‹œνŒ",
      "slug": "μžμœ κ²Œμ‹œνŒ",
      "description": "",
      "isDefault": false,
      "isActive": true,
      "order": 1,
      "postCount": 42,
      "permissionWrite": { "manager": true, "teacher": true, "student": true, "exceptions": [] },
      "permissionRead": { "manager": true, "teacher": true, "student": true, "exceptions": [] },
      "permissionComment": { "manager": true, "teacher": true, "student": true, "exceptions": [] }
    }
  ]
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 FIELD_REQUIRED(school) λͺ©λ‘ 쑰회 μ‹œ school νŒŒλΌλ―Έν„° λˆ„λ½
403 PERMISSION_DENIED 읽기 κΆŒν•œ μ—†μŒ
404 __NOT_FOUND(board) κ²Œμ‹œνŒμ„ 찾을 수 μ—†μŒ
404 __NOT_FOUND(school) 학ꡐλ₯Ό 찾을 수 μ—†μŒ

κ²Œμ‹œνŒ μˆ˜μ •

κ²Œμ‹œνŒμ˜ 이름, μ„€λͺ…, μ •λ ¬ μˆœμ„œλ₯Ό μˆ˜μ •ν•©λ‹ˆλ‹€. κΈ°λ³Έ κ²Œμ‹œνŒ(곡지사항)의 이름은 λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

PUT /api/boards/:_id

κΆŒν•œ: admin λ˜λŠ” manager (isAdManager)

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

νŒŒλΌλ―Έν„° νƒ€μž… μ„€λͺ…
_id string κ²Œμ‹œνŒ _id

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

ν•„λ“œ νƒ€μž… ν•„μˆ˜ μ„€λͺ…
name string X κ²Œμ‹œνŒ 이름 (κΈ°λ³Έ κ²Œμ‹œνŒμ€ λ³€κ²½ λΆˆκ°€)
description string X κ²Œμ‹œνŒ μ„€λͺ…
order number X μ •λ ¬ μˆœμ„œ

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

{
  "name": "μžμœ κ²Œμ‹œνŒ",
  "description": "μˆ˜μ •λœ μ„€λͺ…μž…λ‹ˆλ‹€.",
  "order": 2
}

응닡 (200)

{
  "board": {
    "_id": "507f1f77bcf86cd799439023",
    "name": "μžμœ κ²Œμ‹œνŒ",
    "description": "μˆ˜μ •λœ μ„€λͺ…μž…λ‹ˆλ‹€.",
    "order": 2
  }
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 κΈ°λ³Έ κ²Œμ‹œνŒμ˜ 이름은 λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€. κΈ°λ³Έ κ²Œμ‹œνŒ 이름 λ³€κ²½ μ‹œλ„
404 __NOT_FOUND(board) κ²Œμ‹œνŒμ„ 찾을 수 μ—†μŒ

κ²Œμ‹œνŒ κΆŒν•œ μˆ˜μ •

κ²Œμ‹œνŒμ˜ 역할별 κΆŒν•œ(읽기/μ“°κΈ°/λŒ“κΈ€)을 μˆ˜μ •ν•©λ‹ˆλ‹€.

PUT /api/boards/:_id/permission/:type

κΆŒν•œ: admin λ˜λŠ” manager (isAdManager)

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

νŒŒλΌλ―Έν„° νƒ€μž… μ„€λͺ…
_id string κ²Œμ‹œνŒ _id
type string κΆŒν•œ μœ ν˜•: read, write, comment

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

ν•„λ“œ νƒ€μž… ν•„μˆ˜ μ„€λͺ…
manager boolean X κ΄€λ¦¬μž κΆŒν•œ
teacher boolean X ꡐ사 κΆŒν•œ
student boolean X 학생 κΆŒν•œ

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

{
  "manager": true,
  "teacher": true,
  "student": false
}

응닡 (200)

{
  "board": {
    "_id": "507f1f77bcf86cd799439023",
    "permissionWrite": {
      "manager": true,
      "teacher": true,
      "student": false,
      "exceptions": []
    }
  }
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 Invalid permission type 잘λͺ»λœ κΆŒν•œ μœ ν˜• (read, write, comment μ΄μ™Έμ˜ κ°’)
404 __NOT_FOUND(board) κ²Œμ‹œνŒμ„ 찾을 수 μ—†μŒ

κ²Œμ‹œνŒ κΆŒν•œ μ˜ˆμ™Έ μΆ”κ°€

νŠΉμ • μ‚¬μš©μžμ— λŒ€ν•œ κΆŒν•œ μ˜ˆμ™Έλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. μ—­ν•  기반 κΆŒν•œκ³Ό λ³„λ„λ‘œ κ°œλ³„ μ‚¬μš©μžλ₯Ό ν—ˆμš©ν•˜κ±°λ‚˜ 차단할 수 μžˆμŠ΅λ‹ˆλ‹€. 이미 λ“±λ‘λœ μ‚¬μš©μžμ˜ 경우 isAllowed 값이 μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.

POST /api/boards/:_id/permission/:type/exceptions

κΆŒν•œ: admin λ˜λŠ” manager (isAdManager)

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

νŒŒλΌλ―Έν„° νƒ€μž… μ„€λͺ…
_id string κ²Œμ‹œνŒ _id
type string κΆŒν•œ μœ ν˜•: read, write, comment

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

ν•„λ“œ νƒ€μž… ν•„μˆ˜ μ„€λͺ…
user string O μ‚¬μš©μž _id
userId string O μ‚¬μš©μž 둜그인 ID
userName string O μ‚¬μš©μž 이름
isAllowed boolean O ν—ˆμš© μ—¬λΆ€ (true: μ˜ˆμ™Έ ν—ˆμš©, false: μ˜ˆμ™Έ 차단)

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

{
  "user": "507f1f77bcf86cd799439044",
  "userId": "student01",
  "userName": "홍길동",
  "isAllowed": true
}

응닡 (200)

{
  "board": {
    "_id": "507f1f77bcf86cd799439023",
    "permissionWrite": {
      "manager": true,
      "teacher": true,
      "student": false,
      "exceptions": [
        {
          "user": "507f1f77bcf86cd799439044",
          "userId": "student01",
          "userName": "홍길동",
          "isAllowed": true
        }
      ]
    }
  }
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 FIELD_REQUIRED({ν•„λ“œλͺ…}) ν•„μˆ˜ ν•„λ“œ λˆ„λ½ (user, userId, userName, isAllowed)
400 Invalid permission type 잘λͺ»λœ κΆŒν•œ μœ ν˜•
404 __NOT_FOUND(board) κ²Œμ‹œνŒμ„ 찾을 수 μ—†μŒ

κ²Œμ‹œνŒ κΆŒν•œ μ˜ˆμ™Έ μ‚­μ œ

νŠΉμ • μ‚¬μš©μžμ— λŒ€ν•œ κΆŒν•œ μ˜ˆμ™Έλ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.

DELETE /api/boards/:_id/permission/:type/exceptions?userId={userId}

κΆŒν•œ: admin λ˜λŠ” manager (isAdManager)

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

νŒŒλΌλ―Έν„° νƒ€μž… μ„€λͺ…
_id string κ²Œμ‹œνŒ _id
type string κΆŒν•œ μœ ν˜•: read, write, comment

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

νŒŒλΌλ―Έν„° νƒ€μž… ν•„μˆ˜ μ„€λͺ…
userId string O μ‚­μ œν•  μ‚¬μš©μžμ˜ 둜그인 ID

응닡 (200)

{
  "board": {
    "_id": "507f1f77bcf86cd799439023",
    "permissionWrite": {
      "manager": true,
      "teacher": true,
      "student": false,
      "exceptions": []
    }
  }
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 FIELD_REQUIRED(userId) userId νŒŒλΌλ―Έν„° λˆ„λ½
400 Invalid permission type 잘λͺ»λœ κΆŒν•œ μœ ν˜•
404 __NOT_FOUND(board) κ²Œμ‹œνŒμ„ 찾을 수 μ—†μŒ

κ²Œμ‹œνŒ μ‚­μ œ

κ²Œμ‹œνŒμ„ λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€ (μ†Œν”„νŠΈ μ‚­μ œ). κΈ°λ³Έ κ²Œμ‹œνŒ(곡지사항)은 μ‚­μ œν•  수 μ—†μŠ΅λ‹ˆλ‹€.

DELETE /api/boards/:_id

κΆŒν•œ: admin λ˜λŠ” manager (isAdManager)

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

νŒŒλΌλ―Έν„° νƒ€μž… μ„€λͺ…
_id string κ²Œμ‹œνŒ _id

응닡 (200)

{}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 κΈ°λ³Έ κ²Œμ‹œνŒμ€ μ‚­μ œν•  수 μ—†μŠ΅λ‹ˆλ‹€. κΈ°λ³Έ κ²Œμ‹œνŒ μ‚­μ œ μ‹œλ„
404 __NOT_FOUND(board) κ²Œμ‹œνŒμ„ 찾을 수 μ—†μŒ

μ°Έκ³ : μ‚­μ œλœ κ²Œμ‹œνŒμ€ isActive=false둜 μ„€μ •λ˜λ©°, κ²Œμ‹œνŒ λͺ©λ‘ 쑰회 μ‹œ λ°˜ν™˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


κ²Œμ‹œκΈ€ μž‘μ„±

κ²Œμ‹œκΈ€μ„ μž‘μ„±ν•©λ‹ˆλ‹€. μž‘μ„± μ‹œ λŒ€μƒ μ‚¬μš©μžμ—κ²Œ μžλ™μœΌλ‘œ μ•Œλ¦Όμ΄ λ°œμ†‘λ©λ‹ˆλ‹€ (μ΅œλŒ€ 100λͺ…).

POST /api/posts

κΆŒν•œ: 둜그인 (isLoggedIn) + κ²Œμ‹œνŒ μ“°κΈ° κΆŒν•œ

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

ν•„λ“œ νƒ€μž… ν•„μˆ˜ μ„€λͺ…
board string O κ²Œμ‹œνŒ _id
title string O 제λͺ©
content string O λ‚΄μš© (Markdown)
category string X μΉ΄ν…Œκ³ λ¦¬
attachments object[] X μ²¨λΆ€νŒŒμΌ λͺ©λ‘
attachments[].url string X 파일 URL
attachments[].fileName string X 파일λͺ…
attachments[].fileSize number X 파일 크기 (bytes)
attachments[].mimeType string X MIME νƒ€μž…
attachments[].key string X S3 ν‚€
targetAudience object X λŒ€μƒ μ§€μ • (κΈ°λ³Έ: { type: "all" })
targetAudience.type string X all, manager, teacher, student, custom
targetAudience.users object[] X custom인 경우 μ‚¬μš©μž λͺ©λ‘
targetAudience.grade number X ν•™λ…„ μ§€μ • (μ˜΅μ…˜)

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

{
  "board": "507f1f77bcf86cd799439022",
  "title": "3μ›” 학ꡐ 행사 μ•ˆλ‚΄",
  "content": "## 3μ›” 학ꡐ 행사\n\nλ‹€μŒκ³Ό 같이 행사가 μ§„ν–‰λ©λ‹ˆλ‹€.\n\n- 3/5 μž…ν•™μ‹\n- 3/15 ν•™λΆ€λͺ¨ 상담\n- 3/20 μ²΄μœ‘λŒ€νšŒ",
  "category": "행사",
  "attachments": [
    {
      "url": "https://s3.example.com/files/schedule.pdf",
      "fileName": "3μ›”_행사일정.pdf",
      "fileSize": 102400,
      "mimeType": "application/pdf",
      "key": "files/schedule.pdf"
    }
  ],
  "targetAudience": {
    "type": "all"
  }
}

응닡 (200)

{
  "post": {
    "_id": "507f1f77bcf86cd799439055",
    "board": "507f1f77bcf86cd799439022",
    "author": "507f1f77bcf86cd799439033",
    "authorId": "admin01",
    "authorName": "κ΄€λ¦¬μž",
    "authorProfile": "https://s3.example.com/profiles/admin01.jpg",
    "title": "3μ›” 학ꡐ 행사 μ•ˆλ‚΄",
    "content": "## 3μ›” 학ꡐ 행사\n\nλ‹€μŒκ³Ό 같이 행사가 μ§„ν–‰λ©λ‹ˆλ‹€.\n\n- 3/5 μž…ν•™μ‹\n- 3/15 ν•™λΆ€λͺ¨ 상담\n- 3/20 μ²΄μœ‘λŒ€νšŒ",
    "category": "행사",
    "isPinned": false,
    "isActive": true,
    "viewCount": 0,
    "attachments": [
      {
        "url": "https://s3.example.com/files/schedule.pdf",
        "fileName": "3μ›”_행사일정.pdf",
        "fileSize": 102400,
        "mimeType": "application/pdf",
        "key": "files/schedule.pdf"
      }
    ],
    "targetAudience": {
      "type": "all"
    },
    "createdAt": "2024-03-01T09:00:00.000Z",
    "updatedAt": "2024-03-01T09:00:00.000Z"
  }
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 FIELD_REQUIRED({ν•„λ“œλͺ…}) ν•„μˆ˜ ν•„λ“œ λˆ„λ½ (board, title, content)
403 PERMISSION_DENIED μ“°κΈ° κΆŒν•œ μ—†μŒ
404 __NOT_FOUND(board) κ²Œμ‹œνŒμ„ 찾을 수 μ—†μŒ

κ²Œμ‹œκΈ€ 쑰회

κ²Œμ‹œκΈ€μ„ 단일 λ˜λŠ” λͺ©λ‘μœΌλ‘œ μ‘°νšŒν•©λ‹ˆλ‹€. 단일 쑰회 μ‹œ μ‘°νšŒμˆ˜κ°€ 1 μ¦κ°€ν•©λ‹ˆλ‹€.

단일 쑰회

GET /api/posts/:_id

κΆŒν•œ: 둜그인 (isLoggedIn) + 읽기 κΆŒν•œ + targetAudience 확인

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

νŒŒλΌλ―Έν„° νƒ€μž… μ„€λͺ…
_id string κ²Œμ‹œκΈ€ _id

응닡 (200)

{
  "post": {
    "_id": "507f1f77bcf86cd799439055",
    "board": "507f1f77bcf86cd799439022",
    "author": "507f1f77bcf86cd799439033",
    "authorId": "admin01",
    "authorName": "κ΄€λ¦¬μž",
    "authorProfile": "https://s3.example.com/profiles/admin01.jpg",
    "title": "3μ›” 학ꡐ 행사 μ•ˆλ‚΄",
    "content": "## 3μ›” 학ꡐ 행사\n\nλ‹€μŒκ³Ό 같이 행사가 μ§„ν–‰λ©λ‹ˆλ‹€.",
    "category": "행사",
    "isPinned": false,
    "isActive": true,
    "viewCount": 16,
    "attachments": [],
    "targetAudience": { "type": "all" },
    "createdAt": "2024-03-01T09:00:00.000Z",
    "updatedAt": "2024-03-01T09:00:00.000Z"
  },
  "board": {
    "_id": "507f1f77bcf86cd799439022",
    "name": "곡지사항",
    "slug": "announcements"
  }
}

λͺ©λ‘ 쑰회

κ²Œμ‹œκΈ€ λͺ©λ‘μ„ μ»€μ„œ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜μœΌλ‘œ μ‘°νšŒν•©λ‹ˆλ‹€. κ³ μ •λœ κ²Œμ‹œκΈ€μ΄ λ¨Όμ € ν‘œμ‹œλ˜κ³ , 이후 μ΅œμ‹ μˆœμœΌλ‘œ μ •λ ¬λ©λ‹ˆλ‹€.

GET /api/posts?board={board._id}&limit={limit}&before={before}

κΆŒν•œ: 둜그인 (isLoggedIn) + 읽기 κΆŒν•œ

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

νŒŒλΌλ―Έν„° νƒ€μž… ν•„μˆ˜ μ„€λͺ…
board string O κ²Œμ‹œνŒ _id
limit number X νŽ˜μ΄μ§€ 크기 (κΈ°λ³Έ: 20)
before string X μ»€μ„œ (이전 νŽ˜μ΄μ§€μ˜ λ§ˆμ§€λ§‰ κ²Œμ‹œκΈ€ createdAt, ISO 8601)

응닡 (200)

{
  "posts": [
    {
      "_id": "507f1f77bcf86cd799439066",
      "board": "507f1f77bcf86cd799439022",
      "authorId": "admin01",
      "authorName": "κ΄€λ¦¬μž",
      "title": "[μ€‘μš”] 학사일정 λ³€κ²½ μ•ˆλ‚΄",
      "category": "곡지",
      "isPinned": true,
      "isActive": true,
      "viewCount": 120,
      "targetAudience": { "type": "all" },
      "createdAt": "2024-02-20T09:00:00.000Z"
    },
    {
      "_id": "507f1f77bcf86cd799439055",
      "board": "507f1f77bcf86cd799439022",
      "authorId": "teacher01",
      "authorName": "김선생",
      "title": "3μ›” 학ꡐ 행사 μ•ˆλ‚΄",
      "category": "행사",
      "isPinned": false,
      "isActive": true,
      "viewCount": 15,
      "targetAudience": { "type": "all" },
      "createdAt": "2024-03-01T09:00:00.000Z"
    }
  ],
  "board": {
    "_id": "507f1f77bcf86cd799439022",
    "name": "곡지사항"
  }
}

μ°Έκ³ : λͺ©λ‘ 쑰회 μ‹œ content ν•„λ“œλŠ” μ œμ™Έλ©λ‹ˆλ‹€. κΈ°λ³Έ κ²Œμ‹œνŒ(곡지사항)인 경우 κΈ°μ‘΄ μ•Œλ¦Ό(Notification)도 ν•¨κ»˜ λ°˜ν™˜λ©λ‹ˆλ‹€.

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 FIELD_REQUIRED(board) λͺ©λ‘ 쑰회 μ‹œ board νŒŒλΌλ―Έν„° λˆ„λ½
403 PERMISSION_DENIED 읽기 κΆŒν•œ μ—†μŒ λ˜λŠ” targetAudience λŒ€μƒ μ•„λ‹˜
404 __NOT_FOUND(post) κ²Œμ‹œκΈ€μ„ 찾을 수 μ—†μŒ
404 __NOT_FOUND(board) κ²Œμ‹œνŒμ„ 찾을 수 μ—†μŒ

κ²Œμ‹œκΈ€ μˆ˜μ •

κ²Œμ‹œκΈ€μ„ μˆ˜μ •ν•©λ‹ˆλ‹€. μž‘μ„±μž 본인 λ˜λŠ” κ΄€λ¦¬μž(admin, manager)만 μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

PUT /api/posts/:_id

κΆŒν•œ: 둜그인 (isLoggedIn), μž‘μ„±μž λ˜λŠ” κ΄€λ¦¬μž

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

νŒŒλΌλ―Έν„° νƒ€μž… μ„€λͺ…
_id string κ²Œμ‹œκΈ€ _id

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

ν•„λ“œ νƒ€μž… ν•„μˆ˜ μ„€λͺ…
title string X 제λͺ©
content string X λ‚΄μš© (Markdown)
category string X μΉ΄ν…Œκ³ λ¦¬
attachments object[] X μ²¨λΆ€νŒŒμΌ λͺ©λ‘
targetAudience object X λŒ€μƒ μ§€μ •

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

{
  "title": "3μ›” 학ꡐ 행사 μ•ˆλ‚΄ (μˆ˜μ •)",
  "content": "## 3μ›” 학ꡐ 행사 (μˆ˜μ •)\n\n일정이 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.",
  "category": "행사"
}

응닡 (200)

{
  "post": {
    "_id": "507f1f77bcf86cd799439055",
    "title": "3μ›” 학ꡐ 행사 μ•ˆλ‚΄ (μˆ˜μ •)",
    "content": "## 3μ›” 학ꡐ 행사 (μˆ˜μ •)\n\n일정이 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.",
    "category": "행사",
    "updatedAt": "2024-03-02T10:00:00.000Z"
  }
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
403 PERMISSION_DENIED μž‘μ„±μžλ„ μ•„λ‹ˆκ³  κ΄€λ¦¬μžλ„ μ•„λ‹˜
404 __NOT_FOUND(post) κ²Œμ‹œκΈ€μ„ 찾을 수 μ—†μŒ

κ²Œμ‹œκΈ€ κ³ μ •

κ²Œμ‹œκΈ€μ„ 상단에 κ³ μ •ν•˜κ±°λ‚˜ ν•΄μ œν•©λ‹ˆλ‹€. κ³ μ •λœ κ²Œμ‹œκΈ€μ€ λͺ©λ‘ 쑰회 μ‹œ 항상 λ¨Όμ € ν‘œμ‹œλ©λ‹ˆλ‹€.

PUT /api/posts/:_id/pin

κΆŒν•œ: admin λ˜λŠ” manager (isAdManager)

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

νŒŒλΌλ―Έν„° νƒ€μž… μ„€λͺ…
_id string κ²Œμ‹œκΈ€ _id

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

ν•„λ“œ νƒ€μž… ν•„μˆ˜ μ„€λͺ…
isPinned boolean O true(κ³ μ •) / false(ν•΄μ œ)

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

{
  "isPinned": true
}

응닡 (200)

{
  "post": {
    "_id": "507f1f77bcf86cd799439055",
    "isPinned": true,
    "updatedAt": "2024-03-02T10:00:00.000Z"
  }
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 FIELD_REQUIRED(isPinned) isPinned ν•„λ“œ λˆ„λ½
404 __NOT_FOUND(post) κ²Œμ‹œκΈ€μ„ 찾을 수 μ—†μŒ

κ²Œμ‹œκΈ€ μ‚­μ œ

κ²Œμ‹œκΈ€μ„ λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€ (μ†Œν”„νŠΈ μ‚­μ œ). μž‘μ„±μž 본인 λ˜λŠ” κ΄€λ¦¬μž(admin, manager)만 μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‚­μ œ μ‹œ κ²Œμ‹œνŒμ˜ postCountκ°€ κ°μ†Œν•©λ‹ˆλ‹€.

DELETE /api/posts/:_id

κΆŒν•œ: 둜그인 (isLoggedIn), μž‘μ„±μž λ˜λŠ” κ΄€λ¦¬μž

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

νŒŒλΌλ―Έν„° νƒ€μž… μ„€λͺ…
_id string κ²Œμ‹œκΈ€ _id

응닡 (200)

{}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
403 PERMISSION_DENIED μž‘μ„±μžλ„ μ•„λ‹ˆκ³  κ΄€λ¦¬μžλ„ μ•„λ‹˜
404 __NOT_FOUND(post) κ²Œμ‹œκΈ€μ„ 찾을 수 μ—†μŒ

μ°Έκ³ : λ ˆκ±°μ‹œ μ•Œλ¦Ό(Notification)인 κ²½μš°μ—λŠ” μ†Œν”„νŠΈ μ‚­μ œκ°€ μ•„λ‹Œ μ‹€μ œ μ‚­μ œ(deleteOne)κ°€ μˆ˜ν–‰λ©λ‹ˆλ‹€.


λŒ“κΈ€ μž‘μ„±

κ²Œμ‹œκΈ€μ— λŒ“κΈ€μ„ μž‘μ„±ν•©λ‹ˆλ‹€. parentCommentλ₯Ό μ§€μ •ν•˜λ©΄ λŒ€λŒ“κΈ€(λ‹΅κΈ€)둜 μž‘μ„±λ©λ‹ˆλ‹€. λΆ€λͺ¨ λŒ“κΈ€μ€ 같은 κ²Œμ‹œκΈ€μ— 속해야 ν•©λ‹ˆλ‹€.

POST /api/comments

κΆŒν•œ: 둜그인 (isLoggedIn) + κ²Œμ‹œνŒ λŒ“κΈ€ κΆŒν•œ

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

ν•„λ“œ νƒ€μž… ν•„μˆ˜ μ„€λͺ…
post string O κ²Œμ‹œκΈ€ _id
content string O λŒ“κΈ€ λ‚΄μš©
parentComment string X λΆ€λͺ¨ λŒ“κΈ€ _id (λŒ€λŒ“κΈ€μΈ 경우)

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

{
  "post": "507f1f77bcf86cd799439055",
  "content": "행사 일정 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€!"
}

λŒ€λŒ“κΈ€ μš”μ²­ μ˜ˆμ‹œ

{
  "post": "507f1f77bcf86cd799439055",
  "content": "저도 μ°Έμ„ν•˜κ² μŠ΅λ‹ˆλ‹€.",
  "parentComment": "507f1f77bcf86cd799439077"
}

응닡 (200)

{
  "comment": {
    "_id": "507f1f77bcf86cd799439077",
    "post": "507f1f77bcf86cd799439055",
    "author": "507f1f77bcf86cd799439044",
    "authorId": "teacher01",
    "authorName": "김선생",
    "authorProfile": "https://s3.example.com/profiles/teacher01.jpg",
    "content": "행사 일정 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€!",
    "parentComment": null,
    "isActive": true,
    "createdAt": "2024-03-01T10:30:00.000Z",
    "updatedAt": "2024-03-01T10:30:00.000Z"
  }
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 FIELD_REQUIRED({ν•„λ“œλͺ…}) ν•„μˆ˜ ν•„λ“œ λˆ„λ½ (post, content)
400 Parent comment is not in the same post λΆ€λͺ¨ λŒ“κΈ€μ΄ λ‹€λ₯Έ κ²Œμ‹œκΈ€μ— 속함
403 PERMISSION_DENIED λŒ“κΈ€ μž‘μ„± κΆŒν•œ μ—†μŒ
404 __NOT_FOUND(post) κ²Œμ‹œκΈ€μ„ 찾을 수 μ—†μŒ
404 __NOT_FOUND(board) κ²Œμ‹œνŒμ„ 찾을 수 μ—†μŒ
404 __NOT_FOUND(parentComment) λΆ€λͺ¨ λŒ“κΈ€μ„ 찾을 수 μ—†μŒ

λŒ“κΈ€ λͺ©λ‘ 쑰회

νŠΉμ • κ²Œμ‹œκΈ€μ˜ λŒ“κΈ€ λͺ©λ‘μ„ μ‘°νšŒν•©λ‹ˆλ‹€. μž‘μ„± μ‹œκ°„ μ˜€λ¦„μ°¨μˆœ(였래된 순)으둜 μ •λ ¬λ©λ‹ˆλ‹€.

GET /api/comments?post={post._id}

κΆŒν•œ: 둜그인 (isLoggedIn) + κ²Œμ‹œνŒ 읽기 κΆŒν•œ

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

νŒŒλΌλ―Έν„° νƒ€μž… ν•„μˆ˜ μ„€λͺ…
post string O κ²Œμ‹œκΈ€ _id

응닡 (200)

{
  "comments": [
    {
      "_id": "507f1f77bcf86cd799439077",
      "post": "507f1f77bcf86cd799439055",
      "author": "507f1f77bcf86cd799439044",
      "authorId": "teacher01",
      "authorName": "김선생",
      "authorProfile": "https://s3.example.com/profiles/teacher01.jpg",
      "content": "행사 일정 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€!",
      "parentComment": null,
      "isActive": true,
      "createdAt": "2024-03-01T10:30:00.000Z",
      "updatedAt": "2024-03-01T10:30:00.000Z"
    },
    {
      "_id": "507f1f77bcf86cd799439078",
      "post": "507f1f77bcf86cd799439055",
      "author": "507f1f77bcf86cd799439045",
      "authorId": "student01",
      "authorName": "홍길동",
      "content": "저도 μ°Έμ„ν•˜κ² μŠ΅λ‹ˆλ‹€.",
      "parentComment": "507f1f77bcf86cd799439077",
      "isActive": true,
      "createdAt": "2024-03-01T11:00:00.000Z",
      "updatedAt": "2024-03-01T11:00:00.000Z"
    }
  ]
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
400 FIELD_REQUIRED(post) post νŒŒλΌλ―Έν„° λˆ„λ½
403 PERMISSION_DENIED 읽기 κΆŒν•œ μ—†μŒ
404 __NOT_FOUND(post) κ²Œμ‹œκΈ€μ„ 찾을 수 μ—†μŒ
404 __NOT_FOUND(board) κ²Œμ‹œνŒμ„ 찾을 수 μ—†μŒ

λŒ“κΈ€ μˆ˜μ •

λŒ“κΈ€μ„ μˆ˜μ •ν•©λ‹ˆλ‹€. μž‘μ„±μž 본인 λ˜λŠ” κ΄€λ¦¬μž(admin, manager)만 μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

PUT /api/comments/:_id

κΆŒν•œ: 둜그인 (isLoggedIn), μž‘μ„±μž λ˜λŠ” κ΄€λ¦¬μž

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

νŒŒλΌλ―Έν„° νƒ€μž… μ„€λͺ…
_id string λŒ“κΈ€ _id

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

ν•„λ“œ νƒ€μž… ν•„μˆ˜ μ„€λͺ…
content string X λŒ“κΈ€ λ‚΄μš©

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

{
  "content": "행사 일정 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. μˆ˜μ •λœ 일정 반영 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€."
}

응닡 (200)

{
  "comment": {
    "_id": "507f1f77bcf86cd799439077",
    "content": "행사 일정 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. μˆ˜μ •λœ 일정 반영 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.",
    "updatedAt": "2024-03-01T12:00:00.000Z"
  }
}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
403 PERMISSION_DENIED μž‘μ„±μžλ„ μ•„λ‹ˆκ³  κ΄€λ¦¬μžλ„ μ•„λ‹˜
404 __NOT_FOUND(comment) λŒ“κΈ€μ„ 찾을 수 μ—†μŒ

λŒ“κΈ€ μ‚­μ œ

λŒ“κΈ€μ„ λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€ (μ†Œν”„νŠΈ μ‚­μ œ). μž‘μ„±μž 본인 λ˜λŠ” κ΄€λ¦¬μž(admin, manager)만 μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

DELETE /api/comments/:_id

κΆŒν•œ: 둜그인 (isLoggedIn), μž‘μ„±μž λ˜λŠ” κ΄€λ¦¬μž

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

νŒŒλΌλ―Έν„° νƒ€μž… μ„€λͺ…
_id string λŒ“κΈ€ _id

응닡 (200)

{}

μ—λŸ¬ 응닡

μƒνƒœ μ½”λ“œ λ©”μ‹œμ§€ μ„€λͺ…
403 PERMISSION_DENIED μž‘μ„±μžλ„ μ•„λ‹ˆκ³  κ΄€λ¦¬μžλ„ μ•„λ‹˜
404 __NOT_FOUND(comment) λŒ“κΈ€μ„ 찾을 수 μ—†μŒ

μ£Όμš” κ°œλ…

κΆŒν•œ μ‹œμŠ€ν…œ

κ²Œμ‹œνŒμ€ μ—­ν•  기반 κΆŒν•œ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•©λ‹ˆλ‹€. 각 κ²Œμ‹œνŒμ— λŒ€ν•΄ 읽기(read), μ“°κΈ°(write), λŒ“κΈ€(comment) κΆŒν•œμ„ μ—­ν• λ³„λ‘œ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ—­ν•  μ„€λͺ…
manager κ΄€λ¦¬μž (학ꡐ λ§€λ‹ˆμ €)
teacher ꡐ사
student 학생
  • admin κΆŒν•œμ„ κ°€μ§„ μ‚¬μš©μžλŠ” λͺ¨λ“  κ²Œμ‹œνŒμ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • exceptions 배열을 톡해 νŠΉμ • μ‚¬μš©μžμ— λŒ€ν•œ μ˜ˆμ™Έλ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€ (isAllowed: trueλŠ” μ˜ˆμ™Έ ν—ˆμš©, falseλŠ” μ˜ˆμ™Έ 차단).

targetAudience (λŒ€μƒ μ§€μ •)

κ²Œμ‹œκΈ€ μž‘μ„± μ‹œ μ—΄λžŒ λŒ€μƒμ„ μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

νƒ€μž… μ„€λͺ…
all 전체 곡개 (κΈ°λ³Έκ°’)
manager κ΄€λ¦¬μžλ§Œ
teacher κ΅μ‚¬λ§Œ
student ν•™μƒλ§Œ
custom νŠΉμ • μ‚¬μš©μž μ§€μ • (users λ°°μ—΄ ν•„μˆ˜)

μ†Œν”„νŠΈ μ‚­μ œ

λͺ¨λ“  μ‚­μ œ μž‘μ—…μ€ μ†Œν”„νŠΈ μ‚­μ œ(isActive=false)둜 μ²˜λ¦¬λ©λ‹ˆλ‹€. μ‚­μ œλœ λ°μ΄ν„°λŠ” λͺ©λ‘ μ‘°νšŒμ—μ„œ μ œμ™Έλ˜μ§€λ§Œ λ°μ΄ν„°λ² μ΄μŠ€μ—λŠ” μœ μ§€λ©λ‹ˆλ‹€.

κΈ°λ³Έ κ²Œμ‹œνŒ (곡지사항)

ν•™κ΅λ³„λ‘œ ν•˜λ‚˜μ˜ κΈ°λ³Έ κ²Œμ‹œνŒ(곡지사항)이 μžλ™ μƒμ„±λ©λ‹ˆλ‹€. κΈ°λ³Έ κ²Œμ‹œνŒμ€ λ‹€μŒ νŠΉμ„±μ„ κ°–μŠ΅λ‹ˆλ‹€:

  • isDefault: true
  • 이름 λ³€κ²½ λΆˆκ°€
  • μ‚­μ œ λΆˆκ°€
  • κΈ°μ‘΄ μ•Œλ¦Ό(Notification)도 κ²Œμ‹œκΈ€λ‘œ ν•¨κ»˜ ν‘œμ‹œ (λ ˆκ±°μ‹œ 지원)

μ»€μ„œ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜

κ²Œμ‹œκΈ€ λͺ©λ‘μ€ μ»€μ„œ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. before νŒŒλΌλ―Έν„°μ— 이전 νŽ˜μ΄μ§€ λ§ˆμ§€λ§‰ κ²Œμ‹œκΈ€μ˜ createdAt 값을 μ „λ‹¬ν•˜λ©΄ ν•΄λ‹Ή μ‹œμ  μ΄μ „μ˜ κ²Œμ‹œκΈ€μ„ μ‘°νšŒν•©λ‹ˆλ‹€.


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

BoardAPI

ν•¨μˆ˜λͺ… λ©”μ„œλ“œ 경둜 μ„€λͺ…
CBoard POST /api/boards κ²Œμ‹œνŒ 생성
RBoards GET /api/boards?school= κ²Œμ‹œνŒ λͺ©λ‘ 쑰회
RBoard GET /api/boards/:_id κ²Œμ‹œνŒ 단일 쑰회
UBoard PUT /api/boards/:_id κ²Œμ‹œνŒ μˆ˜μ •
UBoardPermission PUT /api/boards/:_id/permission/:type κ²Œμ‹œνŒ κΆŒν•œ μˆ˜μ •
CBoardPermissionException POST /api/boards/:_id/permission/:type/exceptions κΆŒν•œ μ˜ˆμ™Έ μΆ”κ°€
DBoardPermissionException DELETE /api/boards/:_id/permission/:type/exceptions κΆŒν•œ μ˜ˆμ™Έ μ‚­μ œ
DBoard DELETE /api/boards/:_id κ²Œμ‹œνŒ μ‚­μ œ

PostAPI

ν•¨μˆ˜λͺ… λ©”μ„œλ“œ 경둜 μ„€λͺ…
CPost POST /api/posts κ²Œμ‹œκΈ€ μž‘μ„±
RPosts GET /api/posts?board=&limit=&before= κ²Œμ‹œκΈ€ λͺ©λ‘ 쑰회
RPost GET /api/posts/:_id κ²Œμ‹œκΈ€ 단일 쑰회
UPost PUT /api/posts/:_id κ²Œμ‹œκΈ€ μˆ˜μ •
UPostPin PUT /api/posts/:_id/pin κ²Œμ‹œκΈ€ κ³ μ •/ν•΄μ œ
DPost DELETE /api/posts/:_id κ²Œμ‹œκΈ€ μ‚­μ œ

CommentAPI

ν•¨μˆ˜λͺ… λ©”μ„œλ“œ 경둜 μ„€λͺ…
CComment POST /api/comments λŒ“κΈ€ μž‘μ„±
RComments GET /api/comments?post= λŒ“κΈ€ λͺ©λ‘ 쑰회
UComment PUT /api/comments/:_id λŒ“κΈ€ μˆ˜μ •
DComment DELETE /api/comments/:_id λŒ“κΈ€ μ‚­μ œ