Coder Social home page Coder Social logo

async-python-sprint-5's Introduction

Описание проекта

Сервис для хранения файлов.

Возможности проекта:

  • Получение статуса подключения к сервисам.
  • Регистрация, авторизация и аутентификация с помощью JWT.
  • Загрузка файлов (multipart/form-data) в сервис с указанием конкретной директории в сервисе.
  • Получение списка загруженных файлов.
  • Скачивание одного файла: напрямую или в zip-архиве.
  • Скачивание нескольких файлов: с указанием папки для скачивания (в zip-архиве).

Как запустить проект локально с помощью Doker:

Клонировать репозиторий и перейти в него в терминале:

git clone https://github.com/mityasun/async-python-sprint-5.git

Перейдите в директорию с настройками Docker-compose:

cd async-python-sprint-5

Создайте в этой директории файл .env на основе файла-примера env.docker.example:

APP_TITLE='File storage service'
PROJECT_HOST=127.0.0.1
PROJECT_PORT=8000
NGINX_PORT=80
ENGINE_ECHO=False
FILE_FOLDER=files
MAX_FILE_SIZE=1048576
JWT_SECRET=SECRET
TOKEN_LIFETIME=3600
DATABASE_DSN=postgresql+asyncpg://postgres:postgres@files_postgres:5432/postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres

Запустите сборку образа и запуск сервиса из файла Docker-compose:

docker-compose up -d --build

Спецификация API будет доступна по ссылке:

http://localhost/redoc

Проектное задание пятого спринта

Вам необходимо спроектировать и разработать файловое хранилище, которое позволяет хранить различные типы файлов — документы, фотографии, другие данные.

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

Реализовать http-сервис, который обрабатывает поступающие запросы. Сервер стартует по адресу http://127.0.0.1:8080 (дефолтное значение, может быть изменено).

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

    Описание изменений.
    GET /ping
    

    Получить информацию о времени доступа ко всем связанным сервисам, например, к БД, кэшам, примонтированным дискам и т.д.

    Response

    {
        "db": 1.27,
        "cache": 1.89,
        ...
        "service-N": 0.56
    }
  2. Регистрация пользователя.

    Описание изменений.
    POST /api/v1/auth/register
    

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

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

    Описание изменений.
    POST /api/v1/auth/jwt/login
    

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

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

    Описание изменений.
    GET /api/v1/files/
    

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

    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 /api/v1/files/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. Скачать загруженный файл.

    Описание изменений.
    GET /api/v1/files/download
    

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

    Path parameters

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

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

Список дополнительных (опциональных) эндпойнтов.
  1. Добавление возможности скачивания в архиве.

    Описание изменений.
    GET /api/v1/files/download
    

    Path-параметр расширяется дополнительным параметром – compression. Доступно только авторизованному пользователю.

    Дополнительно в path можно указать как путь до директории, так и его UUID. При скачивании директории скачаются все файлы, находящиеся в ней.

    Path parameters

    /?path=[<path-to-file>||<file-meta-id>||<path-to-folder>||<folder-meta-id>] & compression"=[zip||tar||7z]
    
  2. Добавление информация об использовании пользователем дискового пространства.

    Описание изменений.
    GET /user/status
    

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

    Response

    {
        "account_id": "taONIb-OurWxbNQ6ywGRopQngc",
        "info": {
            "root_folder_id": "19f25-3235641",
            "home_folder_id": "19f25-3235641"
        },
        "folders": [
            "root": {
                "allocated": "1000000",
                "used": "395870",
                "files": 89
            },
            "home": {
                "allocated": "1590",
                "used": "539",
                "files": 19
            },
            ...,
            "folder-188734": {
                "allocated": "300",
                "used": "79",
                "files": 2
          }
        ]
    }
  3. Добавление возможности поиска файлов по заданным параметрам.

    Описание изменений.
    POST /files/search
    

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

    Request

    {
        "options": {
            "path": <folder-id-to-search>,
            "extension": <file-extension>,
            "order_by": <field-to-order-search-result>,
            "limit": <max-number-of-results>
        },
        "query": "<any-text||regex>"
    }

    Response

    {
        "mathes": [
              {
                "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
              },
            ...
        ]
    }
  4. Поддержка версионирования изменений файлов.

    Описание изменений.
    POST /files/revisions
    

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

    Request

    {
        "path": <path-to-file>||<file-meta-id>,
        "limit": <max-number-of-results>
    }

    Response

    {
        "revisions": [
              {
                "id": "b1863132-5db6-44fe-9d34-b944ab06ad81",
                "name": "presentation.pptx",
                "created_ad": "2020-09-11T17:22:05Z",
                "path": "/homework/learning/presentation.pptx",
                "size": 3496,
                "is_downloadable": true,
                "rev_id": "676ffc2a-a9a5-47f6-905e-99e024ca8ac8",
                "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
                "modified_at": "2020-09-21T05:13:49Z"
              },
            ...
        ]
    }

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

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

Рекомендации к решению

  1. За основу решения можно взять реализацию проекта 4 спринта.
  2. Используйте готовые библиотеки и пакеты, например, для авторизации. Для поиска можно использовать сервис openbase, PyPi или на GitHub.
  3. Используйте in-memory-db для кэширования данных.
  4. Для скачивания файлов можно использовать возможности сервера отдачи статики, для хранения — облачное объектное хранилище (s3).

async-python-sprint-5's People

Contributors

mityasun avatar

Watchers

 avatar

async-python-sprint-5's Issues

TDD

  • add tests

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.