28 lines
1.0 KiB
TypeScript
28 lines
1.0 KiB
TypeScript
"use server";
|
|
|
|
import { prisma } from "@/lib/db";
|
|
import { requireUserId } from "@/lib/auth-helpers";
|
|
import { projectAccessFilter } from "@/lib/access";
|
|
import { getBoard } from "@/lib/board";
|
|
import type { CategoryDTO } from "@/types/board";
|
|
|
|
/**
|
|
* A fresh read of one board for the client's cross-device sync (see the
|
|
* poll in board-context.tsx). Returns the exact same shape the page's
|
|
* server component renders, so BoardProvider can diff it against its own
|
|
* state and apply it only if something actually changed. `projectId` null
|
|
* is Home scope -- same convention as getScheduledBoard.
|
|
*/
|
|
export async function getBoardSnapshot(projectId: string | null): Promise<CategoryDTO[]> {
|
|
const userId = await requireUserId();
|
|
if (projectId) {
|
|
const project = await prisma.project.findFirst({
|
|
where: { id: projectId, ...projectAccessFilter(userId) },
|
|
select: { id: true },
|
|
});
|
|
if (!project) throw new Error("Project not found");
|
|
return getBoard({ projectId: project.id });
|
|
}
|
|
return getBoard({ userId, projectId: null });
|
|
}
|