Initial commit
This commit is contained in:
175
app/api/admin/setup/route.ts
Normal file
175
app/api/admin/setup/route.ts
Normal file
@@ -0,0 +1,175 @@
|
||||
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 }
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user