Как правильно искать вложенные ресурсы REST?

Допустим у меня есть линк:
/api/v1/m/projects/{p_id}/sprints/{s_id}/tasks/{t_id}
Поддерживаются все CRUD операции.
Но как правильно обработать отсутствие родительских ресурсов? И правильно ли будет слать в ответ сообщение с ошибкой если не будет найден родительский ресурс.

Например:
  1. Не найден проект - ошибка, проект не найден.
  2. Проект найден, не найден спринт - ошибка, спринт не найден.


У меня пока решение одно - в сервисе искать по очереди ресурсы:
  1. Найти проект по id.
  2. Найти спринт по id и проекту.
  3. Найти задание по id, проекту и спринту. (Ну или будет достаточно спринта и id).
UPDATE
Я имел в виду поиск задачи. Мне нужно пройтись по родительским ресурсам и проверить есть ли они.
Например:
Метод "Создать задание" делает по очереди:
  1. Проверка на наличие проекта по id. Если нету - исключение.
  2. Проверка на наличие спринта по id и проекту. Если нету - исключение.
  3. Создание задания с заданным спринтом.
  • Вопрос задан
  • 530 просмотров
Решения вопроса 1
@ivorobioff
Software Engineer
Буду краток. Считаю что твой вариант верный.

Только для 3-ого пункта маленькое замечание. Перед тем как выдавать или проверять на существование "задачи", я бы все-таки запустил проверку из пункта 2 для консистентности. Будет выглядит немного странно если будет все равно какой айди проекта или спринта передавать но главное чтобы задача с заданным айди существовала. Т.е. к примеру если задача существует здесь: `/projects/21/sprints/14/tasks/10` то в случае ее запроса по этому урлу `/projects/49/sprints/76/tasks/10` должно давать 404.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
AlexZaharow
@AlexZaharow
Программист.
Такие проверки надо делать фильтрами. До вызова бизнес-логики.
Ответ написан
1. Сервис выкидывает исключение типа SprintNotFoundException, ProjectNotFoundException, TaskNotFoundException
2. Обработчик исключений (глобальный или для контроллера) выдаёт ошибку 404 с подробностями в теле ответа.

Хотя обычно достаточно исключения типа NotFoundException. Подробности (что именно не найдено) - содержатся в сообщении этого исключения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
ITigris Санкт-Петербург
от 100 000 ₽
ВДком Самара
от 100 000 ₽
Сбербанк Ростов-на-Дону
от 100 000 ₽