feat(core): setup postgres, minio, and authentik next-auth

This commit is contained in:
AI Assistant
2026-02-27 10:29:54 +02:00
parent 3b1ba589f0
commit 0ad7e835bd
18 changed files with 1654 additions and 105 deletions
+130
View File
@@ -0,0 +1,130 @@
import { NextRequest, NextResponse } from "next/server";
import { prisma } from "@/core/storage/prisma";
export async function GET(request: NextRequest) {
const searchParams = request.nextUrl.searchParams;
const namespace = searchParams.get("namespace");
const key = searchParams.get("key");
if (!namespace) {
return NextResponse.json(
{ error: "Namespace is required" },
{ status: 400 },
);
}
try {
if (key) {
// Get single item
const item = await prisma.keyValueStore.findUnique({
where: {
namespace_key: {
namespace,
key,
},
},
});
return NextResponse.json({ value: item ? item.value : null });
} else {
// Get all items in namespace
const items = await prisma.keyValueStore.findMany({
where: { namespace },
});
// Return as a record { [key]: value }
const result: Record<string, any> = {};
for (const item of items) {
result[item.key] = item.value;
}
return NextResponse.json({ items: result });
}
} catch (error) {
console.error("Storage GET error:", error);
return NextResponse.json(
{ error: "Internal server error" },
{ status: 500 },
);
}
}
export async function POST(request: NextRequest) {
try {
const body = await request.json();
const { namespace, key, value } = body;
if (!namespace || !key) {
return NextResponse.json(
{ error: "Namespace and key are required" },
{ status: 400 },
);
}
await prisma.keyValueStore.upsert({
where: {
namespace_key: {
namespace,
key,
},
},
update: {
value,
},
create: {
namespace,
key,
value,
},
});
return NextResponse.json({ success: true });
} catch (error) {
console.error("Storage POST error:", error);
return NextResponse.json(
{ error: "Internal server error" },
{ status: 500 },
);
}
}
export async function DELETE(request: NextRequest) {
const searchParams = request.nextUrl.searchParams;
const namespace = searchParams.get("namespace");
const key = searchParams.get("key");
if (!namespace) {
return NextResponse.json(
{ error: "Namespace is required" },
{ status: 400 },
);
}
try {
if (key) {
// Delete single item
await prisma.keyValueStore
.delete({
where: {
namespace_key: {
namespace,
key,
},
},
})
.catch(() => {
// Ignore error if item doesn't exist
});
} else {
// Clear namespace
await prisma.keyValueStore.deleteMany({
where: { namespace },
});
}
return NextResponse.json({ success: true });
} catch (error) {
console.error("Storage DELETE error:", error);
return NextResponse.json(
{ error: "Internal server error" },
{ status: 500 },
);
}
}