Skip to content

Latest commit

ย 

History

History
574 lines (414 loc) ยท 12.2 KB

File metadata and controls

574 lines (414 loc) ยท 12.2 KB

์‚ฌ์šฉ์ž API

์‚ฌ์šฉ์ž ์ธ์ฆ(๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ) ๋ฐ ์‚ฌ์šฉ์ž ๊ณ„์ • ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” API์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์•„์นด๋ฐ๋ฏธ ๋‚ด์—์„œ owner, admin, manager, member ๋“ฑ๊ธ‰์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

๋ผ์šฐํŠธ ํŒŒ์ผ: backend/src/routes/users.js ์ปจํŠธ๋กค๋Ÿฌ ํŒŒ์ผ: backend/src/controllers/users.js ๋ชจ๋ธ ํŒŒ์ผ: backend/src/models/User.js


์—”๋“œํฌ์ธํŠธ ์š”์•ฝ

๋ฉ”์„œ๋“œ ๊ฒฝ๋กœ ์„ค๋ช… ๊ถŒํ•œ
POST /api/users/login/local ๋กœ์ปฌ ๋กœ๊ทธ์ธ ๋น„์ธ์ฆ
POST /api/users/login/google Google ๋กœ๊ทธ์ธ ๋น„์ธ์ฆ
GET /api/users/logout ๋กœ๊ทธ์•„์›ƒ isLoggedIn
POST /api/users ์‚ฌ์šฉ์ž ์ƒ์„ฑ owner|admin
GET /api/users ์‚ฌ์šฉ์ž ๋ชฉ๋ก ์กฐํšŒ isLoggedIn
GET /api/users/current ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ •๋ณด isLoggedIn
GET /api/users/:_id ์‚ฌ์šฉ์ž ์ƒ์„ธ ์กฐํšŒ isLoggedIn
GET /api/users/:_id/profile ํ”„๋กœํ•„ ์กฐํšŒ isLoggedIn
PUT /api/users/profile ํ”„๋กœํ•„ ์ˆ˜์ • isLoggedIn
PUT /api/users/:_id/password ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ isLoggedIn
PUT /api/users/:_id/email ์ด๋ฉ”์ผ ๋ณ€๊ฒฝ isLoggedIn
PUT /api/users/:_id/tel ์ „ํ™”๋ฒˆํ˜ธ ๋ณ€๊ฒฝ isLoggedIn
PUT /api/users/:_id/userName ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋ณ€๊ฒฝ isLoggedIn
PUT /api/users/:_id/auth ๊ถŒํ•œ ๋“ฑ๊ธ‰ ๋ณ€๊ฒฝ owner|admin
PUT /api/users/:_id/google Google ๊ณ„์ • ์—ฐ๊ฒฐ admin
DELETE /api/users/:_id/google Google ๊ณ„์ • ํ•ด์ œ admin
POST /api/users/:_id/schools ํ•™๊ต ๋“ฑ๋ก admin
DELETE /api/users/:_id/schools ํ•™๊ต ๋“ฑ๋ก ํ•ด์ œ admin
DELETE /api/users/:_id ์‚ฌ์šฉ์ž ์‚ญ์ œ admin

์ธ์ฆ

๋กœ์ปฌ ๋กœ๊ทธ์ธ

์•„์นด๋ฐ๋ฏธ ID, ์‚ฌ์šฉ์ž ID, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

POST /api/users/login/local

๊ถŒํ•œ: ๋น„์ธ์ฆ (๋กœ๊ทธ์ธ ์ƒํƒœ์ด๋ฉด ๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ ํ›„ ์ง„ํ–‰)

์š”์ฒญ ๋ณธ๋ฌธ

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
academyId string O ์•„์นด๋ฐ๋ฏธ ID
userId string O ์‚ฌ์šฉ์ž ID
password string O ๋น„๋ฐ€๋ฒˆํ˜ธ

์š”์ฒญ ์˜ˆ์‹œ

{
  "academyId": "my-academy",
  "userId": "user01",
  "password": "mypassword123"
}

์‘๋‹ต (200)

{
  "user": {
    "_id": "507f1f77bcf86cd799439011",
    "userId": "user01",
    "userName": "ํ™๊ธธ๋™",
    "auth": "member",
    "email": "user01@example.com",
    "tel": "010-1234-5678",
    "academyId": "my-academy",
    "academyName": "๋‚˜์˜ ์•„์นด๋ฐ๋ฏธ",
    "schools": [
      {
        "school": "507f1f77bcf86cd799439012",
        "schoolId": "school01",
        "schoolName": "ํ…Œ์ŠคํŠธ ํ•™๊ต"
      }
    ],
    "snsId": {},
    "profile": "/uploads/profiles/user01.jpg"
  }
}

