feat(collections): обслуживать коллекции кодом — заработали skip, limit, select и вложенные ресурсы - #18
Merged
Merged
Conversation
Мок 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>
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.
Закрывает по существу FEEDBACK-166 («заменить примеры в сервере http api на более реальные»), открытый с февраля по жалобе тьютора.
Что было
Мок prism отдаёт пример из спецификации дословно, поэтому по всем коллекциям не применял
skip,limitиselect, а вложенный ресурс отдавал тот же список, что корневой. Урокexampleкурса http-api учит ровно на этих параметрах, и его теория расходилась с сервером в пяти местах:/users?skip=30→users: [],skip: 30skip: 0/posts?skip=30→total: 100,skip: 30total: 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-ключом, который мок и проверяет.Перенесено руками, потому что раньше это давала спецификация
kindsпро «три разных кода» ломается незаметно.@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