devlog_owen
231128 TIL) 입문강의 중 할일목록 api patch 코드분석 본문
728x90
//할일순서 변경, 할일완료,해제,내용변경
router.patch('/todos/:todoId', async (req, res) => {
// 변경할 '해야할 일'의 ID 값을 가져옵니다.
const { todoId } = req.params;
// '해야할 일'을 몇번째 순서로 설정할 지 order 값을 가져옵니다.
const { order, done, value } = req.body;
// 변경하려는 '해야할 일'을 가져옵니다. 만약, 해당 ID값을 가진 '해야할 일'이 없다면 에러를 발생시킵니다.
const currentTodo = await Todo.findById(todoId).exec();
if (!currentTodo) {
return res
.status(404)
.json({ errorMessage: '존재하지 않는 todo 데이터입니다.' });
}
if (order) {
// 변경하려는 order 값을 가지고 있는 '해야할 일'을 찾습니다.
const targetTodo = await Todo.findOne({ order }).exec();
if (targetTodo) {
// 만약, 이미 해당 order 값을 가진 '해야할 일'이 있다면, 해당 '해야할 일'의 order 값을 변경하고 저장합니다.
targetTodo.order = currentTodo.order;
await targetTodo.save();
}
// 변경하려는 '해야할 일'의 order 값을 변경합니다.
currentTodo.order = order;
}
if (done !== undefined) {
// 변경하려는 '해야할 일'의 doneAt 값을 변경합니다.
currentTodo.doneAt = done ? new Date() : null;
}
if(value){
// 변경하려는 '해야할 일'의 value 값을 변경합니다.
currentTodo.value = value;
}
// 변경된 '해야할 일'을 저장합니다.
await currentTodo.save();
return res.status(200).json({});
});
입문주차 리뉴얼 강의를 듣고 patch부분이 조금 헷갈려 코드분석글을 올린다.
const { todoId } = req.params;
const { order, done, value } = req.body;
url을 보게되면 todoId라는 동적 세그먼트가 있다. 이 동적 세그먼트는 주로 req.params 객체에 {todoId: 123 }이런식으로 저장해서 해당값을 얻을 수 있다.
req.body는 http 요청 본문에서 전송된 데이터를 포함한 객체다. 즉 order,done,value에 대해 데이터 정보를 받는다.
const currentTodo = await Todo.findById(todoId).exec();
if (!currentTodo) {
return res
.status(404)
.json({ errorMessage: '존재하지 않는 todo 데이터입니다.' });
}
todolist 조회 및 에러 핸들링
Todo에서 특정 todoId를 찾아 만약 currentTodo가 없으면 에러메시지 '존재하지 않는 todo 데이터~"를 띄움
if (order) {
// 변경하려는 order 값을 가지고 있는 '해야할 일'을 찾습니다.
const targetTodo = await Todo.findOne({ order }).exec();
if (targetTodo) {
// 만약, 이미 해당 order 값을 가진 '해야할 일'이 있다면, 해당 '해야할 일'의 order 값을 변경하고 저장합니다.
targetTodo.order = currentTodo.order;
await targetTodo.save();
}
// 변경하려는 '해야할 일'의 order 값을 변경합니다.
currentTodo.order = order;
}
1. order 값이 주어지면
=> 변경하려는 order값이 있는 다른 해야할일을 찾아서 만약 그 order값을 가진 다른 해야할 일이 있으면 해당 해야할 일의 값을 변경하고 저장함. 변경하려는 기존의 해야할 일의 order값을 변경해서 저장.
그리고 마지막으로 현재 order값을 변경함.
if (done !== undefined) {
// 변경하려는 '해야할 일'의 doneAt 값을 변경합니다.
currentTodo.doneAt = done ? new Date() : null;
}
done값이 없다면 (완료가 되지 않았다면)
삼항연산자로 done값이 주어진 경우 true면 현재 날짜를, false면 null값을 doneAt 속성에 할당.
if(value){
// 변경하려는 '해야할 일'의 value 값을 변경합니다.
currentTodo.value = value;
}
value값이 있다면 현재 가지고 있는 value값을 수정함.
// 변경된 '해야할 일'을 저장합니다.
await currentTodo.save();
return res.status(200).json({});
});
변경된 해야할 일을 저장하고 200 status code를 반환한다.
728x90
'TIL' 카테고리의 다른 글
231130 TIL) 숙련강의 시청, 개인프로젝트 (0) | 2023.12.01 |
---|---|
231129 TIL)prisma, 새로운 ORM 사용 적응기 (0) | 2023.11.29 |
231127 TIL) 팀프로젝트를 마치며 느낀점(KPT 작성), 입문강의 완강 (2) | 2023.11.27 |
231124 TIL) thunderclient,restclient로 이미지 파일 업로드하기 (1) | 2023.11.24 |
231123 TIL) 뉴스피드 프로젝트 3일차 (1) | 2023.11.23 |