Skip to content

Проектная работа четвертого спринта курса «Асинхронное программирование на Python».

Notifications You must be signed in to change notification settings

alexfofanov/async-python-sprint-4

Repository files navigation

Проектное задание четвёртого спринта

Спроектируйте и реализуйте сервис для создания сокращённой формы передаваемых 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

Запуска без docker-compose

./run_postgres.sh  

alembic upgrade head

fastapi run src/main.py --port 8000

Запуск docker-compose

создать файл .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 (значение по умолчанию, можно изменять).

Список возможных эндпойнтов (можно изменять)
  1. Получить сокращённый вариант переданного URL.
POST /

Метод принимает в теле запроса строку URL для сокращения и возвращает ответ с кодом 201.

  1. Вернуть оригинальный URL.
GET /<shorten-url-id>

Метод принимает в качестве параметра идентификатор сокращённого URL и возвращает ответ с кодом 307 и оригинальным URL в заголовке Location.

  1. Вернуть статус использования 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 баллов) Реализуйте кастомное взаимодействия с БД. Необходимо учесть возможность работы с транзакциями.

Требования к решению

  1. Используйте фреймворк FastAPI. В качестве СУБД используйте PostgreSQL (не ниже 10 версии).
  2. Используйте концепции ООП.
  3. Предусмотрите обработку исключительных ситуаций.
  4. Приведите стиль кода в соответствие pep8, flake8, mypy.
  5. Логируйте результаты действий.
  6. Покройте написанный код тестами.

About

Проектная работа четвертого спринта курса «Асинхронное программирование на Python».

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages