import type { EntityVersionData } from './types' import type db from '@admin/db' import { entityVersions } from '@admin/db/schema' import { and, desc, eq, sql } from 'drizzle-orm' type EntityVersionClient = Parameters[0]>[0] interface CreateEntityVersionInput { entityType: string entityId: string data: EntityVersionData createdBy?: string | null } export async function createEntityVersion( client: EntityVersionClient, input: CreateEntityVersionInput ): Promise { await client.execute( sql`select pg_advisory_xact_lock(hashtext(${input.entityType}), hashtext(${input.entityId}))` ) const [latestVersion] = await client .select({ version: entityVersions.version }) .from(entityVersions) .where( and( eq(entityVersions.entityType, input.entityType), eq(entityVersions.entityId, input.entityId) ) ) .orderBy(desc(entityVersions.version)) .limit(1) await client.insert(entityVersions).values({ entityType: input.entityType, entityId: input.entityId, version: (latestVersion?.version ?? 0) + 1, data: input.data, createdAt: new Date().toISOString(), createdBy: input.createdBy ?? null }) }