@murumets-ee/entity 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/count-cache.ts","../../src/cursor.ts","../../src/admin-config.ts","../../src/fields/base.ts","../../src/behaviors/types.ts","../../src/define-entity.ts","../../src/shared/entity-data-ops.ts","../../src/types/infer.ts","../../src/types/logger.ts","../../src/admin/client.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/count-cache.ts","../../src/fields/base.ts","../../src/types/infer.ts","../../src/behaviors/types.ts","../../src/cursor.ts","../../src/admin-config.ts","../../src/define-entity.ts","../../src/shared/entity-data-ops.ts","../../src/types/logger.ts","../../src/admin/client.ts"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{schemaRegistry as e}from"@murumets-ee/db";import{and as t,eq as n,getTableColumns as r,gt as i,inArray as a,isNull as o,lt as s,or as c,sql as l}from"drizzle-orm";import{index as u,pgTable as d,unique as f,uuid as p,varchar as m}from"drizzle-orm/pg-core";import{z as h}from"zod";function g(e,a){let o=r(e),l=o[a.field];if(!l)return null;let u=a.direction===`desc`?s:i,d=u(l,a.value);if(!a.id)return d;let f=o.id;if(!f)return d;let p=u(f,a.id);return c(d,t(n(l,a.value),p))??d}function _(e,t,n){if(!t)return null;let r={},i=n?.select||Object.keys(e.allFields);for(let a of i){if(!n?.includeInternal&&a.startsWith(`_`))continue;let i=e.allFields[a];i&&i.type!==`blocks`&&(r[a]=t[a])}return r}function v(e,t,n){return t.map(t=>_(e,t,n))}var y=class extends Error{entityName;entityId;usages;constructor(e,t,n){let r=n.length;super(`Cannot delete ${e} '${t}': referenced by ${r} other entit${r===1?`y`:`ies`}`),this.name=`ReferencedEntityError`,this.entityName=e,this.entityId=t,this.usages=n}};const b=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function x(e,t){let n=[],r=new Set;function i(e,t,i){if(!b.test(i))return;let a=`${e}|${t}|${i}`;r.has(a)||(r.add(a),n.push({sourceField:e,targetEntity:t,targetId:i}))}for(let[n,r]of Object.entries(e)){let e=t[n];if(e!=null)switch(r.type){case`media`:typeof e==`string`&&i(n,`media`,e);break;case`reference`:{let t=r;if(t.cardinality===`many`&&Array.isArray(e))for(let r of e)typeof r==`string`&&i(n,t.entity,r);else typeof e==`string`&&i(n,t.entity,e);break}case`blocks`:{let t=r;if(!Array.isArray(e))break;for(let r of e){let e=r,a=e._block;if(!a)continue;let o=t.blocks.find(e=>e.slug===a);if(o)for(let[t,r]of Object.entries(o.fields)){let a=e[t];if(a!=null&&(r.type===`media`&&typeof a==`string`&&i(n,`media`,a),r.type===`reference`)){let e=r;if(e.cardinality===`many`&&Array.isArray(a))for(let t of a)typeof t==`string`&&i(n,e.entity,t);else typeof a==`string`&&i(n,e.entity,a)}}}break}}}return n}const S=d(`entity_refs`,{sourceEntity:m(`source_entity`,{length:100}).notNull(),sourceId:p(`source_id`).notNull(),sourceField:m(`source_field`,{length:100}).notNull(),targetEntity:m(`target_entity`,{length:100}).notNull(),targetId:p(`target_id`).notNull()},e=>[f(`uq_entity_refs`).on(e.sourceEntity,e.sourceId,e.sourceField,e.targetEntity,e.targetId),u(`idx_entity_refs_target`).on(e.targetEntity,e.targetId),u(`idx_entity_refs_source`).on(e.sourceEntity,e.sourceId)]);function C(e){return e.entity.allFields}function w(e){return Object.entries(C(e)).filter(([e,t])=>t.type===`blocks`).map(([e,t])=>({name:e,config:t}))}async function T(r,i,o){if(!i.length)return i;let s=`${r.entity.name}_translations`,c=e.get(s);if(!c)return i;let l=i.map(e=>e.id),u=await r.db.select().from(c).where(t(a(c.entityId,l),n(c.locale,o))),d=Object.entries(C(r)).filter(([e,t])=>t.translatable).map(([e])=>e),f=new Map;for(let e of u){let t={};for(let n of d){let r=e[n];r!=null&&(t[n]=r)}f.set(e.entityId,t)}return i.map(e=>{let t=f.get(e.id);return t?{...e,...t}:e})}async function E(r,i,s,l){let u=w(r);if(u.length===0||i.length===0)return new Map;let d=e.get(`${r.entity.name}_layout`);if(!d)return new Map;let f=u.filter(({config:e})=>!(`localized`in e&&e.localized)),p=u.filter(({config:e})=>`localized`in e&&e.localized),m=new Map;if(f.length>0){let c=await r.db.select().from(d).where(t(a(d.entityId,i),o(d.locale))).orderBy(d.sortOrder),u;if(s&&c.length>0){let i=e.get(`${r.entity.name}_layout_translations`);if(i){let e=c.map(e=>e.id),o=await r.db.select().from(i).where(t(a(i.layoutId,e),n(i.locale,s)));u=new Map;for(let e of o)u.set(e.layoutId,e.fields??{})}}let p;if(l?.strictTranslations){p=new Map;for(let{config:e}of f)if(e.type===`blocks`)for(let t of e.blocks)p.set(t.slug,t.fields)}for(let e of c){let t=e.entityId,n=e.fieldName,r=m.get(t);r||(r={},m.set(t,r)),r[n]||(r[n]=[]);let i=e.data??{},a=u?.get(e.id),o={_block:e.blockType,_id:e.id,...i,...a??{}};if(s&&p){let t=e.blockType,n=p.get(t);if(n)for(let[e,t]of Object.entries(n))t.translatable&&!a?.[e]&&(o[e]=``)}r[n].push(o)}}if(p.length>0){let e=!s||s===l?.defaultLocale,u;u=s?e?c(n(d.locale,s),o(d.locale))??n(d.locale,s):n(d.locale,s):o(d.locale);let f=await r.db.select().from(d).where(t(a(d.entityId,i),u)).orderBy(d.sortOrder),p=new Map;for(let e of f){let t=`${e.entityId}::${e.fieldName}`,n=p.get(t);n||(n={localeRows:[],nullRows:[]},p.set(t,n)),e.locale?n.localeRows.push(e):n.nullRows.push(e)}for(let[,{localeRows:e,nullRows:t}]of p){let n=e.length>0?e:t;for(let e of n){let t=e.entityId,n=e.fieldName,r=m.get(t);r||(r={},m.set(t,r)),r[n]||(r[n]=[]);let i=e.data??{};r[n].push({_block:e.blockType,_id:e.id,...i})}}}return m}function D(e,t,n){let r=w(e);if(r.length!==0)for(let e of t){let t=e.id,i=n.get(t)??{};for(let{name:t}of r)e[t]=i[t]??[]}}function O(e,t,n,r){let i=n?`${n}:${e}`:e;return r&&(i=`${i}@${r}`),t?`${i}:${String(t)}`:i}var k=class extends Error{constructor(e){super(e),this.name=`ForbiddenError`}};async function A(e){if(!e)throw new k(`No context resolver configured on AdminClient/QueryClient. Use createAdminClient() from @murumets-ee/core/clients, or pass a contextResolver in config.`);let t=await e();if(!t)throw new k(`Context resolver returned no context. Ensure auth is configured in your request handler, or use runAsCli() for CLI scripts.`);return t}async function j(e,t,n){let r=await A(t),i=r.user.groups[0];if(!i)throw new k(`User '${r.user.id}' has no role assigned.`);if(!r.checker(i,e.name,n))throw new k(`Forbidden: role '${i}' cannot ${n} '${e.name}'`)}function M(e,t){return n(e.table._scopeId,t)}async function N(e,t,n,r){let i=await A(t),a=i.user.groups[0];if(!a)throw new k(`User '${i.user.id}' has no role assigned.`);if(!i.checker(a,e.name,n))throw new k(`Forbidden: role '${a}' cannot ${n} '${e.name}'`);let o;if(e.scope&&e.scope!==`global`&&(o=i.scope?.id,!o&&r?.strictScope))throw new k(`Entity '${e.name}' requires scope '${e.scope}' but no scope is set in context.`);let s={user:{id:i.user.id,name:i.user.name,email:i.user.email}};return{security:i,scopeId:o,behaviorCtx:s}}function P(e){let t;switch(e.type){case`id`:t=h.string().uuid();break;case`text`:{let n=h.string();e.maxLength&&(n=n.max(e.maxLength)),e.minLength&&(n=n.min(e.minLength)),e.pattern&&(n=n.regex(e.pattern)),t=n;break}case`number`:{let n=h.number();e.integer&&(n=n.int()),e.min!==void 0&&(n=n.min(e.min)),e.max!==void 0&&(n=n.max(e.max)),t=n;break}case`boolean`:t=h.boolean();break;case`date`:t=h.date().or(h.string().datetime());break;case`select`:t=h.enum(e.options);break;case`reference`:t=e.cardinality===`many`?h.array(h.string().uuid()):h.string().uuid();break;case`media`:t=h.string().uuid();break;case`richtext`:t=h.union([h.string(),h.array(h.record(h.unknown()))]);break;case`slug`:t=h.string().regex(/^[a-z0-9-]+$/);break;case`json`:t=h.union([h.record(h.unknown()),h.array(h.unknown()),h.string(),h.number(),h.boolean()]);break;case`blocks`:t=h.array(h.object({_block:h.string()}).passthrough());break;default:t=h.unknown()}return e.required||(t=t.nullable().optional()),e.default!==void 0&&(t=t.default(e.default)),t}function F(e){let t={},n=new Set([`id`,`createdAt`,`updatedAt`,`createdBy`,`_version`]);for(let[r,i]of Object.entries(e.allFields))n.has(r)||(t[r]=P(i));return h.object(t)}function I(e){let t={},n=new Set([`id`,`createdAt`,`createdBy`,`updatedAt`,`updatedBy`,`_version`]);for(let[r,i]of Object.entries(e.allFields))n.has(r)||(t[r]=P(i).optional());return h.object(t)}var L=class r{entity;db;logger;createSchema;updateSchema;table;countCache;contextResolver;entityResolver;get ctx(){return{entity:this.entity,db:this.db,table:this.table,resolveContext:this.contextResolver}}constructor(t){if(typeof window<`u`)throw Error(`AdminClient cannot be used in browser code. Use QueryClient for frontend data access.`);this.entity=t.entity,this.db=t.db,this.logger=t.logger,this.countCache=t.countCache,this.contextResolver=t.contextResolver,this.entityResolver=t.entityResolver,this.createSchema=F(t.entity),this.updateSchema=I(t.entity);let n=e.get(t.entity.name);if(!n)throw Error(`Schema for entity '${t.entity.name}' not found in registry. Ensure schemas are generated and registered before creating AdminClient.`);this.table=n}async create(e){this.logger?.info({entity:this.entity.name},`Creating entity`);let{scopeId:t,behaviorCtx:n}=await N(this.entity,this.contextResolver,`create`,{strictScope:!0}),r=e;for(let e of this.entity.behaviors??[])if(e.hooks?.beforeCreate){let t=await e.hooks.beforeCreate(r,n);t!==void 0&&(r=t)}let i={};for(let e of[`createdAt`,`updatedAt`,`createdBy`,`updatedBy`])r[e]!==void 0&&(i[e]=r[e]);r={...this.createSchema.parse(r),...i},t&&(r._scopeId=t);let a=this.prepareDataForInsert(r),[o]=await this.db.insert(this.table).values(a).returning();await this.saveBlocks(o.id,r),await this.syncRefs(o.id,r,`create`);for(let e of this.entity.behaviors??[])e.hooks?.afterCreate&&await e.hooks.afterCreate(o,n);this.invalidateCountCache();let s=_(this.entity,o);if(s&&w(this.ctx).length>0){let e=await E(this.ctx,[s.id],void 0,{strictTranslations:!0});D(this.ctx,[s],e)}return s}async findById(e,r){this.logger?.info({entity:this.entity.name,id:e},`Finding entity by ID`);let{scopeId:i}=await N(this.entity,this.contextResolver,`view`),a=[n(this.table.id,e)];i&&a.push(M(this.ctx,i));let[o]=await this.db.select().from(this.table).where(t(...a));if(!o)return null;let s=_(this.entity,o);if(!s)return null;if(w(this.ctx).length>0){let e=await E(this.ctx,[s.id],r?.locale,{defaultLocale:r?.defaultLocale,strictTranslations:!0});D(this.ctx,[s],e)}if(r?.locale){let[e]=await T(this.ctx,[s],r.locale);return e}return s}async findMany(e){this.logger?.info({entity:this.entity.name,options:e},`Finding entities`);let{scopeId:n}=await N(this.entity,this.contextResolver,`view`),r=this.db.select().from(this.table).$dynamic(),i=[];if(n&&i.push(M(this.ctx,n)),e?.where&&i.push(e.where),e?.cursor){let t=C(this.ctx);if(!(e.cursor.field in t)&&e.cursor.field!==`id`)throw Error(`Invalid cursor field: '${e.cursor.field}' is not a field on '${this.entity.name}'`);let n=g(this.table,e.cursor);n&&i.push(n)}if(i.length>0&&(r=r.where(t(...i))),e?.limit&&(r=r.limit(e.limit)),e?.offset&&!e?.cursor&&(r=r.offset(e.offset)),e?.orderBy){let t=Array.isArray(e.orderBy)?e.orderBy:[e.orderBy];r=r.orderBy(...t)}let a=await r,o=v(this.entity,a).filter(e=>e!==null);if(w(this.ctx).length>0&&o.length>0){let t=o.map(e=>e.id),n=await E(this.ctx,t,e?.locale,{defaultLocale:e?.defaultLocale,strictTranslations:!0});D(this.ctx,o,n)}return e?.locale?await T(this.ctx,o,e.locale):o}async count(e){this.logger?.info({entity:this.entity.name,options:e},`Counting entities`);let{scopeId:n}=await N(this.entity,this.contextResolver,`view`),r=O(this.entity.name,e?.where,void 0,n),i=async()=>{let r=this.db.select({count:l`count(*)`}).from(this.table).$dynamic(),i=[];n&&i.push(M(this.ctx,n)),e?.where&&i.push(e.where),i.length>0&&(r=r.where(t(...i)));let[a]=await r;return Number(a.count)};return this.countCache?this.countCache.getOrCompute(r,i):i()}async update(e,r,i){this.logger?.info({entity:this.entity.name,id:e},`Updating entity`);let{scopeId:a,behaviorCtx:o}=await N(this.entity,this.contextResolver,`update`,{strictScope:!0}),s=r;for(let t of this.entity.behaviors??[])if(t.hooks?.beforeUpdate){let n=await t.hooks.beforeUpdate(e,s,o);n!==void 0&&(s=n)}let c={};for(let e of[`updatedAt`,`updatedBy`])s[e]!==void 0&&(c[e]=s[e]);s={...this.updateSchema.parse(s),...c};let l=this.prepareDataForUpdate(s),u=n(this.table.id,e),d=a?t(u,M(this.ctx,a))??u:u,f;if(Object.keys(l).length>0){let[e]=await this.db.update(this.table).set(l).where(d).returning();f=e}else{let[e]=await this.db.select().from(this.table).where(d);f=e}await this.saveBlocks(e,s,i),await this.syncRefs(e,s,`update`);for(let e of this.entity.behaviors??[])e.hooks?.afterUpdate&&await e.hooks.afterUpdate(f,o);let p=_(this.entity,f);if(p&&w(this.ctx).length>0){let t=await E(this.ctx,[e],void 0,{strictTranslations:!0});D(this.ctx,[p],t)}return p}async delete(e){this.logger?.info({entity:this.entity.name,id:e},`Deleting entity`);let{scopeId:r,behaviorCtx:i}=await N(this.entity,this.contextResolver,`delete`,{strictScope:!0});if(r){let[i]=await this.db.select({id:this.table.id}).from(this.table).where(t(n(this.table.id,e),M(this.ctx,r)));if(!i)return}await this.db.transaction(async r=>{await this.handleIncomingRefsForDelete(r,[e]);for(let t of this.entity.behaviors??[])t.hooks?.beforeDelete&&await t.hooks.beforeDelete(e,i);await r.delete(this.table).where(n(this.table.id,e)),await r.delete(S).where(t(n(S.sourceEntity,this.entity.name),n(S.sourceId,e)))});for(let t of this.entity.behaviors??[])t.hooks?.afterDelete&&await t.hooks.afterDelete(e,i);this.invalidateCountCache()}async deleteMany(e){this.logger?.info({entity:this.entity.name},`Bulk deleting entities`);let{scopeId:r,behaviorCtx:i}=await N(this.entity,this.contextResolver,`delete`,{strictScope:!0}),o=[e];r&&o.push(M(this.ctx,r));let s=(await this.db.select({id:this.table.id}).from(this.table).where(t(...o))).map(e=>e.id);if(s.length===0)return 0;await this.db.transaction(async e=>{await this.handleIncomingRefsForDelete(e,s);for(let e of s)for(let t of this.entity.behaviors??[])t.hooks?.beforeDelete&&await t.hooks.beforeDelete(e,i);await e.delete(this.table).where(a(this.table.id,s)),await e.delete(S).where(t(n(S.sourceEntity,this.entity.name),a(S.sourceId,s)))});for(let e of s)for(let t of this.entity.behaviors??[])t.hooks?.afterDelete&&await t.hooks.afterDelete(e,i);return this.invalidateCountCache(),s.length}static MAX_CASCADE_DEPTH=10;async handleIncomingRefsForDelete(i,o,s=0){if(s>=r.MAX_CASCADE_DEPTH)throw Error(`Cascade delete exceeded maximum depth of ${r.MAX_CASCADE_DEPTH} while deleting '${this.entity.name}'. This likely indicates a circular reference chain.`);let c=await i.select({sourceEntity:S.sourceEntity,sourceId:S.sourceId,sourceField:S.sourceField}).from(S).where(t(n(S.targetEntity,this.entity.name),a(S.targetId,o)));if(c.length===0)return;let l=new Map;for(let e of c){let t=`${e.sourceEntity}:${e.sourceField}`,n=l.get(t);n||(n={sourceEntity:e.sourceEntity,sourceField:e.sourceField,sourceIds:[]},l.set(t,n)),n.sourceIds.push(e.sourceId)}let u=this.entityResolver?.();for(let[,c]of l){let l=u?.get(c.sourceEntity),d=l?.fields[c.sourceField]?.onDelete??`restrict`;if(d===`restrict`)throw new y(this.entity.name,o[0],c.sourceIds.map(e=>({sourceEntity:c.sourceEntity,sourceId:e,sourceField:c.sourceField})));if(d===`cascade`){let n=e.get(c.sourceEntity);if(n&&l){let e=new r({entity:l,db:i,logger:this.logger,contextResolver:this.contextResolver}),o=await N(l,this.contextResolver,`delete`),u=a(n.id,c.sourceIds);if(o.scopeId){let e={entity:l,db:i,table:n,resolveContext:this.contextResolver},r=t(u,M(e,o.scopeId));r&&(u=r)}await e.deleteManyInTx(i,u,s+1,o.behaviorCtx)}}else if(d===`set-null`){let r=e.get(c.sourceEntity);if(r&&l&&r[c.sourceField]){let e=(await N(l,this.contextResolver,`update`)).scopeId,o=a(r.id,c.sourceIds);if(e){let n={entity:l,db:i,table:r,resolveContext:this.contextResolver},a=t(o,M(n,e));a&&(o=a)}await i.update(r).set({[c.sourceField]:null}).where(o),await i.delete(S).where(t(n(S.sourceEntity,c.sourceEntity),a(S.sourceId,c.sourceIds),n(S.sourceField,c.sourceField)))}}}}async deleteManyInTx(e,r,i,o){let s=(await e.select({id:this.table.id}).from(this.table).where(r)).map(e=>e.id);if(s.length===0)return 0;await this.handleIncomingRefsForDelete(e,s,i);for(let e of s)for(let t of this.entity.behaviors??[])t.hooks?.beforeDelete&&await t.hooks.beforeDelete(e,o);return await e.delete(this.table).where(a(this.table.id,s)),await e.delete(S).where(t(n(S.sourceEntity,this.entity.name),a(S.sourceId,s))),this.invalidateCountCache(),s.length}async updateMany(e,n,r){this.logger?.info({entity:this.entity.name},`Bulk updating entities`);let{scopeId:i}=await N(this.entity,this.contextResolver,`update`,{strictScope:!0}),a=this.updateSchema.parse(n),o=this.prepareDataForUpdate(a);if(r?.expressions){let e=C(this.ctx);for(let[t,n]of Object.entries(r.expressions)){if(t in o)throw Error(`updateMany: field '${t}' appears in both \`data\` and \`expressions\`. Choose one — expressions silently overriding validated values is unsafe.`);if(!(t in e)&&t!==`_scopeId`)throw Error(`updateMany.expressions: unknown column '${t}' on entity '${this.entity.name}'`);o[t]=n}}let s=[e];i&&s.push(M(this.ctx,i));let c=await this.db.update(this.table).set(o).where(t(...s)).returning({id:this.table.id});return this.invalidateCountCache(),c.length}async aggregate(e){this.logger?.info({entity:this.entity.name},`Aggregate query`);let{scopeId:n}=await N(this.entity,this.contextResolver,`view`),r=this.db.select(e.select).from(this.table).$dynamic(),i=[];if(n&&i.push(M(this.ctx,n)),e.where&&i.push(e.where),i.length>0&&(r=r.where(t(...i))),e.groupBy&&e.groupBy.length>0&&(r=r.groupBy(...e.groupBy)),e.orderBy){let t=Array.isArray(e.orderBy)?e.orderBy:[e.orderBy];r=r.orderBy(...t)}return e.limit&&(r=r.limit(e.limit)),await r}getTable(){return this.table}getDb(){return this.db}prepareDataForInsert(e){let t={};for(let[n,r]of Object.entries(e)){let e=C(this.ctx)[n];e&&n!==`id`&&e.type!==`blocks`&&(t[n]=r)}return e._scopeId!==void 0&&(t._scopeId=e._scopeId),t}prepareDataForUpdate(e){let t={};for(let[n,r]of Object.entries(e)){let e=C(this.ctx)[n];e&&n!==`id`&&e.type!==`blocks`&&(t[n]=r)}return t}async saveTranslation(t,n,r){await j(this.entity,this.contextResolver,`update`),this.logger?.info({entity:this.entity.name,entityId:t,locale:n},`Saving translation`);let i=`${this.entity.name}_translations`,a=e.get(i);if(!a)throw Error(`Translation table ${i} not found in schema registry`);let o=Object.entries(C(this.ctx)).filter(([e,t])=>t.translatable).map(([e])=>e);if(o.length===0)throw Error(`Entity ${this.entity.name} has no translatable fields`);let s={entityId:t,locale:n},c={};for(let e of o)r[e]!==void 0&&(s[e]=r[e],c[e]=r[e]);await this.db.insert(a).values(s).onConflictDoUpdate({target:[a.entityId,a.locale],set:c}),this.logger?.info({entity:this.entity.name,entityId:t,locale:n},`Translation saved`)}async deleteTranslation(r,i){await j(this.entity,this.contextResolver,`update`),this.logger?.info({entity:this.entity.name,entityId:r,locale:i},`Deleting translation`);let a=`${this.entity.name}_translations`,o=e.get(a);if(!o)throw Error(`Translation table ${a} not found in schema registry`);i?(await this.db.delete(o).where(t(n(o.entityId,r),n(o.locale,i))),this.logger?.info({entity:this.entity.name,entityId:r,locale:i},`Translation deleted`)):(await this.db.delete(o).where(n(o.entityId,r)),this.logger?.info({entity:this.entity.name,entityId:r},`All translations deleted`))}async saveBlockTranslations(r,i,a){await j(this.entity,this.contextResolver,`update`),this.logger?.info({entity:this.entity.name,entityId:r,locale:i},`Saving block translations`);let s=w(this.ctx);if(s.length===0)return;let c=e.get(`${this.entity.name}_layout_translations`);if(!c)return;let l=e.get(`${this.entity.name}_layout`);if(l){for(let{name:e,config:u}of s){let s=a[e];if(!Array.isArray(s)||u.type!==`blocks`)continue;let d=u.blocks;if(!d)continue;let f=await this.db.select({id:l.id,blockType:l.blockType}).from(l).where(t(n(l.entityId,r),n(l.fieldName,e),o(l.locale))).orderBy(l.sortOrder);for(let e=0;e<s.length;e++){let t=s[e],n=t._block;if(!n)continue;let r=f[e];if(!r||r.blockType!==n)continue;let a=d.find(e=>e.slug===n);if(!a)continue;let o={};for(let[e,n]of Object.entries(a.fields))n.translatable&&t[e]!==void 0&&(o[e]=t[e]);Object.keys(o).length!==0&&await this.db.insert(c).values({layoutId:r.id,locale:i,fields:o}).onConflictDoUpdate({target:[c.layoutId,c.locale],set:{fields:o}})}}this.logger?.info({entity:this.entity.name,entityId:r,locale:i},`Block translations saved`)}}async saveLocalizedBlocks(e,t,n){await j(this.entity,this.contextResolver,`update`),this.logger?.info({entity:this.entity.name,entityId:e,locale:t},`Saving localized blocks`),await this.saveBlocks(e,n,{locale:t})}async saveBlocks(r,i,a){let s=w(this.ctx);if(s.length===0)return;let c=e.get(`${this.entity.name}_layout`);if(c)for(let{name:e,config:l}of s){let s=i[e];if(!Array.isArray(s))continue;let u=`localized`in l&&l.localized===!0,d=u?a?.locale??null:null,f=[n(c.entityId,r),n(c.fieldName,e)];d?f.push(n(c.locale,d)):u||f.push(o(c.locale)),await this.db.delete(c).where(t(...f));for(let t=0;t<s.length;t++){let n=s[t],i=n._block;if(!i)continue;let{_block:a,_id:o,...l}=n;await this.db.insert(c).values({entityId:r,fieldName:e,blockType:i,sortOrder:t,data:l,locale:d})}}}async syncRefs(r,i,o){if(!e.has(`entity_refs`))return;let s=C(this.ctx);if(o===`update`){let e=Object.keys(i).filter(e=>{let t=s[e];return t&&(t.type===`media`||t.type===`reference`||t.type===`blocks`)});e.length>0&&await this.db.delete(S).where(t(n(S.sourceEntity,this.entity.name),n(S.sourceId,r),a(S.sourceField,e)))}let c=x(s,i);c.length>0&&await this.db.insert(S).values(c.map(e=>({sourceEntity:this.entity.name,sourceId:r,sourceField:e.sourceField,targetEntity:e.targetEntity,targetId:e.targetId}))).onConflictDoNothing()}invalidateCountCache(){this.countCache?.invalidate(this.entity.name)}};export{L as AdminClient};
1
+ import{schemaRegistry as e}from"@murumets-ee/db";import{and as t,eq as n,getTableColumns as r,gt as i,inArray as a,isNull as o,lt as s,or as c,sql as l}from"drizzle-orm";import{index as u,pgTable as d,unique as f,uuid as p,varchar as m}from"drizzle-orm/pg-core";import{z as h}from"zod";function g(e,a){let o=r(e),l=o[a.field];if(!l)return null;let u=a.direction===`desc`?s:i,d=u(l,a.value);if(!a.id)return d;let f=o.id;if(!f)return d;let p=u(f,a.id);return c(d,t(n(l,a.value),p))??d}function _(e,t,n){if(!t)return null;let r={},i=n?.select||Object.keys(e.allFields);for(let a of i){let i=e.allFields[a];if(!n?.includeInternal){let e=a.startsWith(`_`),t=i?.internal===!0;if(e||t)continue}i&&i.type!==`blocks`&&(r[a]=t[a])}return r}function v(e,t,n){return t.map(t=>_(e,t,n))}var y=class extends Error{entityName;entityId;usages;constructor(e,t,n){let r=n.length;super(`Cannot delete ${e} '${t}': referenced by ${r} other entit${r===1?`y`:`ies`}`),this.name=`ReferencedEntityError`,this.entityName=e,this.entityId=t,this.usages=n}};const b=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function x(e,t){let n=[],r=new Set;function i(e,t,i){if(!b.test(i))return;let a=`${e}|${t}|${i}`;r.has(a)||(r.add(a),n.push({sourceField:e,targetEntity:t,targetId:i}))}for(let[n,r]of Object.entries(e)){let e=t[n];if(e!=null)switch(r.type){case`media`:typeof e==`string`&&i(n,`media`,e);break;case`reference`:{let t=r;if(t.cardinality===`many`&&Array.isArray(e))for(let r of e)typeof r==`string`&&i(n,t.entity,r);else typeof e==`string`&&i(n,t.entity,e);break}case`blocks`:{let t=r;if(!Array.isArray(e))break;for(let r of e){let e=r,a=e._block;if(!a)continue;let o=t.blocks.find(e=>e.slug===a);if(o)for(let[t,r]of Object.entries(o.fields)){let a=e[t];if(a!=null&&(r.type===`media`&&typeof a==`string`&&i(n,`media`,a),r.type===`reference`)){let e=r;if(e.cardinality===`many`&&Array.isArray(a))for(let t of a)typeof t==`string`&&i(n,e.entity,t);else typeof a==`string`&&i(n,e.entity,a)}}}break}}}return n}const S=d(`entity_refs`,{sourceEntity:m(`source_entity`,{length:100}).notNull(),sourceId:p(`source_id`).notNull(),sourceField:m(`source_field`,{length:100}).notNull(),targetEntity:m(`target_entity`,{length:100}).notNull(),targetId:p(`target_id`).notNull()},e=>[f(`uq_entity_refs`).on(e.sourceEntity,e.sourceId,e.sourceField,e.targetEntity,e.targetId),u(`idx_entity_refs_target`).on(e.targetEntity,e.targetId),u(`idx_entity_refs_source`).on(e.sourceEntity,e.sourceId)]);function C(e){return e.entity.allFields}function w(e){return Object.entries(C(e)).filter(([e,t])=>t.type===`blocks`).map(([e,t])=>({name:e,config:t}))}async function T(r,i,o){if(!i.length)return i;let s=`${r.entity.name}_translations`,c=e.get(s);if(!c)return i;let l=i.map(e=>e.id),u=await r.db.select().from(c).where(t(a(c.entityId,l),n(c.locale,o))),d=Object.entries(C(r)).filter(([e,t])=>t.translatable).map(([e])=>e),f=new Map;for(let e of u){let t={};for(let n of d){let r=e[n];r!=null&&(t[n]=r)}f.set(e.entityId,t)}return i.map(e=>{let t=f.get(e.id);return t?{...e,...t}:e})}async function E(r,i,s,l){let u=w(r);if(u.length===0||i.length===0)return new Map;let d=e.get(`${r.entity.name}_layout`);if(!d)return new Map;let f=u.filter(({config:e})=>!(`localized`in e&&e.localized)),p=u.filter(({config:e})=>`localized`in e&&e.localized),m=new Map;if(f.length>0){let c=await r.db.select().from(d).where(t(a(d.entityId,i),o(d.locale))).orderBy(d.sortOrder),u;if(s&&c.length>0){let i=e.get(`${r.entity.name}_layout_translations`);if(i){let e=c.map(e=>e.id),o=await r.db.select().from(i).where(t(a(i.layoutId,e),n(i.locale,s)));u=new Map;for(let e of o)u.set(e.layoutId,e.fields??{})}}let p;if(l?.strictTranslations){p=new Map;for(let{config:e}of f)if(e.type===`blocks`)for(let t of e.blocks)p.set(t.slug,t.fields)}for(let e of c){let t=e.entityId,n=e.fieldName,r=m.get(t);r||(r={},m.set(t,r)),r[n]||(r[n]=[]);let i=e.data??{},a=u?.get(e.id),o={_block:e.blockType,_id:e.id,...i,...a??{}};if(s&&p){let t=e.blockType,n=p.get(t);if(n)for(let[e,t]of Object.entries(n))t.translatable&&!a?.[e]&&(o[e]=``)}r[n].push(o)}}if(p.length>0){let e=!s||s===l?.defaultLocale,u;u=s?e?c(n(d.locale,s),o(d.locale))??n(d.locale,s):n(d.locale,s):o(d.locale);let f=await r.db.select().from(d).where(t(a(d.entityId,i),u)).orderBy(d.sortOrder),p=new Map;for(let e of f){let t=`${e.entityId}::${e.fieldName}`,n=p.get(t);n||(n={localeRows:[],nullRows:[]},p.set(t,n)),e.locale?n.localeRows.push(e):n.nullRows.push(e)}for(let[,{localeRows:e,nullRows:t}]of p){let n=e.length>0?e:t;for(let e of n){let t=e.entityId,n=e.fieldName,r=m.get(t);r||(r={},m.set(t,r)),r[n]||(r[n]=[]);let i=e.data??{};r[n].push({_block:e.blockType,_id:e.id,...i})}}}return m}function D(e,t,n){let r=w(e);if(r.length!==0)for(let e of t){let t=e.id,i=n.get(t)??{};for(let{name:t}of r)e[t]=i[t]??[]}}function O(e,t,n,r){let i=n?`${n}:${e}`:e;return r&&(i=`${i}@${r}`),t?`${i}:${String(t)}`:i}var k=class extends Error{constructor(e){super(e),this.name=`ForbiddenError`}};async function A(e){if(!e)throw new k(`No context resolver configured on AdminClient/QueryClient. Use createAdminClient() from @murumets-ee/core/clients, or pass a contextResolver in config.`);let t=await e();if(!t)throw new k(`Context resolver returned no context. Ensure auth is configured in your request handler, or use runAsCli() for CLI scripts.`);return t}async function j(e,t,n){let r=await A(t),i=r.user.groups[0];if(!i)throw new k(`User '${r.user.id}' has no role assigned.`);if(!r.checker(i,e.name,n))throw new k(`Forbidden: role '${i}' cannot ${n} '${e.name}'`)}function M(e,t){return n(e.table._scopeId,t)}async function N(e,t,n,r){let i=await A(t),a=i.user.groups[0];if(!a)throw new k(`User '${i.user.id}' has no role assigned.`);if(!i.checker(a,e.name,n))throw new k(`Forbidden: role '${a}' cannot ${n} '${e.name}'`);let o;if(e.scope&&e.scope!==`global`&&(o=i.scope?.id,!o&&r?.strictScope))throw new k(`Entity '${e.name}' requires scope '${e.scope}' but no scope is set in context.`);let s={user:{id:i.user.id,...i.user.name!==void 0&&{name:i.user.name},...i.user.email!==void 0&&{email:i.user.email}},...r?.enqueueOnCommit!==void 0&&{enqueueOnCommit:r.enqueueOnCommit}};return{security:i,scopeId:o,behaviorCtx:s}}function P(e){let t;switch(e.type){case`id`:t=h.string().uuid();break;case`text`:{let n=h.string();e.maxLength&&(n=n.max(e.maxLength)),e.minLength&&(n=n.min(e.minLength)),e.pattern&&(n=n.regex(e.pattern)),t=n;break}case`number`:{let n=h.number();e.integer&&(n=n.int()),e.min!==void 0&&(n=n.min(e.min)),e.max!==void 0&&(n=n.max(e.max)),t=n;break}case`boolean`:t=h.boolean();break;case`date`:t=h.date().or(h.string().datetime());break;case`select`:t=h.enum(e.options);break;case`reference`:t=e.cardinality===`many`?h.array(h.string().uuid()):h.string().uuid();break;case`media`:t=h.string().uuid();break;case`richtext`:t=h.union([h.string(),h.array(h.record(h.unknown()))]);break;case`slug`:t=h.string().regex(/^[a-z0-9-]+$/);break;case`json`:t=h.union([h.record(h.unknown()),h.array(h.unknown()),h.string(),h.number(),h.boolean()]);break;case`blocks`:t=h.array(h.object({_block:h.string()}).passthrough());break;default:t=h.unknown()}return e.required||(t=t.nullable().optional()),e.default!==void 0&&(t=t.default(e.default)),t}function F(e){return e===`id`||e===`createdAt`||e===`createdBy`||e===`updatedAt`||e===`updatedBy`||e===`_version`}function I(e){return e===`id`||e===`createdAt`||e===`updatedAt`||e===`createdBy`||e===`_version`}function L(e,t={}){let n={};for(let[r,i]of Object.entries(e.allFields))I(r)||i.internal&&!t.includeInternal||(n[r]=P(i));return h.object(n)}function R(e,t={}){let n={};for(let[r,i]of Object.entries(e.allFields))F(r)||i.internal&&!t.includeInternal||(n[r]=P(i).optional());return h.object(n)}var z=class r{entity;db;logger;createSchema;updateSchema;updateInternalSchema;internalFieldNames;table;countCache;contextResolver;entityResolver;enqueueOnCommit;enqueueOnCommitFactory;get ctx(){return this.ctxFor(this.db)}ctxFor(e){return{entity:this.entity,db:e,table:this.table,resolveContext:this.contextResolver}}buildAuthOptions(e){return this.enqueueOnCommitFactory?{enqueueOnCommit:this.enqueueOnCommitFactory(e)}:this.enqueueOnCommit?{enqueueOnCommit:this.enqueueOnCommit}:{}}rebindEnqueueOnCommit(e,t){let n=this.buildAuthOptions(t);return n.enqueueOnCommit?{...e,enqueueOnCommit:n.enqueueOnCommit}:e}constructor(t){if(typeof window<`u`)throw Error(`AdminClient cannot be used in browser code. Use QueryClient for frontend data access.`);this.entity=t.entity,this.db=t.db,this.logger=t.logger,this.countCache=t.countCache,this.contextResolver=t.contextResolver,this.entityResolver=t.entityResolver,this.enqueueOnCommit=t.enqueueOnCommit,this.enqueueOnCommitFactory=t.enqueueOnCommitFactory,this.createSchema=L(t.entity),this.updateSchema=R(t.entity),this.updateInternalSchema=R(t.entity,{includeInternal:!0}),this.internalFieldNames=new Set(Object.entries(t.entity.allFields).filter(([,e])=>e.internal).map(([e])=>e));let n=e.get(t.entity.name);if(!n)throw Error(`Schema for entity '${t.entity.name}' not found in registry. Ensure schemas are generated and registered before creating AdminClient.`);this.table=n}stripCallerInternals(e){if(this.internalFieldNames.size===0)return e;let t={};for(let[n,r]of Object.entries(e))this.internalFieldNames.has(n)||(t[n]=r);return t}pickInternalFields(e){if(this.internalFieldNames.size===0)return{};let t={};for(let n of this.internalFieldNames)e[n]!==void 0&&(t[n]=e[n]);return t}async create(e,t){this.logger?.info({entity:this.entity.name},`Creating entity`);let n=t?.tx??this.db,{scopeId:r,behaviorCtx:i}=await N(this.entity,this.contextResolver,`create`,{strictScope:!0,...this.buildAuthOptions(t?.tx)}),a=this.stripCallerInternals(e);for(let e of this.entity.behaviors??[])if(e.hooks?.beforeCreate){let t=await e.hooks.beforeCreate(a,i);t!==void 0&&(a=t)}let o={};for(let e of[`createdAt`,`updatedAt`,`createdBy`,`updatedBy`])a[e]!==void 0&&(o[e]=a[e]);let s=this.pickInternalFields(a);a={...this.createSchema.parse(a),...o,...s},r&&(a._scopeId=r);let c=this.prepareDataForInsert(a),[l]=await n.insert(this.table).values(c).returning();if(!l)throw Error(`Insert into "${this.entity.name}" returned no row`);await this.saveBlocks(n,l.id,a),await this.syncRefs(n,l.id,a,`create`);for(let e of this.entity.behaviors??[])e.hooks?.afterCreate&&await e.hooks.afterCreate(l,i);this.invalidateCountCache(t?.tx!==void 0);let u=this.ctxFor(n),d=_(this.entity,l);if(d&&w(u).length>0){let e=await E(u,[d.id],void 0,{strictTranslations:!0});D(u,[d],e)}return d}async findById(e,r){this.logger?.info({entity:this.entity.name,id:e},`Finding entity by ID`);let{scopeId:i}=await N(this.entity,this.contextResolver,`view`),a=[n(this.table.id,e)];i&&a.push(M(this.ctx,i));let[o]=await this.db.select().from(this.table).where(t(...a));if(!o)return null;let s=r?.includeInternal?{includeInternal:!0}:void 0,c=_(this.entity,o,s);if(!c)return null;if(w(this.ctx).length>0){let e=await E(this.ctx,[c.id],r?.locale,{defaultLocale:r?.defaultLocale,strictTranslations:!0});D(this.ctx,[c],e)}if(r?.locale){let[e]=await T(this.ctx,[c],r.locale);return e}return c}async findMany(e){this.logger?.info({entity:this.entity.name,options:e},`Finding entities`);let{scopeId:n}=await N(this.entity,this.contextResolver,`view`),r=this.db.select().from(this.table).$dynamic(),i=[];if(n&&i.push(M(this.ctx,n)),e?.where&&i.push(e.where),e?.cursor){let t=C(this.ctx);if(!Object.hasOwn(t,e.cursor.field)&&e.cursor.field!==`id`)throw Error(`Invalid cursor field: '${e.cursor.field}' is not a field on '${this.entity.name}'`);let n=g(this.table,e.cursor);n&&i.push(n)}if(i.length>0&&(r=r.where(t(...i))),e?.limit&&(r=r.limit(e.limit)),e?.offset&&!e?.cursor&&(r=r.offset(e.offset)),e?.orderBy){let t=Array.isArray(e.orderBy)?e.orderBy:[e.orderBy];r=r.orderBy(...t)}let a=await r,o=e?.includeInternal?{includeInternal:!0}:void 0,s=v(this.entity,a,o).filter(e=>e!==null);if(w(this.ctx).length>0&&s.length>0){let t=s.map(e=>e.id),n=await E(this.ctx,t,e?.locale,{defaultLocale:e?.defaultLocale,strictTranslations:!0});D(this.ctx,s,n)}return e?.locale?await T(this.ctx,s,e.locale):s}async count(e){this.logger?.info({entity:this.entity.name,options:e},`Counting entities`);let{scopeId:n}=await N(this.entity,this.contextResolver,`view`),r=O(this.entity.name,e?.where,void 0,n),i=async()=>{let r=this.db.select({count:l`count(*)`}).from(this.table).$dynamic(),i=[];n&&i.push(M(this.ctx,n)),e?.where&&i.push(e.where),i.length>0&&(r=r.where(t(...i)));let[a]=await r;if(!a)throw Error(`count query returned no row for ${this.entity.name}`);return Number(a.count)};return this.countCache?this.countCache.getOrCompute(r,i):i()}async update(e,t,n){return this.updateImpl(e,t,n,{allowInternal:!1})}async updateInternal(e,t,n){return this.updateImpl(e,t,n,{allowInternal:!0})}async updateImpl(e,r,i,a){this.logger?.info({entity:this.entity.name,id:e,internal:a.allowInternal||void 0},`Updating entity`);let o=i?.tx??this.db,{scopeId:s,behaviorCtx:c}=await N(this.entity,this.contextResolver,`update`,{strictScope:!0,...this.buildAuthOptions(i?.tx)}),l=a.allowInternal?r:this.stripCallerInternals(r),u=await this.findByIdInternal(o,e,s),d=async()=>u,f={...c,loadCurrent:d,viaInternal:a.allowInternal};for(let t of this.entity.behaviors??[])if(t.hooks?.beforeUpdate){let n=await t.hooks.beforeUpdate(e,l,f);n!==void 0&&(l=n)}let p={};for(let e of[`updatedAt`,`updatedBy`])l[e]!==void 0&&(p[e]=l[e]);let m=a.allowInternal?this.updateInternalSchema:this.updateSchema,h=a.allowInternal?{}:this.pickInternalFields(l);l={...m.parse(l),...p,...h};let g=this.prepareDataForUpdate(l),v=n(this.table.id,e),y=s?t(v,M(this.ctx,s))??v:v,b;if(Object.keys(g).length>0){let[t]=await o.update(this.table).set(g).where(y).returning();if(!t)throw Error(`Update of "${this.entity.name}" id=${e} returned no row`);b=t}else{let[t]=await o.select().from(this.table).where(y);if(!t)throw Error(`"${this.entity.name}" row not found for id=${e}`);b=t}await this.saveBlocks(o,e,l,i),await this.syncRefs(o,e,l,`update`);for(let e of this.entity.behaviors??[])e.hooks?.afterUpdate&&await e.hooks.afterUpdate(b,f);let x=this.ctxFor(o),S=a.allowInternal?{includeInternal:!0}:void 0,C=_(this.entity,b,S);if(C&&w(x).length>0){let t=await E(x,[e],void 0,{strictTranslations:!0});D(x,[C],t)}return C}async findByIdInternal(e,r,i){let a=this.ctxFor(e),o=[n(this.table.id,r)];i&&o.push(M(a,i));let[s]=await e.select().from(this.table).where(t(...o));if(!s)return null;let c=_(this.entity,s);if(!c)return null;if(w(a).length>0){let e=await E(a,[c.id],void 0,{strictTranslations:!0});D(a,[c],e)}return c}async delete(e,r){this.logger?.info({entity:this.entity.name,id:e},`Deleting entity`);let{scopeId:i,behaviorCtx:a}=await N(this.entity,this.contextResolver,`delete`,{strictScope:!0,...this.buildAuthOptions(r?.tx)}),o=r?.tx??this.db;if(i){let[r]=await o.select({id:this.table.id}).from(this.table).where(t(n(this.table.id,e),M(this.ctx,i)));if(!r)return}let s=async r=>{let i=this.rebindEnqueueOnCommit(a,r);await this.handleIncomingRefsForDelete(r,[e]);for(let t of this.entity.behaviors??[])t.hooks?.beforeDelete&&await t.hooks.beforeDelete(e,i);await r.delete(this.table).where(n(this.table.id,e)),await r.delete(S).where(t(n(S.sourceEntity,this.entity.name),n(S.sourceId,e)))};r?.tx?await s(r.tx):await this.db.transaction(s);for(let t of this.entity.behaviors??[])t.hooks?.afterDelete&&await t.hooks.afterDelete(e,a);this.invalidateCountCache(r?.tx!==void 0)}async deleteMany(e,r){this.logger?.info({entity:this.entity.name},`Bulk deleting entities`);let{scopeId:i,behaviorCtx:o}=await N(this.entity,this.contextResolver,`delete`,{strictScope:!0,...this.buildAuthOptions(r?.tx)}),s=r?.tx??this.db,c=[e];i&&c.push(M(this.ctx,i));let l=(await s.select({id:this.table.id}).from(this.table).where(t(...c))).map(e=>e.id);if(l.length===0)return 0;let u=async e=>{let r=this.rebindEnqueueOnCommit(o,e);await this.handleIncomingRefsForDelete(e,l);for(let e of l)for(let t of this.entity.behaviors??[])t.hooks?.beforeDelete&&await t.hooks.beforeDelete(e,r);await e.delete(this.table).where(a(this.table.id,l)),await e.delete(S).where(t(n(S.sourceEntity,this.entity.name),a(S.sourceId,l)))};r?.tx?await u(r.tx):await this.db.transaction(u);for(let e of l)for(let t of this.entity.behaviors??[])t.hooks?.afterDelete&&await t.hooks.afterDelete(e,o);return this.invalidateCountCache(r?.tx!==void 0),l.length}static MAX_CASCADE_DEPTH=10;async handleIncomingRefsForDelete(i,o,s=0){if(s>=r.MAX_CASCADE_DEPTH)throw Error(`Cascade delete exceeded maximum depth of ${r.MAX_CASCADE_DEPTH} while deleting '${this.entity.name}'. This likely indicates a circular reference chain.`);let c=await i.select({sourceEntity:S.sourceEntity,sourceId:S.sourceId,sourceField:S.sourceField}).from(S).where(t(n(S.targetEntity,this.entity.name),a(S.targetId,o)));if(c.length===0)return;let l=new Map;for(let e of c){let t=`${e.sourceEntity}:${e.sourceField}`,n=l.get(t);n||(n={sourceEntity:e.sourceEntity,sourceField:e.sourceField,sourceIds:[]},l.set(t,n)),n.sourceIds.push(e.sourceId)}let u=this.entityResolver?.();for(let[,c]of l){let l=u?.get(c.sourceEntity),d=l?.fields[c.sourceField]?.onDelete??`restrict`;if(d===`restrict`){let e=o[0];throw e?new y(this.entity.name,e,c.sourceIds.map(e=>({sourceEntity:c.sourceEntity,sourceId:e,sourceField:c.sourceField}))):Error(`expected at least one id`)}if(d===`cascade`){let n=e.get(c.sourceEntity);if(n&&l){let e=new r({entity:l,db:i,logger:this.logger,contextResolver:this.contextResolver,...this.enqueueOnCommit!==void 0&&{enqueueOnCommit:this.enqueueOnCommit},...this.enqueueOnCommitFactory!==void 0&&{enqueueOnCommitFactory:this.enqueueOnCommitFactory}}),o=await N(l,this.contextResolver,`delete`,this.buildAuthOptions(i)),u=a(n.id,c.sourceIds);if(o.scopeId){let e={entity:l,db:i,table:n,resolveContext:this.contextResolver},r=t(u,M(e,o.scopeId));r&&(u=r)}await e.deleteManyInTx(i,u,s+1,o.behaviorCtx)}}else if(d===`set-null`){let r=e.get(c.sourceEntity);if(r&&l&&r[c.sourceField]){let e=(await N(l,this.contextResolver,`update`,this.buildAuthOptions(i))).scopeId,o=a(r.id,c.sourceIds);if(e){let n={entity:l,db:i,table:r,resolveContext:this.contextResolver},a=t(o,M(n,e));a&&(o=a)}await i.update(r).set({[c.sourceField]:null}).where(o),await i.delete(S).where(t(n(S.sourceEntity,c.sourceEntity),a(S.sourceId,c.sourceIds),n(S.sourceField,c.sourceField)))}}}}async deleteManyInTx(e,r,i,o){let s=(await e.select({id:this.table.id}).from(this.table).where(r)).map(e=>e.id);if(s.length===0)return 0;await this.handleIncomingRefsForDelete(e,s,i);for(let e of s)for(let t of this.entity.behaviors??[])t.hooks?.beforeDelete&&await t.hooks.beforeDelete(e,o);return await e.delete(this.table).where(a(this.table.id,s)),await e.delete(S).where(t(n(S.sourceEntity,this.entity.name),a(S.sourceId,s))),this.invalidateCountCache(!0),s.length}async updateMany(e,n,r){this.logger?.info({entity:this.entity.name},`Bulk updating entities`);let{scopeId:i}=await N(this.entity,this.contextResolver,`update`,{strictScope:!0,...this.buildAuthOptions(r?.tx)}),a=r?.tx??this.db,o=r?.allowInternal?n:this.stripCallerInternals(n),s=(r?.allowInternal?this.updateInternalSchema:this.updateSchema).parse(o),c=this.prepareDataForUpdate(s);if(r?.expressions){let e=C(this.ctx);for(let[t,n]of Object.entries(r.expressions)){if(Object.hasOwn(c,t))throw Error(`updateMany: field '${t}' appears in both \`data\` and \`expressions\`. Choose one — expressions silently overriding validated values is unsafe.`);if(!Object.hasOwn(e,t)&&t!==`_scopeId`)throw Error(`updateMany.expressions: unknown column '${t}' on entity '${this.entity.name}'`);if(!r.allowInternal&&this.internalFieldNames.has(t))throw Error(`updateMany.expressions: '${t}' is internal — pass \`allowInternal: true\` from a trusted server context that has authorized the transition out-of-band.`);c[t]=n}}let l=[e];i&&l.push(M(this.ctx,i));let u=await a.update(this.table).set(c).where(t(...l)).returning({id:this.table.id});return this.invalidateCountCache(r?.tx!==void 0),u.length}async aggregate(e){this.logger?.info({entity:this.entity.name},`Aggregate query`);let{scopeId:n}=await N(this.entity,this.contextResolver,`view`),r=this.db.select(e.select).from(this.table).$dynamic(),i=[];if(n&&i.push(M(this.ctx,n)),e.where&&i.push(e.where),i.length>0&&(r=r.where(t(...i))),e.groupBy&&e.groupBy.length>0&&(r=r.groupBy(...e.groupBy)),e.orderBy){let t=Array.isArray(e.orderBy)?e.orderBy:[e.orderBy];r=r.orderBy(...t)}return e.limit&&(r=r.limit(e.limit)),await r}getTable(){return this.table}getDb(){return this.db}prepareDataForInsert(e){let t={};for(let[n,r]of Object.entries(e)){let e=C(this.ctx)[n];e&&n!==`id`&&e.type!==`blocks`&&(t[n]=r)}return e._scopeId!==void 0&&(t._scopeId=e._scopeId),t}prepareDataForUpdate(e){let t={};for(let[n,r]of Object.entries(e)){let e=C(this.ctx)[n];e&&n!==`id`&&e.type!==`blocks`&&(t[n]=r)}return t}async saveTranslation(t,n,r,i){await j(this.entity,this.contextResolver,`update`),this.logger?.info({entity:this.entity.name,entityId:t,locale:n},`Saving translation`);let a=i?.tx??this.db,o=`${this.entity.name}_translations`,s=e.get(o);if(!s)throw Error(`Translation table ${o} not found in schema registry`);let c=Object.entries(C(this.ctx)).filter(([e,t])=>t.translatable).map(([e])=>e);if(c.length===0)throw Error(`Entity ${this.entity.name} has no translatable fields`);let l={entityId:t,locale:n},u={};for(let e of c)r[e]!==void 0&&(l[e]=r[e],u[e]=r[e]);await a.insert(s).values(l).onConflictDoUpdate({target:[s.entityId,s.locale],set:u}),this.logger?.info({entity:this.entity.name,entityId:t,locale:n},`Translation saved`)}async deleteTranslation(r,i,a){await j(this.entity,this.contextResolver,`update`),this.logger?.info({entity:this.entity.name,entityId:r,locale:i},`Deleting translation`);let o=a?.tx??this.db,s=`${this.entity.name}_translations`,c=e.get(s);if(!c)throw Error(`Translation table ${s} not found in schema registry`);i?(await o.delete(c).where(t(n(c.entityId,r),n(c.locale,i))),this.logger?.info({entity:this.entity.name,entityId:r,locale:i},`Translation deleted`)):(await o.delete(c).where(n(c.entityId,r)),this.logger?.info({entity:this.entity.name,entityId:r},`All translations deleted`))}async saveBlockTranslations(r,i,a,s){await j(this.entity,this.contextResolver,`update`),this.logger?.info({entity:this.entity.name,entityId:r,locale:i},`Saving block translations`);let c=s?.tx??this.db,l=w(this.ctx);if(l.length===0)return;let u=e.get(`${this.entity.name}_layout_translations`);if(!u)return;let d=e.get(`${this.entity.name}_layout`);if(d){for(let{name:e,config:s}of l){let l=a[e];if(!Array.isArray(l)||s.type!==`blocks`)continue;let f=s.blocks;if(!f)continue;let p=await c.select({id:d.id,blockType:d.blockType}).from(d).where(t(n(d.entityId,r),n(d.fieldName,e),o(d.locale))).orderBy(d.sortOrder);for(let e=0;e<l.length;e++){let t=l[e];if(!t)continue;let n=t._block;if(!n)continue;let r=p[e];if(!r||r.blockType!==n)continue;let a=f.find(e=>e.slug===n);if(!a)continue;let o={};for(let[e,n]of Object.entries(a.fields))n.translatable&&t[e]!==void 0&&(o[e]=t[e]);Object.keys(o).length!==0&&await c.insert(u).values({layoutId:r.id,locale:i,fields:o}).onConflictDoUpdate({target:[u.layoutId,u.locale],set:{fields:o}})}}this.logger?.info({entity:this.entity.name,entityId:r,locale:i},`Block translations saved`)}}async saveLocalizedBlocks(e,t,n,r){await j(this.entity,this.contextResolver,`update`),this.logger?.info({entity:this.entity.name,entityId:e,locale:t},`Saving localized blocks`);let i=r?.tx??this.db;await this.saveBlocks(i,e,n,{locale:t})}async saveBlocks(r,i,a,s){let c=w(this.ctx);if(c.length===0)return;let l=e.get(`${this.entity.name}_layout`);if(l)for(let{name:e,config:u}of c){let c=a[e];if(!Array.isArray(c))continue;let d=`localized`in u&&u.localized===!0,f=d?s?.locale??null:null,p=[n(l.entityId,i),n(l.fieldName,e)];f?p.push(n(l.locale,f)):d||p.push(o(l.locale)),await r.delete(l).where(t(...p));for(let t=0;t<c.length;t++){let n=c[t],a=n._block;if(!a)continue;let{_block:o,_id:s,...u}=n;await r.insert(l).values({entityId:i,fieldName:e,blockType:a,sortOrder:t,data:u,locale:f})}}}async syncRefs(r,i,o,s){if(!e.has(`entity_refs`))return;let c=C(this.ctx);if(s===`update`){let e=Object.keys(o).filter(e=>{let t=c[e];return t&&(t.type===`media`||t.type===`reference`||t.type===`blocks`)});e.length>0&&await r.delete(S).where(t(n(S.sourceEntity,this.entity.name),n(S.sourceId,i),a(S.sourceField,e)))}let l=x(c,o);l.length>0&&await r.insert(S).values(l.map(e=>({sourceEntity:this.entity.name,sourceId:i,sourceField:e.sourceField,targetEntity:e.targetEntity,targetId:e.targetId}))).onConflictDoNothing()}invalidateCountCache(e=!1){e||this.countCache?.invalidate(this.entity.name)}};export{z as AdminClient};
2
2
  //# sourceMappingURL=index.mjs.map