์—๋Ÿฌ ์‘๋‹ต

์ƒํƒœ ์ฝ”๋“œ ๋ฉ”์‹œ์ง€ ์„ค๋ช…
400 FIELD_REQUIRED(...) ํ•„์ˆ˜ ํ•„๋“œ ๋ˆ„๋ฝ
401 LOGIN_FAILED ๋กœ๊ทธ์ธ ์‹คํŒจ (ID ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถˆ์ผ์น˜)
403 ACADEMY_INACTIVATED ๋น„ํ™œ์„ฑํ™”๋œ ์•„์นด๋ฐ๋ฏธ

Google ๋กœ๊ทธ์ธ

Google OAuth๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ „์— ์‚ฌ์šฉ์ž ๊ณ„์ •์— Google ๊ณ„์ •์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

POST /api/users/login/google

๊ถŒํ•œ: ๋น„์ธ์ฆ

์š”์ฒญ ๋ณธ๋ฌธ

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
academyId string O ์•„์นด๋ฐ๋ฏธ ID
credential string O Google OAuth ์ธ์ฆ ํ† ํฐ

๋กœ๊ทธ์•„์›ƒ

ํ˜„์žฌ ์„ธ์…˜์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

GET /api/users/logout

๊ถŒํ•œ: isLoggedIn

์‘๋‹ต (200)

{}

ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ •๋ณด (RMySelf)

๋กœ๊ทธ์ธ๋œ ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

GET /api/users/current

๊ถŒํ•œ: isLoggedIn

์‘๋‹ต (200)

{
  "user": {
    "_id": "507f1f77bcf86cd799439011",
    "userId": "user01",
    "userName": "ํ™๊ธธ๋™",
    "auth": "member",
    "email": "user01@example.com",
    "tel": "010-1234-5678",
    "academyId": "my-academy",
    "academyName": "๋‚˜์˜ ์•„์นด๋ฐ๋ฏธ",
    "schools": [
      {
        "school": "507f1f77bcf86cd799439012",
        "schoolId": "school01",
        "schoolName": "ํ…Œ์ŠคํŠธ ํ•™๊ต"
      }
    ],
    "snsId": {
      "google": "user01@gmail.com"
    },
    "profile": "/uploads/profiles/user01.jpg"
  }
}

์‚ฌ์šฉ์ž ์ƒ์„ฑ

์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์ž๋™ ์ƒ์„ฑ๋˜์–ด ์‘๋‹ต์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

POST /api/users

๊ถŒํ•œ: owner ๋˜๋Š” admin

์š”์ฒญ ๋ณธ๋ฌธ

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
userId string O ์‚ฌ์šฉ์ž ๊ณ ์œ  ID
userName string O ์‚ฌ์šฉ์ž ์ด๋ฆ„
auth string X ๊ถŒํ•œ ๋“ฑ๊ธ‰ (admin, manager, member). ๊ธฐ๋ณธ๊ฐ’: member
email string X ์ด๋ฉ”์ผ
tel string X ์ „ํ™”๋ฒˆํ˜ธ
schools object[] X ๋“ฑ๋กํ•  ํ•™๊ต ๋ชฉ๋ก

์š”์ฒญ ์˜ˆ์‹œ

{
  "userId": "newuser01",
  "userName": "๊น€์‹ ์ž…",
  "auth": "member",
  "email": "newuser@example.com"
}

์‘๋‹ต (200)

{
  "user": {
    "_id": "507f1f77bcf86cd799439013",
    "userId": "newuser01",
    "userName": "๊น€์‹ ์ž…",
    "auth": "member",
    "password": "์ž๋™์ƒ์„ฑ๋œ๋น„๋ฐ€๋ฒˆํ˜ธ",
    "academyId": "my-academy",
    "academyName": "๋‚˜์˜ ์•„์นด๋ฐ๋ฏธ"
  }
}

์—๋Ÿฌ ์‘๋‹ต

์ƒํƒœ ์ฝ”๋“œ ๋ฉ”์‹œ์ง€ ์„ค๋ช…
400 FIELD_REQUIRED(...) ํ•„์ˆ˜ ํ•„๋“œ ๋ˆ„๋ฝ
400 FIELD_INVALID(...) ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์‹คํŒจ
409 FIELD_IN_USE(userId) ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ธ ์‚ฌ์šฉ์ž ID

์‚ฌ์šฉ์ž ๋ชฉ๋ก ์กฐํšŒ

์•„์นด๋ฐ๋ฏธ ๋‚ด์˜ ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

GET /api/users

๊ถŒํ•œ: isLoggedIn

