Files
yourwillyourwish/app/api/admin/setup/route.ts
2026-02-06 21:44:04 -06:00

176 lines
5.4 KiB
TypeScript

import { NextResponse } from "next/server";
import { PrismaClient } from "@prisma/client";
import { loadSystemConfig, saveSystemConfig } from "@/lib/system-config";
import { cookies } from "next/headers";
import { verifySession } from "@/lib/auth/jwt";
import { getCached, setCached, deleteCached, cacheKeys } from "@/lib/redis";
export const runtime = "nodejs";
const prisma = new PrismaClient();
async function validateSession() {
const cookieStore = await cookies();
const token = cookieStore.get("ep_session")?.value;
if (!token) return null;
try {
const decoded = await verifySession(token);
return decoded;
} catch {
return null;
}
}
export async function GET() {
try {
const session = await validateSession();
if (!session || session.role !== "ADMIN") {
return NextResponse.json(
{ ok: false, message: "Unauthorized" },
{ status: 401 }
);
}
// Try to get from cache first
let cachedSetup = await getCached(cacheKeys.adminSetup);
if (cachedSetup) {
return NextResponse.json({
ok: true,
data: cachedSetup,
});
}
const appSetup = await prisma.appSetup.findUnique({
where: { id: 1 },
});
const systemConfig = await loadSystemConfig();
const setupData = {
googleAuth: {
enabled: appSetup?.googleAuthEnabled || false,
clientId: systemConfig.googleAuth?.clientId || "",
clientSecret: systemConfig.googleAuth?.clientSecret || "",
},
oauth: {
google: { enabled: false, clientId: "", clientSecret: "" },
github: { enabled: false, clientId: "", clientSecret: "" },
facebook: { enabled: false, clientId: "", clientSecret: "" },
discord: { enabled: false, clientId: "", clientSecret: "" },
},
googleCalendar: {
enabled: systemConfig.googleCalendar?.enabled || false,
serviceAccountEmail: systemConfig.googleCalendar?.serviceAccountEmail || "",
serviceAccountKey: systemConfig.googleCalendar?.serviceAccountKey || "",
calendarId: systemConfig.googleCalendar?.calendarId || "",
},
socials: appSetup?.socials || {},
email: {
smtp: {
enabled: systemConfig.email?.enabled || false,
host: systemConfig.email?.smtp?.host || "",
port: systemConfig.email?.smtp?.port || 587,
username: systemConfig.email?.smtp?.user || "",
password: systemConfig.email?.smtp?.pass || "",
from: systemConfig.email?.from || "",
},
},
pagination: {
itemsPerPage: appSetup?.paginationItemsPerPage || 10,
},
};
// Cache for 5 minutes
await setCached(cacheKeys.adminSetup, setupData, 300);
return NextResponse.json({
ok: true,
data: setupData,
});
} catch (error) {
console.error("Error fetching admin setup:", error);
return NextResponse.json(
{ ok: false, message: "Failed to fetch configuration" },
{ status: 500 }
);
}
}
export async function POST(request: Request) {
try {
const session = await validateSession();
if (!session || session.role !== "ADMIN") {
return NextResponse.json(
{ ok: false, message: "Unauthorized" },
{ status: 401 }
);
}
const body = await request.json();
const { googleAuth, googleCalendar, socials, email, pagination } = body;
// Update database for public-facing settings
await prisma.appSetup.upsert({
where: { id: 1 },
update: {
googleAuthEnabled: googleAuth?.enabled || false,
socials: socials || {},
paginationItemsPerPage: pagination?.itemsPerPage || 10,
},
create: {
id: 1,
googleAuthEnabled: googleAuth?.enabled || false,
socials: socials || {},
paginationItemsPerPage: pagination?.itemsPerPage || 10,
categories: ["Basics", "Planning", "Tax", "Healthcare", "Advanced"],
},
});
// Update system-config.json for sensitive data
const currentConfig = await loadSystemConfig();
const updatedConfig = {
...currentConfig,
googleAuth: {
clientId: googleAuth?.clientId || "",
clientSecret: googleAuth?.clientSecret || "",
redirectUri: `${process.env.APP_BASE_URL || "http://localhost:3001"}/auth/google/callback`,
},
googleCalendar: {
enabled: googleCalendar?.enabled || false,
serviceAccountEmail: googleCalendar?.serviceAccountEmail || "",
serviceAccountKey: googleCalendar?.serviceAccountKey || "",
calendarId: googleCalendar?.calendarId || "",
},
email: {
...currentConfig.email,
smtp: {
enabled: email?.smtp?.enabled || false,
host: email?.smtp?.host || "",
port: email?.smtp?.port || 587,
user: email?.smtp?.username || "",
pass: email?.smtp?.password || "",
},
from: email?.smtp?.from || "",
},
};
await saveSystemConfig(updatedConfig, prisma);
// Invalidate cache after update
await deleteCached(cacheKeys.adminSetup);
console.log("[SETUP] Configuration saved");
return NextResponse.json({
ok: true,
message: "Configuration updated successfully",
});
} catch (error) {
console.error("Error updating admin setup:", error);
return NextResponse.json(
{ ok: false, message: "Failed to update configuration" },
{ status: 500 }
);
}
}