Skip to content

Latest commit

 

History

History
195 lines (134 loc) · 11.5 KB

README.md

File metadata and controls

195 lines (134 loc) · 11.5 KB

Уважаемые студенты с яндекс-практикума. Если вы что-то для себя почерпнули из этой работы поставьте звезду, мне будет очень приятно. Не списывайте бездумно, попытайтесь понять код как будто вы ревьювер. Код с недостатками. :)

Разворачиваем проект

  • Указываем в .env переменные окружения или в migrations/env.py и config/config.py

poetry install

poetry shell

alembic upgrade head

python api.py

Тестируем API

  • Создаем пользователя

      POST /user/
          {
              "name": "pavel"
          }
    
  • Получаем всех пользователей

    GET /user/
    
  • Создаем Чат

    POST /chat_room/
        {
            "name": "chat for pavel"
        }
    
  • Получаем список всех чатов

    GET /chat_room/
    
  • Подключаем пользователя к чату

      POST /connect/
      {
          "chat_room_id":"7642d912-23dd-4667-af7a-f815a1b8dc44",
          "user_id":"a87dec77-6143-4b0b-be79-451d1e3b92f4"
      }
    
  • Получаем список подключенных чатов пользователя.

    GET /connect/a87dec77-6143-4b0b-be79-451d1e3b92f4
    
  • создаем сообщение

      POST /message/
      {
          "chat_room_id":"7642d912-23dd-4667-af7a-f815a1b8dc44",
          "author_id":"a87dec77-6143-4b0b-be79-451d1e3b92f4",
          "message": "text of message"
      }
    
  • Получаем сообщения из чата

      GET /message/
      {
          "author_id": "a87dec77-6143-4b0b-be79-451d1e3b92f4",
          "chat_room_id": "7642d912-23dd-4667-af7a-f815a1b8dc44"
      }
    
  • Создаем коммент

      POST /comment/
      {
          "author_id": "a87dec77-6143-4b0b-be79-451d1e3b92f4",
          "message_id": "4aa6fc93-4df7-434f-90e2-081652d1f0d1",
          "comment":"крутой комент"
      }
    
  • Получаем список комментариев

      GET /comment/{message_id}
    

Альтернативный запуск

  • Запускаем сервер
python server.py
  • Запускаем клиент. Он эмулирует отправку сообшений. Клиентов можно запустить несколько.
python client.py

Дополнительные требования (отметить [Х] выбранные пункты):

  • (1 балл) Период жизни доставленных сообщений — 1 час (по умолчанию).
  • (1 балл) Клиент может отправлять не более 20 (по умолчанию) сообщений в общий чат в течение определенного периода - 1 час (по умолчанию). В конце каждого периода лимит обнуляется;
  • (1 балл) Возможность комментировать сообщения;
  • (2 балла) Возможность создавать сообщения с заранее указанным временем отправки; созданные, но неотправленные сообщения можно отменить;
  • (2 балла) Возможность пожаловаться на пользователя. При достижении лимита в 3 предупреждения, пользователь становится "забанен" - невозможность отправки сообщений в течение 4 часов (по умолчанию);
  • (3 балла) Возможность отправлять файлы различного формата (объёмом не более 5Мб, по умолчанию).
  • (3 балла) Пользователь может подключиться с двух и более клиентов одновременно. Состояния должны синхронизироваться между клиентами.
  • (3 балла) Возможность создавать кастомные приватные чаты и приглашать в него других пользователей. Неприглашенный пользователь может "войти" в такой чат только по сгенерированной ссылке и после подтверждения владельцем чата.
  • **(5 баллов) Реализовать кастомную реализацию для взаимодействия по протоколу http (можно использовать asyncio.streams);
Проектное задание третьего спринта

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

Спроектируйте и реализуйте мессенджер для получения и обработки сообщений от клиента.

Кроме основного задания, выберите из списка дополнительные требования. У каждого требования есть определённая сложность, от которой зависит количество баллов. Необходимо выбрать такое количество заданий, чтобы общая сумма баллов была больше или равна 4. Выбор заданий никак не ограничен: можно выбрать все простые или одно среднее и два простых, или одно продвинутое, или решить все.

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

Сервер

Реализовать сервис, который обрабатывает поступающие запросы от клиентов;

Условия и требования:

  1. Подключенный клиент добавляется в "общий" чат, где находятся ранее подключенные клиенты;
  2. После подключения новому клиенту доступные последние N (по умолчанию 20) сообщений из общего чата;
  3. Повторно подключенный клиент имеет возможность просмотреть все ранее непрочитанные сообщения до момента последнего опроса (как из общего чата, так и приватные);
  4. По умолчанию сервер стартует на локальном хосте (127.0.0.1) и на 8000 порту (иметь возможность задавать любой);
  5. Можно не проектировать БД: информацию хранить в памяти и/или десериализовать/сериализировать в файл (формат на выбор) и восстанавливать при старте сервера;
Список возможных методов для взаимодействия (можно изменять)
  1. Подключиться к общему чату
POST /connect
  1. Получить статус и информацию о чатах
GET /status
  1. Отправить сообщение в общий чат или определенному пользователю в приватный чат
POST /send

Клиент

Реализовать приложение, который умеет подключаться к серверу и обмениваться сообщениями;

Условия и требования:

  1. После подключения клиент может отправлять сообщения в "общий" чат;
  2. Возможность отправки сообщения в приватном чате (1-to-1) любому участнику из общего чата;
  3. Разрабатывать UI не надо: можно выводить информацию в консоль или использовать лог-файлы;

Дополнительные требования (отметить [Х] выбранные пункты):

  • (1 балл) Период жизни доставленных сообщений — 1 час (по умолчанию).
  • (1 балл) Клиент может отправлять не более 20 (по умолчанию) сообщений в общий чат в течение определенного периода - 1 час (по умолчанию). В конце каждого периода лимит обнуляется;
  • (1 балл) Возможность комментировать сообщения;
  • (2 балла) Возможность создавать сообщения с заранее указанным временем отправки; созданные, но неотправленные сообщения можно отменить;
  • (2 балла) Возможность пожаловаться на пользователя. При достижении лимита в 3 предупреждения, пользователь становится "забанен" - невозможность отправки сообщений в течение 4 часов (по умолчанию);
  • (3 балла) Возможность отправлять файлы различного формата (объёмом не более 5Мб, по умолчанию).
  • (3 балла) Пользователь может подключиться с двух и более клиентов одновременно. Состояния должны синхронизироваться между клиентами.
  • (3 балла) Возможность создавать кастомные приватные чаты и приглашать в него других пользователей. Неприглашенный пользователь может "войти" в такой чат только по сгенерированной ссылке и после подтверждения владельцем чата.
  • **(5 баллов) Реализовать кастомную реализацию для взаимодействия по протоколу http (можно использовать asyncio.streams);

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

  1. Описать документацию по разработанному API: вызов по команде/флагу для консольного приложения или эндпойнт для http-сервиса.
  2. Используйте концепции ООП.
  3. Используйте аннотацию типов.
  4. Предусмотрите обработку исключительных ситуаций.
  5. Приведите стиль кода в соответствие pep8, flake8, mypy.
  6. Логируйте результаты действий.
  7. Покройте написанный код тестами.

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

  1. Можно использовать внешние библиотеки, но не фреймворки (описать в requirements.txt).