71 lines
2.3 KiB
TypeScript
71 lines
2.3 KiB
TypeScript
import { NextResponse } from "next/server";
|
||
import { requireAdmin } from "@/lib/admin-auth";
|
||
|
||
export const dynamic = "force-dynamic";
|
||
|
||
function isSupabaseConfigured() {
|
||
return !!(process.env.SUPABASE_URL && process.env.SUPABASE_SERVICE_ROLE_KEY);
|
||
}
|
||
|
||
function supabaseNotReadyResponse() {
|
||
return NextResponse.json(
|
||
{ error: "Supabase nicht konfiguriert – Email-Queue nicht verfügbar" },
|
||
{ status: 503 }
|
||
);
|
||
}
|
||
|
||
export async function GET(request: Request) {
|
||
const check = await requireAdmin();
|
||
if (check instanceof NextResponse) return check;
|
||
if (!isSupabaseConfigured()) return supabaseNotReadyResponse();
|
||
|
||
const { createServiceClient } = await import("@/lib/supabase");
|
||
const supabase = createServiceClient();
|
||
const { data, error } = await supabase
|
||
.from("email_queue")
|
||
.select("id, created_at, next_retry_at, retry_count, status, error_last, mail_to, subject")
|
||
.order("created_at", { ascending: false })
|
||
.limit(50);
|
||
|
||
if (error) return NextResponse.json({ error: error.message }, { status: 500 });
|
||
return NextResponse.json(data);
|
||
}
|
||
|
||
export async function POST(request: Request) {
|
||
const check = await requireAdmin();
|
||
if (check instanceof NextResponse) return check;
|
||
if (!isSupabaseConfigured()) return supabaseNotReadyResponse();
|
||
|
||
const { createServiceClient } = await import("@/lib/supabase");
|
||
const supabase = createServiceClient();
|
||
const { error, count } = await supabase
|
||
.from("email_queue")
|
||
.update({ next_retry_at: new Date().toISOString() })
|
||
.eq("status", "pending");
|
||
|
||
if (error) return NextResponse.json({ error: error.message }, { status: 500 });
|
||
|
||
try {
|
||
const { startEmailQueueWorker } = await import("@/lib/email-queue");
|
||
startEmailQueueWorker();
|
||
} catch {}
|
||
|
||
return NextResponse.json({ ok: true, updated: count ?? 0 });
|
||
}
|
||
|
||
export async function DELETE(request: Request) {
|
||
const check = await requireAdmin();
|
||
if (check instanceof NextResponse) return check;
|
||
if (!isSupabaseConfigured()) return supabaseNotReadyResponse();
|
||
|
||
const { createServiceClient } = await import("@/lib/supabase");
|
||
const supabase = createServiceClient();
|
||
const { error, count } = await supabase
|
||
.from("email_queue")
|
||
.delete()
|
||
.eq("status", "failed");
|
||
|
||
if (error) return NextResponse.json({ error: error.message }, { status: 500 });
|
||
return NextResponse.json({ ok: true, deleted: count ?? 0 });
|
||
}
|