API
할 일 목록 가져오기 API
router.get("/todos", async (req, res) => {
  const todos = await Todo.find().sort("-order").exec();
  res.send({ todos });
});
할 일 순서 변경 API
router.patch("/todos/:todoId", async (req, res) => {
  const { todoId } = req.params;
  const { order } = req.body;
  
  
  const currentTodo = await Todo.findById(todoId);
  if (!currentTodo) {
    return res
      .status(400)
      .json({ errorMessage: "존재하지 않는 할 일 입니다." });
  }
  
  if (order) {
    const targetTodo = await Todo.findOne({ order }).exec();
    if (targetTodo) {
      targetTodo.order = currentTodo.order;
      await targetTodo.save();
    }
    currentTodo.order = order;
    await currentTodo.save();
  }
});
할 일 삭제 API
router.delete("/todos/:todoId", async (req, res) => {
  const { todoId } = req.params;
  const deleteTodo = await Todo.findById(todoId).exec();
  if (!deleteTodo) {
    return res
      .status(400)
      .json({ errorMessage: "존재하지 않는 할 일 입니다." });
  }
  await deleteTodo.delete();
  res.json({ result: "삭제성공!" });
});
할 일 내용/체크박스 수정 API
router.patch("/todos/:todoId", async (req, res) => {
  const { todoId } = req.params;
  const { order, value, done } = req.body;
  
  
  const currentTodo = await Todo.findById(todoId).exec();
  if (!currentTodo) {
    return res
      .status(400)
      .json({ errorMessage: "존재하지 않는 할 일 입니다." });
  }
  
  if (order) {
    const targetTodo = await Todo.findOne({ order }).exec();
    if (targetTodo) {
      targetTodo.order = currentTodo.order;
      await targetTodo.save();
    }
    currentTodo.order = order;
  
  } else if (value) {
    currentTodo.value = value;
  
  } else if (done !== undefined) {
    currentTodo.doneAt = done ? new Date() : null;
  }
  await currentTodo.save();
  res.send({ result: "수정완료!" });
});