@kubun/store-graph 0.8.0 → 0.8.1
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.
- package/lib/api.js +1 -1
- package/lib/migrations.js +1 -1
- package/lib/tables.d.ts +9 -9
- package/package.json +2 -2
package/lib/api.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{DocumentID as e,DocumentModelID as t}from"@kubun/id";import{serializeCursor as n}from"./cursor.js";function l(e,t){if(!(e instanceof Error))return!1;let n=e.message;return n.includes("no such table")&&n.includes(t)||n.includes("does not exist")&&n.includes(t)}import{applyDocumentFilter as a,applyDocumentOrderBy as r,applyPagination as o}from"./query-builder.js";function i(e){let t={version:e.version,name:e.name,behavior:e.behavior,interfaces:e.interfaces,schema:e.schema,fieldsMeta:e.fields_meta};return"unique"===t.behavior&&(t.uniqueFields=e.unique_fields),t}function s(e,t){return{id:t.id,model:t.model,owner:t.owner,data:t.data,createdAt:e.decodeTimestamp(t.created_at),updatedAt:t.updated_at?e.decodeTimestamp(t.updated_at):null}}function u(e,n){let l=t.fromString(n);return l.isLocal?l.toGlobal(t.fromString(e)).toString():n}async function c(e,t,n){let{id:l,graphModelID:a,model:r}=n,o=t.types;for(let n of(await e.schema.createTable(`k_${l}`).ifNotExists().addColumn("id",o.text,e=>e.notNull().primaryKey()).addColumn("owner",o.text,e=>e.notNull()).addColumn("model",o.text,e=>e.notNull()).addColumn("data",o.json).addColumn("field_hlcs",o.json).addColumn("unique",o.binary,e=>e.notNull()).addColumn("created_at",o.timestamp,e=>e.defaultTo(t.functions.now).notNull()).addColumn("updated_at",o.timestamp).execute(),await e.insertInto("kubun_document_models").values({id:l,version:r.version,name:r.name,behavior:r.behavior,unique_fields:"unique"===r.behavior?t.encodeJSON(r.uniqueFields):null,interfaces:t.encodeJSON(r.interfaces),schema:t.encodeJSON(r.schema),fields_meta:t.encodeJSON(r.fieldsMeta)}).onConflict(e=>e.doNothing()).execute(),r.interfaces))await e.insertInto("kubun_document_model_interfaces").values({interface_id:u(l,n),implementation_id:l}).onConflict(e=>e.doNothing()).execute();await e.insertInto("kubun_graph_document_models").values({graph_model_id:a,document_model_id:l}).onConflict(e=>e.doNothing()).execute()}export function createGraphStore(t,d){let m=d.coerceFilterValue.bind(d);async function _(e,t){if(null==t)return{effectiveModelIDs:e,effectiveOwners:void 0};let{models:n,owners:l}=await w.resolveCatalogScope(t),a=e;if(null!=n){let e=new Set(n);a=a.filter(t=>e.has(t))}return{effectiveModelIDs:a,effectiveOwners:l}}let w={async getDocument(e){let n=await t.selectFrom(`k_${e.model.toString()}`).selectAll().where("id","=",e.toString()).executeTakeFirst();return n?s(d,n):null},getDocumentModel:async e=>i(await t.selectFrom("kubun_document_models").selectAll().where("id","=",e.toString()).executeTakeFirstOrThrow()),async createDocument(e){let n=e.id.toString(),l=e.id.model.toString(),a=await t.insertInto(`k_${l}`).values({id:n,owner:e.owner,model:l,data:d.encodeJSON(e.data),unique:d.encodeBinary(e.unique)}).returningAll().executeTakeFirstOrThrow(()=>Error(`createDocument failed to return row for ${n}`));return s(d,a)},async saveDocument(e){let n=e.id.toString(),l=await t.updateTable(`k_${e.id.model.toString()}`).set({data:e.data?d.encodeJSON(e.data):null,updated_at:d.encodeTimestamp(new Date)}).where("id","=",n).returningAll().executeTakeFirstOrThrow(()=>Error(`saveDocument: document not found for id=${n}`));return s(d,l)},async queryDocuments(e){let{catalogID:l,filter:i,modelIDs:u,orderBy:c,owner:w,...h}=e,f=null!=e.last,{effectiveModelIDs:g,effectiveOwners:p}=await _(u,l);if(0===g.length)return{entries:[],hasMore:!1};let[y,...k]=g,x=t.selectFrom(`k_${y}`).selectAll();for(let e of(null!=w&&(x=x.where("owner","=",w)),null!=p&&(x=x.where("owner","in",p)),null!=i&&(x=x.where(e=>a(e,i,[],m))),k))x=x.unionAll(t=>{let n=t.selectFrom(`k_${e}`).selectAll();return null!=w&&(n=n.where("owner","=",w)),null!=p&&(n=n.where("owner","in",p)),null!=i&&(n=n.where(e=>a(e,i,[],m))),n});let[b,S]=r(x,c,f),[F,D]=o(b,h,c),v=await F.execute(),C=f?v.slice(0,D).reverse():v.slice(0,D);return{entries:S?C.map(e=>{let t={};for(let n of S){let l=e.data;for(let e of n)null!=l&&(l=l[e]);null!=l&&(t[n.join(".")]=l)}return{cursor:n({id:e.id,values:t}),document:s(d,e)}}):C.map(e=>({cursor:n({id:e.id,ts:+e.created_at}),document:s(d,e)})),hasMore:v.length>D}},async countDocuments(e){let{catalogID:n,filter:l,modelIDs:r,owner:o}=e,{effectiveModelIDs:i,effectiveOwners:s}=await _(r,n);return 0===i.length?0:(await Promise.all(i.map(async e=>{let n=t.selectFrom(`k_${e}`).select(e=>e.fn.countAll().as("count"));return null!=o&&(n=n.where("owner","=",o)),null!=s&&(n=n.where("owner","in",s)),null!=l&&(n=n.where(e=>a(e,l,[],m))),Number((await n.executeTakeFirstOrThrow()).count)}))).reduce((e,t)=>e+t,0)},async listDocuments(e){let[n,...l]=e.modelIDs,a=t.selectFrom(`k_${n}`).selectAll().where("id","in",e.docIDs);for(let t of l)a=a.unionAll(n=>n.selectFrom(`k_${t}`).selectAll().where("id","in",e.docIDs));return(await a.execute()).map(e=>s(d,e))},listDocumentModelIDs:async()=>(await t.selectFrom("kubun_document_models").select("id").execute()).map(e=>e.id),async getDistinctOwnersForModel(e){try{return(await t.selectFrom(`k_${e}`).select("owner").distinct().execute()).map(e=>e.owner)}catch(t){if(l(t,`k_${e}`))return[];throw t}},queryDocumentsByOwner:async(e,n)=>(await t.selectFrom(`k_${e}`).selectAll().where("owner","=",n).execute()).map(e=>s(d,e)),async insertMutationLogEntry(e){await t.insertInto("kubun_mutation_log").values(e).onConflict(e=>e.doNothing()).execute()},hasMutationHash:async e=>null!=await t.selectFrom("kubun_mutation_log").select("mutation_hash").where("mutation_hash","=",e).executeTakeFirst(),async updateMutationStatus(e,n){await t.updateTable("kubun_mutation_log").set({status:n}).where("mutation_hash","=",e).execute()},getMutationLogForDocuments:async e=>0===e.length?[]:await t.selectFrom("kubun_mutation_log").selectAll().where("document_id","in",e).orderBy("hlc","asc").execute(),getPendingMutations:async e=>await t.selectFrom("kubun_mutation_log").selectAll().where("document_id","=",e).where("status","=","pending").orderBy("hlc","asc").execute(),async getFieldHLCs(n){let l=e.fromString(n).model.toString(),a=await t.selectFrom(`k_${l}`).select("field_hlcs").where("id","=",n).executeTakeFirst();if(a?.field_hlcs==null)return null;let r=a.field_hlcs;return"string"==typeof r?JSON.parse(r):r},async updateFieldHLCs(e,n){let l=e.model.toString();await t.updateTable(`k_${l}`).set({field_hlcs:d.encodeJSON(n)}).where("id","=",e.toString()).execute()},listGraphs:async()=>await t.selectFrom("kubun_graph_models").selectAll().execute(),async createGraph(e){let n=e.id,l=e.name??n;return await t.transaction().setIsolationLevel("read committed").execute(async t=>{await t.insertInto("kubun_graph_models").values({aliases:d.encodeJSON(e.aliases??{}),extension_sdl:e.extensionSDL??null,id:n,name:l,plugin_config:e.pluginConfig?d.encodeJSON(e.pluginConfig):null,search:e.search?d.encodeJSON(e.search):null}).onConflict(e=>e.doNothing()).execute();let a=Object.entries(e.record),r=new Set;for(;r.size<a.length;){let e=a.filter(([e,t])=>!r.has(e)&&t.interfaces.every(t=>r.has(u(e,t))));if(0===e.length)throw Error("Could not create graph: no valid model to add");await Promise.all(e.map(async([e,l])=>{await c(t,d,{id:e,graphModelID:n,model:l}),r.add(e)}))}}),n},async getGraph(e){let n=await t.selectFrom("kubun_graph_models").selectAll().where("id","=",e).executeTakeFirst();if(null==n)return null;let l={};for(let n of(await t.selectFrom("kubun_graph_document_models").innerJoin("kubun_document_models","kubun_graph_document_models.document_model_id","kubun_document_models.id").selectAll("kubun_document_models").where("kubun_graph_document_models.graph_model_id","=",e).execute()))l[n.id]=i(n);return{...n,record:l}},async getClusterForModel(e){let n=await t.selectFrom("kubun_cluster_models").select("cluster_id").where("model_id","=",e).executeTakeFirst();return n?.cluster_id},getClusterModels:async e=>await t.selectFrom("kubun_cluster_models").selectAll().where("cluster_id","=",e).orderBy("cluster_index").execute(),async saveCluster(e,n){await t.insertInto("kubun_clusters").values({id:e,definition:d.encodeJSON(n)}).onConflict(e=>e.column("id").doUpdateSet(e=>({definition:e.ref("excluded.definition")}))).execute()},getCluster:async e=>await t.selectFrom("kubun_clusters").selectAll().where("id","=",e).executeTakeFirst(),async getClusters(e){if(0===e.length)return{};let n=await t.selectFrom("kubun_clusters").selectAll().where("id","in",e).execute(),l={};for(let e of n)l[e.id]=e.definition;return l},async addAttachments(e){await t.insertInto("kubun_document_attachments").values(e).onConflict(e=>e.doNothing()).execute()},async createSearchIndex(e,n){await d.createSearchIndex(t,{modelID:e,fields:n})},async dropSearchIndex(e){await d.dropSearchIndex(t,e)},async updateSearchEntry(e,n,l,a){let r={};for(let e of a){let t=function(e,t){let n=t.split("."),l=e;for(let e of n){if(null==l||"object"!=typeof l)return null;l=l[e]}return l}(l,e);null!=t&&(r[e]=String(t))}await d.updateSearchEntry(t,e,n,r,a)},async removeSearchEntry(e,n){await d.removeSearchEntry(t,e,n)},async searchDocuments(e){let n=[];for(let l of e.modelIDs)for(let a of(await d.searchIndex(t,{query:e.query,modelID:l,limit:e.first??50})))n.push({documentID:a.documentID,modelID:l,rank:a.rank});return(n.sort((e,t)=>Math.abs(t.rank)-Math.abs(e.rank)),e.first)?n.slice(0,e.first):n},async createCatalog(e){await t.insertInto("kubun_catalogs").values({id:e.id,owner_did:e.owner_did,name:e.name,description:e.description,filter_criteria:d.encodeJSON(e.filter_criteria),hlc:e.hlc}).execute()},getCatalog:async e=>await t.selectFrom("kubun_catalogs").selectAll().where("id","=",e).executeTakeFirst(),async updateCatalog(e,n){let l={};null!=n.name&&(l.name=n.name),null!=n.description&&(l.description=n.description),null!=n.filter_criteria&&(l.filter_criteria=d.encodeJSON(n.filter_criteria)),null!=n.hlc&&(l.hlc=n.hlc),l.updated_at=d.encodeTimestamp(new Date),await t.updateTable("kubun_catalogs").set(l).where("id","=",e).execute()},async deleteCatalog(e){await t.deleteFrom("kubun_catalogs").where("id","=",e).execute()},listCatalogs:async e=>await t.selectFrom("kubun_catalogs").selectAll().where("owner_did","=",e).execute(),async resolveCatalogScope(e){let t,n=await w.getCatalog(e);if(null==n)return{models:void 0,owners:void 0};let l=n.filter_criteria,a=null!=l.models&&l.models.length>0?l.models:void 0;return null!=l.owners&&l.owners.length>0&&(t=[...l.owners]),{models:a,owners:t}},async registerClusterModels(e,n){0!==n.length&&await t.insertInto("kubun_cluster_models").values(n).onConflict(e=>e.column("model_id").doUpdateSet(e=>({cluster_id:e.ref("excluded.cluster_id"),cluster_index:e.ref("excluded.cluster_index")}))).execute()},async getUserModelAccessDefault(e,n,l){let a=await t.selectFrom("kubun_user_model_access_defaults").select(["access_level","allowed_dids"]).where("owner_did","=",e).where("model_id","=",n).where("permission_type","=",l).executeTakeFirst();return a?{level:a.access_level,allowedDIDs:a.allowed_dids}:null},async setUserModelAccessDefault(e){await t.insertInto("kubun_user_model_access_defaults").values({owner_did:e.ownerDID,model_id:e.modelID,permission_type:e.permissionType,access_level:e.accessLevel,allowed_dids:e.allowedDIDs?d.encodeJSON(e.allowedDIDs):null}).onConflict(t=>t.columns(["owner_did","model_id","permission_type"]).doUpdateSet({access_level:e.accessLevel,allowed_dids:e.allowedDIDs?d.encodeJSON(e.allowedDIDs):null,updated_at:d.encodeTimestamp(new Date)})).execute()},async removeUserModelAccessDefaults(e,n,l){await t.deleteFrom("kubun_user_model_access_defaults").where("owner_did","=",e).where("model_id","=",n).where("permission_type","in",l).execute()},async getDocumentIDsForScope(e,n=[]){let a=[];for(let n of e)try{let e=await t.selectFrom(`k_${n.modelID}`).select("id").where("owner","=",n.ownerDID).execute();a.push(...e.map(e=>e.id))}catch(e){if(!l(e,`k_${n.modelID}`))throw e}if(n.length>0){let e=new Set(n);return a.filter(t=>!e.has(t))}return a},getDocumentMetadataForSync:async(e,n)=>0===n.length?[]:(await t.selectFrom(`k_${e}`).select(["id","model","owner"]).where("id","in",n).execute()).map(e=>({id:e.id,model:e.model,owner:e.owner}))};return w}
|
|
1
|
+
import{DocumentID as e,DocumentModelID as t}from"@kubun/id";import{serializeCursor as n}from"./cursor.js";function l(e,t){if(!(e instanceof Error))return!1;let n=e.message;return n.includes("no such table")&&n.includes(t)||n.includes("does not exist")&&n.includes(t)}import{applyDocumentFilter as a,applyDocumentOrderBy as r,applyPagination as o}from"./query-builder.js";function i(e){let t={version:e.version,name:e.name,behavior:e.behavior,interfaces:e.interfaces,schema:e.schema,fieldsMeta:e.fields_meta};return"unique"===t.behavior&&(t.uniqueFields=e.unique_fields),t}function s(e,t){return{id:t.id,model:t.model,owner:t.owner,data:t.data,createdAt:e.decodeTimestamp(t.created_at),updatedAt:t.updated_at?e.decodeTimestamp(t.updated_at):null}}function u(e,n){let l=t.fromString(n);return l.isLocal?l.toGlobal(t.fromString(e)).toString():n}async function c(e,t,n){let{id:l,graphModelID:a,model:r}=n,o=t.types;for(let n of(await e.schema.createTable(`k_${l}`).ifNotExists().addColumn("id",o.text,e=>e.notNull().primaryKey()).addColumn("owner",o.text,e=>e.notNull()).addColumn("model",o.text,e=>e.notNull()).addColumn("data",o.json).addColumn("field_hlcs",o.json).addColumn("unique",o.binary,e=>e.notNull()).addColumn("created_at",o.timestamp,e=>e.defaultTo(t.functions.now).notNull()).addColumn("updated_at",o.timestamp).execute(),await e.insertInto("kubun_graph_document_models").values({id:l,version:r.version,name:r.name,behavior:r.behavior,unique_fields:"unique"===r.behavior?t.encodeJSON(r.uniqueFields):null,interfaces:t.encodeJSON(r.interfaces),schema:t.encodeJSON(r.schema),fields_meta:t.encodeJSON(r.fieldsMeta)}).onConflict(e=>e.doNothing()).execute(),r.interfaces))await e.insertInto("kubun_graph_document_model_interfaces").values({interface_id:u(l,n),implementation_id:l}).onConflict(e=>e.doNothing()).execute();await e.insertInto("kubun_graph_document_model_links").values({graph_model_id:a,document_model_id:l}).onConflict(e=>e.doNothing()).execute()}export function createGraphStore(t,d){let m=d.coerceFilterValue.bind(d);async function _(e,t){if(null==t)return{effectiveModelIDs:e,effectiveOwners:void 0};let{models:n,owners:l}=await h.resolveCatalogScope(t),a=e;if(null!=n){let e=new Set(n);a=a.filter(t=>e.has(t))}return{effectiveModelIDs:a,effectiveOwners:l}}let h={async getDocument(e){let n=await t.selectFrom(`k_${e.model.toString()}`).selectAll().where("id","=",e.toString()).executeTakeFirst();return n?s(d,n):null},getDocumentModel:async e=>i(await t.selectFrom("kubun_graph_document_models").selectAll().where("id","=",e.toString()).executeTakeFirstOrThrow()),async createDocument(e){let n=e.id.toString(),l=e.id.model.toString(),a=await t.insertInto(`k_${l}`).values({id:n,owner:e.owner,model:l,data:d.encodeJSON(e.data),unique:d.encodeBinary(e.unique)}).returningAll().executeTakeFirstOrThrow(()=>Error(`createDocument failed to return row for ${n}`));return s(d,a)},async saveDocument(e){let n=e.id.toString(),l=await t.updateTable(`k_${e.id.model.toString()}`).set({data:e.data?d.encodeJSON(e.data):null,updated_at:d.encodeTimestamp(new Date)}).where("id","=",n).returningAll().executeTakeFirstOrThrow(()=>Error(`saveDocument: document not found for id=${n}`));return s(d,l)},async queryDocuments(e){let{catalogID:l,filter:i,modelIDs:u,orderBy:c,owner:h,...w}=e,f=null!=e.last,{effectiveModelIDs:g,effectiveOwners:p}=await _(u,l);if(0===g.length)return{entries:[],hasMore:!1};let[y,...k]=g,x=t.selectFrom(`k_${y}`).selectAll();for(let e of(null!=h&&(x=x.where("owner","=",h)),null!=p&&(x=x.where("owner","in",p)),null!=i&&(x=x.where(e=>a(e,i,[],m))),k))x=x.unionAll(t=>{let n=t.selectFrom(`k_${e}`).selectAll();return null!=h&&(n=n.where("owner","=",h)),null!=p&&(n=n.where("owner","in",p)),null!=i&&(n=n.where(e=>a(e,i,[],m))),n});let[b,S]=r(x,c,f),[F,D]=o(b,w,c),v=await F.execute(),C=f?v.slice(0,D).reverse():v.slice(0,D);return{entries:S?C.map(e=>{let t={};for(let n of S){let l=e.data;for(let e of n)null!=l&&(l=l[e]);null!=l&&(t[n.join(".")]=l)}return{cursor:n({id:e.id,values:t}),document:s(d,e)}}):C.map(e=>({cursor:n({id:e.id,ts:+e.created_at}),document:s(d,e)})),hasMore:v.length>D}},async countDocuments(e){let{catalogID:n,filter:l,modelIDs:r,owner:o}=e,{effectiveModelIDs:i,effectiveOwners:s}=await _(r,n);return 0===i.length?0:(await Promise.all(i.map(async e=>{let n=t.selectFrom(`k_${e}`).select(e=>e.fn.countAll().as("count"));return null!=o&&(n=n.where("owner","=",o)),null!=s&&(n=n.where("owner","in",s)),null!=l&&(n=n.where(e=>a(e,l,[],m))),Number((await n.executeTakeFirstOrThrow()).count)}))).reduce((e,t)=>e+t,0)},async listDocuments(e){let[n,...l]=e.modelIDs,a=t.selectFrom(`k_${n}`).selectAll().where("id","in",e.docIDs);for(let t of l)a=a.unionAll(n=>n.selectFrom(`k_${t}`).selectAll().where("id","in",e.docIDs));return(await a.execute()).map(e=>s(d,e))},listDocumentModelIDs:async()=>(await t.selectFrom("kubun_graph_document_models").select("id").execute()).map(e=>e.id),async getDistinctOwnersForModel(e){try{return(await t.selectFrom(`k_${e}`).select("owner").distinct().execute()).map(e=>e.owner)}catch(t){if(l(t,`k_${e}`))return[];throw t}},queryDocumentsByOwner:async(e,n)=>(await t.selectFrom(`k_${e}`).selectAll().where("owner","=",n).execute()).map(e=>s(d,e)),async insertMutationLogEntry(e){await t.insertInto("kubun_graph_mutation_log").values(e).onConflict(e=>e.doNothing()).execute()},hasMutationHash:async e=>null!=await t.selectFrom("kubun_graph_mutation_log").select("mutation_hash").where("mutation_hash","=",e).executeTakeFirst(),async updateMutationStatus(e,n){await t.updateTable("kubun_graph_mutation_log").set({status:n}).where("mutation_hash","=",e).execute()},getMutationLogForDocuments:async e=>0===e.length?[]:await t.selectFrom("kubun_graph_mutation_log").selectAll().where("document_id","in",e).orderBy("hlc","asc").execute(),getPendingMutations:async e=>await t.selectFrom("kubun_graph_mutation_log").selectAll().where("document_id","=",e).where("status","=","pending").orderBy("hlc","asc").execute(),async getFieldHLCs(n){let l=e.fromString(n).model.toString(),a=await t.selectFrom(`k_${l}`).select("field_hlcs").where("id","=",n).executeTakeFirst();if(a?.field_hlcs==null)return null;let r=a.field_hlcs;return"string"==typeof r?JSON.parse(r):r},async updateFieldHLCs(e,n){let l=e.model.toString();await t.updateTable(`k_${l}`).set({field_hlcs:d.encodeJSON(n)}).where("id","=",e.toString()).execute()},listGraphs:async()=>await t.selectFrom("kubun_graph_models").selectAll().execute(),async createGraph(e){let n=e.id,l=e.name??n;return await t.transaction().setIsolationLevel("read committed").execute(async t=>{await t.insertInto("kubun_graph_models").values({aliases:d.encodeJSON(e.aliases??{}),extension_sdl:e.extensionSDL??null,id:n,name:l,plugin_config:e.pluginConfig?d.encodeJSON(e.pluginConfig):null,search:e.search?d.encodeJSON(e.search):null}).onConflict(e=>e.doNothing()).execute();let a=Object.entries(e.record),r=new Set;for(;r.size<a.length;){let e=a.filter(([e,t])=>!r.has(e)&&t.interfaces.every(t=>r.has(u(e,t))));if(0===e.length)throw Error("Could not create graph: no valid model to add");await Promise.all(e.map(async([e,l])=>{await c(t,d,{id:e,graphModelID:n,model:l}),r.add(e)}))}}),n},async getGraph(e){let n=await t.selectFrom("kubun_graph_models").selectAll().where("id","=",e).executeTakeFirst();if(null==n)return null;let l={};for(let n of(await t.selectFrom("kubun_graph_document_model_links").innerJoin("kubun_graph_document_models","kubun_graph_document_model_links.document_model_id","kubun_graph_document_models.id").selectAll("kubun_graph_document_models").where("kubun_graph_document_model_links.graph_model_id","=",e).execute()))l[n.id]=i(n);return{...n,record:l}},async getClusterForModel(e){let n=await t.selectFrom("kubun_graph_cluster_models").select("cluster_id").where("model_id","=",e).executeTakeFirst();return n?.cluster_id},getClusterModels:async e=>await t.selectFrom("kubun_graph_cluster_models").selectAll().where("cluster_id","=",e).orderBy("cluster_index").execute(),async saveCluster(e,n){await t.insertInto("kubun_graph_clusters").values({id:e,definition:d.encodeJSON(n)}).onConflict(e=>e.column("id").doUpdateSet(e=>({definition:e.ref("excluded.definition")}))).execute()},getCluster:async e=>await t.selectFrom("kubun_graph_clusters").selectAll().where("id","=",e).executeTakeFirst(),async getClusters(e){if(0===e.length)return{};let n=await t.selectFrom("kubun_graph_clusters").selectAll().where("id","in",e).execute(),l={};for(let e of n)l[e.id]=e.definition;return l},async addAttachments(e){await t.insertInto("kubun_graph_document_attachments").values(e).onConflict(e=>e.doNothing()).execute()},async createSearchIndex(e,n){await d.createSearchIndex(t,{modelID:e,fields:n})},async dropSearchIndex(e){await d.dropSearchIndex(t,e)},async updateSearchEntry(e,n,l,a){let r={};for(let e of a){let t=function(e,t){let n=t.split("."),l=e;for(let e of n){if(null==l||"object"!=typeof l)return null;l=l[e]}return l}(l,e);null!=t&&(r[e]=String(t))}await d.updateSearchEntry(t,e,n,r,a)},async removeSearchEntry(e,n){await d.removeSearchEntry(t,e,n)},async searchDocuments(e){let n=[];for(let l of e.modelIDs)for(let a of(await d.searchIndex(t,{query:e.query,modelID:l,limit:e.first??50})))n.push({documentID:a.documentID,modelID:l,rank:a.rank});return(n.sort((e,t)=>Math.abs(t.rank)-Math.abs(e.rank)),e.first)?n.slice(0,e.first):n},async createCatalog(e){await t.insertInto("kubun_graph_catalogs").values({id:e.id,owner_did:e.owner_did,name:e.name,description:e.description,filter_criteria:d.encodeJSON(e.filter_criteria),hlc:e.hlc}).execute()},getCatalog:async e=>await t.selectFrom("kubun_graph_catalogs").selectAll().where("id","=",e).executeTakeFirst(),async updateCatalog(e,n){let l={};null!=n.name&&(l.name=n.name),null!=n.description&&(l.description=n.description),null!=n.filter_criteria&&(l.filter_criteria=d.encodeJSON(n.filter_criteria)),null!=n.hlc&&(l.hlc=n.hlc),l.updated_at=d.encodeTimestamp(new Date),await t.updateTable("kubun_graph_catalogs").set(l).where("id","=",e).execute()},async deleteCatalog(e){await t.deleteFrom("kubun_graph_catalogs").where("id","=",e).execute()},listCatalogs:async e=>await t.selectFrom("kubun_graph_catalogs").selectAll().where("owner_did","=",e).execute(),async resolveCatalogScope(e){let t,n=await h.getCatalog(e);if(null==n)return{models:void 0,owners:void 0};let l=n.filter_criteria,a=null!=l.models&&l.models.length>0?l.models:void 0;return null!=l.owners&&l.owners.length>0&&(t=[...l.owners]),{models:a,owners:t}},async registerClusterModels(e,n){0!==n.length&&await t.insertInto("kubun_graph_cluster_models").values(n).onConflict(e=>e.column("model_id").doUpdateSet(e=>({cluster_id:e.ref("excluded.cluster_id"),cluster_index:e.ref("excluded.cluster_index")}))).execute()},async getUserModelAccessDefault(e,n,l){let a=await t.selectFrom("kubun_graph_user_model_access_defaults").select(["access_level","allowed_dids"]).where("owner_did","=",e).where("model_id","=",n).where("permission_type","=",l).executeTakeFirst();return a?{level:a.access_level,allowedDIDs:a.allowed_dids}:null},async setUserModelAccessDefault(e){await t.insertInto("kubun_graph_user_model_access_defaults").values({owner_did:e.ownerDID,model_id:e.modelID,permission_type:e.permissionType,access_level:e.accessLevel,allowed_dids:e.allowedDIDs?d.encodeJSON(e.allowedDIDs):null}).onConflict(t=>t.columns(["owner_did","model_id","permission_type"]).doUpdateSet({access_level:e.accessLevel,allowed_dids:e.allowedDIDs?d.encodeJSON(e.allowedDIDs):null,updated_at:d.encodeTimestamp(new Date)})).execute()},async removeUserModelAccessDefaults(e,n,l){await t.deleteFrom("kubun_graph_user_model_access_defaults").where("owner_did","=",e).where("model_id","=",n).where("permission_type","in",l).execute()},async getDocumentIDsForScope(e,n=[]){let a=[];for(let n of e)try{let e=await t.selectFrom(`k_${n.modelID}`).select("id").where("owner","=",n.ownerDID).execute();a.push(...e.map(e=>e.id))}catch(e){if(!l(e,`k_${n.modelID}`))throw e}if(n.length>0){let e=new Set(n);return a.filter(t=>!e.has(t))}return a},getDocumentMetadataForSync:async(e,n)=>0===n.length?[]:(await t.selectFrom(`k_${e}`).select(["id","model","owner"]).where("id","in",n).execute()).map(e=>({id:e.id,model:e.model,owner:e.owner}))};return h}
|
package/lib/migrations.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function getGraphMigrations(e){let t=e.types,a=e.functions.now;return{"0-init":{async up(e){await e.schema.createTable("
|
|
1
|
+
export function getGraphMigrations(e){let t=e.types,a=e.functions.now;return{"0-init":{async up(e){await e.schema.createTable("kubun_graph_document_attachments").ifNotExists().addColumn("id",t.text,e=>e.notNull().primaryKey()).addColumn("data",t.binary,e=>e.notNull()).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).execute(),await e.schema.createTable("kubun_graph_document_models").ifNotExists().addColumn("id",t.text,e=>e.notNull().primaryKey()).addColumn("version",t.text,e=>e.notNull()).addColumn("name",t.text,e=>e.notNull()).addColumn("behavior",t.text,e=>e.notNull()).addColumn("unique_fields",t.json).addColumn("interfaces",t.json,e=>e.notNull()).addColumn("schema",t.json,e=>e.notNull()).addColumn("fields_meta",t.json,e=>e.notNull()).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).execute(),await e.schema.createTable("kubun_graph_document_model_interfaces").ifNotExists().addColumn("interface_id",t.text,e=>e.notNull().references("kubun_graph_document_models.id")).addColumn("implementation_id",t.text,e=>e.notNull().references("kubun_graph_document_models.id")).addUniqueConstraint("kubun_graph_document_model_interfaces_pkey",["interface_id","implementation_id"]).execute(),await e.schema.createTable("kubun_graph_models").ifNotExists().addColumn("id",t.text,e=>e.notNull().primaryKey()).addColumn("name",t.text,e=>e.notNull()).addColumn("aliases",t.json,e=>e.defaultTo("{}").notNull()).addColumn("search",t.json).addColumn("extension_sdl",t.text).addColumn("plugin_config",t.json).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).addColumn("updated_at",t.timestamp).execute(),await e.schema.createTable("kubun_graph_document_model_links").ifNotExists().addColumn("graph_model_id",t.text,e=>e.notNull().references("kubun_graph_models.id")).addColumn("document_model_id",t.text,e=>e.notNull().references("kubun_graph_document_models.id")).addUniqueConstraint("kubun_graph_document_model_links_pkey",["graph_model_id","document_model_id"]).execute(),await e.schema.createTable("kubun_graph_user_model_access_defaults").ifNotExists().addColumn("owner_did",t.text,e=>e.notNull()).addColumn("model_id",t.text,e=>e.notNull()).addColumn("permission_type",t.text,e=>e.notNull()).addColumn("access_level",t.text,e=>e.notNull()).addColumn("allowed_dids",t.json).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).addColumn("updated_at",t.timestamp).addPrimaryKeyConstraint("kubun_graph_user_model_access_defaults_pkey",["owner_did","model_id","permission_type"]).execute(),await e.schema.createIndex("idx_graph_user_model_access_owner_model").on("kubun_graph_user_model_access_defaults").columns(["owner_did","model_id"]).execute(),await e.schema.createTable("kubun_graph_mutation_log").ifNotExists().addColumn("mutation_hash",t.text,e=>e.primaryKey()).addColumn("model_id",t.text,e=>e.notNull()).addColumn("document_id",t.text,e=>e.notNull()).addColumn("author_did",t.text,e=>e.notNull()).addColumn("hlc",t.text,e=>e.notNull()).addColumn("mutation_jwt",t.text,e=>e.notNull()).addColumn("status",t.text,e=>e.notNull().defaultTo("applied")).execute(),await e.schema.createIndex("idx_graph_mutation_log_hlc").on("kubun_graph_mutation_log").column("hlc").execute(),await e.schema.createIndex("idx_graph_mutation_log_document").on("kubun_graph_mutation_log").column("document_id").execute(),await e.schema.createIndex("idx_graph_mutation_log_status").on("kubun_graph_mutation_log").column("status").execute(),await e.schema.createTable("kubun_graph_cluster_models").ifNotExists().addColumn("model_id",t.text,e=>e.notNull().primaryKey()).addColumn("cluster_id",t.text,e=>e.notNull()).addColumn("cluster_index","integer",e=>e.notNull()).execute(),await e.schema.createIndex("idx_graph_cluster_models_cluster").on("kubun_graph_cluster_models").column("cluster_id").execute(),await e.schema.createTable("kubun_graph_clusters").ifNotExists().addColumn("id",t.text,e=>e.notNull().primaryKey()).addColumn("definition",t.json,e=>e.notNull()).execute(),await e.schema.createTable("kubun_graph_catalogs").ifNotExists().addColumn("id",t.text,e=>e.notNull().primaryKey()).addColumn("owner_did",t.text,e=>e.notNull()).addColumn("name",t.text,e=>e.notNull()).addColumn("description",t.text,e=>e.notNull().defaultTo("")).addColumn("filter_criteria",t.json,e=>e.notNull()).addColumn("hlc",t.text,e=>e.notNull()).addColumn("created_at",t.timestamp,e=>e.defaultTo(a).notNull()).addColumn("updated_at",t.timestamp).execute(),await e.schema.createIndex("idx_graph_catalogs_owner").ifNotExists().on("kubun_graph_catalogs").column("owner_did").execute()},async down(e){await e.schema.dropTable("kubun_graph_catalogs").ifExists().execute(),await e.schema.dropTable("kubun_graph_clusters").ifExists().execute(),await e.schema.dropTable("kubun_graph_cluster_models").ifExists().execute(),await e.schema.dropTable("kubun_graph_mutation_log").ifExists().execute(),await e.schema.dropTable("kubun_graph_user_model_access_defaults").ifExists().execute(),await e.schema.dropTable("kubun_graph_document_model_links").ifExists().execute(),await e.schema.dropTable("kubun_graph_models").ifExists().execute(),await e.schema.dropTable("kubun_graph_document_model_interfaces").ifExists().execute(),await e.schema.dropTable("kubun_graph_document_models").ifExists().execute(),await e.schema.dropTable("kubun_graph_document_attachments").ifExists().execute()}}}}
|
package/lib/tables.d.ts
CHANGED
|
@@ -116,16 +116,16 @@ export type Catalog = Selectable<CatalogTable>;
|
|
|
116
116
|
export type InsertCatalog = Insertable<CatalogTable>;
|
|
117
117
|
export type UpdateCatalog = Updateable<CatalogTable>;
|
|
118
118
|
export type GraphTables = {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
119
|
+
kubun_graph_catalogs: CatalogTable;
|
|
120
|
+
kubun_graph_cluster_models: ClusterModelTable;
|
|
121
|
+
kubun_graph_clusters: ClusterDefinitionTable;
|
|
122
|
+
kubun_graph_document_attachments: DocumentAttachmentTable;
|
|
123
|
+
kubun_graph_document_models: DocumentModelTable;
|
|
124
|
+
kubun_graph_document_model_interfaces: DocumentModelInterfaceTable;
|
|
125
|
+
kubun_graph_document_model_links: GraphDocumentModelTable;
|
|
126
126
|
kubun_graph_models: GraphModelTable;
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
kubun_graph_mutation_log: MutationLogTable;
|
|
128
|
+
kubun_graph_user_model_access_defaults: UserModelAccessDefaultTable;
|
|
129
129
|
[key: `k_${string}`]: DocumentTable;
|
|
130
130
|
};
|
|
131
131
|
export type DocumentParams = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubun/store-graph",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"license": "see LICENSE.md",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"type": "module",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"kysely": "^0.28.16",
|
|
20
20
|
"@kubun/db": "^0.8.1",
|
|
21
21
|
"@kubun/db-adapter": "^0.8.1",
|
|
22
|
-
"@kubun/protocol": "^0.8.
|
|
22
|
+
"@kubun/protocol": "^0.8.1",
|
|
23
23
|
"@kubun/id": "^0.8.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|