Skip to content

Тестовый проект на FastAPI, запакован в Docker

License

Notifications You must be signed in to change notification settings

andmerk93/shift-test

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

shift-test

Тестовое задание ШИФТ

Требуется реализовать REST-сервис для просмотра текущей зарплаты и даты следующего повышения. Из-за того, что такие данные очень важны и критичны, каждый сотрудник может видеть только свою сумму. Для обеспечения безопасности, потребуется реализовать метод, где по логину и паролю сотрудника будет выдан секретный токен, который действует в течение определенного времени. Запрос данных о зарплате должен выдаваться только при предъявлении валидного токена.

Структура сервиса

Есть файлы users.csv и tokens.csv (имитация 2-х таблиц БД). В users есть поля login, password, salary, salary_date, в tokens - login, token, token_date. Файл users должен быть заранее заполнен какими-то данными. users.csv считывается функцией csv_reader и пишется в переменную users. В переменной лежат словари вида

{
  "john": {
    "login": "john",
    "password": "pass",
    "salary": "100",
    "salary_date": "2023-06-04",
    "token": "passjohn111",
    "token_date": "2023-06-05 02:05:33.218894"
  },
}

Затем создаётся экземпляр FastAPI, который слушает эндпоинты.

На эндпоинте / стоит заглушка, можно отправить GET-запрос, но ничего не придёт в ответ.

На эндпоинте /login сервис ожидает POST-запрос JSON'a с параметрами вида

{
  "login": "",
  "password": ""
}

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

На эндпоинт /salary нужно отправить GET-запрос с query-параметрами login и token. Функция обновляет список токенов в паямти (считывает из словаря), проверяет правильность логина и токена, в случае ошибки - возвращает None. При выполнение всех условий возвращает JSON с искомыми значениями:

{
  "login": "john",
  "salary": "100",
  "salary_date": "2023-06-04"
}

Описание работы функций есть в docstring самих функций.

Описание полей объекта user, с которыми работает программа:

    login: str = ''
    password: str = ''
    salary: float = 0.0
    salary_date: str = ''
    token: str = ''
    token_date: str = ''

Изначально палнировалось сделать pydantic-модель, но не понадобилось, внутренние функции работают с обычным списком словарей, модель одного пользователя - словарь. ТЗ и реализация простые, pydantic здесь избыточен.

Описание также продублировано в docstring файла самого сервиса.

Запуск в виртуальном окружении

Для запуска сервиса понадобятся FastAPI и uvicorn. Установить и запустить их можно следующим образом (для linux):

python3 -m venv venv
source ./venv/bin/activate
pip install fastapi uvicorn[standart]
python3 main.py

Сервис запустится и будет доступен по https://127.0.0.1:8000/ Увидеть описание эндпоинтов и сделать тестовые запросы к ним можно по https://127.0.0.1:8000/docs или https://127.0.0.1:8000/redoc

Запуск в Docker-контейнере

Для работы сервиса используется стандартный образ uvicorn-gunicorn-fastapi от разработчика FastAPI. Образ не изменяется и не пересобирается локально, файлы сервиса монтируются в папку /app внутри контейнера. Чтобы запустить сервис в докере, нужно выполнить из корня репозитория

docker compose up -d

Чтобы остановить сервис

docker compose down

About

Тестовый проект на FastAPI, запакован в Docker

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages