с использованием JWT токена
- fastapi
- sqlalchemy
- pydantic
- uvicorn
- asyncpg
- redis
- alembic
- jose
Ожидает на вход UserCreate с полями: name, surname, email, password.
Создаёт и сохраняет пользователя: (user_id, name, surname, email, is_active, hashed_password).
Поля name и surname только буквенные символы и '-'. Поле email валидируется классом pydantic EmailStr. Поле password валидируется регуляркой по буквам двух регистров, длине и цифрам.
Пароль хэшируется библиотекой passli и заносится в Postgres.
user_id генерируется библиотекой uuid, классом UUID.
Возвращает ShowUser с полями: user_id, name, surname, email, is_active.
Поле email уникальное, если в бд уже есть введённая почта возвращается ошибка.
Поле is_active нужно для отметки активных пользователей (вместо удаления из базы может отметить "выключенного" пользователя).
Ожидает на вход OAuth2PasswordRequestForm с полями: username(email), password.
Сверяет почту и пароль и возвращает JWT-токен.
Токен создаётся на 60 минут (expire).
Если пароль или почта неверные возвращает ошибку.
Если токена нет в Redis по ключу почты он генерируется и сохраняется в Redis. Если токен есть в noSQL базе после проверки пароля возвращается токен (не генерируется новый).
Возвращается Token с полем: access_token.
Доступно только авторизованным пользователям.
Удаляет токен из Redis.
Возвращает Token с полем: success.
Доступно только авторизованным пользователям.
Ожидает на вход TaskCreate с полями: name, content.
Создаёт и записывает в базу задачу с полями: user_id, task_id, name, content.
task_id сохраняется с типом UUID.
Пользователь может создать запись только от своего имени.
Возвращает ShowTask с полями:user_id, task_id, name, content.
Доступно только авторизованным пользователям.
Выводит список задач пользователя.
Отображаются только задачи текущего пользователя.
Возвращает ShowTasks с полями: [[user_id, task_id, name, content], ...].
Доступно только авторизованным пользователям.
Ожидает на вход task_id.
Выводит задачу пользователя.
Пользователь может видеть только свои записи.
Если записи нет в базе или она не создана этим пользователем возвращается ошибка.
Возвращает ShowTask c полями:user_id, task_id, name, content.
Доступно только авторизованным пользователям.
Ожидает на вход TaskEdit с полями: task_id, name, content.
Изменяет содержимое задачи пользователя.
Пользователь может менять только свои записи.
Если записи нет в базе или она не создана этим пользователем возвращается ошибка.
Возвращает ShowTask c полями:user_id, task_id, name, content.
Доступно только авторизованным пользователям.
Ожидает на вход task_id.
Удаляет задачу пользователя.
Пользователь может удалять только свои записи.
Если записи нет в базе или она не создана этим пользователем возвращается ошибка.
Возвращает Success с полем: success.
Стоит общее ограничение на количество запросов (сейчас 100 в минуту). Изменяется значение в модуле config.py.
Схема сущности users:
user_id | name | surname | is_active | hashed_password |
---|---|---|---|---|
uuid.UUID | str | str | bool | str |
... | ... | ... | ... | ... |
Сущности users и tasks связаны по атрибуту user_id (один ко многим).
Схема сущности tasks:
user_id | task_id | name | content |
---|---|---|---|
uuid.UUID | uuid.UUID | str | str |
... | ... | ... | ... |
или через CURL запросы в консоли.
Подлючен и настроен Docker. Используется docker-compose.yaml файл, и docker_entrypoint.sh для автоматической миграции моделей через Alembic.
Все сессии подключения к бд происходят через декоратор utils.decorators.request() -> автоматический откат при ошибке, сокращенье повторения кода.
Бизнес-логика содержится в модуле dals.py и не зависит от FastAPI.
Асинхронный ход в Postgres.
- Выполнить команду:
docker-compose up --build
- Создать файлы Alembic:
alembic init -t async alembic
- Внести в alembic.ini:
# alembic.ini sqlalchemy.url = postgresql+asyncpg://user:pass@port:host/db_name
- Внести в alembic.env.py:
# alembic.env.py from db.models import Base target_metadata = Base.metadata
- Создание миграции:
alembic revision --autogenerate -m 'migration_name'
- Создать файл .env:
# .env POSTGRES_USER=... POSTGRES_PASSWORD=... POSTGRES_DB=... DATABASE_URL=postgresql+asyncpg://user:pass@port:host/db_name REDIS_HOST=... REDIS_PORT=... SECRET=... ALGORITHM=...
- Логирование в файл.
- Тесты.
- Добавление кеширования часто запрашиваемых данных в Redis.