Files
kan/packages/api/src/schemas/board.ts
2026-04-18 21:29:35 +01:00

131 lines
3.6 KiB
TypeScript

import { z } from "zod";
import {
checklistResponseSchema,
labelSchema,
workspaceMemberSchema,
} from "./common";
// ─── board.all ───────────────────────────────────────────────
export const boardListItemSchema = z.object({
publicId: z.string(),
name: z.string(),
favorite: z.boolean(),
lists: z.array(
z.object({
publicId: z.string(),
name: z.string(),
index: z.number(),
}),
),
labels: z.array(labelSchema),
});
// ─── Card sub-object inside board detail (byId) ─────────────
const boardCardMemberSchema = z.object({
publicId: z.string(),
email: z.string(),
user: z
.object({
name: z.string().nullable(),
email: z.string(),
image: z.string().nullable(),
})
.nullable(),
});
const boardDetailCardSchema = z.object({
publicId: z.string(),
title: z.string(),
description: z.string().nullable(),
index: z.number(),
dueDate: z.date().nullable(),
labels: z.array(labelSchema),
members: z.array(boardCardMemberSchema),
attachments: z.array(z.object({ publicId: z.string() })),
checklists: z.array(checklistResponseSchema),
comments: z.array(z.object({ publicId: z.string() })),
});
// ─── board.byId ──────────────────────────────────────────────
export const boardDetailSchema = z.object({
publicId: z.string(),
name: z.string(),
slug: z.string(),
visibility: z.string(),
isArchived: z.boolean(),
favorite: z.boolean(),
workspace: z.object({
publicId: z.string(),
members: z.array(workspaceMemberSchema),
}),
labels: z.array(labelSchema),
lists: z.array(
z.object({
publicId: z.string(),
name: z.string(),
index: z.number(),
cards: z.array(boardDetailCardSchema),
}),
),
allLists: z.array(
z.object({
publicId: z.string(),
name: z.string(),
}),
),
});
// ─── Card sub-object inside board detail (bySlug — no members) ─
const boardSlugCardSchema = z.object({
publicId: z.string(),
title: z.string(),
description: z.string().nullable(),
index: z.number(),
dueDate: z.date().nullable(),
labels: z.array(labelSchema),
attachments: z.array(z.object({ publicId: z.string() })),
checklists: z.array(checklistResponseSchema),
comments: z.array(z.object({ publicId: z.string() })),
});
// ─── board.bySlug ────────────────────────────────────────────
export const boardBySlugSchema = z.object({
publicId: z.string(),
name: z.string(),
slug: z.string(),
visibility: z.string(),
workspace: z.object({
publicId: z.string(),
name: z.string(),
slug: z.string(),
}),
labels: z.array(labelSchema),
lists: z.array(
z.object({
publicId: z.string(),
name: z.string(),
index: z.number(),
cards: z.array(boardSlugCardSchema),
}),
),
allLists: z.array(
z.object({
publicId: z.string(),
name: z.string(),
}),
),
});
// ─── board.create / board.createFromSnapshot ─────────────────
export const boardCreateResponseSchema = z.object({
publicId: z.string(),
name: z.string(),
});
// ─── board.update ────────────────────────────────────────────
export const boardUpdateResponseSchema = z.union([
z.object({ success: z.boolean() }),
z.object({ publicId: z.string(), name: z.string() }),
]);