На Авито ежедневно публикуются тысячи объявлений о продаже или аренде недвижимости. Они попадают в каталог домов, в котором пользователь может выбрать жильё по нужным параметрам в понравившемся доме.
Прежде чем попасть в каталог, объявление проходит тщательную модерацию, чтобы в нём не было недопустимого контента.
Разработайте backend-сервис, с помощью которого пользователь сможет продать квартиру, загрузив объявление на Авито.
- Авторизация пользователей:
- Используя ручку /dummyLogin и передав в неё желаемый тип пользователя (client, moderator), сервис в ответе вернет токен с соответствующим уровнем доступа — обычного пользователя или модератора. Этот токен нужно передавать во все endpoints, требующие авторизации.
- Регистрация и авторизация пользователей по почте и паролю:
- При регистрации используется endpoint /register. В базе создаётся и сохраняется новый пользователь желаемого типа: обычный пользователь (client) или модератор (moderator).
- У созданного пользователя появляется токен endpoint /login. При успешной авторизации по почте и паролю возвращается токен для пользователя с соответствующим ему уровнем доступа.
- Создание дома:
- Только модератор имеет возможность создать дом используя endpoint /house/create. В случае успешного запроса возвращается полная информация о созданном доме
- Создание квартиры:
- Создать квартиру может любой пользователь, используя endpoint /flat/create. При успешном запросе возвращается полная информация о квартире.
- Если жильё успешно создано через endpoint /flat/create, то объявление получает статус модерации created.
- У дома, в котором создали новую квартиру, обновляется дата последнего добавления жилья.
- Модерация квартиры:
- Статус модерации квартиры может принимать одно из четырёх значений: created, approved, declined, on moderation.
- Только модератор может изменить статус модерации квартиры с помощью endpoint /flat/update. При успешном запросе возвращается полная информация об обновленной квартире.
- Получение списка квартир по номеру дома:
- Используя endpoint /house/{id}, обычный пользователь и модератор могут получить список квартир по номеру дома. Только обычный пользователь увидит все квартиры со статусом модерации approved, а модератор — жильё с любым статусом модерации.
- Дополнительно. Подписка на уведомления о новых квартирах в доме по его номеру. Обычный пользователь может подписаться на такие уведомления с помощью endpoint /house/{id}/subscribe.
У сущности «Дом» есть:
- уникальный номер дома
- адрес
- год постройки
- застройщик (у 50% домов)
- дата создания дома в базе
- дата последнего добавления новой квартиры дома
У сущности «Квартира» есть:
- номер квартиры
- цена (целое число)
- количество комнат
Связи между сущностями:
- Каждая квартира может иметь только одно соответствие с домом (один к одному).
- Номер дома служит уникальным идентификатором самого дома.
- Номер квартиры не является уникальным идентификатором. Например, квартира №1 может находиться как в доме №1, так и в доме №2, и в этом случае это будут разные квартиры.
Список квартир в доме — ключевая функция, которой пользуются:
- Модераторы — получают полный список всех объявлений в доме вне зависимости от статуса модерации.
- Пользователи — получают список только прошедших модерацию объявлений. Важно гарантировать быстрый отклик endpoint для пользователей.
- Используйте этот API.
- Реализация пользовательской авторизаций не является обязательным условием. Поэтому токен авторизации можете получить из метода /dummyLogin, описанного в пункте 1 API. В параметрах запроса можно выбрать роль пользователя: модератор или обычный пользователь. В зависимости от роли будет сгенерирован токен с определённым уровнем доступа.
- Всего квартир (до 20kk), RPS — 1k, SLI времени ответа — 50 мс, SLI успешности ответа — 99.99%
- Для авторизации доступов должны использоваться два вида токенов: обычного пользователя и модератора. Получение списка квартир и публикация нового объявления может происходить с помощью токена пользователя или модератора, остальные действия могут выполняться только с помощью токена модератора.
- Разработайте интеграционные и модульные тесты для сценариев получения списка квартир и процесса публикации новой квартиры.
- Квартира может не пройти модерацию. В таком случае её видят только модераторы.
- Работать с сервисом могут несколько модераторов. При этом конкретную квартиру может проверять только один модератор. Перед началом работы нужно перевести квартиру в статус on moderate — тем самым запретив брать её на проверку другим модераторам. В конце квартиру переводят в статус approved или declined.
Не являются обязательными, но дадут вам преимущество перед другими кандидатами.
- Реализовать пользовательскую авторизацию по методам /register и /login.
- Реализовать асинхронный механизм уведомления пользователя о появлении новых квартир в доме по почте, метод /house/{id}/subscribe. Саму отправку писем разрабатывать не нужно, вместо этого стоит использовать готовый интерфейс:
package sender
import (
"context"
"errors"
"fmt"
"math/rand"
"time"
)
type Sender struct{}
func New() *Sender {
return &Sender{}
}
func (s *Sender) SendEmail(ctx context.Context, recipient string, message string) error {
// Имитация отправки сообщения
duration := time.Duration(rand.Int63n(3000)) * time.Millisecond
time.Sleep(duration)
// Имитация неуспешной отправки сообщения
errorProbability := 0.1
if rand.Float64() < errorProbability {
return errors.New("internal error")
}
fmt.Printf("send message '%s' to '%s'\n", message, recipient)
return nil
}
- Настроить CI (например, через github actions или travis), по итогам которого:
- Настроить логгер
- Настроить кодогенерацию DTO endpoint'ов по openapi схеме
- Язык сервиса: – Go.
- База данных: – предпочтительно PostgreSQL, но можно выбрать другую удобную вам. Нельзя использовать ORM для взаимодействия с базой. Допустимо использовать билдеры для запросов, например, такой: https://github.com/Masterminds/squirrel
- Для деплоя зависимостей и самого сервиса нужно использовать Docker или Docker & DockerCompose.
Если у вас возникнут вопросы, ответов на которые нет в условиях, то принимать решения можете самостоятельно. В таком случае приложите к проекту Readme-файл со списком вопросов и объяснениями своих решений.
Создайте публичный git-репозиторий на любом хосте (GitHub, GitLab и другие), содержащий в master/main ветке:
- Код сервиса;
- Docker или Docker & DockerCompose или описанную в Readme.md инструкцию по запуску;
- Описанные в Readme.md вопросы или проблемы, с которыми вы столкнулись, и описание своих решений.
Прикрепите ссылку на репозиторий в письмо на почте от организаторов программы.