/AsyncPython-Sprint5

Simple cloud file storage. Graduation project of the course "Python asynchronous programming". Made with FastAPI, SQLAlchemy and PostgreSQL technologies.

Primary LanguagePython

Zephyr

Zephyr - это пет проект, представляющий и себя файловое хранилище для различных типов файлов.

Описание задания

Zephyr является асинхронным HTTP-сервером, обрабатывающем поступающию запросы с помощью библиотеки FastAPI. Весь код написан в асинхронном стиле. Используется асинхронный драйвер для БД - asyncpg. Файлы хранятся облачном хранилище Yandex S3 Objects Storage.

Список эндпоинтов
  1. Статус активности связанных сервисов.

    Подробнее

    Request

    GET /ping
    

    Получить информацию по доступности сторонних сервисов (Postgresql, S3)

    Response

    {
        "database": 1.27,
        "yandex s3": 1.89
    }
  2. Регистрация пользователя.

    Подробнее

    Request

    POST /users/register
    
    {
        "login": "foo",
        "password": "bar"
    }

    Регистрация нового пользователя. Запрос принимает на вход логин и пароль для создания новой учетной записи.

  3. Авторизация пользователя.

    Подробнее

    Request

    POST /users/login
    
    {
        "login": "foo",
        "password": "bar"
    }

    Запрос принимает на вход логин и пароль учетной записи и возвращает авторизационный токен. Далее все запросы проверяют наличие токена в заголовках - Authorization: Bearer <token>

  4. Информация о загруженных файлах.

    Подробнее
    GET storage/
    

    Вернуть информацию о ранее загруженных файлах. Доступно только авторизованному пользователю.

    Response

    {
        "account_id": "AH4f99T0taONIb-OurWxbNQ6ywGRopQngc",
        "files": [
              {
                "id": "a19ad56c-d8c6-4376-b9bb-ea82f7f5a853",
                "name": "notes.txt",
                "created_ad": "2020-09-11T17:22:05Z",
                "path": "/homework/test-fodler/notes.txt",
                "size": 8512,
                "is_downloadable": true
              },
            ...
              {
                "id": "113c7ab9-2300-41c7-9519-91ecbc527de1",
                "name": "tree-picture.png",
                "created_ad": "2019-06-19T13:05:21Z",
                "path": "/homework/work-folder/environment/tree-picture.png",
                "size": 1945,
                "is_downloadable": true
              }
        ]
    }
  5. Загрузить файл в хранилище.

    Подробнее
    POST /storage/upload
    

    Метод загрузки файла в хранилище. Доступно только авторизованному пользователю. Для загрузки заполняется полный путь до файла, в который будет загружен/переписан загружаемый файл. Если нужные директории не существуют, то они должны быть созданы автоматически. Так же есть возможность указать только путь до директории. В этом случае имя создаваемого файла будет создано в соответствии с передаваемым именем файла.

    Request

    {
        "path": <full-path-to-file>||<path-to-folder>,
    }
    

    Response

    {
        "id": "a19ad56c-d8c6-4376-b9bb-ea82f7f5a853",
        "name": "notes.txt",
        "created_ad": "2020-09-11T17:22:05Z",
        "path": "/homework/test-fodler/notes.txt",
        "size": 8512,
        "is_downloadable": true
    }
  6. Скачать загруженный файл.

    Подробнее

    Request

    GET /storage/download
    

    Скачивание ранее загруженного файла. Доступно только авторизованному пользователю.

    Path parameters

    /?path=<path-to-file>||<file-meta-id>
    

    Возможность скачивания есть как по переданному пути до файла, так и по идентификатору.

Использованные технологии

  1. PostgreSQL 15.2
  2. FastAPI
  3. Pydantic
  4. SQLAlchemy
  5. Alembic
  6. Pytest
  7. Docker
  8. Yandex S3 object storage