import { NextRequest, NextResponse } from "next/server"; import { telegramApproverDb, telegramSettingsDb } from "@/lib/db"; import { isTelegramConfigured, registerTelegramWebhook } from "@/lib/telegram"; import { TelegramApprover } from "@/lib/types"; export const dynamic = "force-dynamic"; export async function GET() { const settings = telegramSettingsDb.get(); return NextResponse.json({ approvers: telegramApproverDb.getAll(), baseUrl: settings.baseUrl, greetingText: settings.greetingText, cardNumber: settings.cardNumber, cardHolderName: settings.cardHolderName, botConfigured: isTelegramConfigured(), webhookSecretConfigured: Boolean(process.env.TELEGRAM_WEBHOOK_SECRET), }); } export async function PUT(request: NextRequest) { try { const body = (await request.json()) as { approvers?: TelegramApprover[]; baseUrl?: string; botToken?: string; greetingText?: string; cardNumber?: string; cardHolderName?: string; }; if (!Array.isArray(body.approvers)) { return NextResponse.json({ error: "approvers must be an array" }, { status: 400 }); } const seen = new Set(); const approvers: TelegramApprover[] = []; for (const item of body.approvers) { const userId = String(item.userId || "").trim(); if (!/^\d+$/.test(userId)) { return NextResponse.json({ error: `Invalid Telegram user ID: ${userId}` }, { status: 400 }); } if (!seen.has(userId)) { seen.add(userId); approvers.push({ userId, label: String(item.label || "").trim().slice(0, 100) }); } } const baseUrl = String(body.baseUrl || "https://api.telegram.org").trim().replace(/\/$/, ""); let parsedUrl: URL; try { parsedUrl = new URL(baseUrl); } catch { return NextResponse.json({ error: "Invalid Telegram API base URL" }, { status: 400 }); } if (!["http:", "https:"].includes(parsedUrl.protocol) || parsedUrl.username || parsedUrl.password) { return NextResponse.json({ error: "Telegram API base URL must use HTTP or HTTPS without credentials" }, { status: 400 }); } const botToken = body.botToken?.trim(); const greetingText = String(body.greetingText || "").trim().slice(0, 1000); const cardNumber = String(body.cardNumber || "").trim().slice(0, 100); const cardHolderName = String(body.cardHolderName || "").trim().slice(0, 200); if (!greetingText) { return NextResponse.json({ error: "Greeting message is required" }, { status: 400 }); } telegramApproverDb.replaceAll(approvers); telegramSettingsDb.update({ baseUrl, greetingText, cardNumber, cardHolderName, ...(botToken ? { botToken } : {}), }); return NextResponse.json({ approvers: telegramApproverDb.getAll(), baseUrl: telegramSettingsDb.get().baseUrl, greetingText, cardNumber, cardHolderName, botConfigured: isTelegramConfigured(), webhookSecretConfigured: Boolean(process.env.TELEGRAM_WEBHOOK_SECRET), }); } catch (error) { console.error("Telegram settings update failed:", error); return NextResponse.json({ error: "Failed to update Telegram settings" }, { status: 500 }); } } export async function POST() { try { await registerTelegramWebhook(); return NextResponse.json({ message: "Telegram webhook registered successfully" }); } catch (error) { const message = error instanceof Error ? error.message : "Failed to register Telegram webhook"; console.error("Telegram webhook registration failed:", error); return NextResponse.json({ error: message }, { status: 502 }); } }