Skip to content

iagh3/fastapi-task-manager

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AI Task Manager — Backend

REST API для управления задачами на FastAPI + PostgreSQL.

Tests

Стек

  • FastAPI + SQLAlchemy 2 — фреймворк и ORM
  • PostgreSQL — база данных
  • Alembic — миграции схемы
  • JWT (python-jose) — авторизация (access 30 мин / refresh 7 дней)
  • bcrypt — хеширование паролей
  • slowapi — rate limiting на эндпоинтах авторизации
  • pytest + httpx — тесты (18 тест-кейсов, SQLite in-memory)
  • Docker + Docker Compose — контейнеризация

Быстрый старт (Docker)

cp backend/.env.example backend/.env

docker-compose up --build

# API:        http://localhost:8000
# Swagger UI: http://localhost:8000/docs

Локальный запуск

cd backend

python -m venv venv
venv\Scripts\activate       # Windows
# source venv/bin/activate  # Linux/macOS

pip install -r requirements.txt

cp .env.example .env
# Прописать DATABASE_URL и SECRET_KEY в .env

alembic upgrade head

uvicorn app.main:app --reload

Переменные окружения

Переменная Описание
DATABASE_URL postgresql://user:pass@host:5432/dbname
SECRET_KEY Секрет для JWT (≥ 32 символа)
ALGORITHM HS256
ACCESS_TOKEN_EXPIRE_MINUTES 30
REFRESH_TOKEN_EXPIRE_DAYS 7

В Docker DATABASE_URL переопределяется на имя сервиса db автоматически.


API — версия v1

Все эндпоинты доступны по префиксу /api/v1.

Auth /api/v1/auth

Метод URL Описание Защита
POST /auth/register Регистрация
POST /auth/login Логин → токены (5 req/min)
POST /auth/refresh Обновить access-токен
POST /auth/logout Выход Bearer

Logout и JWT: токен остаётся валидным до истечения 30 минут. Для полной инвалидации нужен Redis-blacklist.

Users /api/v1/users

Метод URL Описание Роль
GET /users/me Мой профиль любая
PUT /users/me Обновить профиль любая
GET /users Список пользователей admin
GET /users/{id} Пользователь по ID admin
DELETE /users/{id} Удалить пользователя admin

Tasks /api/v1/tasks

Метод URL Описание
POST /tasks Создать задачу
GET /tasks Список задач (фильтры + пагинация)
GET /tasks/{id} Задача по ID
PUT /tasks/{id} Обновить задачу
DELETE /tasks/{id} Удалить задачу
PATCH /tasks/{id}/assign Назначить исполнителя

Фильтры для GET /tasks

GET /api/v1/tasks?status=in_progress&priority=high
GET /api/v1/tasks?assigned_to=5
GET /api/v1/tasks?owner_id=2&skip=0&limit=20

Тесты

cd backend
pytest tests/ -v

18 тестов, покрывают:

Модуль Тесты
test_auth.py регистрация, логин, logout, дубликаты
test_users.py профиль, обновление, admin-доступ
test_tasks.py CRUD, изоляция задач по пользователю

Тесты используют SQLite in-memory + StaticPool — PostgreSQL не нужен. Rate limiting сбрасывается между тестами автоматически.


Миграции (Alembic)

cd backend

alembic upgrade head                              # применить все
alembic revision --autogenerate -m "description" # создать новую
alembic downgrade -1                              # откатить последнюю

Роли

  • user — управляет своими задачами
  • admin — полный доступ ко всем пользователям и задачам

Назначить admin через SQL:

UPDATE users SET role = 'admin' WHERE username = 'your_username';

Структура проекта

backend/
├── alembic/
│   └── versions/
│       └── 001_initial_schema.py
├── app/
│   ├── main.py          # точка входа, CORS, rate limiter
│   ├── config.py        # настройки через pydantic-settings
│   ├── database.py      # SQLAlchemy engine + get_db
│   ├── models/          # ORM: User, Task
│   ├── schemas/         # Pydantic: валидация запросов/ответов
│   ├── routers/         # auth.py, users.py, tasks.py
│   ├── core/            # security, dependencies, limiter
│   └── utils/           # logger
├── tests/
│   ├── conftest.py      # фикстуры, SQLite override, rate limit reset
│   ├── test_auth.py
│   ├── test_users.py
│   └── test_tasks.py
├── requirements.txt
├── .env.example
├── alembic.ini
└── Dockerfile
docker-compose.yml

Releases

No releases published

Packages

 
 
 

Contributors