Skip to content

Тестовое задание OZON | Cервис сокращения URL

License

Notifications You must be signed in to change notification settings

edamiyan/ozon-link-shortener

Repository files navigation

ozon-link-shortener

Тестовое задание OZON | Cервис сокращения URL

Содержание

  1. Описание задачи
  2. Реализация
  3. API
  4. Сборка и запуск
  5. Тестирование

Описание задачи

Необходимо реализовать сервис, который должен предоставлять API по созданию сокращенных ссылок следующего формата:

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

Сервис должен быть написан на Go и принимать следующие запросы по http:

  1. Метод Post, который будет сохранять оригинальный URL в базе и возвращать сокращённый
  2. Метод Get, который будет принимать сокращённый URL и возвращать оригинальный URL

Решение должно быть предоставлено в «конечном виде», а именно:

  • Сервис должен быть распространён в виде Docker-образа
  • В качестве хранилища ожидается использовать in-memory решение И postgresql. Какое хранилище использовать указывается параметром при запуске сервиса.
  • Покрыть реализованный функционал Unit-тестами

Демонстрация работы

Данный тестовый проект развернут на сервере, который находится по адресу http://165.232.74.0:8080

Сократить оригинальный URL

curl --location --request POST 'http://165.232.74.0:8080/api/v1/tokens' \
--header 'Content-Type: application/json' \
--data-raw '{
    "base_url": "https://ozon.ru"
}'

Получить оригинальный URL

curl --location --request GET 'http://165.232.74.0:8080/api/v1/tokens/M_bnd0O_Jo' \
--header 'Content-Type: application/json'
}'

Реализация

  • Следование дизайну REST API.
  • Подход "Чистой Архитектуры" и техника внедрения зависимости.
  • Работа с фреймворком echo.
  • Работа с БД Postgres с использованием библиотеки sqlx и написанием SQL запросов.
  • Конфигурация приложения - библиотека viper.
  • Запуск из Docker.
  • Юнит-тестирование уровней бизнес-логики с помощью моков.

Структура проекта:

.
├── internal
│   ├── model           	// основные структуры
│   ├── handler         	// обработчики запросов
│   ├── pkg
│       ├── response    	// обработчик ответов
│   	└── token_generator     // генератор уникальных токенов
│   ├── service         	// бизнес-логика
│   └── repository      	// взаимодействие с БД
├── cmd                 	// точка входа в приложение
├── postgres            	// SQL файлы с миграциями
└── configs             	// файлы конфигурации

API

  1. Тело запроса/ответа - в формате JSON.
  2. В случае ошибки возвращается необходимый HTTP код, в теле содержится описание ошибки (пример: {"error": "something went wrong"}).

POST /api/v1/tokens/

Сокращение исходного URL.

  • Параметры тела запроса:
    • base_url - исходный URL.
  • Тело ответа:
    • token - уникальный токен, присвоенный данному адресу URL.

Пример

Запрос:

curl -X POST localhost:8080/api/v1/tokens \
-H "Content-Type: application/json" \
-d '{
	"base_url": "https://www.ozon.ru/product/smartfon-lenovo-k13-2-32gb-siniy-298657201/?sh=1gxfRKTl%2F"
}'

Ответ:

{
    "token":"_r0md0magW"
}

POST /api/v1/tokens/:token

Восстановление оригинального URL.

  • Тело ответа:
    • base_url - оригинальный URL, соответствующий данному токену.

Пример

Запрос:

curl -X GET localhost:8080/api/v1/tokens/_r0md0magW

Ответ:

{
    "baseURL":"https://www.ozon.ru/product/smartfon-lenovo-k13-2-32gb-siniy-298657201/?sh=1gxfRKTl%2F"
}

Сборка и запуск

С помощью docker-compose

Запуск с in-memory хранилищем

docker-compose build app_im
docker-compose run -p 127.0.0.1:8080:8080 -d app_im

Запуск с postgresql хранилищем

docker-compose build app_db
docker-compose run -p 127.0.0.1:8080:8080 -d app_db

С помощью Makefile

Запуск с in-memory хранилищем

make fmt
make build
make run_im

Запуск с postgresql хранилищем

make fmt
make build
make run_db

Тестирование

Запуск юнит-тестов

make generate
make test