mirror of
https://github.com/temetro/temetro.git
synced 2026-08-13 12:06:52 +00:00
7d6641ef59
New `note` table (src/db/schema/notes.ts) referencing organization + user, with org+author scoping so a doctor only sees their own notes within the active clinic. Adds: - src/types/note.ts + src/lib/note-validation.ts (zod) - src/services/notes.ts (CRUD, treats non-uuid ids as not-found) - src/routes/notes.ts mounted at /api/notes, gated requireAuth → requireOrg - schema barrel + generated migration drizzle/0001_*.sql (applied on startup by the runtime migrator) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
28 lines
1003 B
TypeScript
28 lines
1003 B
TypeScript
import { index, pgTable, text, timestamp, uuid } from "drizzle-orm/pg-core";
|
|
|
|
import { organization, user } from "./auth.js";
|
|
|
|
// A doctor's freeform note, scoped to a clinic (organization) AND its author —
|
|
// notes are private to the doctor who wrote them within that clinic. `content`
|
|
// holds the rich-text editor's HTML.
|
|
export const notes = pgTable(
|
|
"notes",
|
|
{
|
|
id: uuid("id").primaryKey().defaultRandom(),
|
|
organizationId: text("organization_id")
|
|
.notNull()
|
|
.references(() => organization.id, { onDelete: "cascade" }),
|
|
authorId: text("author_id")
|
|
.notNull()
|
|
.references(() => user.id, { onDelete: "cascade" }),
|
|
title: text("title").notNull(),
|
|
content: text("content").notNull().default(""),
|
|
createdAt: timestamp("created_at").defaultNow().notNull(),
|
|
updatedAt: timestamp("updated_at")
|
|
.defaultNow()
|
|
.$onUpdate(() => new Date())
|
|
.notNull(),
|
|
},
|
|
(t) => [index("notes_org_author_idx").on(t.organizationId, t.authorId)],
|
|
);
|