Zum Inhalt springen

Datenmodell

Ein Schema definiert Felder, Defaults, Indizes, Relationen und Zugriffsregeln. Ein schema()-Aufruf erzeugt die Tabellenregistry der Engine, die SQL-Migrationen und die Typen des Clients. Die Typen werden aus dem Schema abgeleitet; es gibt keinen Codegen-Schritt.

tapedb.schema.ts
import { check, filter, model, role, schema, t } from "tapedb/schema";
export default schema({
board: model({
name: t.string(),
ownerId: t.string().index(),
archived: t.boolean().default(false),
columns: t.hasMany("column"),
}).access({
read: filter(({ auth }) => ({ ownerId: auth.sub })),
update: check(({ auth, row }) => row?.ownerId === auth.sub),
delete: role("moderator"),
}),
column: model({
name: t.string(),
position: t.number().default(0).index(),
board: t.belongsTo("board", { onDelete: "cascade" }),
tasks: t.hasMany("task"),
}),
task: model({
title: t.string(),
done: t.boolean().default(false),
due: t.date().optional(),
meta: t.json().optional(),
column: t.belongsTo("column").optional(),
}),
});

t.string(), t.number(), t.boolean(), t.date() (als Epoch-Millisekunden gespeichert) und t.json().

Modifikatoren: .optional(), .default(value), .index() und .unique().

Relationen: t.belongsTo("model") besitzt den Foreign Key (board speichert boardId); t.hasMany("model") ist die Inverse. onDelete kann auf einer belongs-to-Relation gesetzt werden.

Jede Zeile trägt id (client-generiert, zeitgeordnet), createdAt und updatedAt.

Zugriffsregeln gehören zur Modelldefinition, neben den Feldern. Siehe Zugriff und Identität für die drei Regeltypen und ihre Defaults.