Skip to content

Backend

Igor Baliuk edited this page Jan 26, 2025 · 19 revisions

Привет! В данном разделе находятся ответы вопросы, которые мы получаем чаще, чем хотелось бы. Пожалуйста, ознакомьтесь с ними прежде чем задавать вопрос в бота поддержки.

Самый эффективный способ узнать ответ на появившийся вопрос — прочитать условие задания несколько раз, с паузами, и дать некоторое время самому себе, чтобы полученная информация усвоилась и всё стало на свои места. Да, это непросто, но очень полезно! Такая тактика с высокой вероятностью позволит вам получить ответ быстрее, нежели ждать его в боте поддержки. Это поможет организаторам олимпиады сконцентрироваться на вопросах, которые не освещаются в условии.

Бота поддержки стоит воспринимать как крайнюю меру, если самостоятельно разобраться с вопросом не получается. Пользуйтесь интернетом для поиска оветов на общие вопросы, не относящиеся конкретно к данному заданию.

Я прочитал(а) задание несколько раз, но все еще непонятно, что надо сделать?

Вам необходимо реализовать HTTP-сервер, который будет реализовывать описанные методы и будет обращаться к СУБД для хранения данных. На проверку необходимо сдать репозиторий с реализованным приложением. Все необходимые зависимости (PostgreSQL, Redis, ...) тестирующая система запустит самостоятельно во время тестирования.

Что такое спецификация и где её взять?

Open API — это специальный формат для формального описания API. Он позволяет указать схему запросов и ответов, которой должно следовать ваше приложение. Подробнее про Open API можно почитать по ссылке. Со спецификацией Open API для нашего задания можно ознакомиться в файле api.yml (ссылка кликабельна).

Я могу использовать библиотеку X? Я могу не использовать какую-то СУБД?

Да, можете. Вы сами выбираете, как написать собственное приложение. Ограничение на набор библиотек и подходов нет. Главное, чтобы собрался Docker-образ с работающим HTTP-сервером.

Мне нужно запускать PostgreSQL и redis?

Вы можете это сделать для локального тестирования. Например, это можно сделать с помощью docker compose.

В рамках тестирования мы самостоятельно запустим наши собственные контейнеры PostgreSQL, Redis и другими зависимостями.

Можно использовать MySQL, sqlite, ClickHouse, Cassandra, Kafka, nats? Или хотя бы MongoDB?... Это мои любимые технологии, они правда здесь нужны!

Нет.

Можно я закоммичу что-то в корень проекта, помимо директории solution и .gitignore?

Нет. Но можете попробовать :)

В корень репозитория попали лишние файлы. Что делать?

Наши механики должны были откатить данные изменения, поэтому необходимо сделать git pull, при необходимости добавить файлы в .gitignore.

Можно ли доработать CI и добавить туда что-то?

Нет.

Можно ли возвращать null?

Нет. Если структура ответа предполагает опциональность поля, сервер не должен возвращать данное поле при его отсутствии. Запросы с неописанными в спецификации полями можно отклонять (400), на ваше усмотрение.

Как реагировать на null в качестве значений полей в запросах?

На ваше усмотрение. Тестирующая система не будет делать такие запросы.

Насколько сильно надо валидировать e-mail?

Руководствуйтесь здравым смыслом. Если на указанный адрес можно отправить электронное письмо, принимайте его. Можете изучить, какие e-mail'ы допустимы при регистрации на github.com, и сделать так же.

В спецификации сказано X, а в условии еще упомянуто Y. Кому верить?

В условии указаны более человекочитаемые фразы. При тестировании будет проверяться то, что указано в спецификации.

Нужно ли проверять регистр символов при указании кода страны?

Нет, валидация должна быть регистронезависимой. То есть пользователь может указать rU, а компания — RU, и это будут эквивалентные значения. Причем оба значения будут корректными.

Будет ли валидироваться тело ответа при ошибке? (4xx)

Нет. Только status code.

В CI вижу ошибку create network: ensure default network: network list. Что это?

Скорее всего ваше приложение не может запуститься / не отвечает на /api/ping. Раскройте вкладку Application logs для первой группы тестов.

В каком формате сервер должен отдавать время и дату? Какой часовой пояс?

При отправке времени комментария используйте формат RFC3339. Этот формат позволяет указать часовой пояс, к которому относится переданное время. Примерны корректных значений: 2019-10-12T07:20:50Z(UTC+0), 2019-10-12T07:20:50+00:00 (UTC+0), 2019-10-12T14:20:50+07:00 (UTC+7), 2019-10-12T03:20:50-04:00 (UTC-4).

Нужно ли проставлять ENV в Dockerfile?

Нет. При тестировании система самостоятельно подставит нужные env.

Может ли сервер возвращать лишние заголовки?

Да.

В тестах в ответе ожидается намного меньше полей, чем в спецификации, почему так?

Для тестирования в Tavern включена нестрогая валидация ответа. Tavern будет сравнивать только те поля, которые указаны в expected значении. Сервер при этом должен передавать все обязательные поля из спецификации, так как они могут быть проверены в других тестах.

В публичных тестах сообщение вида Extra-keys in ... носит информационный характер. Если публичные тесты не прошли и вы видите сообщение Extra keys in response: {'company_id', 'company_name', 'used_count', 'like_count', 'active', 'promo_id'}, причина падения тестов не в нём.

Что делать, если в запросе на создание промокода active_from > active_until?

На ваше усмотрение. Можете возвращать ошибку, можете сохранить промокод (тогда он будет неактивным).

Может ли пользователь получить промокод по ID, даже если не выполнены условия таргетинга?

Да.

Как реагировать на пустой список categories?

Можете считать пустой список и отсутствие поля эквивалентными значениями. Если поступил запрос с пустым списком, в ответе вы можете не возвращать данное поле.

В логах сборки вместо токена и пароля я вижу ***. Что это?

Это github старается маскировать пароли, токены и другие секреты, чтобы их труднее было украсть, когда вы хотите показать свой экран кому-то другому.

Если приходит запрос по ID промокода / комментария, который не соответствует формату UUID, возвращать 400 или 404?

На ваше усмотрение. Можете возвращать 400 или 404.

Clone this wiki locally