Требуется реализовать 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
Для работы сервиса используется стандартный образ uvicorn-gunicorn-fastapi
от разработчика FastAPI.
Образ не изменяется и не пересобирается локально, файлы сервиса монтируются в папку /app
внутри контейнера.
Чтобы запустить сервис в докере, нужно выполнить из корня репозитория
docker compose up -d
Чтобы остановить сервис
docker compose down