์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
userId string X ์‚ฌ์šฉ์ž ID๋กœ ํ•„ํ„ฐ๋ง
userName string X ์‚ฌ์šฉ์ž ์ด๋ฆ„์œผ๋กœ ํ•„ํ„ฐ๋ง
auth string X ๊ถŒํ•œ ๋“ฑ๊ธ‰์œผ๋กœ ํ•„ํ„ฐ๋ง

์‘๋‹ต (200)

{
  "users": [
    {
      "_id": "507f1f77bcf86cd799439011",
      "userId": "user01",
      "userName": "ํ™๊ธธ๋™",
      "auth": "member",
      "email": "user01@example.com",
      "schools": [
        {
          "school": "507f1f77bcf86cd799439012",
          "schoolId": "school01",
          "schoolName": "ํ…Œ์ŠคํŠธ ํ•™๊ต"
        }
      ]
    }
  ]
}

์ฐธ๊ณ : password ํ•„๋“œ๋Š” ์Šคํ‚ค๋งˆ ๋ ˆ๋ฒจ์—์„œ select: false๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด ์กฐํšŒ ์‘๋‹ต์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


์‚ฌ์šฉ์ž ์ƒ์„ธ ์กฐํšŒ

ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

GET /api/users/:_id

๊ถŒํ•œ: isLoggedIn

๊ฒฝ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ์„ค๋ช…
_id string ์‚ฌ์šฉ์ž ObjectId

์‘๋‹ต (200)

{
  "user": {
    "_id": "507f1f77bcf86cd799439011",
    "userId": "user01",
    "userName": "ํ™๊ธธ๋™",
    "auth": "member",
    "email": "user01@example.com",
    "tel": "010-1234-5678",
    "schools": [...],
    "snsId": { "google": "user01@gmail.com" },
    "profile": "/uploads/profiles/user01.jpg"
  }
}

ํ”„๋กœํ•„ ์กฐํšŒ

GET /api/users/:_id/profile

๊ถŒํ•œ: isLoggedIn


ํ”„๋กœํ•„ ์ˆ˜์ •

ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž์˜ ํ”„๋กœํ•„(์‚ฌ์ง„)์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

PUT /api/users/profile

๊ถŒํ•œ: isLoggedIn


๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ

์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋ณธ์ธ ๋˜๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PUT /api/users/:_id/password

๊ถŒํ•œ: isLoggedIn

๊ฒฝ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ์„ค๋ช…
_id string ์‚ฌ์šฉ์ž ObjectId

์š”์ฒญ ๋ณธ๋ฌธ

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
password string O ํ˜„์žฌ ๋น„๋ฐ€๋ฒˆํ˜ธ (๋ณธ์ธ ๋ณ€๊ฒฝ ์‹œ)
newPassword string O ์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ

์š”์ฒญ ์˜ˆ์‹œ

{
  "password": "ํ˜„์žฌ๋น„๋ฐ€๋ฒˆํ˜ธ",
  "newPassword": "์ƒˆ๋น„๋ฐ€๋ฒˆํ˜ธ123"
}

์‘๋‹ต (200)

{}

์—๋Ÿฌ ์‘๋‹ต

์ƒํƒœ ์ฝ”๋“œ ๋ฉ”์‹œ์ง€ ์„ค๋ช…
400 FIELD_REQUIRED(...) ํ•„์ˆ˜ ํ•„๋“œ ๋ˆ„๋ฝ
401 PASSWORD_INCORRECT ํ˜„์žฌ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถˆ์ผ์น˜

์ฐธ๊ณ : ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” bcrypt๋กœ ํ•ด์‹œํ™”๋˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. API ์‘๋‹ต์— ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


์ด๋ฉ”์ผ ๋ณ€๊ฒฝ

PUT /api/users/:_id/email

๊ถŒํ•œ: isLoggedIn

์š”์ฒญ ๋ณธ๋ฌธ

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
email string X ์ƒˆ ์ด๋ฉ”์ผ ์ฃผ์†Œ

์ „ํ™”๋ฒˆํ˜ธ ๋ณ€๊ฒฝ

PUT /api/users/:_id/tel

๊ถŒํ•œ: isLoggedIn

์š”์ฒญ ๋ณธ๋ฌธ

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
tel string X ์ƒˆ ์ „ํ™”๋ฒˆํ˜ธ

์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋ณ€๊ฒฝ

PUT /api/users/:_id/userName

๊ถŒํ•œ: isLoggedIn

์š”์ฒญ ๋ณธ๋ฌธ

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
userName string O ์ƒˆ ์‚ฌ์šฉ์ž ์ด๋ฆ„

๊ถŒํ•œ ๋“ฑ๊ธ‰ ๋ณ€๊ฒฝ

์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ๋“ฑ๊ธ‰์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

PUT /api/users/:_id/auth

๊ถŒํ•œ: owner ๋˜๋Š” admin

์š”์ฒญ ๋ณธ๋ฌธ

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
auth string O ์ƒˆ ๊ถŒํ•œ ๋“ฑ๊ธ‰ (admin, manager, member)

์š”์ฒญ ์˜ˆ์‹œ

{
  "auth": "manager"
}

Google ๊ณ„์ • ๊ด€๋ฆฌ

Google ๊ณ„์ • ์—ฐ๊ฒฐ

์‚ฌ์šฉ์ž ๊ณ„์ •์— Google ์ด๋ฉ”์ผ์„ ์—ฐ๊ฒฐํ•˜์—ฌ Google ๋กœ๊ทธ์ธ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

PUT /api/users/:_id/google

๊ถŒํ•œ: admin

์š”์ฒญ ๋ณธ๋ฌธ

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
email string O ์—ฐ๊ฒฐํ•  Google ์ด๋ฉ”์ผ

Google ๊ณ„์ • ์—ฐ๊ฒฐ ํ•ด์ œ

DELETE /api/users/:_id/google

๊ถŒํ•œ: admin


ํ•™๊ต ๋“ฑ๋ก/ํ•ด์ œ

ํ•™๊ต ๋“ฑ๋ก

์‚ฌ์šฉ์ž๋ฅผ ํŠน์ • ํ•™๊ต์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

POST /api/users/:_id/schools

๊ถŒํ•œ: admin

์š”์ฒญ ๋ณธ๋ฌธ

ํ•„๋“œ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
school string O ํ•™๊ต ObjectId
schoolId string O ํ•™๊ต ID
schoolName string O ํ•™๊ต ์ด๋ฆ„

ํ•™๊ต ๋“ฑ๋ก ํ•ด์ œ

DELETE /api/users/:_id/schools

๊ถŒํ•œ: admin

์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ํ•„์ˆ˜ ์„ค๋ช…
school string O ํ•ด์ œํ•  ํ•™๊ต ObjectId

์‚ฌ์šฉ์ž ์‚ญ์ œ

์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

DELETE /api/users/:_id

๊ถŒํ•œ: admin

๊ฒฝ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ์„ค๋ช…
_id string ์‚ญ์ œํ•  ์‚ฌ์šฉ์ž ObjectId

์‘๋‹ต (200)

{}

ํ”„๋ก ํŠธ์—”๋“œ API ํ•จ์ˆ˜ (useAPIv2)

ํ•จ์ˆ˜๋ช… ๋ฉ”์„œ๋“œ ๊ฒฝ๋กœ ์„ค๋ช…
LoginLocal POST /api/users/login/local ๋กœ์ปฌ ๋กœ๊ทธ์ธ
LoginGoogle POST /api/users/login/google Google ๋กœ๊ทธ์ธ
Logout GET /api/users/logout ๋กœ๊ทธ์•„์›ƒ
RMySelf GET /api/users/current ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ •๋ณด
CUser POST /api/users ์‚ฌ์šฉ์ž ์ƒ์„ฑ
RUsers GET /api/users ์‚ฌ์šฉ์ž ๋ชฉ๋ก
RUser GET /api/users/:_id ์‚ฌ์šฉ์ž ์ƒ์„ธ
RUserProfile GET /api/users/:_id/profile ํ”„๋กœํ•„ ์กฐํšŒ
UUserProfile PUT /api/users/profile ํ”„๋กœํ•„ ์ˆ˜์ •
UPassword PUT /api/users/:_id/password ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ
UEmail PUT /api/users/:_id/email ์ด๋ฉ”์ผ ๋ณ€๊ฒฝ
UTel PUT /api/users/:_id/tel ์ „ํ™”๋ฒˆํ˜ธ ๋ณ€๊ฒฝ
UUserName PUT /api/users/:_id/userName ์ด๋ฆ„ ๋ณ€๊ฒฝ
UAuth PUT /api/users/:_id/auth ๊ถŒํ•œ ๋ณ€๊ฒฝ
UConnectGoogle PUT /api/users/:_id/google Google ์—ฐ๊ฒฐ
DDisconnectGoogle DELETE /api/users/:_id/google Google ํ•ด์ œ
CUserSchool POST /api/users/:_id/schools ํ•™๊ต ๋“ฑ๋ก
DUserSchool DELETE /api/users/:_id/schools ํ•™๊ต ํ•ด์ œ
DUser DELETE /api/users/:_id ์‚ฌ์šฉ์ž ์‚ญ์ œ