Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

VK backend test task

Описание работы

Данный проект представляет собой REST API маркетплейса, написанный на Go и работающий в связке с базой данных PostgreSQL. Запуск осуществляется с помощью Docker Compose и утилиты air для hot reload разработки.

Public API

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 15
  • marketplace-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

Как запустить

  1. Убедитесь, что у вас установлены Docker и Docker Compose.
  2. Убедитесь, что файл .env существует и корректен. Измените его если вам нужна другая конфигурация
  3. Запустите проект:
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, данные сохраняются в volume postgres_data

Задача

Написать приложение, реализующее REST-API условного маркетплейса:

  • авторизация пользователей;
  • регистрация пользователей;
  • размещение нового объявления;
  • отображение ленты объявлений.

API должен быть реализован в формате REST + JSON. Реализовать приложение на языке Go. Допускается использование фреймворков. База данных любая. Приложение, включая БД, должно быть упаковано в Docker контейнер.


Авторизация пользователя

  • авторизация должна происходить посредством отправки в приложение логина и пароля;
  • приложение должно проверить корректность полученных данных и вернуть авторизационный токен в случае успеха;
  • токен должен передаваться в хедерах запроса, название хедера на ваш выбор;
  • токен может быть передан в любой эндпоинт;
  • при наличии токена, он должен быть обработан и проверен.

Регистрация пользователей

  • регистрация должна осуществляться посредством отправки в приложение логина и пароля;
  • необходимо предусмотреть и реализовать разумные ограничения на формат логина и пароля;
  • в успешном ответе вернуть данные добавленного пользователя.

Размещение объявления

  • размещение объявления должно происходить посредством отправки данных в формате JSON: заголовок, текст объявления, адрес изображения, цена;
  • размещать объявления могут только авторизованные пользователи;
  • необходимо предусмотреть и реализовать разумные ограничения на длину заголовка, текста объявления, цены, размера и формата изображения;
  • в успешном ответе вернуть данные добавленного объявления.

Отображение ленты объявлений

  • лента объявлений представляет из себя список объявлений, отсортированный по дате добавления (самые свежие в начале);
  • необходимо реализовать постраничную навигацию, возможность изменения типа и направления сортировки (дата создания и цена), возможность фильтрации по цене (мин. и макс. значение);
  • для каждого объявления необходимо вернуть: заголовок, текст объявления, адрес изображения, цену, логин автора;
  • для авторизованных пользователей необходимо дополнительно возвращать признак принадлежности объявления текущему пользователю.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages