Необходимо реализовать сервис, который должен предоставлять API по созданию сокращённых ссылок следующего формата:
- Ссылка должна быть уникальной и на один оригинальный URL должна ссылаться только одна сокращенная ссылка
- Ссылка должна быть длиной 10 символов
- Ссылка должна состоять из символов латинского алфавита в нижнем и верхнем регистре, цифр и символа «_»
- Сервис должен быть распространён в виде Docker-образа
- В качестве хранилища ожидается использовать две реализации. Какое хранилище использовать, указывается параметром при запуске сервиса.
- PostgreSQL
- Самостоятельно написать пакет для хранения ссылок в памяти приложения
- Покрыть реализованный функционал Unit-тестами
Сервис принимает следующие запросы по http:
- Метод Post
"/"
. Сохраняет оригинальный URL в базе и возвращает сокращённый - Метод Get
"/:short_url"
. Принимает сокращённый URL и возвращает оригинальный URL
Для запуска с in-memory хранилищем данных:
go run cmd/main.go -storage=local
OR
docker build -f Dockerfile.local -t service .
docker run -p 8080:8080 -t service
Для запуска с PostgreSQL:
go run cmd/main.go -storage=postgres
OR
docker-compose up --build
В случае запуска без Docker'а необходимо использовать в .env-файле DATABASE_URL=postgres://localhost:qwer@database:5432/urlsdb?sslmode=disable
Запуск Unit-тестов:
go test ./...
curl -X POST http://localhost:8080/ -H 'Content-Type: application/json' -d '{"full_url":"https://example.com/ddddddddk/share/fs"}'
{
"message": "Success",
"short_url": "https://short.io/ddZ7Vg7jFR"
}
curl https://localhost:8080/ddZ7Vg7jFR
{
"full_url": "https://example.com/dddddddfs"
}
Для создания используется Base string с разрешёнными символами, которые выдираются случайным образом. В случае коллизии хэш пересоздаётся до тех пор, пока не будет получен уникальный ключ.