Необходимо спроектировать и реализовать RESTful API для сокращателя ссылок. Сокращатель ссылок - сервис, который позволяет пользователю создавать более короткие адреса, которые лучше передавать другим пользователям и собирает статистику по совершенным переходам.
Стэк: MySQL, Go
- Регистрация пользователя (авторизация не требуется)
- Получение информации о текущем авторизированном пользователе
- Создание новой короткой ссылки
- Получение всех созданных коротких ссылок пользователя
- Получение информации о конкретной короткой ссылке пользователя (количество переходов)
- Удаление короткой ссылки пользователя
- Получение временного графика количества переходов с группировкой по дням, часам, минутам
- Получение топа из 20 сайтов иcточников переходов
- Получение редиректа на полный url по короткой ссылке
- Клонировать репозиторий проекта
$ git clone https://github.com/bolshagin/shorty-rest-api.git
- Перейти в каталог с проектом
- Создать необходимые для работы объекты в базе данных
create table Users ( userid int not null auto_increment primary key, email varchar(4000) not null, password varchar(4000) not null, access_token varchar(4000) not null ); create table Links ( linkid int not null auto_increment primary key, long_url varchar(8000) not null, short_url varchar(4000) not null default '', userid int not null ); create table Clicks ( linkid int not null, click_time datetime not null );
- Сконфигурировать .toml-конфиг в папке ./configs
bind_addr = ":8080" # порт log_level = "debug" # уровень логирования [store] dbname = "restapi_dev" # схема бд user = "dev" # пользователь password = "12345" # пароль
- С помощью makefile построить проект
или выполнить команду
$ make
$ go build -v ./cmd/apiserver
- Запустить получившийся бинарник
или
apiserver.exe
$ ./apiserver
- Для запусков тестов (сделал только малую часть) необходимо
в отдельном окне терминала (после запуска сервера) выполнить команду
$ make test
/users
POST /users
создает пользователя с указанными в теле запроса email и паролем.
Возвращает:
- userid (идентификатор пользователя в базе данных)
- email (почтовый адрес пользователя)
- access_token (токен для дальнейшей аунтетификации запросов)
Пример запроса:
curl --location --request POST 'http://localhost:8080/users' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "foobar@mail.ru",
"password": "1234567a"
}'
Ответ:
{
"userid": 22,
"email": "foobar@mail.ru",
"access_token": "Zm9vYmFyQG1haWwucnU6MTIzNDU2N2E="
}
201 Created
- пользователь успешно создан в базе данных400 Bad request
- ошибка в формировании запроса500 Internal Server Error
- ошибка возникшая при создании пользователя в базе данных (пропал коннект и т.д.)
GET /me/
- возвращает данные по текущему авторизированному пользователю (в заголовке необходимо передать токен)
Возвращает:
- userid (идентификатор пользователя в базе данных)
- email (почтовый адрес пользователя)
Пример запроса:
curl --location --request GET 'http://localhost:8080/me/' \
--header 'Authorization: Bearer Zm9vYmFyQG1haWwucnU6MTIzNDU2N2E='
Ответ:
{
"userid": 22,
"email": "foobar@mail.ru"
}
200 OK
- успешное получение данных по пользователю401 Unautorized
- ошибка при аутентификации пользователя по переданному токену
/links
POST /links
создает короткую ссылку. В теле запроса необходимо передать long_url.
Ссылка будет создана для пользователя, токен которого указан в заголовке запроса.
Возвращает:
- linkid (идентификатор ссылки в базе данных)
- long_url (полная ссылка)
- short_url (сокращенная ссылка)
Пример запроса:
curl --location --request POST 'http://localhost:8080/links' \
--header 'Authorization: Bearer Zm9vYmFyMTIzQG1haWwucnU6MTIzNDU2N2E=' \
--header 'Content-Type: application/json' \
--data-raw '{
"long_url": "https://meduza.io/"
}'
Ответ:
{
"linkid": 18,
"long_url": "https://meduza.io/",
"short_url": "http://localhost:8080/5pKK"
}
201 Created
- ссылка успешно создана в базе данных400 Bad request
- ошибка в формировании запроса401 Unautorized
- ошибка при аутентификации пользователя по переданному токену500 Internal Server Error
- ошибка возникшая при создании ссылки в базе данных (пропал коннект и т.д.)
/links/{userid}
GET /links/{userid}
- получает все созданные пользователем userid ссылки. В заголовке необходимо передать токен.
Возвращает:
- userid (идентификатор пользователя в базе данных)
- email (почтовый адрес пользователя)
- список ссылок пользователя links
- long_url (полная ссылка)
- short_url (сокращенная ссылка)
Пример запроса:
curl --location --request GET 'http://localhost:8080/links/19' \
--header 'Authorization: Bearer Ym9sc2hhZ2luLm5pa2l0YUB5YW5kZXguY29tOjEyMzQ1Njc=' \
--data-raw ''
Ответ:
{
"userid": 19,
"email": "foobar123@mail.ru",
"links": [
{
"long_url": "https://meduza.io/",
"short_url": "http://localhost:8080/5pKK"
}
]
}
200 OK
- успешный возврат данных400 Bad request
- ошибка в формировании запроса401 Unautorized
- ошибка при аутентификации пользователя по переданному токену500 Internal Server Error
- ошибка возникшая при работе с бд (пропал коннект, неверный запрос и т.д.)
GET /link
- получает информацию по конкретной короткой ссылке short_url пользователя userid. В заголовке необходимо передать токен.
Возвращает:
- linkid (идентификатор ссылки в базе данных)
- long_url (полная ссылка)
- short_url (сокращенная ссылка)
- n_clicks (количество переходов; если переходов 0, то данного поля нет)
Пример запроса:
curl --location --request GET 'http://localhost:8080/link' \
--header 'Authorization: Bearer Zm9vYmFyMTIzQG1haWwucnU6MTIzNDU2N2E=' \
--header 'Content-Type: application/json' \
--data-raw '{
"userid": 19,
"short_url": "http://localhost:8080/5pKK"
}'
Ответ:
{
"linkid": 18,
"long_url": "https://meduza.io/",
"short_url": "http://localhost:8080/5pKK",
"n_clicks": 1
}
200 OK
- успешный возврат данных400 Bad request
- ошибка в формировании запроса401 Unautorized
- ошибка при аутентификации пользователя по переданному токену500 Internal Server Error
- ошибка возникшая при работе с бд
DELETE /link
- удаляет короткую ссылку пользователя. Удаляет только ссылку у пользователя, токен которого передан.
Пример запроса:
curl --location --request DELETE 'http://localhost:8080/link' \
--header 'Authorization: Bearer Zm9vYmFyMTIzQG1haWwucnU6MTIzNDU2N2E=' \
--header 'Content-Type: application/json' \
--data-raw '{
"short_url": "http://localhost:8080/5pKK"
}'
Ответ:
{
"result": "deleted"
}
200 OK
- ссылка удалена400 Bad request
- ошибка в формировании запроса401 Unautorized
- ошибка при аутентификации пользователя по переданному токену500 Internal Server Error
- ошибка возникшая при работе с бд (не существует такой ссылки и т.д.)
/stats/top
GET /stats/top
- возвращает топ-20 ссылок по переходам. В заголовке необходимо передать токен.
Возвращает:
- список ссылок с количеством переходов
Пример запроса:
curl --location --request GET 'http://localhost:8080/stats/top' \
--header 'Authorization: Bearer Zm9vYmFyMTIzQG1haWwucnU6MTIzNDU2N2E='
Ответ:
[
{
"long_url": "https://meduza.io/",
"n_clicks": 6
}
]
200 OK
- успешный возврат данных401 Unautorized
- ошибка при аутентификации пользователя по переданному токену500 Internal Server Error
- ошибка возникшая при работе с бд
/{short_url}
GET /{short_url}
- делает редирект по короткой ссылке
Пример запроса:
curl --location --request GET 'http://localhost:8080/5pKN'