Тестовое задание OZON | Cервис сокращения URL
Необходимо реализовать сервис, который должен предоставлять API по созданию сокращенных ссылок следующего формата:
- Ссылка должна быть уникальной и на один оригинальный URL должна ссылаться только одна сокращенная ссылка.
- Ссылка должна быть длинной 10 символов
- Ссылка должна состоять из символов латинского алфавита в нижнем и верхнем регистре, цифр и символа _ (подчеркивание)
Сервис должен быть написан на Go и принимать следующие запросы по http:
- Метод Post, который будет сохранять оригинальный URL в базе и возвращать сокращённый
- Метод 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 // файлы конфигурации
- Тело запроса/ответа - в формате JSON.
- В случае ошибки возвращается необходимый HTTP код, в теле содержится описание ошибки (пример:
{"error": "something went wrong"}
).
Сокращение исходного 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"
}
Восстановление оригинального 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 build app_im
docker-compose run -p 127.0.0.1:8080:8080 -d app_im
docker-compose build app_db
docker-compose run -p 127.0.0.1:8080:8080 -d app_db
make fmt
make build
make run_im
make fmt
make build
make run_db
make generate
make test