Skip to content

feat(collections): обслуживать коллекции кодом — заработали skip, limit, select и вложенные ресурсы - #18

Merged
fey merged 2 commits into
mainfrom
feat/real-collections
Aug 14, 2026
Merged

feat(collections): обслуживать коллекции кодом — заработали skip, limit, select и вложенные ресурсы#18
fey merged 2 commits into
mainfrom
feat/real-collections

Conversation

@fey

@fey fey commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Закрывает по существу FEEDBACK-166 («заменить примеры в сервере http api на более реальные»), открытый с февраля по жалобе тьютора.

Что было

Мок prism отдаёт пример из спецификации дословно, поэтому по всем коллекциям не применял skip, limit и select, а вложенный ресурс отдавал тот же список, что корневой. Урок example курса http-api учит ровно на этих параметрах, и его теория расходилась с сервером в пяти местах:

Урок обещает Сервер отдавал
/users?skip=30users: [], skip: 30 10 пользователей, skip: 0
/posts?skip=30total: 100, skip: 30 3 поста, total: 3, skip: 0
/users?select=firstName,email → три поля все четыре
/users/1/posts → посты автора 1 тот же список, что /posts
/users/1"id": "1" id числом

Плюс блок про вложенные ресурсы в уроке был напечатан латинской мешаниной ("title": "comitatus considero termes") — ровно то, на что жаловались: «здесь тоже одна латынь».

Что стало

/users, /posts, /comments и /tasks обслуживает приложение. Регистрация маршрутов общая (routes.js), разбор параметров и выборка тоже (collections.js), данные в data/. Тем же кодом собирается JSON-RPC по задачам, поэтому REST и RPC не расходятся по построению.

За моком в http-api остались /courses и /login: параметров выборки уроки на них не учат, а /courses закрыт API-ключом, который мок и проверяет.

Перенесено руками, потому что раньше это давала спецификация

  • Коды 200, 201, 204, 404, 405, 422. Про 405 отдельно: без явных маршрутов на неподходящие методы fastify отвечает 404 на существующий адрес, и урок kinds про «три разных кода» ломается незаметно.
  • Требования Bearer из @useAuth. Значение токена не проверяется, важно наличие заголовка — как и было у мока.

select оставляет запрошенные поля и всегда идентификатор, в порядке модели, а не в порядке параметра: так ответ совпадает с напечатанным в уроке и не зависит от порядка полей в запросе.

Наборы данных

Размеры подобраны под уроки и уменьшать их нельзя, не правя курс: десять пользователей, сорок постов, восемь постов у автора 1, тридцать комментариев по первым десяти постам. Первые три пользователя и первые два поста автора 1 приведены в уроке дословно.

Наборы по-прежнему неизменяемые: create и delete только сообщают, что произошло бы. Сервер учебный, запросы идут одновременно от множества студентов.

Спецификация

У пользователей skip и limit объявлены uint16 вместо строк, у get, update, delete добавлен 404. Примеры моделей синхронизированы с наборами, и это проверяется прогоном.

Заодно

В Caddyfile апстримы записаны адресом, а не именем localhost: prism и приложение слушают только IPv4, а localhost резолвится ещё и в ::1, где не слушает никто.

Проверка

make test вырос до 75 проверок: пагинация каждой коллекции, select на списке и на одиночном ресурсе, вложенные ресурсы с отбором по родителю и 404 на несуществующем родителе, 401 на защищённых методах, 404 по каждой коллекции, неизменяемость наборов, границы uint16, сверка примеров спецификации с данными.

Проверен на способность падать: если убрать фильтр по родителю, падают 3 проверки и прогон выходит с кодом 1.

Сверх прогона собран образ и поднят контейнер, запросы шли через Caddy. Сто запросов подряд по пяти адресам — ни одного 502. Остальные курсы не задеты: /http-protocol/example, /js-playwright/users, /postman/cookie, документация, главная — все отвечают.

Правки курса под это идут отдельным коммитом в courses/ru/http_api_course.

🤖 Generated with Claude Code

fey and others added 2 commits August 14, 2026 19:05
Мок prism отдаёт пример из спецификации дословно, поэтому по всем коллекциям не
применял skip, limit и select, а вложенный ресурс отдавал тот же список, что
корневой: /users/1/posts совпадал с /posts. Урок example курса http-api учит ровно
на этих параметрах, из-за чего студент не мог выполнить самостоятельную, а тьютор
получил жалобу.

Теперь /users, /posts, /comments и /tasks обслуживает приложение. Регистрация
маршрутов общая (routes.js), разбор параметров и выборка тоже (collections.js), а
данные лежат в data/. Одним и тем же кодом собираются и REST, и JSON-RPC по
задачам, поэтому REST и RPC не расходятся по построению.

За моком в http-api остались /courses и /login: параметров выборки уроки на них не
учат, а /courses закрыт API-ключом, который мок и проверяет.

Что перенесено руками, потому что раньше это давала спецификация:

- коды 200, 201, 204, 404, 405, 422. Про 405 отдельно: без явных маршрутов на
  неподходящие методы fastify отвечает 404 на существующий адрес, и урок kinds про
  три разных кода ломается незаметно;
- требования Bearer из @useAuth. Сервер учебный и значение токена не проверяет,
  важно наличие заголовка, как и раньше у мока.

select оставляет запрошенные поля и всегда идентификатор, в порядке модели, а не в
порядке параметра: так ответ совпадает с напечатанным в уроке и не зависит от того,
в каком порядке клиент перечислил поля.

Наборы данных выросли под уроки: десять пользователей (урок объясняет пагинацию
тем, что total равен 10, а skip=30 отдаёт пустую страницу), сорок постов (учит на
skip=30, значит записей нужно заметно больше тридцати), восемь постов у автора 1
(на пустом вложенном списке урок ничего не объясняет), тридцать комментариев по
первым десяти постам. Наборы по-прежнему неизменяемые: create и delete только
сообщают, что произошло бы.

Спецификация приведена к поведению: у пользователей skip и limit объявлены uint16
вместо строк, у get, update и delete добавлен 404. Примеры моделей синхронизированы
с наборами.

В Caddyfile апстримы записаны адресом, а не именем localhost: prism и приложение
слушают только IPv4, а localhost резолвится ещё и в ::1.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Демонстрационный сервер один на все локали курсов, а посты, комментарии, задачи и
примеры курсов были на русском. Сегодня по /http-api его использует только ru-курс,
потому что es- и en-копии старые и ходят на dummyjson.com, но это везение, а не
устройство: как только копии обновят, испанский студент получит русские ответы.
Пользователи при этом уже были на латинице, то есть набор был внутренне
несогласован.

Переведены посты, комментарии, задачи и примеры моделей Task, Post, Comment,
Course. Идентификаторы, авторы и размеры наборов не менялись, поэтому все
утверждения уроков про пагинацию и вложенные ресурсы остались в силе.

Задачи были на русском с самого их появления (52b3402), они не мои, но лежат в том
же наборе и по той же причине переведены.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fey
fey merged commit 2283a99 into main Aug 14, 2026
2 checks passed
@fey
fey deleted the feat/real-collections branch August 14, 2026 14:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant