176 lines
5.4 KiB
TypeScript
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 }
|
|
);
|
|
}
|
|
}
|