go-url-shortener-service

Задача:

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

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

Результат:

  1. Сервис должен быть распространён в виде Docker-образа
  2. В качестве хранилища ожидается использовать две реализации. Какое хранилище использовать, указывается параметром при запуске сервиса.
    • PostgreSQL
    • Самостоятельно написать пакет для хранения ссылок в памяти приложения
  3. Покрыть реализованный функционал 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 ./...

Пример хэширования и занесения URL в базу

Request

curl -X POST http://localhost:8080/ -H 'Content-Type: application/json' -d '{"full_url":"https://example.com/ddddddddk/share/fs"}'

Response

{
    "message": "Success",
    "short_url": "https://short.io/ddZ7Vg7jFR"
}

Пример получения оригинальной URL из базы

Request

curl https://localhost:8080/ddZ7Vg7jFR

Response

{
   "full_url": "https://example.com/dddddddfs"
}

Алгоритм создания коротких ссылок

Для создания используется Base string с разрешёнными символами, которые выдираются случайным образом. В случае коллизии хэш пересоздаётся до тех пор, пока не будет получен уникальный ключ.