Проект демонстрирует практическое применение чистой архитектуры, работу с Telegram Bot API и визуализацию данных. Разработан с целью тестирования использования Golang в serverless архитектуре.
Бот поддерживает два режима работы:
Классический режим работы через long polling:
go build cmd/bot/main.go
./mainБот может работать в serverless режиме через AWS Lambda или аналогичные сервисы:
cmd/function/WebhookHandler- обработка входящих сообщений через webhookcmd/function/DailyReportHandler- отправка ежедневных отчетов (триггер по расписанию)
- Разверните функцию в AWS Lambda
- Создайте API Gateway endpoint
- Настройте webhook в Telegram:
curl -X POST https://api.telegram.org/bot<YOUR_BOT_TOKEN>/setWebhook \
-H "Content-Type: application/json" \
-d '{"url": "https://your-api-gateway-url/prod/webhook"}'Бот поддерживает отправку логов в сервис BetterStack:
- Создайте аккаунт на BetterStack
- Получите токен и эндпоинт для отправки логов
- Настройте переменные окружения в файле
.env:BETTERSTACK_TOKEN=your_token BETTERSTACK_ENDPOINT=your_endpoint BETTERSTACK_ENABLED=true - При запуске бота логи автоматически будут отправляться в BetterStack
При отсутствии настроек BetterStack или при установке BETTERSTACK_ENABLED=false, логи будут выводиться только в консоль.
Для настройки автоматических напоминаний пользователям:
- Создайте триггер "Timer" в Yandex Cloud
- Настройте расписание (например, ежедневно в 21:00)
- Выберите функцию WebhookHandler в качестве целевой
- Укажите следующий JSON-параметр:
{"notification_trigger": true} - Сохраните триггер
Функция будет вызываться в заданное время и отправлять напоминания всем пользователям, у которых включены уведомления.
Проект построен с использованием принципов чистой архитектуры:
.
├── cmd/
│ ├── bot/ # Точка входа для long polling режима
│ └── function/ # AWS Lambda handlers
├── internal/
│ ├── bot/ # Telegram бот и обработка команд
│ ├── model/ # Доменные модели
│ ├── repository/ # Работа с данными (Supabase)
│ ├── service/ # Бизнес-логика
│ ├── charts/ # Генерация графиков
│ ├── logger/ # Работа с логами
│ └── config/ # Конфигурация
└── migrations/ # Миграции бд
- Паттерн конечного автомата для управления диалогами
- In-memory хранение состояний пользователей
- Автоматический сброс состояния после завершения операций
- База данных: Supabase (PostgreSQL)
- Схема данных:
-- Категории доходов/расходов CREATE TABLE categories ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id BIGINT NOT NULL, name TEXT NOT NULL, type TEXT NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Финансовые операции CREATE TABLE transactions ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id BIGINT NOT NULL, category_id UUID REFERENCES categories(id), amount DECIMAL NOT NULL, description TEXT, date TIMESTAMP WITH TIME ZONE DEFAULT NOW(), created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() );
- Интеграция с BetterStack для централизованного сбора логов
- Структурированное логирование с использованием
slog - Отслеживание ошибок в реальном времени
Использует библиотеку go-chart для генерации графиков:
-
Типы графиков:
- Линейные графики (динамика доходов/расходов)
- Круговые диаграммы (распределение по категориям)
- Столбчатые диаграммы (сравнение периодов)
-
Оптимизации:
- Предварительная фильтрация данных
- Адаптивные размеры для Telegram
- Группировка малых категорий
- Оптимизированные форматы изображений
-
Типы отчетов:
type ReportType int const ( DailyReport ReportType = iota WeeklyReport MonthlyReport YearlyReport )
-
Метрики:
- Основные показатели (доходы, расходы, баланс)
- Сравнение с предыдущими периодами
- Тренды и изменения
- Статистика по категориям
- Многоуровневая валидация
- Контекстные ошибки
- Информативные сообщения пользователю
- Логирование для отладки
github.com/go-telegram-bot-api/telegram-bot-api/v5- Telegram Bot APIgithub.com/supabase-community/supabase-go- Работа с Supabasegithub.com/go-redis/redis/v8- Работа с Redisgithub.com/samber/slog-betterstack- Интеграция с BetterStack для логирования
-
Умная агрегация данных
- Автоматическое определение периодов
- Расчет трендов и изменений
- Выявление значимых изменений
-
Оптимизация графиков
- Предварительная фильтрация данных
- Адаптивные размеры
- Оптимизированные форматы для Telegram
-
UX-решения
- Информативные сообщения об ошибках
- Поддержка частичного ввода (транзакции без описания)
-
Масштабируемость
- Чистая архитектура
- Независимые модули
- Легкое добавление новых типов отчетов и графиков
CREATE TABLE categories (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id BIGINT NOT NULL,
name TEXT NOT NULL,
type TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE transactions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id BIGINT NOT NULL,
category_id UUID REFERENCES categories(id),
amount DECIMAL NOT NULL,
description TEXT,
date TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS user_states (
user_id BIGINT PRIMARY KEY,
selected_category_id TEXT,
transaction_type TEXT,
awaiting_action TEXT,
notifications BOOLEAN DEFAULT TRUE,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);# Основные настройки
TELEGRAM_TOKEN="your_telegram_bot_token"
SUPABASE_URL="your_supabase_url"
SUPABASE_KEY="your_supabase_key"
REDIS_URL="your_redis_url"
# Настройки логирования
BETTERSTACK_TOKEN="your_betterstack_token"
BETTERSTACK_ENDPOINT="your_betterstack_endpoint"
BETTERSTACK_ENABLED=truego build cmd/bot/main.go
./main- Создайте ZIP для AWS Lambda:
zip function.zip bootstrap- Загрузите ZIP в AWS Lambda и настройте триггеры:
- API Gateway для webhook
- EventBridge для ежедневных отчетов
