Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Task Tracker

Веб-приложение для управления внутренними задачами компании.

Система позволяет создавать задачи, назначать исполнителей, изменять статус выполнения и отслеживать список заявок через веб-интерфейс.


Используемый стек

Backend

  • Python 3.12
  • FastAPI
  • SQLAlchemy 2.0
  • Pydantic v2
  • SQLite
  • Uvicorn

Frontend

  • 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-моделей.

Сущности

User

id
name
email

Task

id
title
description
status
requester
assignee_id
created_at
updated_at

Поддерживаемые статусы:

new
in_progress
done
cancelled

Запуск проекта

1. Клонирование репозитория

git clone <repository_url>
cd task_tracker

2. Создание виртуального окружения

Если это линукс

python -m venv .venv

Если это Windows

py -m venv .venv

Windows

.venv\Scripts\activate

Linux / macOS

source .venv/bin/activate

3. Установка зависимостей

pip install -r requirements.txt

Инициализация базы данных

Проект использует SQLite.

База данных создаётся автоматически при запуске приложения.

При первом запуске автоматически:

  • создаются таблицы;
  • добавляются тестовые пользователи.

Предзаполненные пользователи:

Alex
alex@example.ru

John
john@yandex.ru

Дополнительная настройка базы данных не требуется.


Запуск Backend

Из корня проекта (task_tracker/):

Запустить сервер:

uvicorn backend.app.main:app --reload

После запуска API будет доступно по адресу:

http://127.0.0.1:8000

Swagger UI:

http://127.0.0.1:8000/docs

Запуск Frontend

⚠️ Важно: Из-за использования ES6-модулей (type="module"), файл index.html нельзя просто открыть двойным кликом в браузере (политика CORS заблокирует загрузку скриптов). Необходимо использовать локальный сервер.

Перейти в каталог frontend:

cd frontend

Запустить локальный сервер:

python -m http.server 5500

После запуска открыть в браузере:

http://localhost:5500

Перед запуском фронтенда необходимо убедиться, что backend-сервер уже работает.


📚 Документация

Подробная информация о проекте вынесена в директорию docs/:

Интерактивная документация 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 эндпоинты

Полная документация API доступна в файле docs/API.md и в Swagger UI по адресу /docs.

Краткая сводка:

Метод Эндпоинт Описание
GET /users Получить список пользователей
POST /tasks Создать задачу
GET /tasks Список задач (с фильтром)
GET /tasks/{id} Получить задачу по ID
PUT /tasks/{id} Обновить статус/исполнителя
DELETE /tasks/{id} Удалить задачу

Архитектурные решения

Backend построен по принципу разделения ответственности:

Routers

Обработка HTTP-запросов и валидация входных данных.

Services

Бизнес-логика приложения, независимая от транспорта.

Schemas

Валидация и сериализация данных через Pydantic v2.

Models

ORM-модели SQLAlchemy 2.0 с современным синтаксисом Mapped.

Database

Подключение и управление базой данных через Dependency Injection.

Tests

Интеграционные тесты с изолированной 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 часов

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages