Веб-приложение для управления внутренними задачами компании.
Система позволяет создавать задачи, назначать исполнителей, изменять статус выполнения и отслеживать список заявок через веб-интерфейс.
- Python 3.12
- FastAPI
- SQLAlchemy 2.0
- Pydantic v2
- SQLite
- Uvicorn
- HTML5
- CSS3
- Vanilla JavaScript (ES6 Modules)
- Fetch API
- Bootstrap 5
- Pytest
- HTTPX (TestClient для FastAPI)
- pytest-asyncio
- pytest-cov (покрытие кода)
- Получение списка пользователей
- Выбор исполнителя из списка при создании задачи
- Изменение исполнителя задачи
- Создание задачи
- Получение списка задач
- Получение задачи по ID
- Фильтрация задач по статусу
- Изменение статуса задачи
- Изменение исполнителя задачи
- Удаление задачи
- Одностраничное модульное приложение (ES6 Modules)
- Таблица задач с цветовой индикацией статусов
- Фильтр по статусу
- Форма создания задачи
- Модальное окно просмотра и редактирования
- Автоматическое обновление данных после изменений
- Защита от XSS при рендеринге пользовательского ввода
# Структура проекта
task_tracker/
│
├── backend/
│ │
│ ├── app/
│ │ │
│ │ ├── main.py
│ │ │ # Точка входа FastAPI приложения.
│ │ │ # Создание приложения, регистрация роутеров
│ │ │ # и инициализация базы данных.
│ │ │
│ │ ├── database/
│ │ │ │
│ │ │ ├── base.py
│ │ │ │ # Базовый класс SQLAlchemy Base.
│ │ │ │ # От него наследуются все ORM-модели.
│ │ │ │
│ │ │ ├── db.py
│ │ │ │ # Настройка подключения к SQLite.
│ │ │ │ # Создание Engine и SessionLocal.
│ │ │ │
│ │ │ └── dependencies.py
│ │ │ # FastAPI Dependency Injection.
│ │ │ # Предоставляет сессию базы данных
│ │ │ # через Depends(get_db).
│ │ │
│ │ ├── enums/
│ │ │ │
│ │ │ └── task_status.py
│ │ │ # Перечисление статусов задач.
│ │ │ # Используется в ORM-моделях,
│ │ │ # схемах и бизнес-логике.
│ │ │
│ │ ├── models/
│ │ │ │
│ │ │ ├── user.py
│ │ │ │ # ORM-модель пользователя.
│ │ │ │ # Описывает таблицу users.
│ │ │ │
│ │ │ └── task.py
│ │ │ # ORM-модель задачи.
│ │ │ # Описывает таблицу tasks,
│ │ │ # связи с пользователями
│ │ │ # и автоматические даты.
│ │ │
│ │ ├── schemas/
│ │ │ │
│ │ │ ├── user.py
│ │ │ │ # Pydantic-схемы пользователей.
│ │ │ │ # Используются для сериализации
│ │ │ │ # ответов API.
│ │ │ │
│ │ │ └── task.py
│ │ │ # Pydantic-схемы задач.
│ │ │ # Валидация запросов и ответов API.
│ │ │ # Содержит Create, Update,
│ │ │ # Response и Delete схемы.
│ │ │
│ │ ├── routers/
│ │ │ │
│ │ │ ├── user_router.py
│ │ │ │ # HTTP эндпоинты пользователей.
│ │ │ │ # Получение списка сотрудников.
│ │ │ │
│ │ │ └── task_router.py
│ │ │ # CRUD эндпоинты задач.
│ │ │ # Создание, получение,
│ │ │ # обновление и удаление задач.
│ │ │
│ │ ├── services/
│ │ │ │
│ │ │ ├── task_service.py
│ │ │ │ # Слой бизнес-логики.
│ │ │ │ # Работа с задачами,
│ │ │ │ # проверки и операции БД.
│ │ │ │
│ │ │ └── task_mapper.py
│ │ │ # Преобразование ORM-моделей
│ │ │ # в Pydantic Response-схемы.
│ │ │ # Изолирует формат API
│ │ │ # от структуры БД.
│ │ │
│ │ └── __init__.py
│ │ # Делает директорию app
│ │ # Python-пакетом.
│ │
│ │
│ ├── tests/
│ │ │
│ │ ├── conftest.py
│ │ │ # Общие фикстуры pytest.
│ │ │ # Настройка тестовой базы данных
│ │ │ # и тестового клиента FastAPI.
│ │ │
│ │ └── test_api.py
│ │ # Интеграционные тесты API.
│ │ # Проверка основных сценариев:
│ │ # CRUD операций и обработки ошибок.
│ │
│ ├── task_tracker.db
│ │ # SQLite база данных проекта.
│ │ # Создается автоматически при запуске.
│ │
│ ├── requirements.txt
│ │ # Список зависимостей Python.
│ │ # Используется для установки окружения.
│ │
│ └── README.md
│ # Основная документация проекта.
│ # Инструкция по запуску,
│ # описание архитектуры и API.
│
│
├── frontend/
│ │
│ ├── index.html
│ │ # Основная страница приложения.
│ │ # Содержит форму создания задач,
│ │ # таблицу задач и модальное окно.
│ │
│ ├── css/
│ │ │
│ │ └── styles.css
│ │ # Стили интерфейса.
│ │ # Оформление таблиц,
│ │ # кнопок, модального окна
│ │ # и адаптивной верстки.
│ │
│ └── js/
│ │
│ ├── api.js
│ │ # Работа с REST API.
│ │ # Выполняет HTTP-запросы
│ │ # к backend приложению.
│ │
│ ├── users.js
│ │ # Логика работы с пользователями.
│ │ # Получение списка исполнителей
│ │ # и заполнение выпадающих списков.
│ │
│ ├── tasks.js
│ │ # Логика отображения задач.
│ │ # Рендеринг таблицы,
│ │ # фильтрация и обновление данных.
│ │
│ └── main.js
│ # Главный файл фронтенда.
│ # Инициализация приложения,
│ # обработчики событий форм,
│ # кнопок и модальных окон.
│
│
└── docs/
│
├── ARCHITECTURE.md
│ # Документ с описанием архитектуры,
│ # структуры проекта и принятых решений.
│
├── API.md
│ # Подробное описание REST API,
│ # запросов, ответов и ошибок.
│
└── DATABASE.md
# Описание структуры базы данных,
# таблиц, связей и ORM-моделей.
id
name
email
id
title
description
status
requester
assignee_id
created_at
updated_at
Поддерживаемые статусы:
new
in_progress
done
cancelled
git clone <repository_url>
cd task_trackerЕсли это линукс
python -m venv .venvЕсли это Windows
py -m venv .venv.venv\Scripts\activatesource .venv/bin/activatepip install -r requirements.txtПроект использует SQLite.
База данных создаётся автоматически при запуске приложения.
При первом запуске автоматически:
- создаются таблицы;
- добавляются тестовые пользователи.
Предзаполненные пользователи:
Alex
alex@example.ru
John
john@yandex.ru
Дополнительная настройка базы данных не требуется.
Из корня проекта (task_tracker/):
Запустить сервер:
uvicorn backend.app.main:app --reloadПосле запуска API будет доступно по адресу:
http://127.0.0.1:8000
Swagger UI:
http://127.0.0.1:8000/docs
type="module"), файл index.html нельзя просто открыть двойным кликом в браузере (политика CORS заблокирует загрузку скриптов). Необходимо использовать локальный сервер.
Перейти в каталог frontend:
cd frontendЗапустить локальный сервер:
python -m http.server 5500После запуска открыть в браузере:
http://localhost:5500
Перед запуском фронтенда необходимо убедиться, что backend-сервер уже работает.
Подробная информация о проекте вынесена в директорию docs/:
- Архитектура и стек — высокоуровневое описание проекта и принципы проектирования
- Описание API — подробная документация всех эндпоинтов с примерами запросов
- Схема базы данных — описание таблиц, полей и связей между сущностями
Интерактивная документация API (Swagger UI) доступна после запуска приложения по адресу:
http://127.0.0.1:8000/docs
Проект покрыт интеграционными тестами API. Тесты используют in-memory SQLite (sqlite:///:memory:), что гарантирует изоляцию тестов от основной базы данных и высокую скорость выполнения.
backend/tests/
├── conftest.py # Фикстуры pytest и настройка тестовой БД
└── test_api.py # Сценарии тестирования всех эндпоинтов
- ✅ Health-check эндпоинт (
GET /) - ✅ Получение списка пользователей (
GET /users) - ✅ Создание задачи с валидными данными (
POST /tasks) - ✅ Валидация данных при создании (ошибка 422)
- ✅ Получение списка задач с фильтрацией (
GET /tasks?status=...) - ✅ Получение задачи по ID (
GET /tasks/{id}) - ✅ Обработка несуществующей задачи (ошибка 404)
- ✅ Обновление задачи (
PUT /tasks/{id}) - ✅ Удаление задачи (
DELETE /tasks/{id})
Перейти в каталог backend:
cd backendЗапуск всех тестов с подробным выводом:
pytest tests/ -vЗапуск с измерением покрытия кода:
pytest tests/ -v --cov=app --cov-report=term-missingПолная документация API доступна в файле docs/API.md и в Swagger UI по адресу /docs.
Краткая сводка:
| Метод | Эндпоинт | Описание |
|---|---|---|
| GET | /users |
Получить список пользователей |
| POST | /tasks |
Создать задачу |
| GET | /tasks |
Список задач (с фильтром) |
| GET | /tasks/{id} |
Получить задачу по ID |
| PUT | /tasks/{id} |
Обновить статус/исполнителя |
| DELETE | /tasks/{id} |
Удалить задачу |
Backend построен по принципу разделения ответственности:
Обработка HTTP-запросов и валидация входных данных.
Бизнес-логика приложения, независимая от транспорта.
Валидация и сериализация данных через Pydantic v2.
ORM-модели SQLAlchemy 2.0 с современным синтаксисом Mapped.
Подключение и управление базой данных через Dependency Injection.
Интеграционные тесты с изолированной in-memory БД и переопределением зависимостей FastAPI.
Такое разделение упрощает поддержку проекта и позволяет масштабировать функциональность без усложнения кода.
✅ Создание задач
✅ Получение списка задач
✅ Получение задачи по ID
✅ Изменение статуса задачи
✅ Изменение исполнителя
✅ Удаление задач
✅ Фильтрация по статусу
✅ Валидация данных через Pydantic v2
✅ Обработка ошибок через HTTPException
✅ Работа с SQLite
✅ Сервисный слой (разделение бизнес-логики и HTTP-слоя)
✅ Swagger документация (автоматическая через FastAPI)
✅ Веб-интерфейс для работы с задачами (модульный Vanilla JS + Bootstrap 5)
✅ Интеграционные тесты API с покрытием всех эндпоинтов
✅ Подробная документация проекта в директории docs/
В рамках тестового задания не были реализованы:
- JWT-авторизация и аутентификация
- Ролевая модель пользователей
- Поиск и сортировка задач
- Пагинация списка задач
- Unit-тесты сервисного слоя (есть только интеграционные)
- Alembic-миграции
- Docker-контейнеризация
- CI/CD пайплайн
Эти функции выходят за рамки текущего задания и могли бы быть добавлены на следующих этапах развития проекта.
Во время реализации проекта возникли следующие задачи:
- настройка модульной структуры FastAPI проекта;
- работа с SQLAlchemy 2.0 и новым синтаксисом
Mapped; - организация связей между User и Task;
- преобразование ORM-моделей в Pydantic-схемы (проблема N+1 при загрузке
assignee_name); - корректная настройка
response_modelс вложенными связями; - разделение бизнес-логики и HTTP-слоя;
- настройка взаимодействия модульного фронтенда (ES6) с REST API;
- обработка ошибок валидации и отсутствующих сущностей;
- настройка изолированной in-memory БД для тестов с переопределением зависимостей FastAPI;
- решение проблем CORS при работе фронтенда с backend на разных портах.
При наличии дополнительного времени можно реализовать:
- PostgreSQL вместо SQLite для production-окружения;
- Alembic для версионирования схемы БД;
- JWT-аутентификацию с refresh-токенами;
- Docker Compose для быстрого развёртывания всего стека;
- Unit-тесты сервисного слоя с моками репозиториев;
- Логирование действий пользователей (audit log);
- Пагинацию, сортировку и полнотекстовый поиск задач;
- Полноценный frontend на React или Vue с TypeScript;
- CI/CD пайплайн (GitHub Actions) с автопрогоном тестов;
- Redis для кэширования списка пользователей и задач;
- WebSocket для real-time обновления списка задач.
- Проектирование и разработка Backend: 11 часов
- Разработка Frontend (модульный Vanilla JS + Bootstrap): 3 часа
- Написание интеграционных тестов: 1 час
- Написание документации: 1 час
- Итого: 16 часов