REST API для управления задачами на FastAPI + PostgreSQL.
- 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 — контейнеризация
cp backend/.env.example backend/.env
docker-compose up --build
# API: http://localhost:8000
# Swagger UI: http://localhost:8000/docscd 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.
| Метод | URL | Описание | Защита |
|---|---|---|---|
| POST | /auth/register |
Регистрация | — |
| POST | /auth/login |
Логин → токены | — (5 req/min) |
| POST | /auth/refresh |
Обновить access-токен | — |
| POST | /auth/logout |
Выход | Bearer |
Logout и JWT: токен остаётся валидным до истечения 30 минут. Для полной инвалидации нужен Redis-blacklist.
| Метод | URL | Описание | Роль |
|---|---|---|---|
| GET | /users/me |
Мой профиль | любая |
| PUT | /users/me |
Обновить профиль | любая |
| GET | /users |
Список пользователей | admin |
| GET | /users/{id} |
Пользователь по ID | admin |
| DELETE | /users/{id} |
Удалить пользователя | admin |
| Метод | URL | Описание |
|---|---|---|
| POST | /tasks |
Создать задачу |
| GET | /tasks |
Список задач (фильтры + пагинация) |
| GET | /tasks/{id} |
Задача по ID |
| PUT | /tasks/{id} |
Обновить задачу |
| DELETE | /tasks/{id} |
Удалить задачу |
| PATCH | /tasks/{id}/assign |
Назначить исполнителя |
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/ -v18 тестов, покрывают:
| Модуль | Тесты |
|---|---|
test_auth.py |
регистрация, логин, logout, дубликаты |
test_users.py |
профиль, обновление, admin-доступ |
test_tasks.py |
CRUD, изоляция задач по пользователю |
Тесты используют SQLite in-memory + StaticPool — PostgreSQL не нужен. Rate limiting сбрасывается между тестами автоматически.
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