feat(tasks): обслуживать /tasks кодом — заработали skip, limit и отбор по пути - #17
Merged
Conversation
Статичный мок prism отдаёт пример из спецификации дословно, поэтому не применял
skip и limit, а на любой /tasks/{id} отвечал одной и той же задачей. Уроки
приходилось подгонять под это: в 250-example оговаривать, что параметры не
работают, а в 400-kinds прибивать сравнение REST и RPC к задаче 1.
Теперь /tasks обслуживает приложение. Операции вынесены в tasks-store.js, и его
же использует JSON-RPC, то есть два стиля делят не только текст задач, но и
логику: задача с одним номером в REST и в RPC одна и та же по построению.
Коды ответов, на которых стоят самостоятельные, воспроизведены руками, потому что
раньше их давал prism из спецификации: 200, 404 на несуществующую задачу, 422 на
негодное тело, 405 на неподходящий метод, 204 на удаление. 405 требует отдельных
маршрутов: без них fastify отвечает 404 на существующий адрес с чужим методом.
Набор данных остался неизменяемым. POST и DELETE отвечают 201 и 204, но список не
трогают: сервер учебный, запросы идут одновременно от множества студентов, и
мутации сделали бы уроки невоспроизводимыми.
В Caddyfile маршруты заданы точно, /http-api/tasks и /http-api/tasks/*, без
tasks*, чтобы не перехватывать посторонние адреса. Префикс не срезается, поэтому
приложение регистрирует полные пути.
Спецификация приведена к поведению: skip и limit объявлены uint16, как у
остальных коллекций, и добавлен 404 у get, update и delete. По спецификации
читают документацию курса, расходиться с ответами ей нельзя.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Прогон дополнен тем, что раньше было сломано и не проверялось: skip и limit
применяются, /tasks/{id} отдаёт именно эту задачу, несуществующая отвечает 404,
отрицательный skip отвечает 422, а после POST набор задач остаётся прежним.
Пути /tasks в прогоне переехали с порта мока на порт приложения, вместе с
префиксом: Caddy срезает его перед prism и оставляет перед приложением.
Добавлена сверка примеров спецификации с набором данных. Раньше совпадение
проверялось само собой, потому что ответы брались из примеров; теперь ответы даёт
код, а примеры остались документацией, и разойтись они могут молча. Сверка идёт
поиском подстроки: разбирать YAML нечем, отдельная зависимость ради одной
проверки того не стоит.
AGENTS.md обновлён под новое устройство: таблица кодов разведена по источникам
(prism против нашего кода), раздел про ограничение переписан на то, что осталось
у остальных коллекций, и описана неизменяемость набора.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Закрывает #16. Тикет: FEEDBACK-371.
Зачем
Статичный мок prism отдаёт пример из спецификации дословно, поэтому
/tasksне применялskipиlimitи на любой/tasks/{id}отвечал одной и той же задачей:Уроки приходилось подгонять под это: в
250-exampleоговаривать, что параметры не работают, а в400-kindsприбивать сравнение REST и RPC к задаче 1.Что стало
/tasksобслуживает приложение. Операции вынесены вtasks-store.js, и его же использует JSON-RPC — два стиля делят логику, а не только текст задач, поэтому задача с одним номером в REST и в RPC одна и та же по построению.Сохранено намеренно
Коды ответов. Раньше их давал prism из спецификации, и на них построены самостоятельные. Воспроизведены руками:
GET /tasksGET /tasks/1GET /tasks/999POST /tasksс{}DELETE /tasksDELETE /tasks/1405 требует отдельных маршрутов на неподходящие методы: без них fastify отвечает 404 на существующий адрес с чужим методом.
Неизменяемость набора.
POSTиDELETEотвечают 201 и 204, но список не трогают. Сервер учебный, запросы идут одновременно от множества студентов, и мутации сделали бы уроки невоспроизводимыми. Проверяется тестом.Маршрутизация
В
Caddyfileдва точных блока,/http-api/tasksи/http-api/tasks/*, а неtasks*— чтобы не перехватывать посторонние адреса. Проверено:/http-api/tasksfooпо-прежнему уходит к моку и отвечает 404. Префикс не срезается, поэтому приложение регистрирует полные пути.Спецификация
Приведена к поведению:
skipиlimitобъявленыuint16, как у остальных коллекций (былиstring), и добавлен 404 уget,update,delete. По спецификации читают документацию курса, расходиться с ответами ей нельзя. Проверено в контейнере:/http-api-openapi/jsonпоказывает200, 404иformat=uint16.Проверка
make testдополнен и вырос до 48 проверок: пагинация, отбор по пути, 404, 422 на отрицательномskip, неизменяемость набора послеPOST, плюс сверка примеров спецификации с набором данных — раньше совпадение выходило само, теперь ответы даёт код, а примеры остались документацией и могут разойтись молча.Тест проверен на способность падать: если
findперестаёт искать по id, падают 4 проверки и прогон выходит с кодом 1.Сверх прогона собран образ и поднят контейнер, запросы шли через Caddy, как на проде. Соседние пути остались за моком (
/users,/users/1,/posts,/posts/1,/comments,/login,/courses— все 200), остальные курсы не задеты (/http-protocol/example,/js-playwright/users,/postman/cookie, документация, главная — все отвечают).Осталось за рамками
Остальные коллекции по-прежнему за статичным моком, поэтому у них
skip/limitне работают, а/users/1/postsсовпадает с/posts. Лечится тем же способом; вAGENTS.mdэто описано как то, что осталось.После мержа и деплоя можно снять две скрытые пометки
<!-- TODO -->вcourses/ru/http_api_courseи убрать оговорку проskipиlimitиз250-example.🤖 Generated with Claude Code