Skip to content

fogel-dev/goals-tracker

Repository files navigation

Goals Tracker

Goals Tracker — приложение для отслеживания ежедневных целей и привычек: воды, сна, шагов, тренировок, питания и общего прогресса за месяц.

Репозиторий организован как монорепозиторий. Сейчас в нем есть веб-интерфейс на React, Telegram-бот на Python и начальный backend API на Go. Общая идея проекта: дать пользователю быстрый и понятный способ отмечать выполненные действия за день и видеть, насколько стабильно он движется к своим целям.

Что уже есть

  • Веб-приложение с главной страницей целей на сегодня.
  • Карточки ежедневных целей с возможностью отметить выполнение.
  • Виджет статистики по текущему дню.
  • Календарь прогресса за месяц.
  • Анимация поздравления, когда все цели за день выполнены.
  • Telegram-бот с базовой архитектурой под работу с целями.
  • Backend API на Go с тестовым endpoint целей.
  • Docker Compose конфигурация для локального Postgres.
  • Моковые данные и моковый репозиторий, которые можно заменить реальным API или базой данных.

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

.
├── apps
│   ├── web        # React-приложение на Vite
│   ├── bot        # Telegram-бот на Python и aiogram
│   └── api        # Backend API на Go
├── packages       # место для будущих общих пакетов
├── package.json   # общие команды монорепозитория
├── docker-compose.yml
└── pnpm-workspace.yaml

apps/web

Веб-приложение собрано на React, TypeScript и Vite.

Основные директории:

  • src/app — корневой компонент приложения и глобальные стили.
  • src/pages — страницы приложения. Сейчас есть главная страница.
  • src/widgets — крупные блоки интерфейса: цели на сегодня, статистика, календарь.
  • src/entities — доменные типы, например цель и прогресс дня.
  • src/shared — общие UI-компоненты и утилиты.

Сейчас данные для веб-интерфейса лежат в apps/web/src/pages/home/model/mockData.ts. Это удобно для разработки интерфейса без backend. Когда появится API, моковые данные можно заменить загрузкой с сервера.

apps/bot

Telegram-бот написан на Python 3.9+ с использованием aiogram.

Архитектура разделена на слои:

  • domain — бизнес-сущности. Этот слой не зависит от Telegram, aiogram, окружения или хранилищ.
  • application — сценарии использования и порты для репозиториев.
  • infrastructure — адаптеры к внешним системам. Сейчас здесь находится моковый репозиторий.
  • presentation/telegram — Telegram-слой: роутеры, клавиатуры и форматирование сообщений.
  • config — чтение и проверка настроек из переменных окружения.
  • app.py — сборка зависимостей приложения.
  • main.py — точка входа для запуска бота.

Такое разделение позволяет в будущем подключить реальную базу данных или backend API без переписывания Telegram-обработчиков.

apps/api

Backend API написан на Go.

Основные директории:

  • cmd/api — точка входа HTTP-сервера.
  • internal/domain — доменные сущности API.
  • internal/httpapi — HTTP-роуты и обработчики.
  • internal/repository — порт репозитория и временная in-memory реализация.
  • internal/config — чтение настроек из переменных окружения.
  • migrations — SQL-схема для Postgres.

Сейчас endpoint целей использует in-memory данные. Postgres уже подготовлен через docker-compose.yml и миграцию apps/api/migrations/001_create_goals.sql.

Требования

Для локальной разработки понадобятся:

  • Node.js и pnpm.
  • Python 3.9 или новее.
  • Go 1.22 или новее.
  • Docker, если нужно поднять локальный Postgres.
  • Telegram bot token, если нужно запускать бота.

Если pnpm еще не установлен, его можно включить через Corepack:

corepack enable

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

Из корня репозитория:

pnpm install

Для Telegram-бота отдельно создается Python virtual environment:

pnpm bot:setup

Эта команда перейдет в apps/bot, создаст .venv и установит зависимости из requirements.txt.

Запуск веб-приложения

pnpm dev

Команда запускает Vite dev server для пакета @goals-tracker/web. После запуска адрес локального сервера появится в терминале, обычно это http://localhost:5173.

Дополнительные команды:

pnpm build
pnpm preview
pnpm lint
  • pnpm build — собирает production-версию веб-приложения.
  • pnpm preview — запускает локальный preview собранного приложения.
  • pnpm lint — проверяет код веб-приложения через ESLint.

Запуск Telegram-бота

Сначала создайте файл окружения:

cp apps/bot/.env.example apps/bot/.env

Затем укажите в apps/bot/.env токен Telegram-бота:

BOT_TOKEN=123456:your-telegram-bot-token

После этого бота можно запустить из корня репозитория:

pnpm bot:dev

Или напрямую из папки apps/bot:

make run

Перед первым запуском из папки apps/bot выполните:

make setup

Проверка бота

pnpm bot:check

Команда запускает compileall для исходников бота и помогает быстро поймать синтаксические ошибки в Python-коде.

Запуск backend API

Из корня репозитория:

pnpm api:dev

