DB-backed workspace + LangGraph agent

This commit is contained in:
Ruslan Bakiev
2026-02-18 13:56:35 +07:00
parent a8db021597
commit efa0b79c4c
36 changed files with 2125 additions and 468 deletions

View File

@@ -0,0 +1,8 @@
import { ensureDemoAuth, setSession } from "../../utils/auth";
export default defineEventHandler(async (event) => {
const demo = await ensureDemoAuth();
setSession(event, demo);
return { ok: true };
});

View File

@@ -0,0 +1,35 @@
import { readBody } from "h3";
import { prisma } from "../../utils/prisma";
import { setSession } from "../../utils/auth";
export default defineEventHandler(async (event) => {
const body = await readBody<{ email?: string; name?: string; teamName?: string }>(event);
const email = (body?.email ?? "").trim().toLowerCase();
const name = (body?.name ?? "").trim();
const teamName = (body?.teamName ?? "").trim() || "My Team";
if (!email || !email.includes("@")) {
throw createError({ statusCode: 400, statusMessage: "valid email is required" });
}
if (!name) {
throw createError({ statusCode: 400, statusMessage: "name is required" });
}
const user = await prisma.user.upsert({
where: { email },
update: { name },
create: { email, name },
});
// For MVP: 1 user -> 1 team (created if missing)
const team = await prisma.team.create({ data: { name: teamName } });
await prisma.teamMember.create({ data: { teamId: team.id, userId: user.id, role: "OWNER" } });
const conversation = await prisma.chatConversation.create({
data: { teamId: team.id, createdByUserId: user.id, title: "Pilot" },
});
setSession(event, { teamId: team.id, userId: user.id, conversationId: conversation.id });
return { ok: true };
});

View File

@@ -0,0 +1,6 @@
import { clearAuthSession } from "../../utils/auth";
export default defineEventHandler(async (event) => {
clearAuthSession(event);
return { ok: true };
});

View File

@@ -0,0 +1,17 @@
import { getAuthContext } from "../../utils/auth";
import { prisma } from "../../utils/prisma";
export default defineEventHandler(async (event) => {
try {
const auth = await getAuthContext(event);
const [user, team, conv] = await Promise.all([
prisma.user.findUnique({ where: { id: auth.userId } }),
prisma.team.findUnique({ where: { id: auth.teamId } }),
prisma.chatConversation.findUnique({ where: { id: auth.conversationId } }),
]);
if (!user || !team || !conv) throw new Error("unauth");
return { user: { id: user.id, email: user.email, name: user.name }, team: { id: team.id, name: team.name }, conversation: { id: conv.id, title: conv.title } };
} catch {
throw createError({ statusCode: 401, statusMessage: "Unauthorized" });
}
});