Skip to content

wtxsuper/todo-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Todo List API

Информация о работе

Название: Асинхронное REST API приложение для управления списками задач
Автор: Корноухов Роман, ПИН-232
Дисциплина: Объектно-ориентированное программирование (4 семестр)
Язык программирования: Python 3.11+
Год создания: 2026


Описание проекта

Проект представляет собой асинхронное REST API для управления списками задач (Todo). Приложение построено на современном фреймворке FastAPI с использованием асинхронной БД PostgreSQL через ORM SQLAlchemy.

Основной функционал

  • ✅ Создание, редактирование и удаление списков задач
  • ✅ Создание, редактирование и удаление задач внутри списков
  • ✅ Автоматическое ведение счётчиков (всего задач, выполненных)
  • ✅ Мягкое удаление (soft delete) - данные не физически удаляются
  • ✅ Асинхронная работа с БД для производительности
  • ✅ Полная документация API через Swagger UI

Требования и установка

Системные требования

  • Python 3.11 или выше
  • PostgreSQL 12 или выше
  • pip или другой менеджер пакетов Python

Установка и запуск

# 1. Установите зависимости
pip install -r requirements.txt

# 2. Создайте файл .env и установите параметры подключения к БД
cp .env.example .env

# 3. Запуск тестового сервера
uvicorn main:app --reload

После запуска приложение будет доступно по адресу: http://127.0.0.1:8000

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


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

kornoukhov/
├── main.py              # Главный файл с эндпоинтами API
├── models.py            # Модели БД (SQLAlchemy ORM)
├── schemas.py           # Pydantic-схемы для валидации данных
├── database.py          # Конфигурация подключения к БД
├── requirements.txt     # Список зависимостей
├── .env                 # Переменные окружения (создаётся вручную)
├── .gitignore           # Git-конфигурация
└── README.md            # Этот файл

Описание файлов

Файл Описание
main.py Основной файл приложения. Содержит определение FastAPI-приложения и все REST API эндпоинты для работы с TodoList и Item.
models.py ORM-модели данных: класс TodoList (список задач) и класс Item (отдельная задача). Определяют структуру таблиц БД.
schemas.py Pydantic-схемы для валидации входящих данных и формирования ответов API. Включает классы Create, Update и Response для каждой сущности.
database.py Конфигурация асинхронного подключения к PostgreSQL. Загружает переменные окружения и инициализирует SQLAlchemy engine и SessionLocal.
requirements.txt Список всех зависимостей Python проекта.

API Эндпоинты

TodoList (Списки задач)

GET /todolists

Возвращает все существующие списки задач, которые не были удалены.

Ответ (200 OK):

[
    {
        "id": 1,
        "name": "Работа",
        "items_count": 5,
        "completed_count": 2
    }
]

GET /todolists/{todo_id}

Возвращает один список задач по ID.

Ответ (200 OK) / 404 Not Found:

{
    "id": 1,
    "name": "Работа",
    "items_count": 5,
    "completed_count": 2
}

POST /todolists

Создаёт новый список задач.

Тело запроса:

{
    "name": "Новый список"
}

Ответ (201 Created):

{
    "id": 2,
    "name": "Новый список",
    "items_count": 0,
    "completed_count": 0
}

PATCH /todolists/{todo_id}

Обновляет название списка.

Тело запроса:

{
    "name": "Обновлённое название"
}

DELETE /todolists/{todo_id}

Мягко удаляет список (проставляет время удаления, не физически). Возвращает 204 No Content.


Item (Задачи)

GET /items

Возвращает все задачи, которые не были удалены.

Ответ (200 OK):

[
    {
        "id": 1,
        "todo_list_id": 1,
        "name": "Купить хлеб",
        "text": "В ближайшем магазине",
        "is_done": false
    }
]

GET /items/{item_id}

Возвращает одну задачу по ID.

Ответ (200 OK) / 404 Not Found

POST /items

Создаёт новую задачу в указанном списке. Возвращает 404, если todo_list_id не существует или был удалён.

Тело запроса:

{
    "todo_list_id": 1,
    "name": "Купить молоко",
    "text": "Проверить срок годности",
    "is_done": false
}

Ответ (201 Created):

{
    "id": 2,
    "todo_list_id": 1,
    "name": "Купить молоко",
    "text": "Проверить срок годности",
    "is_done": false
}

PATCH /items/{item_id}

Обновляет поля задачи (все поля опциональны).

Тело запроса:

{
    "name": "Обновлённая задача",
    "is_done": true
}

DELETE /items/{item_id}

Мягко удаляет задачу. Возвращает 204 No Content.


Ключевые особенности реализации

1. Асинхронность

Все операции с БД выполняются асинхронно, обеспечивая высокую производительность при работе с множественными запросами.

async def get_all_todolists(db: AsyncSession = Depends(get_db)):
    result = await db.execute(...)
    return result.scalars().all()

2. Мягкое удаление (Soft Delete)

Вместо физического удаления записей проставляется временная метка deleted_at. Это позволяет сохранить историю и связность данных.

todo.deleted_at = datetime.now(timezone.utc)

3. Автоматическое уведение счётчиков

Функция update_todo_counters() автоматически пересчитывает количество всех задач и выполненных задач в списке при каждом изменении.

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

Все входящие данные проверяются по схемам, определённым в schemas.py. FastAPI автоматически генерирует валидные JSON-ответы.

5. Проверка существования связанных объектов

При создании задачи проверяется, что родительский список существует и не был удалён:

todo = await db.get(TodoList, data.todo_list_id)
if not todo or todo.deleted_at is not None:
    raise HTTPException(status_code=404, detail="TodoList not found")

Примеры использования

Создание списка и задач

# 1. Создать список
curl -X POST http://127.0.0.1:8000/todolists \
  -H "Content-Type: application/json" \
  -d "{\"name\": \"Покупки\"}"

# 2. Создать задачу в списке (ID=1)
curl -X POST http://127.0.0.1:8000/items \
  -H "Content-Type: application/json" \
  -d "{\"todo_list_id\": 1, \"name\": \"Хлеб\", \"text\": \"Чёрный хлеб\"}"

# 3. Получить все списки
curl http://127.0.0.1:8000/todolists

# 4. Отметить задачу как выполненную
curl -X PATCH http://127.0.0.1:8000/items/1 \
  -H "Content-Type: application/json" \
  -d "{\"is_done\": true}"

Заключение

Данный проект демонстрирует применение современных подходов к разработке веб-приложений на Python:

  • Асинхронное программирование
  • REST API архитектура
  • ORM и работа с БД
  • Валидация данных
  • Документирование API

Приложение готово к развёртыванию и может служить базовой платформой для более сложных систем управления задачами.


Скриншоты

Интерфейс Swagger UI

Swagger UI interface


Добавление новой сущности

Create new entity


Изменение сущности и расчёт процента выполнения

Update entity and progress


"Мягкое" удаление сущности

Delete entity

Deleted timestamp

About

Асинхронное REST API приложение для управления списками задач. ООП, 4 семестр

Resources

Stars

Watchers

Forks

Contributors

Languages