Или напрямую:

cd apps/api
make run

По умолчанию API слушает http://localhost:8080.

Проверить endpoint можно так:

curl http://localhost:8080/health
curl http://localhost:8080/api/v1/goals
curl -X PATCH http://localhost:8080/api/v1/goals/water/toggle
curl -X PATCH 'http://localhost:8080/api/v1/goals/water/toggle?date=2026-05-11'

Настройка целей на месяц:

curl http://localhost:8080/api/v1/goal-presets
curl 'http://localhost:8080/api/v1/goal-period-plan/status?month=2026-05'
curl 'http://localhost:8080/api/v1/goal-period-plan?month=2026-05'
curl -X PUT http://localhost:8080/api/v1/goal-period-plan \
  -H 'Content-Type: application/json' \
  -d '{"month":"2026-05","goals":[{"id":"water","kind":"water","title":"Вода","targetLabel":"2.5 л"}]}'

Для обычного веб-входа доступны:

curl -i -X POST http://localhost:8080/api/v1/auth/register \
  -H 'Content-Type: application/json' \
  -d '{"email":"user@example.com","password":"secret-password"}'

curl -i -X POST http://localhost:8080/api/v1/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"email":"user@example.com","password":"secret-password"}'

Ожидаемый ответ для целей:

{
  "items": [
    {
      "id": "workout",
      "userId": "demo",
      "title": "Тренировка",
      "targetLabel": "выполнено",
      "isCompleted": true
    }
  ]
}

Локальный Postgres можно поднять так:

docker compose up -d postgres

Интеграция web и bot с API

Веб-приложение читает VITE_API_BASE_URL. В dev-режиме значение можно оставить пустым: frontend будет ходить на относительный /api, а Vite проксирует запросы в Go API. Если приложение открыто не как Telegram Mini App и сессии еще нет, frontend покажет форму входа или регистрации.

cp apps/web/.env.example apps/web/.env
pnpm api:dev
pnpm dev

Telegram-бот читает BACKEND_API_URL. Если переменная не задана или API недоступен, бот использует текущий моковый репозиторий.

cp apps/bot/.env.example apps/bot/.env
pnpm api:dev
pnpm bot:dev

Основные команды

Команда Назначение
pnpm dev Запустить веб-приложение в режиме разработки
pnpm build Собрать веб-приложение
pnpm preview Посмотреть production-сборку локально
pnpm lint Проверить веб-приложение линтером
pnpm bot:setup Создать .venv и установить зависимости бота
pnpm bot:dev Запустить Telegram-бота
pnpm bot:check Проверить Python-код бота на синтаксические ошибки
pnpm api:dev Запустить backend API
pnpm api:test Запустить Go-тесты backend API

Переменные окружения

Сейчас обязательная переменная нужна только Telegram-боту. Для API есть необязательные настройки запуска:

Переменная Где используется Описание
BOT_TOKEN apps/bot Токен Telegram-бота, полученный у BotFather
BACKEND_API_URL apps/bot Адрес backend API, например http://localhost:8080
VITE_API_BASE_URL apps/web Адрес backend API для веб-приложения
HTTP_ADDR apps/api Адрес HTTP-сервера, по умолчанию :8080
DATABASE_URL apps/api Строка подключения к Postgres для будущего DB-репозитория
TELEGRAM_BOT_TOKEN apps/api Токен бота для проверки Telegram Mini App initData

Не добавляйте реальные значения токенов и секретов в git. Для примера используйте .env.example, а реальные значения храните только в локальном .env.

Как развивать проект

Ближайшие логичные направления:

  • Подключить backend API или базу данных вместо моковых данных.
  • Синхронизировать веб-приложение и Telegram-бота через общий источник данных.
  • Добавить авторизацию пользователя.
  • Расширить модель целей: периодичность, единицы измерения, история выполнения.
  • Добавить тесты для бизнес-логики и ключевых UI-сценариев.
  • Вынести общие типы или клиент API в packages/*, когда они понадобятся и вебу, и боту.

Полезные файлы

  • apps/web/src/pages/home/model/mockData.ts — текущие моковые цели и прогресс.
  • apps/web/src/entities/goal/model/types.ts — TypeScript-модель цели.
  • apps/web/src/entities/day-progress/model/types.ts — TypeScript-модель прогресса дня.
  • apps/bot/src/goals_tracker_bot/domain/goals.py — доменные сущности бота.
  • apps/bot/src/goals_tracker_bot/application/use_cases.py — сценарии использования бота.
  • apps/bot/.env.example — пример переменных окружения для бота.
  • apps/api/internal/domain/goal.go — доменная модель цели в API.
  • apps/api/internal/httpapi/router.go — первые HTTP endpoint API.
  • apps/api/migrations/001_create_goals.sql — начальная схема таблицы целей.
  • apps/web/src/shared/api/goalsApi.ts — HTTP-клиент веб-приложения для API.
  • apps/bot/src/goals_tracker_bot/infrastructure/api/goal_repository.py — HTTP-репозиторий бота для API.

About

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors