Rest API ของระบบ Interview
Clone Project ลงมาในเครื่อง
git clone [email protected]:jame3032002/backend-interview.git
cd ไปที่ Project
cd ./backend-interview
ใช้คำสั่ง
docker-compose up
Clone Project ลงมาในเครื่อง
git clone [email protected]:jame3032002/backend-interview.git
cd ไปที่ Project
cd ./backend-interview
สร้าง docker network
ขั้นแรกให้สร้าง Network ชื่อ interview-network
docker network create interview-network
การ Run database แบบ Manual (ใช้ Docker)
docker build -t [ชื่อ docker image ที่ต้องการสร้าง] -f ./database/Dockerfile ./database
เช่น
docker build -t interview-db -f ./database/Dockerfile ./database
docker run -p 27017:27017 --network=[ชื่อ network ที่เราสร้างก่อนหน้า] --name=[ชื่อ container] -e MONGO_INITDB_DATABASE=[ชื่อ database ที่ต้องการ] [ชื่อ docker image ที่สร้างในขั้นตอนก่อนหน้า]
เช่น
docker run -p 27017:27017 --network=interview-network --name=database -e MONGO_INITDB_DATABASE=robinhood interview-db
หากต้องการให้ Run เป็น background ให้ใส่ tag
-d
เพิ่มเข้าไป เช่น
docker run -p 27017:27017 --network=interview-network --name=database -d -e MONGO_INITDB_DATABASE=robinhood interview-db
การ Run backend แบบ Manual (ใช้ Docker)
docker build -t interview-backend -f ./backend/Dockerfile ./backend
docker run -p 2000:2000 --network=interview-network -e MONGO_SERVER=mongodb://[ชื่อ container ของ database]:27017/robinhood -e ACCESS_TOKEN_SECRET_KEY=[SECRET_KEY ที่ต้องการ] -e TZ=Asia/Bangkok interview-backend
เช่น
docker run -p 2000:2000 --network=interview-network -e MONGO_SERVER=mongodb://database:27017/robinhood -e ACCESS_TOKEN_SECRET_KEY=ACCESS_TOKEN_SECRET_KEY -e TZ=Asia/Bangkok interview-backend
The base endpoint http://localhost:2000 สามารถใช้เข้าถึง API endpoints ต่างๆ ตาม documents ด้านล่าง
Route ที่เข้าได้โดยไม่ต้อง Authentication
Register - ลงทะเบียนเป็น user
สำหรับลงทะเบียนเป็น user เพื่อใช้งานระบบ
URL : /api/users
Method : POST
Auth required : NO
Data constraints
{
"name": "ข้อมูลเป็น String",
"email": "ต้องถูก Format ของ email address",
"password": "ต้องมากกว่า 8 ตัวอักษรและประกอบไปด้วย ตัวเล็ก ตัวใหญ่ ตัวเลข และอักขระพิเศษ"
}
Data example
{
"name": "วันเดอร์วูแมน",
"email": "[email protected]",
"password": "Password1!"
}
Code : 201 Created
Content :
{
"success": true,
"user": {
"email": "[email protected]",
"name": "วันเดอร์วูแมน",
"_id": "65d07b072bb274bc40edc356",
"createdAt": "2024-02-17T09:23:19.874Z",
"updatedAt": "2024-02-17T09:23:19.874Z",
"__v": 0
}
}
Condition : ถ้าไม่ได้ส่ง name
หรือ email
หรือ password
ไป
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid parameters"
}
Condition : ถ้า email
ผิด format
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid email format"
}
Condition : ถ้า password
ไม่ได้ประกอบไปด้วย ตัวอักษรเล็ก ตัวอักษรใหญ่ ตัวเลข และอักขระพิเศษ หรือน้อยกว่า 8 ตัวอักษร
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Password must contain uppercase, lowercase, integer, special character and more than 8 characters"
}
Condition : ถ้า email
ที่ส่งมามีอยู่แล้วในระบบ
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "This email has already exists"
}
Login - เข้าสู่ระบบ
สำหรับ Login ใช้งานระบบ
URL : /api/users/login
Method : POST
Auth required : NO
Data constraints
{
"email": "ต้องถูก Format ของ email address",
"password": "เป็น String"
}
Data example
{
"email": "[email protected]",
"password": "Password1!"
}
Code : 200 OK
Content :
{
"success": true,
"user": {
"_id": "65cfa17ad00dcd13b311fc47",
"email": "[email protected]",
"name": "โรบินฮู้ด",
"createdAt": "2022-12-31T17:00:00.000Z",
"updatedAt": "2022-12-31T17:00:00.000Z",
"__v": 0
},
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NWNmYTE3YWQwMGRjZDEzYjMxMWZjNDciLCJlbWFpbCI6InVzZXIxQHJvYmluaG9vZC5jby50aCIsIm5hbWUiOiLguYLguKPguJrguLTguJnguK7guLnguYnguJQiLCJyb2xlIjoidXNlciIsImlhdCI6MTcwODIyODg2MSwiZXhwIjoxNzM5NzY0ODYxfQ.vZz_hJ5NjSF7Dr3LZrktewqCxMzJGGdQr-4sVS0Dt2o"
}
Condition : ถ้าไม่ได้ส่ง email
หรือ password
ไป
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid parameters"
}
Condition : ถ้าหาก email
หรือ password
ไม่ถูกต้อง
Code : 401 Unauthorized
Content :
{
"success": false,
"message": "Invalid email or password"
}
การ Authentication สามารถทำได้โดยเมื่อ Login เรียบร้อยแล้วให้เอา accessToken ที่ได้จาก response ของการ Login แนบมาใน header Authorization
จะเป็น Bearer [Token ที่ได้จากการ Login]
เช่น
curl --location --request GET 'http://localhost:2000/api/interviews?page=1&limit=3' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NWNmYTE4NmQwMGRjZDEzYjMxMWZjNGEiLCJlbWFpbCI6InVzZXIyQHJvYmluaG9vZC5jby50aCIsIm5hbWUiOiLguYHguJrguJfguYHguKHguJkiLCJyb2xlIjoidXNlciIsImlhdCI6MTcwODE1Njc3MiwiZXhwIjoxNzA4MTU3NjcyfQ.pwwwt7GwnY1BI70xLqzcqSEoscbDxszdXvIrCjy-WiE'
หากใน doc ระบุว่า Auth required : YES จะต้องแนบ header
Authorization
มาด้วยเสมอ จึงจะใช้งาน route นั้นๆ ได้
Condition : ถ้าหากไม่ได้แนบ Header Authorization
มาด้วย
Code : 401 Unauthorized
Content :
{
"error": true,
"message": "Access token is required"
}
Condition : ถ้าหาก Header Authorization
ที่ส่งมาไม่ถูกต้อง
Code : 403 Forbidden
Content :
{
"error": true,
"message": "Invalid access token"
}
Add Interview - เพิ่มข้อมูล interview
เป็น Route เพิ่มข้อมูล interview
URL : /api/interviews
Method : POST
Auth required : YES
Data constraints
{
"title": "ข้อมูลเป็น String",
"description": "ข้อมูลเป็น String",
"status": "ข้อมูลเป็น String เป็นได้แค่ 'To Do', 'In Progress', 'Done'"
}
status
ถ้าหาก status ไม่ได้ส่งไป ค่าเริ่มต้นจะเป็นTo Do
Data example
{
"title": "นัดสัมภาษณ์งาน 1",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorpera. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "To Do"
}
Code : 201 Created
Content :
{
"success": true,
"interview": {
"title": "นัดสัมภาษณ์งาน 1",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorpera. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "To Do",
"createdBy": "65cfa17ad00dcd13b311fc47",
"isArchive": false,
"_id": "65d1823db1bb47c4f3c4bd5c",
"edited": [],
"createdAt": "2024-02-18T04:06:21.749Z",
"updatedAt": "2024-02-18T04:06:21.749Z",
"__v": 0,
"name": "โรบินฮู้ด",
"email": "[email protected]"
}
}
Condition : ถ้าไม่ได้ส่ง title
หรือ description
ไป
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid title or description"
}
Condition : ถ้าหากส่ง status
เป็นค่าที่ไม่ใช่ To Do
, In Progress
, Done
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid status"
}
Get Interviews - ดึงข้อมูล Interviews
เป็น Route สำหรับดึงข้อมูลมาทำ List ของ Card ที่แสดงข้อมูล Interview ดังรูปด้านล่าง
URL : /api/interviews
Method : GET
สามารถระบุ query เพิ่มเติมได้ 2 ค่าคือ
limit
และpage
- page จะมีค่า default เป็น 1
- limit จะมีค่า default เป็น 3
Auth required : YES
Code : 200 OK
Content :
{
"success": true,
"interviews": [
{
"_id": "65d061949166d015d47dee80",
"title": "นัดสัมภาษณ์งาน 1",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorpera. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "To Do",
"createdBy": "65cfa17ad00dcd13b311fc47",
"isArchive": false,
"createdAt": "2023-01-01T03:00:00.696Z",
"updatedAt": "2023-01-01T04:00:00.696Z",
"name": "โรบินฮู้ด",
"email": "[email protected]"
},
{
"_id": "65d061979166d015d47dee82",
"title": "นัดสัมภาษณ์งาน 2",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorpera. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "To Do",
"createdBy": "65cfa17ad00dcd13b311fc47",
"isArchive": false,
"createdAt": "2023-01-01T08:00:00.816Z",
"updatedAt": "2023-01-01T08:00:00.816Z",
"name": "โรบินฮู้ด",
"email": "[email protected]"
},
{
"_id": "65d0619b9166d015d47dee84",
"title": "นัดสัมภาษณ์งาน 3",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorpera. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "To Do",
"createdBy": "65cfa17ad00dcd13b311fc47",
"isArchive": false,
"createdAt": "2023-01-02T03:00:00.553Z",
"updatedAt": "2023-01-02T03:00:00.553Z",
"name": "โรบินฮู้ด",
"email": "[email protected]"
}
],
"info": {
"totalResults": 8,
"isNextPage": true,
"currentPage": 1,
"limit": 3
}
}
จากรูป UX/UI ก่อนหน้า ถ้าหากกดปุ่ม
See more
ให้เรียก API route เดิมนี้โดยจะต้องระบุ page ส่งมาด้วย เพื่อโหลด List ของ Interviews เพิ่มเติม เช่น http://localhost:2000/api/interviews?page=2
Get Interview By Id - ดึงข้อมูล Interviews ด้วย id
เป็น Route สำหรับดึงข้อมูล Interview ด้วย Id ใช้สำหรับดึงข้อมูลเพื่อดูข้อมูล Interview หรือดึงข้อมูลเพื่อจะแก้ไขข้อมูลของ Interview ใช้กับ UX/UI ในส่วนการคลิกที่ Card เพื่อดู detail ดังรูปด้านล่างนี้
URL : /api/interviews/:interviewId
Method : GET
สามารถระบุ query เพิ่มเติมได้ คือ
include=comments
ถ้าหากระบุจะมี comments แสดงขึ้นมาด้วย
Auth required : YES
Code : 200 OK
Content :
{
"success": true,
"interview": {
"_id": "65d061949166d015d47dee80",
"title": "นัดสัมภาษณ์งาน 1",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorpera. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "To Do",
"createdBy": "65cfa17ad00dcd13b311fc47",
"isArchive": false,
"edited": [
{
"title": "นัดสัมภาษณ์งาน 1-1",
"description": "1-1-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorpera. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "To Do",
"createdAt": "2023-01-01T03:10:00.696Z",
"_id": "65d067709e8c3fb440e39d2c"
},
{
"title": "นัดสัมภาษณ์งาน 1-2",
"description": "1-2-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "Done",
"createdAt": "2023-01-01T03:12:00.696Z",
"_id": "65d0677a9e8c3fb440e39d30"
},
{
"title": "นัดสัมภาษณ์งาน 1-3",
"description": "1-3-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "Done",
"createdAt": "2023-01-01T03:20:00.696Z",
"_id": "65d0677f9e8c3fb440e39d35"
}
],
"createdAt": "2023-01-01T03:00:00.696Z",
"updatedAt": "2023-01-01T04:00:00.696Z",
"name": "โรบินฮู้ด",
"email": "[email protected]"
},
"comments": [
{
"_id": "65d062a99166d015d47dee8f",
"interviewId": "65d061949166d015d47dee80",
"comment": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"createdBy": "65cfa186d00dcd13b311fc4a",
"createdAt": "2023-01-02T11:00:00.161Z",
"name": "แบทแมน",
"email": "[email protected]"
},
{
"_id": "65d062a19166d015d47dee8c",
"interviewId": "65d061949166d015d47dee80",
"comment": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"createdBy": "65cfa19ad00dcd13b311fc4d",
"createdAt": "2023-01-01T11:00:00.363Z",
"name": "แคทวูแมน",
"email": "[email protected]"
},
{
"_id": "65d062469166d015d47dee88",
"interviewId": "65d061949166d015d47dee80",
"comment": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"createdBy": "65cfa186d00dcd13b311fc4a",
"createdAt": "2023-01-01T08:00:00.492Z",
"name": "แบทแมน",
"email": "[email protected]"
}
]
}
Code : 200 OK
Content :
{
"success": true,
"interview": {
"_id": "65d061949166d015d47dee80",
"title": "นัดสัมภาษณ์งาน 1",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorpera. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "To Do",
"createdBy": "65cfa17ad00dcd13b311fc47",
"isArchive": false,
"edited": [
{
"title": "นัดสัมภาษณ์งาน 1-1",
"description": "1-1-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorpera. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "To Do",
"createdAt": "2023-01-01T03:10:00.696Z",
"_id": "65d067709e8c3fb440e39d2c"
},
{
"title": "นัดสัมภาษณ์งาน 1-2",
"description": "1-2-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "Done",
"createdAt": "2023-01-01T03:12:00.696Z",
"_id": "65d0677a9e8c3fb440e39d30"
},
{
"title": "นัดสัมภาษณ์งาน 1-3",
"description": "1-3-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "Done",
"createdAt": "2023-01-01T03:20:00.696Z",
"_id": "65d0677f9e8c3fb440e39d35"
}
],
"createdAt": "2023-01-01T03:00:00.696Z",
"updatedAt": "2023-01-01T04:00:00.696Z",
"name": "โรบินฮู้ด",
"email": "[email protected]"
}
}
เพิ่มเติม ในการ GET interview by id จะมีข้อมูล Edited ติดมาด้วย ซึ่งจะเอาไปใช้กับส่วนที่กดดูประวัติการแก้ไข
Update interview - แก้ไขข้อมูล interview (title, description, status)
เป็น Route ที่เรียกเมื่อต้องการแก้ไข interview
URL : /api/interviews/:interviewId
Method : PATCH
Auth required : YES
Data constraints
{
"title": "ข้อมูลเป็น String",
"description": "ข้อมูลเป็น String",
"status": "ข้อมูลเป็น String เป็นได้แค่ 'To Do', 'In Progress', 'Done'"
}
ไม่จำเป็นต้องส่งมาทุก field ถ้าหากค่าไหนที่ไม่ได้ส่งมา ค่านั้นจะไม่ถูกอัพเดท
Data example
{
"title": "นัดสัมภาษณ์งาน latest",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "Done"
}
Code : 200 OK
Content :
{
"success": true,
"interview": {
"_id": "65d0619b9166d015d47dee84",
"title": "นัดสัมภาษณ์งาน latest",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "Done",
"createdBy": "65cfa17ad00dcd13b311fc47",
"isArchive": false,
"edited": [
{
"title": "นัดสัมภาษณ์งาน 3",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorpera. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "To Do",
"createdAt": "2024-02-18T05:35:39.165Z",
"_id": "65d1972b5c0d4112dd47b034"
}
],
"createdAt": "2023-01-02T03:00:00.553Z",
"updatedAt": "2024-02-18T05:35:39.167Z",
"__v": 0,
"name": "โรบินฮู้ด",
"email": "[email protected]"
}
}
Condition : ถ้าไม่ได้ส่ง title
หรือ description
หรือ status
ไป
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid parameters"
}
Condition : ถ้าหาก interviewId
ที่ส่งมาไม่ตรงกับใน Database
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid interviewId"
}
Condition : ถ้าหาก status
ที่ส่งมาค่าไม่ใช่ To Do
หรือ In Progress
หรือ Done
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid status"
}
Archive interview - เก็บข้อมูล interview
เป็น Route ที่เรียกเมื่อกดที่ปุ่ม "จัดเก็บ" ดังรูปด้านล่าง
URL : /api/interviews/:interviewId/archive
Method : PATCH
Auth required : YES
Code : 200 OK
Content :
{
"success": true,
"interview": {
"_id": "65d061949166d015d47dee80",
"title": "นัดสัมภาษณ์งาน 1",
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorpera. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "To Do",
"createdBy": "65cfa17ad00dcd13b311fc47",
"isArchive": true,
"edited": [
{
"title": "นัดสัมภาษณ์งาน 1-1",
"description": "1-1-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorpera. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "To Do",
"createdAt": "2023-01-01T03:10:00.696Z",
"_id": "65d067709e8c3fb440e39d2c"
},
{
"title": "นัดสัมภาษณ์งาน 1-2",
"description": "1-2-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "Done",
"createdAt": "2023-01-01T03:12:00.696Z",
"_id": "65d0677a9e8c3fb440e39d30"
},
{
"title": "นัดสัมภาษณ์งาน 1-3",
"description": "1-3-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. In vitae turpis massa sed elementum tempus egestas sed sed. Pulvinar neque laoreet suspendisse interdum consectetur libero. Ut lectus arcu bibendum at varius vel. Feugiat in ante metus dictum at tempor commodo ullamcorper a. Lacinia at quis risus sed. Adipiscing bibendum est ultricies integer quis auctor elit sed vulputate. Nulla aliquet enim tortor at auctor urna nunc.",
"status": "Done",
"createdAt": "2023-01-01T03:20:00.696Z",
"_id": "65d0677f9e8c3fb440e39d35"
}
],
"createdAt": "2023-01-01T03:00:00.696Z",
"updatedAt": "2024-02-18T05:27:50.165Z",
"__v": 0,
"name": "โรบินฮู้ด",
"email": "[email protected]"
}
}
ระบบจะอัพเดท field ชื่อ
isArchive
ให้มีค่าเป็น trueซึ่งในส่วน
GET interviews
ปกติแล้วจะดึงเฉพาะค่าisArchive
ที่เป็น false ไปแสดง
Condition : ถ้าหาก interviewId
ที่ส่งมาไม่ถูกต้อง
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid interviewId"
}
Add comment in interview - แสดงความคิดเห็นใน interview
เป็น Route สำหรับเพิ่มความคิดเห็นใน interview ดัง UX/UI ด้านล่าง
URL : /api/interviews/:interviewId/comments
Method : POST
Auth required : YES
Data constraints
{
"comment": "ข้อมูลเป็น String"
}
Data example
{
"comment": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
}
Code : 201 Created
Content :
{
"success": true,
"comment": {
"interviewId": "65d061949166d015d47dee80",
"comment": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"createdBy": "65d07b072bb274bc40edc356",
"_id": "65d0f6e467b048161e74dd6d",
"createdAt": "2024-02-17T18:11:48.217Z",
"updatedAt": "2024-02-17T18:11:48.217Z",
"__v": 0
}
}
Condition : ถ้าหาก comment
ไม่ได้ส่งมา
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid parameters"
}
Condition : ถ้าหาก interviewId
ไม่ถูกต้อง
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid interviewId"
}
Update comment - แก้ไขความคิดเห็นใน interview
เป็น Route สำหรับอัพเดทความคิดเห็นของ user นั้นๆ ที่แสดง
URL : /api/comments/:commentId
Method : PATCH
Auth required : YES
Data constraints
{
"comment": "ข้อมูลเป็น String"
}
Data example
{
"comment": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
}
Code : 200 OK
Content :
{
"success": true,
"comment": {
"_id": "65d062469166d015d47dee88",
"interviewId": "65d061949166d015d47dee80",
"comment": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"createdBy": "65cfa186d00dcd13b311fc4a",
"createdAt": "2024-02-17T07:37:42.492Z",
"updatedAt": "2024-02-17T18:51:50.821Z",
"__v": 0
}
}
Condition : ถ้าหาก comment
ไม่ได้ส่งมา
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid parameters"
}
Condition : ถ้าหาก commentId
ไม่มีใน database
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid commentId"
}
Condition : ถ้าหากเราไม่ได้เป็นคนสร้างความคิดเห็นนั้น แล้วไปแก้ไขความคิดเห็น
Code : 403 FORBIDDEN
Content :
{
"error": true,
"message": "You don't have permission"
}
Delete comment - ลบความคิดเห็นใน interview
เป็น Route สำหรับลบความคิดเห็นของ user นั้นๆ
URL : /api/comments/:commentId
Method : DELETE
Auth required : YES
Code : 200 OK
Content :
{
"success": true
}
Condition : ถ้าหาก commentId
ไม่มีใน database
Code : 400 BAD REQUEST
Content :
{
"error": true,
"message": "Invalid commentId"
}
Condition : ถ้าหากเราไม่ได้เป็นคนสร้างความคิดเห็นนั้น แล้วไปแก้ไขความคิดเห็น
Code : 403 FORBIDDEN
Content :
{
"error": true,
"message": "You don't have permission"
}
เพิ่มเติม ถ้าหาก Error อื่น ๆ นอกจากที่กล่าวข้างต้นจะแสดงดัง Error Response ด้านล่างครับ
Condition : ถ้าหากส่ง Request มากเกิน rate limit ที่กำหนด
Rate limit สามารถกำหนดได้จาก env โดยจะกำหนด 2 ค่าคือ
- RATE_LIMIT_TIME_RESET -> คือเวลาที่ต้องการให้ Reset หน่วยเป็น นาที (หากไม่กำหนดค่าเริ่มต้นจะเป็น 1)
- RATE_LIMIT_REQUEST_PER_TIME_RESET -> คือ จำนวน request ในหนึ่งหน่วยเวลา (หากไม่กำหนดค่าเริ่มต้นจะเป็น 20)
ซึ่งหากไม่ได้กำหนด จะ request ได้ 20 ครั้งใน 1 นาที
Code : 429 TOO MANY REQUESTS
Content :
{
"error": true,
"message": "Too many requests from this IP, please try again later."
}
Condition : Error อื่น ๆ ที่นอกเหนือการควบคุม
Code : 500 INTERNAL SERVER ERROR
Content :
{
"error": true,
"message": "Internal server error"
}