Skip to content

minaton-ru/fastapi-post-api

Repository files navigation

API приложение для скачивания и сохранения вопросов для викторины

Приложение запрашивает с API сервиса jService случайные вопросы для викторины, сохраняет их в базу данных.

Функционал

Ендпойнт принимает запрос POST, в котором указывается количество вопросов для скачивания. Запрашивает с сервиса jService указанное количество вопросов. Сохраняет в базу данных все полученные вопросы. Если среди полученных вопросов есть уже существующий в базе данных, то на сервис jService отправляется дополнительный запрос на получение нового вопроса, до тех пор, пока не будет получен уникальный.

В ответ на POST-запрос возвращается предыдущий сохраненный в БД вопрос.

Когда в локальной БД будет 221510 записей, сервис будет возвращать ошибку 406, потому что скачаны все вопросы из jService.
Запрашивать в POST-запросе больше 100 за один раз нет смысла, потому что в jService ограничени на 100 вопросов.

Стек

Python
FastAPI
aiohttp
alembic
SQLAlchemy

Структура данных

Модель Question:

  • id = primary_key
  • answer = текст ответа
  • question = текст вопроса
  • category_id = номер категории
  • loaded_at = дата и время сохранения в локальную БД
  • created_at = дата и время создания
  • updated_at = дата и время изменения

Описание API

В проекте есть документация Swagger, доступная после запуска приложения по адресу http://127.0.0.1/docs/

Запрос

На ендпойнт /api/question/ отправляется POST-запрос вида:

POST /robots/create/ HTTP/1.1
Host: 127.0.0.1
Content-Type: application/json

{"questions_num": N}

Где:

  • N - число вопросов

Ответ

Если данные в запросе валидны, то ендпойнт вернет ответ 201 CREATED и данные с предыдущим сохраненным вопросом:

HTTP 201 CREATED
Content-Type: application/json
Date:
Server: uvicorn
Content-Length:    

Body:  

[
    {
        "category_id": 9537,
        "loaded_at": "2023-10-22T17:48:02.106598",
        "question": "(Her Majesty delivers the clue again.) In 2007 UNICEF Canada supplied 33,000 insecticide-treated bednets to help children & pregnant women in Liberia to fight this disease",
        "id": 122525,
        "answer": "malaria",
        "created_at": "2022-12-30T19:57:50.557000",
        "updated_at": "2022-12-30T19:57:50.557000"
    }
]

Установка

  1. Скопировать файлы:
$ git clone https://github.com/minaton-ru/fastapi-post-api.git
  1. Создать файл .env для переменных окружения. Пример файла:
POSTGRES_PORT=5432
POSTGRES_PASSWORD=password1
POSTGRES_USER=postgresuser
POSTGRES_DB=question
POSTGRES_HOST=database
  1. Сборка образа и запуск контейнеров:
docker-compose up --build
  1. Открыть в браузере URL c Swagger-документацией http://127.0.0.1/docs/, указать количество вопросов и сделать тестовый запрос на ендпойнт /api/question/.
  2. Или через Postman отправить POST-запросы с помощью коллекции fastapi-post-api.postman_collection.json.

TODO

  • Добавить тесты
  • Добавить логирование

About

Small API service to get quizes from jService and to save them to the database.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors