Первый работающий API

Query-параметры и фильтрация каталога

Содержание курса

Подбор переговорной для встречи

Любая рабочая встреча начинается с поиска подходящего места: достаточно ли стульев, есть ли проектор, не придётся ли теснить коллег у окна. В крупном офисе переговорных может быть десятки, и просматривать каждую вручную — значит тратить время до того, как разговор даже начался. Именно здесь появляется Roomly: сервис, который берёт на себя подбор комнаты по нескольким простым критериям.

Каталог переговорных хранится в памяти, и к нему обращаются сразу несколько частей системы: общий список, просмотр отдельной комнаты по её числовому идентификатору и фильтрация. Все они работают с одним и тем же источником данных, поэтому информация везде согласована. Если в запросе на получение комнаты указан идентификатор в нечисловом формате, сервис автоматически сообщает об ошибке ещё до того, как дело дойдёт до поиска.

Фильтрация устроена гибко: можно указать минимальное число мест, потребовать наличие проектора или задать оба условия сразу — тогда комната должна соответствовать каждому из них. Если ни один параметр не передан, возвращается весь каталог целиком. Когда подходящих вариантов не находится, Roomly честно отвечает пустым списком — это тоже успешный результат, а не ошибка. Вместе все эти возможности образуют первый рабочий контур сервиса, в котором список комнат, точечный доступ по идентификатору и каталожная фильтрация действуют как единое целое.

Что уже дано

В редакторе открыт полный накопительный main.py: объект верхнего уровня app, единый словарь rooms_by_id, рабочий GET /api/rooms/{room_id} и базовый GET /api/rooms, который пока возвращает весь каталог. Каждая комната имеет поля id, name, floor, capacity и has_projector. Перед файлом выполняется видимый служебный переходник проверки: он определяет функции для запросов и чтения состояния, но не создаёт приложение или данные каталога. Менять переходник не нужно.

Что нужно сделать

Расширьте обработчик GET /api/rooms: объявите min_capacity: int = 0 и has_projector: Optional[bool] = None. Возвращайте JSON-массив значений единого rooms_by_id. Оставляйте комнаты с capacity >= min_capacity. Фильтр has_projector применяйте только при значении, отличном от None, и сравнивайте поле комнаты с переданным bool. При двух фильтрах должны выполняться оба условия. Без фильтров возвращайте весь каталог; отсутствие совпадений возвращайте как пустой массив со статусом 200. Не изменяйте рабочий path-маршрут.

Ввод и вывод

stdin не используется. Печатать через print в stdout ничего не нужно. После вашего кода проверяющая система читает объекты верхнего уровня app и rooms_by_id и отправляет запросы через TestClient. Она проверяет полный checkpoint: список, получение существующей комнаты по числовому id, автоматический 422 для нечислового path-значения, оба query-фильтра по отдельности и вместе, пустую выборку и автоматический 422 для несовместимых скалярных query-значений.

О данных в ответах

Используйте учебные данные. Не вставляйте пароли, токены, ключи доступа, паспортные и банковские данные, а также персональные данные других людей. Политика обработки данных.

РешениеPython · Python 3.12 (web: FastAPI, SQLAlchemy, pytest)
Как проверяется решение

Проверяются функции и их результаты. Собственный запуск выполняет ваш код без авторских тестов. Интерактивный запуск не влияет на оценку. Лимит сессии — 5 минут, процессорного времени — 10 секунд.

Отправьте решение, чтобы увидеть результаты тестов.