Add Telegram notification integration for geofencing

Features:
- Multi-channel notifications (Email + Telegram)
- User-configurable notification settings per channel
- Telegram bot integration with rich messages, location pins, and inline buttons
- QR code generation for easy bot access (@myidbot support)
- Admin UI for notification settings management
- Test functionality for Telegram connection
- Comprehensive documentation

Implementation:
- lib/telegram-service.ts: Telegram API integration
- lib/notification-settings-db.ts: Database layer for user notification preferences
- lib/geofence-notifications.ts: Extended for parallel multi-channel delivery
- API routes for settings management and testing
- Admin UI with QR code display and step-by-step instructions
- Database table: UserNotificationSettings

Documentation:
- docs/telegram.md: Technical implementation guide
- docs/telegram-anleitung.md: User guide with @myidbot instructions
- docs/telegram-setup.md: Admin setup guide
- README.md: Updated NPM scripts section

Docker:
- Updated Dockerfile to copy public directory
- Added TELEGRAM_BOT_TOKEN environment variable
- Integrated notification settings initialization in db:init

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-04 14:54:19 +00:00
parent 17aaf130a8
commit 0d1dbeafda
18 changed files with 3200 additions and 21 deletions

View File

@@ -0,0 +1,52 @@
import { NextResponse } from 'next/server';
import { auth } from '@/lib/auth';
import { telegramService } from '@/lib/telegram-service';
import { getUserNotificationSettings } from '@/lib/notification-settings-db';
// POST /api/users/[id]/notification-settings/test
export async function POST(
request: Request,
{ params }: { params: Promise<{ id: string }> }
) {
try {
const session = await auth();
if (!session?.user) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
const { id: userId } = await params;
const currentUserId = (session.user as any).id;
if (userId !== currentUserId) {
return NextResponse.json({ error: 'Forbidden' }, { status: 403 });
}
const settings = getUserNotificationSettings(userId);
if (!settings.telegram_chat_id) {
return NextResponse.json(
{ error: 'No Telegram chat ID configured' },
{ status: 400 }
);
}
const success = await telegramService.testConnection(
settings.telegram_chat_id
);
if (success) {
return NextResponse.json({ success: true, message: 'Test message sent' });
} else {
return NextResponse.json(
{ error: 'Failed to send test message' },
{ status: 500 }
);
}
} catch (error) {
console.error('[POST /api/users/[id]/notification-settings/test]', error);
return NextResponse.json(
{ error: 'Failed to send test message' },
{ status: 500 }
);
}
}