feat(db): mesh data model — meshes, members, invites, audit log
- pgSchema "mesh" with 4 tables isolating the peer mesh domain - Enums: visibility, transport, tier, role - audit_log is metadata-only (E2E encryption enforced at broker/client) - Cascade on mesh delete, soft-delete via archivedAt/revokedAt Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
6
packages/db/src/utils/drizzle-zod.ts
Normal file
6
packages/db/src/utils/drizzle-zod.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
import { createSchemaFactory } from "drizzle-zod";
|
||||
|
||||
export const { createInsertSchema, createSelectSchema, createUpdateSchema } =
|
||||
createSchemaFactory({
|
||||
coerce: true,
|
||||
});
|
||||
32
packages/db/src/utils/index.ts
Normal file
32
packages/db/src/utils/index.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import { asc, desc } from "drizzle-orm";
|
||||
|
||||
import * as schema from "../schema";
|
||||
|
||||
import type { SortPayload } from "@turbostarter/shared/schema";
|
||||
import type { PgTableWithColumns, TableConfig } from "drizzle-orm/pg-core";
|
||||
|
||||
// Re-export drizzle-zod utilities (separate file to avoid circular deps)
|
||||
export {
|
||||
createInsertSchema,
|
||||
createSelectSchema,
|
||||
createUpdateSchema,
|
||||
} from "./drizzle-zod";
|
||||
|
||||
export const getOrderByFromSort = <Schema extends TableConfig>({
|
||||
sort,
|
||||
defaultSchema,
|
||||
}: {
|
||||
sort: SortPayload[];
|
||||
defaultSchema: PgTableWithColumns<Schema>;
|
||||
}) => {
|
||||
return sort.map((s) => {
|
||||
const order = s.desc ? desc : asc;
|
||||
const parts = s.id.split(/[_.]/);
|
||||
|
||||
const table =
|
||||
parts[0] && parts[0] in schema
|
||||
? schema[parts[0] as keyof typeof schema]
|
||||
: defaultSchema;
|
||||
return order(table[(parts[1] ?? parts[0]) as keyof typeof table]);
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user