Skip to content

KrolPaul/python-fastapi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

Задача

Создать новую ветку в репозитории и подготовить пул-реквест, реализующий описанный ниже функционал.

На Python + FastAPI реализовать REST эндпоинты для работы с публикациями участников конференции:

  • GET /conferences/{conference_id}/publications - получение списка публикаций, поданных пользователем;
  • GET /conferences/{conference_id}/applications/{application_id}/publication - получение подробной информации о конкретной публикации;
  • POST /conferences/{conference_id}/applications/{application_id}/publication - подача новой публикации от участника конференции;
  • PUT /conferences/{conference_id}/applications/{application_id}/publication - замена (редактирование) файла с текстом публикации;
  • PATCH /conferences/{conference_id}/applications/{application_id}/publication - внесение изменений в мета-данные публикации.

В качестве базы данных (хранилища) информации о публикациях используется та же таблица Google.Sheets, в которой уже хранятся заявки на участие в конференции (см. #1 ). В таблицу с заявками добавляются дополнительные столбцы и каждая публикация привязывается к одной из ранее созданных заявок.

Также имеется еще одна таблица, в которой содержится информация о списке конференций. Полученный в запросе параметр {conference_id} используется для поиска в этой таблице нужной конференции. Если конференция найдена, из соответствующей записи извлекается идентификатор гугл-таблицы с информацией о заявках на участие и дальнейшая работа ведется с этой конференцией. Если конференция не найдена, все эндпоинты возвращают ошибку 404. Если конференция найдена, но срок приема заявок уже прошел, все эндпоинты возвращают ошибку 403. Подробнее см. #2 .

GET /conferences/{conference_id}/publications

Входные данные (параметры запроса)

В запросе должен быть обязательно указан один из следующих параметров, но не два или три одновременно:

  • email,
  • telegram_id,
  • discord_id.

Значение входного параметра используется для фильтрации (поиска) публикаций в гугл-таблице.

Выходные данные

JSON-список [{"id": 1, ...}, {"id": 2, ...}, ...], содержащий найденные записи. Формат отдельной записи в списке имеет следующий вид:

{
  "id": "application_id", // идентификатор публикации совпадает с идентификатором заявки, к которой данная публикация привязана
  "publication_title": "Название публикации", // может отличаться от названия доклада в исходной заявке
  "upload_date": "дата загрузки", 
  "review_status": "статус рецензирования" // одно из значений "in progress", "changes requested", "rejected", "accepted"
}

Если поле "upload_date" в гугл-таблице не заполнено (пустая строка), соответствующая запись не включается в выходные данные. Если найденных записей нет или у всех найденных записей пустое поле "upload_date", возвращается ошибка 404.

Примеры запросов

/conferences/3/publications?telegram_id="1234"
/conferences/1/publications/?email="example@example.com"

GET /conferences/{conference_id}/applications/{application_id}/publication

Входные данные (параметры запроса)

В запросе должен быть обязательно указан один из следующих параметров, но не два или три одновременно:

  • email,
  • telegram_id,
  • discord_id.

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

Логика работы

Осуществляется поиск заявки с идентификатором {application_id} в гугл-таблице. Если заявка не найдена, возвращается ошибка 404. Если заявка найдена, проверяется значение поля "email", "telegram_id" или "discord_id", в зависимости от того, какое из них было указано во входных данных. Если проверка не пройдена, возвращается ошибка 403. Если проверка пройдена успешно, возвращается подробная информация о публикации.

Выходные данные

JSON следующего вида:

{
  "id": "application_id", // идентификатор публикации совпадает с идентификатором заявки, к которой данная публикация привязана
  "publication_title": "Название публикации", // может отличаться от названия доклада в исходной заявке
  "upload_date": "дата загрузки", 
  "review_status": "статус рецензирования", // одно из значений "in progress", "changes requested", "rejected", "accepted"
  "download_url": "URL для скачивания",
  "keywords": "список; ключевых; слов; через; точу с запятой",
  "abstract": "аннотация к статье"
}

POST /conferences/{conference_id}/applications/{application_id}/publication

Входные данные (тело запроса)

В теле запроса передаются:

  • обязательное поле "publication_title";
  • обязательно одно (и только одно) из полей "email", "telegram_id", "discord_id";
  • необязательные поля "keywords" и "abstract";
  • бинарный документ (файл) с текстом публикации. Можно, например, использовать формат multipart/form-data (multipart HTTP request) для передачи файла и метаданных в одном запросе.

Логика работы

Осуществляется поиск заявки с идентификатором {application_id} в гугл-таблице. Если заявка не найдена, возвращается ошибка 404. Если заявка найдена, проверяется значение поля "email", "telegram_id" или "discord_id", в зависимости от того, какое из них было указано во входных данных. Если проверка не пройдена, возвращается ошибка 403.

Если проверка пройдена успешно, файл с текстом публикации загружается в отдельную директорию на гугл-диск (см. официальную документацию или пример с использованием сторонней библиотеки pydrive). В гугл-таблице обновляются значения полей "publication_title", "keywords", "abstract", если они были переданы во входных данных. В поле "upload_date" записываются текущая дата и время в формате ISO 8601, в Python можно использовать код datetime.datetime.now().astimezone().isoformat(). В поле "review_status" записывается значение "in progress". В поле "download_url" помещается URL для скачивания файла.

Выходные данные

JSON, структура которого приведена в разделе "Выходные данные" эндпоинта "GET /conferences/{conference_id}/applications/{application_id}/publication", содержащий актуальную информацию о публикации.

PUT /conferences/{conference_id}/applications/{application_id}/publication

Входные данные (тело запроса)

Бинарный документ (файл) с текстом публикации

Входные данные (параметры запроса)

В запросе должен быть обязательно указан один из следующих параметров, но не два или три одновременно:

  • email,
  • telegram_id,
  • discord_id.

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

Логика работы

Осуществляются проверки, аналогичные описанным для эндпоинта POST /conferences/{conference_id}/applications/{application_id}/publication. Если они пройдены успешно, переданный в теле запроса файл загружается на гугл-диск, а в гугл-таблице обновляются поля "upload_date" и "download_url". В поле "review_status" записывается значение "in progress".

Выходные данные

JSON, структура которого приведена в разделе "Выходные данные" эндпоинта "GET /conferences/{conference_id}/applications/{application_id}/publication", содержащий актуальную информацию о публикации.

PATCH /conferences/{conference_id}/applications/{application_id}/publication

Входные данные (тело запроса)

JSON, в котором содержатся:

  • обязательно одно (и только одно) из полей "email", "telegram_id", "discord_id";
  • необязательные поля "publication_title", "keywords" и "abstract";

Логика работы

Осуществляются проверки, аналогичные описанным для эндпоинта POST /conferences/{conference_id}/applications/{application_id}/publication. Если они пройдены успешно, в гугл-таблице обновляются значения полей "publication_title", "keywords", "abstract", если они были переданы во входных данных.

Выходные данные

JSON, структура которого приведена в разделе "Выходные данные" эндпоинта "GET /conferences/{conference_id}/applications/{application_id}/publication", содержащий актуальную информацию о публикации.

Настройка и запуск

  1. Установить зависимости из requirements.txt
  2. Добавить credits от Google API в файл creds.json
  3. В dbs_access.py заполнить переменные confSpreadsheetId и gDriveFolder идентификатором таблицы с конференциями (Google Spreadsheets) и идентификатором папки на Google Drive соответственно
  4. В tables_settings.py описать структуры таблиц (table[вид объекта]['fields]) строго по порядку размещения в таблице и смещения (table[вид объекта]['rowOffset'] и table[вид объекта]['colOffset']) относительно крайней верхней левой ячейки листа. В случае изменения полей выборок, изменить selection[вид объекта]
  5. Запустить из папки расположения командой uvicorn src.app:app --reload

Ограничения

  • Идентификатор объекта, находящийся в поле 'id', должен совпадать с номером строки таблицы с учетом смещения. В противном случае объект считается недействительным, его нельзя прочитать.

About

Эндпоинты python+fastAPI для работы с Google Sheets/Drive

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages