Skip to content

aytero/go-url-shortener-service

Repository files navigation

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 с разрешёнными символами, которые выдираются случайным образом. В случае коллизии хэш пересоздаётся до тех пор, пока не будет получен уникальный ключ.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published