131 lines
3.6 KiB
TypeScript
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() }),
|
|
]);
|