feat: implement Story 1.1 — create and view diagrams
Add diagram/project DB schema, CRUD API, dashboard pages with grid/card/ empty state, create dialog with type selector, editor placeholder, and 26 schema validation tests. Includes code review fixes: soft-delete filter on GET /:id, error handling, keyboard accessibility, type-safe API response types, and error states on pages. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
71
packages/db/src/schema/diagram.ts
Normal file
71
packages/db/src/schema/diagram.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
import {
|
||||
integer,
|
||||
jsonb,
|
||||
pgEnum,
|
||||
pgTable,
|
||||
text,
|
||||
timestamp,
|
||||
} from "drizzle-orm/pg-core";
|
||||
|
||||
import { generateId } from "@turbostarter/shared/utils";
|
||||
|
||||
import {
|
||||
createInsertSchema,
|
||||
createSelectSchema,
|
||||
createUpdateSchema,
|
||||
} from "../lib/zod";
|
||||
|
||||
import { user } from "./auth";
|
||||
|
||||
import type * as z from "zod";
|
||||
|
||||
export const diagramTypeEnum = pgEnum("diagram_type", [
|
||||
"bpmn",
|
||||
"er",
|
||||
"orgchart",
|
||||
"architecture",
|
||||
"sequence",
|
||||
"flowchart",
|
||||
]);
|
||||
|
||||
export const project = pgTable("project", {
|
||||
id: text().primaryKey().notNull().$defaultFn(generateId),
|
||||
name: text().notNull(),
|
||||
userId: text()
|
||||
.references(() => user.id, { onDelete: "cascade" })
|
||||
.notNull(),
|
||||
sortOrder: integer().default(0),
|
||||
createdAt: timestamp().defaultNow(),
|
||||
updatedAt: timestamp().$onUpdate(() => new Date()),
|
||||
});
|
||||
|
||||
export const diagram = pgTable("diagram", {
|
||||
id: text().primaryKey().notNull().$defaultFn(generateId),
|
||||
title: text().notNull(),
|
||||
type: diagramTypeEnum().notNull(),
|
||||
graphData: jsonb().$type<object>().default({}),
|
||||
userId: text()
|
||||
.references(() => user.id, { onDelete: "cascade" })
|
||||
.notNull(),
|
||||
projectId: text(),
|
||||
lastAiMessage: text(),
|
||||
deletedAt: timestamp(),
|
||||
createdAt: timestamp().defaultNow(),
|
||||
updatedAt: timestamp().$onUpdate(() => new Date()),
|
||||
});
|
||||
|
||||
export const insertDiagramSchema = createInsertSchema(diagram);
|
||||
export const selectDiagramSchema = createSelectSchema(diagram);
|
||||
export const updateDiagramSchema = createUpdateSchema(diagram);
|
||||
|
||||
export type InsertDiagram = z.infer<typeof insertDiagramSchema>;
|
||||
export type SelectDiagram = z.infer<typeof selectDiagramSchema>;
|
||||
export type UpdateDiagram = z.infer<typeof updateDiagramSchema>;
|
||||
|
||||
export const insertProjectSchema = createInsertSchema(project);
|
||||
export const selectProjectSchema = createSelectSchema(project);
|
||||
export const updateProjectSchema = createUpdateSchema(project);
|
||||
|
||||
export type InsertProject = z.infer<typeof insertProjectSchema>;
|
||||
export type SelectProject = z.infer<typeof selectProjectSchema>;
|
||||
export type UpdateProject = z.infer<typeof updateProjectSchema>;
|
||||
Reference in New Issue
Block a user