Your Name 53ddb7e585
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
Initial commit - clean repository
2025-12-17 20:15:18 +08:00

116 lines
3.3 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
import { z } from "zod";
import { db } from "@/lib/db";
import { authSettings } from "@/lib/db/schema";
import { eq } from "drizzle-orm";
import { auth } from "@/app/(auth)/auth";
// GET /api/auth-settings - 获取认证配置
export async function GET() {
try {
const session = await auth();
const isAdmin = session?.user?.type === "admin";
const [settings] = await db.select().from(authSettings).limit(1);
// 如果没有配置记录,返回默认值
if (!settings) {
return NextResponse.json({
dingTalkAppKey: "",
dingTalkAppSecret: "", // 即使是空的,非管理员也不应该看到这个字段名,但因为是空字符串,问题不大
isDingTalkEnabled: false,
isRegistrationEnabled: true,
});
}
if (isAdmin) {
return NextResponse.json(settings);
} else {
// 非管理员,脱敏返回
return NextResponse.json({
dingTalkAppKey: settings.dingTalkAppKey,
isDingTalkEnabled: settings.isDingTalkEnabled,
isRegistrationEnabled: settings.isRegistrationEnabled,
// 不返回 dingTalkAppSecret
});
}
} catch (error) {
console.error("[Auth Settings API] Get error:", error);
return NextResponse.json(
{ error: "Failed to fetch auth settings" },
{ status: 500 }
);
}
}
const updateSchema = z.object({
dingTalkAppKey: z.string().optional(),
dingTalkAppSecret: z.string().optional(),
isDingTalkEnabled: z.boolean().optional(),
isRegistrationEnabled: z.boolean().optional(),
});
// PUT /api/auth-settings - 更新认证配置(仅管理员)
export async function PUT(request: NextRequest) {
try {
const session = await auth();
if (!session?.user) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
if (session.user.type !== "admin") {
return NextResponse.json({ error: "Forbidden" }, { status: 403 });
}
const body = await request.json();
const data = updateSchema.parse(body);
// 查找现有配置
const [existing] = await db.select().from(authSettings).limit(1);
if (existing) {
// 更新现有配置
const [updated] = await db
.update(authSettings)
.set({
...data,
updatedAt: new Date(),
updatedBy: session.user.id,
})
.where(eq(authSettings.id, existing.id))
.returning();
return NextResponse.json(updated);
} else {
// 创建新配置
const [created] = await db
.insert(authSettings)
.values({
dingTalkAppKey: data.dingTalkAppKey,
dingTalkAppSecret: data.dingTalkAppSecret,
isDingTalkEnabled: data.isDingTalkEnabled || false,
isRegistrationEnabled: data.isRegistrationEnabled ?? true,
updatedBy: session.user.id,
})
.returning();
return NextResponse.json(created);
}
} catch (error) {
console.error("[Auth Settings API] Update error:", error);
if (error instanceof z.ZodError) {
return NextResponse.json(
{ error: "Invalid request data", details: error.errors },
{ status: 400 }
);
}
return NextResponse.json(
{ error: "Failed to update auth settings" },
{ status: 500 }
);
}
}