Это умный менеджер задач, который сам напоминает о себе там, где вы точно не пропустите уведомление — в Telegram.
Вы просто создаёте задачу в браузере на Frontend, указываете, через сколько минут напомнить, и продолжаете заниматься своими делами. Бэкенд на FastAPI бережно хранит всё в PostgreSQL, а фоновый планировщик в нужный момент «стучится» в Telegram.
Бот проверяет статусы задач и присылает уведомление в Telegram по окончанию действия таймера. Задача автоматически помечается как выполненная (или неудачная, если бот не смог отправить сообщение).
- Python - язык программирования
- FastAPI — веб-фреймворк для API
- PostgreSQL — основная база данных
- SQLAlchemy (ORM) — работа с БД
- Pydantic — валидация данных и схемы
- Docker — контейнеризация PostgreSQL
- Telegram Bot API (pyTelegramBotAPI) — отправка уведомлений
- Python-dotenv — управление переменными окружения
- Uvicorn — ASGI сервер
- React - Frontend
- Asyncio — фоновые задачи
src/
├── api/
│ ├── router.py # эндпоинты
│ └── repository.py # работа с БД
├── models/
│ ├── models.py # SQLAlchemy ORM
│ └── constants.py # ограничения полей
├── schemas/
│ └── schemas.py # Pydantic схемы
├── bot/
│ └── bot_load.py # логика бота и планировщик
├── core/
│ └── database.py # подключение к БД
└── main.py # точка входа, lifespan
/todo-app-frontend # фронтэнд проектаgit clone git@github.com:YoFaceQT/Notes-and-Notifications.gitDB_HOST=localhost
DB_PORT=5432
DB_USER=postgres
DB_NAME=postgres
DB_PASS=postgres
TELEGRAM_TOKEN=!!!YOUR_BOT_TELEGRAMM_TOKEN!!!
TELEGRAM_CHAT_ID=!!!YOUR_TELEGRAM_CHAT_ID!!!
docker-compose up --buildБазовый URL FRONTEND: http://localhost:80
Базовый URL BACKEND: http://localhost:8000
Документация сгенерирована FASTAPI и находится по адресу: http://localhost:8000/docs
| Method | Endpoint | Description |
|---|---|---|
| POST | /tasks |
Создать новую задачу |
| GET | /tasks |
Список всех задач |
| PATCH | /tasks/{id} |
Обновить задачу |
| DELETE | /tasks/{id} |
Удалить задачу |
"В проекте также имеются pytest-тесты. Они не включаются в сборку контейнера бэкенда и запускаются отдельно."
Запрос:
curl -X POST http://localhost:8000/tasks \
-H "Content-Type: application/json" \
-d '{
"name": "Купить молоко",
"description": "Выйти до 20:00",
"remind_after_minutes": 30
}'
Ответ: (JSON)
[
{
"id": 1,
"name": "Купить молоко",
"description": "Выйти до 20:00",
"remind_after_minutes": 30,
"time_stamp": "2025-04-22T12:00:00",
"status": "IN_PROGRESS",
"reminded": false
}
]