153 lines
4.2 KiB
TypeScript
153 lines
4.2 KiB
TypeScript
import { z } from "zod";
|
|
import { requireAdmin } from "@/lib/middleware/admin";
|
|
import {
|
|
getAllStorageConfigs,
|
|
getStorageConfigById,
|
|
createStorageConfig,
|
|
updateStorageConfig,
|
|
deleteStorageConfig,
|
|
} from "@/lib/db/queries";
|
|
import { ChatSDKError } from "@/lib/errors";
|
|
|
|
const createStorageSchema = z.object({
|
|
name: z.string().trim().min(1).max(128),
|
|
type: z.enum(["s3", "local"]),
|
|
endpoint: z.string().trim().optional(),
|
|
region: z.string().trim().max(64).optional(),
|
|
bucket: z.string().trim().max(128).optional(),
|
|
accessKeyId: z.string().trim().optional(),
|
|
secretAccessKey: z.string().trim().optional(),
|
|
publicUrl: z.string().trim().optional(),
|
|
isDefault: z.boolean().optional(),
|
|
isEnabled: z.boolean().optional(),
|
|
});
|
|
|
|
const updateStorageSchema = z.object({
|
|
id: z.string().uuid(),
|
|
name: z.string().trim().min(1).max(128).optional(),
|
|
type: z.enum(["s3", "local"]).optional(),
|
|
endpoint: z.string().trim().optional(),
|
|
region: z.string().trim().max(64).optional(),
|
|
bucket: z.string().trim().max(128).optional(),
|
|
accessKeyId: z.string().trim().optional(),
|
|
secretAccessKey: z.string().trim().optional(),
|
|
publicUrl: z.string().trim().optional(),
|
|
isDefault: z.boolean().optional(),
|
|
isEnabled: z.boolean().optional(),
|
|
});
|
|
|
|
export async function GET(request: Request) {
|
|
try {
|
|
await requireAdmin();
|
|
|
|
const { searchParams } = new URL(request.url);
|
|
const id = searchParams.get("id");
|
|
|
|
if (id) {
|
|
const config = await getStorageConfigById({ id });
|
|
if (!config) {
|
|
return new ChatSDKError("bad_request:api", "Storage config not found").toResponse();
|
|
}
|
|
// 隐藏敏感信息
|
|
return Response.json({
|
|
config: {
|
|
...config,
|
|
accessKeyId: config.accessKeyId
|
|
? config.accessKeyId.slice(0, 4) + "****"
|
|
: null,
|
|
secretAccessKey: config.secretAccessKey ? "****" : null,
|
|
},
|
|
});
|
|
}
|
|
|
|
const configs = await getAllStorageConfigs();
|
|
// 隐藏敏感信息
|
|
return Response.json({
|
|
configs: configs.map((c) => ({
|
|
...c,
|
|
accessKeyId: c.accessKeyId ? c.accessKeyId.slice(0, 4) + "****" : null,
|
|
secretAccessKey: c.secretAccessKey ? "****" : null,
|
|
})),
|
|
});
|
|
} catch (error) {
|
|
if (error instanceof ChatSDKError) {
|
|
return error.toResponse();
|
|
}
|
|
return new ChatSDKError("offline:admin").toResponse();
|
|
}
|
|
}
|
|
|
|
export async function POST(request: Request) {
|
|
try {
|
|
const session = await requireAdmin();
|
|
|
|
const body = await request.json();
|
|
const data = createStorageSchema.parse(body);
|
|
|
|
const config = await createStorageConfig({
|
|
...data,
|
|
updatedBy: session.user.id,
|
|
});
|
|
|
|
return Response.json({ config: config[0] });
|
|
} catch (error) {
|
|
if (error instanceof ChatSDKError) {
|
|
return error.toResponse();
|
|
}
|
|
if (error instanceof z.ZodError) {
|
|
return new ChatSDKError("bad_request:api", error.message).toResponse();
|
|
}
|
|
return new ChatSDKError("offline:admin").toResponse();
|
|
}
|
|
}
|
|
|
|
export async function PUT(request: Request) {
|
|
try {
|
|
const session = await requireAdmin();
|
|
|
|
const body = await request.json();
|
|
const data = updateStorageSchema.parse(body);
|
|
|
|
const config = await updateStorageConfig({
|
|
...data,
|
|
updatedBy: session.user.id,
|
|
});
|
|
|
|
if (config.length === 0) {
|
|
return new ChatSDKError("bad_request:api", "Storage config not found").toResponse();
|
|
}
|
|
|
|
return Response.json({ config: config[0] });
|
|
} catch (error) {
|
|
if (error instanceof ChatSDKError) {
|
|
return error.toResponse();
|
|
}
|
|
if (error instanceof z.ZodError) {
|
|
return new ChatSDKError("bad_request:api", error.message).toResponse();
|
|
}
|
|
return new ChatSDKError("offline:admin").toResponse();
|
|
}
|
|
}
|
|
|
|
export async function DELETE(request: Request) {
|
|
try {
|
|
await requireAdmin();
|
|
|
|
const { searchParams } = new URL(request.url);
|
|
const id = searchParams.get("id");
|
|
|
|
if (!id) {
|
|
return new ChatSDKError("bad_request:api", "Storage config ID is required").toResponse();
|
|
}
|
|
|
|
await deleteStorageConfig({ id });
|
|
|
|
return Response.json({ success: true });
|
|
} catch (error) {
|
|
if (error instanceof ChatSDKError) {
|
|
return error.toResponse();
|
|
}
|
|
return new ChatSDKError("offline:admin").toResponse();
|
|
}
|
|
}
|