Данный проект представляет собой REST API маркетплейса, написанный на Go и работающий в связке с базой данных PostgreSQL. Запуск осуществляется с помощью Docker Compose и утилиты air для hot reload разработки.
API доступен по адресу https://vktest.nerfthis.space/api/v1 (с http должен работать редирект)
Там уже есть mock данные, 5 юзеров и 25 объявлений.
Один из пользователей для теста:
Ledner4392 password123
Там я настроил все с помощью traefik, в том числе там доступна документация https://vktest.nerfthis.space/swagger
labels:
- "traefik.enable=true"
- "traefik.http.routers.marketplace.rule=Host(`vktest.nerfthis.space`)"
- "traefik.http.routers.marketplace.entrypoints=web,websecure"
- "traefik.http.routers.marketplace.tls.certresolver=le"
- "traefik.http.services.marketplace.loadbalancer.server.port=23356"db: контейнер с PostgreSQL 15marketplace-service: Go-приложение с автоматическим перезапуском при изменениях
Создайте файл .env в корне проекта со следующим содержанием:
HTTP_PORT=3000
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=password
DB_NAME=auth_db
JWT_SECRET=ASJDKASjdkjqojerqiowje21903123askdj
ACCESS_TOKEN_TTL=5m- Убедитесь, что у вас установлены Docker и Docker Compose.
- Убедитесь, что файл
.envсуществует и корректен. Измените его если вам нужна другая конфигурация - Запустите проект:
docker-compose up --buildПо умолчанию PostgreSQL в Docker создаёт базу только один раз при первом запуске volume, используя переменную POSTGRES_DB. Поэтому если хочется поменять название бд после то нужно удалить volumes
Dockerfile— описание сборки Go-приложенияdocker-compose.yml— конфигурация сервисов.env— переменные окружения.air.toml— опциональная конфигурация дляair
Скрипт создаст пять пользователей с паролем password и по пять объявлений на каждого.
Нужно сначала сбилдить контейнеры или просто их запустить через docker compose up и потом заполнить командой
docker compose run --rm marketplace-service go run ./cmd/seedПосле запуска:
- API будет доступен по адресу http://localhost:3000 или по порту который вы указали в .env
- База данных PostgreSQL будет работать на порту
5432, данные сохраняются в volumepostgres_data
Написать приложение, реализующее REST-API условного маркетплейса:
- авторизация пользователей;
- регистрация пользователей;
- размещение нового объявления;
- отображение ленты объявлений.
API должен быть реализован в формате REST + JSON. Реализовать приложение на языке Go. Допускается использование фреймворков. База данных любая. Приложение, включая БД, должно быть упаковано в Docker контейнер.
- авторизация должна происходить посредством отправки в приложение логина и пароля;
- приложение должно проверить корректность полученных данных и вернуть авторизационный токен в случае успеха;
- токен должен передаваться в хедерах запроса, название хедера на ваш выбор;
- токен может быть передан в любой эндпоинт;
- при наличии токена, он должен быть обработан и проверен.
- регистрация должна осуществляться посредством отправки в приложение логина и пароля;
- необходимо предусмотреть и реализовать разумные ограничения на формат логина и пароля;
- в успешном ответе вернуть данные добавленного пользователя.
- размещение объявления должно происходить посредством отправки данных в формате JSON: заголовок, текст объявления, адрес изображения, цена;
- размещать объявления могут только авторизованные пользователи;
- необходимо предусмотреть и реализовать разумные ограничения на длину заголовка, текста объявления, цены, размера и формата изображения;
- в успешном ответе вернуть данные добавленного объявления.
- лента объявлений представляет из себя список объявлений, отсортированный по дате добавления (самые свежие в начале);
- необходимо реализовать постраничную навигацию, возможность изменения типа и направления сортировки (дата создания и цена), возможность фильтрации по цене (мин. и макс. значение);
- для каждого объявления необходимо вернуть: заголовок, текст объявления, адрес изображения, цену, логин автора;
- для авторизованных пользователей необходимо дополнительно возвращать признак принадлежности объявления текущему пользователю.