Спроектируйте и реализуйте сервис для создания сокращённой формы передаваемых URL и анализа активности их использования.
Кроме этого, выберите из списка дополнительные требования и тоже реализуйте их. У каждого задания есть определённая сложность, от которой зависит количество баллов. Вам необходимо выбрать такое количество заданий, чтобы общая сумма баллов была больше 4. Выбор заданий никак не ограничен: можно выбрать все простые или одно среднее и два простых, или одно продвинутое, или решить все.
В рамках выполнения задания реализован прототип API сервиса для сокращения URL ссылок, который позволяет получать короткую ссылку для длинных URL адресов и обеспечивает просмотр статистики по её использованию.
Описане API доступно по ссылке: http://127.0.0.1:8000/api/openapi
git clone https://github.com/alexfofanov/async-python-sprint-4.git
cd async-python-sprint-4
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
создать файл .env по аналоии с .env.sample
./run_postgres.sh
alembic upgrade head
fastapi run src/main.py --port 8000
создать файл .env_docker по анологии с .env_docker.sample
docker-compose up --build -d # запуск
docker-compose down # остановка и удаление
./run_test_postgres.sh
pytest # запуск тестов
cd src
python3 main.py # запуск API
Реализовать http-сервис, который обрабатывает поступающие запросы. Сервер стартует по адресу http://127.0.0.1:8080 (значение по умолчанию, можно изменять).
Список возможных эндпойнтов (можно изменять)
- Получить сокращённый вариант переданного URL.
POST /Метод принимает в теле запроса строку URL для сокращения и возвращает ответ с кодом 201.
- Вернуть оригинальный URL.
GET /<shorten-url-id>Метод принимает в качестве параметра идентификатор сокращённого URL и возвращает ответ с кодом 307 и оригинальным URL в заголовке Location.
- Вернуть статус использования URL.
GET /<shorten-url-id>/status?[full-info]&[max-result=10]&[offset=0]Метод принимает в качестве параметра идентификатор сокращённого URL и возвращает информацию о количестве переходов, совершенных по ссылке.
В ответе может содержаться как общее количество совершенных переходов, так и дополнительная детализированная информация о каждом переходе (наличие query-параметра full-info и параметров пагинации):
- дата и время перехода/использования ссылки;
- информация о клиенте, выполнившем запрос;
- (1 балл) Реализуйте метод
GET /ping, который возвращает информацию о статусе доступности БД. - (1 балл) Реализуйте возможность «удаления» сохранённого URL. Запись должна остаться, но помечаться как удалённая. При попытке получения полного URL возвращать ответ с кодом
410 Gone. - (2 балла) Реализуйте middlware, блокирующий доступ к сервису из запрещённых подсетей (black list).
- (2 балла) Реализуйте возможность передавать ссылки пачками (batch upload).
Описание изменений
- Метод
POST /shortenпринимает в теле запроса список URL в формате:
[
{
"original-url": "<URL-for-shorten>"
},
...
]... и возвращает данные в следующем формате:
[
{
"short-id": "<shoten-id>",
"short-url": "http://...",
},
...
]- (3 балла) Реализуйте взаимодействие с сервисом авторизованного пользователя. Пользователь может создавать как приватные, так и публичные ссылки или изменять видимость ссылок. Вызов метода
GET /user/statusвозвращает все созданные ранее ссылки в формате:
[
{
"short-id": "<text-id>",
"short-url": "http://...",
"original-url": "http://...",
"type": "<public|private>"
},
...
]
- **(5 баллов) Реализуйте кастомное взаимодействия с БД. Необходимо учесть возможность работы с транзакциями.
- Используйте фреймворк FastAPI. В качестве СУБД используйте PostgreSQL (не ниже 10 версии).
- Используйте концепции ООП.
- Предусмотрите обработку исключительных ситуаций.
- Приведите стиль кода в соответствие pep8, flake8, mypy.
- Логируйте результаты действий.
- Покройте написанный код тестами.