@kubun/store-graph 0.8.1 → 0.9.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.
package/lib/api.d.ts CHANGED
@@ -2,9 +2,18 @@ import type { Adapter } from '@kubun/db-adapter';
2
2
  import { DocumentID, DocumentModelID } from '@kubun/id';
3
3
  import type { DocumentModel, DocumentNode } from '@kubun/protocol';
4
4
  import type { Kysely } from 'kysely';
5
- import type { Catalog, ClusterDefinitionRow, ClusterModel, CountDocumentsParams, CreateDocumentParams, CreateGraphParams, GraphModel, GraphModelWithRecord, GraphTables, InsertCatalog, InsertClusterModel, InsertDocumentAttachment, InsertMutationLogEntry, ListDocumentsParams, MutationLogEntry, QueryDocumentsParams, QueryDocumentsResult, SaveDocumentParams, SearchDocumentResult, SearchDocumentsParams } from './tables.js';
5
+ import type { AccessLevel, Catalog, ClusterDefinitionRow, ClusterModel, CountDocumentsParams, CreateDocumentParams, CreateGraphParams, GraphModel, GraphModelWithRecord, GraphTables, InsertCatalog, InsertClusterModel, InsertDocumentAttachment, InsertMutationLogEntry, ListDocumentsParams, MutationLogEntry, QueryDocumentsParams, QueryDocumentsResult, SaveDocumentParams, SearchDocumentResult, SearchDocumentsParams } from './tables.js';
6
+ /**
7
+ * Persisted access rule shape as stored in `user_model_access_defaults`.
8
+ */
9
+ export type StoredAccessRule = {
10
+ level: AccessLevel;
11
+ allowedDIDs: Array<string> | null;
12
+ allowedCircles: Array<string> | null;
13
+ allowedGroups: Array<string> | null;
14
+ };
6
15
  export type GraphStoreAPI = {
7
- getDocument(id: DocumentID): Promise<DocumentNode | null>;
16
+ getDocument(id: DocumentID | string): Promise<DocumentNode | null>;
8
17
  getDocumentModel(id: DocumentModelID | string): Promise<DocumentModel>;
9
18
  createDocument(params: CreateDocumentParams): Promise<DocumentNode>;
10
19
  saveDocument(params: SaveDocumentParams): Promise<DocumentNode>;
@@ -37,6 +46,14 @@ export type GraphStoreAPI = {
37
46
  searchDocuments(params: SearchDocumentsParams): Promise<Array<SearchDocumentResult>>;
38
47
  createCatalog(catalog: InsertCatalog): Promise<void>;
39
48
  getCatalog(id: string): Promise<Catalog | undefined>;
49
+ /**
50
+ * Batch fetch catalogs by ID. Returns a Map keyed by ID; missing IDs are
51
+ * absent from the map. Single SQL query with `WHERE id IN (...)`. Empty
52
+ * input short-circuits with an empty Map (no SQL).
53
+ *
54
+ * Caller is responsible for deduplicating IDs (e.g. via `Array.from(new Set(...))`).
55
+ */
56
+ getCatalogs(ids: Array<string>): Promise<Map<string, Catalog>>;
40
57
  updateCatalog(id: string, update: Partial<Pick<InsertCatalog, 'name' | 'description' | 'filter_criteria' | 'hlc'>>): Promise<void>;
41
58
  deleteCatalog(id: string): Promise<void>;
42
59
  listCatalogs(ownerDID: string): Promise<Array<Catalog>>;
@@ -45,16 +62,15 @@ export type GraphStoreAPI = {
45
62
  owners: Array<string> | undefined;
46
63
  }>;
47
64
  registerClusterModels(clusterID: string, entries: Array<InsertClusterModel>): Promise<void>;
48
- getUserModelAccessDefault(ownerDID: string, modelID: string, permissionType: 'read' | 'write'): Promise<{
49
- level: string;
50
- allowedDIDs: Array<string> | null;
51
- } | null>;
65
+ getUserModelAccessDefault(ownerDID: string, modelID: string, permissionType: 'read' | 'write'): Promise<StoredAccessRule | null>;
52
66
  setUserModelAccessDefault(params: {
53
67
  ownerDID: string;
54
68
  modelID: string;
55
69
  permissionType: 'read' | 'write';
56
- accessLevel: string;
70
+ accessLevel: AccessLevel;
57
71
  allowedDIDs: Array<string> | null;
72
+ allowedCircles: Array<string> | null;
73
+ allowedGroups: Array<string> | null;
58
74
  }): Promise<void>;
59
75
  removeUserModelAccessDefaults(ownerDID: string, modelID: string, permissionTypes: Array<string>): Promise<void>;
60
76
  getDocumentIDsForScope(scopes: Array<{
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_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}
1
+ import{DocumentID as e,DocumentModelID as t}from"@kubun/id";import{serializeCursor as l}from"./cursor.js";function n(e,t){if(!(e instanceof Error))return!1;let l=e.message;return l.includes("no such table")&&l.includes(t)||l.includes("does not exist")&&l.includes(t)}import{applyDocumentFilter as a,applyDocumentOrderBy as r,applyPagination as o}from"./query-builder.js";function s(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 i(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 c(e,l){let n=t.fromString(l);return n.isLocal?n.toGlobal(t.fromString(e)).toString():l}async function u(e,t,l){let{id:n,graphModelID:a,model:r}=l,o=t.types;for(let l of(await e.schema.createTable(`k_${n}`).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:n,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:c(n,l),implementation_id:n}).onConflict(e=>e.doNothing()).execute();await e.insertInto("kubun_graph_document_model_links").values({graph_model_id:a,document_model_id:n}).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:l,owners:n}=await w.resolveCatalogScope(t),a=e;if(null!=l){let e=new Set(l);a=a.filter(t=>e.has(t))}return{effectiveModelIDs:a,effectiveOwners:n}}let w={async getDocument(l){let n=e.from(l),a=await t.selectFrom(`k_${n.model.toString()}`).selectAll().where("id","=",n.toString()).executeTakeFirst();return a?i(d,a):null},getDocumentModel:async e=>s(await t.selectFrom("kubun_graph_document_models").selectAll().where("id","=",e.toString()).executeTakeFirstOrThrow()),async createDocument(e){let l=e.id.toString(),n=e.id.model.toString(),a=await t.insertInto(`k_${n}`).values({id:l,owner:e.owner,model:n,data:d.encodeJSON(e.data),unique:d.encodeBinary(e.unique)}).returningAll().executeTakeFirstOrThrow(()=>Error(`createDocument failed to return row for ${l}`));return i(d,a)},async saveDocument(e){let l=e.id.toString(),n=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","=",l).returningAll().executeTakeFirstOrThrow(()=>Error(`saveDocument: document not found for id=${l}`));return i(d,n)},async queryDocuments(e){let{catalogID:n,filter:s,modelIDs:c,orderBy:u,owner:w,...h}=e,f=null!=e.last,{effectiveModelIDs:g,effectiveOwners:p}=await _(c,n);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!=s&&(x=x.where(e=>a(e,s,[],m))),k))x=x.unionAll(t=>{let l=t.selectFrom(`k_${e}`).selectAll();return null!=w&&(l=l.where("owner","=",w)),null!=p&&(l=l.where("owner","in",p)),null!=s&&(l=l.where(e=>a(e,s,[],m))),l});let[b,S]=r(x,u,f),[F,D]=o(b,h,u),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 l of S){let n=e.data;for(let e of l)null!=n&&(n=n[e]);null!=n&&(t[l.join(".")]=n)}return{cursor:l({id:e.id,values:t}),document:i(d,e)}}):C.map(e=>({cursor:l({id:e.id,ts:+e.created_at}),document:i(d,e)})),hasMore:v.length>D}},async countDocuments(e){let{catalogID:l,filter:n,modelIDs:r,owner:o}=e,{effectiveModelIDs:s,effectiveOwners:i}=await _(r,l);return 0===s.length?0:(await Promise.all(s.map(async e=>{let l=t.selectFrom(`k_${e}`).select(e=>e.fn.countAll().as("count"));return null!=o&&(l=l.where("owner","=",o)),null!=i&&(l=l.where("owner","in",i)),null!=n&&(l=l.where(e=>a(e,n,[],m))),Number((await l.executeTakeFirstOrThrow()).count)}))).reduce((e,t)=>e+t,0)},async listDocuments(e){let[l,...n]=e.modelIDs,a=t.selectFrom(`k_${l}`).selectAll().where("id","in",e.docIDs);for(let t of n)a=a.unionAll(l=>l.selectFrom(`k_${t}`).selectAll().where("id","in",e.docIDs));return(await a.execute()).map(e=>i(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(n(t,`k_${e}`))return[];throw t}},queryDocumentsByOwner:async(e,l)=>(await t.selectFrom(`k_${e}`).selectAll().where("owner","=",l).execute()).map(e=>i(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,l){await t.updateTable("kubun_graph_mutation_log").set({status:l}).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(l){let n=e.fromString(l).model.toString(),a=await t.selectFrom(`k_${n}`).select("field_hlcs").where("id","=",l).executeTakeFirst();if(a?.field_hlcs==null)return null;let r=a.field_hlcs;return"string"==typeof r?JSON.parse(r):r},async updateFieldHLCs(e,l){let n=e.model.toString();await t.updateTable(`k_${n}`).set({field_hlcs:d.encodeJSON(l)}).where("id","=",e.toString()).execute()},listGraphs:async()=>await t.selectFrom("kubun_graph_models").selectAll().execute(),async createGraph(e){let l=e.id,n=e.name??l;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:l,name:n,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(c(e,t))));if(0===e.length)throw Error("Could not create graph: no valid model to add");await Promise.all(e.map(async([e,n])=>{await u(t,d,{id:e,graphModelID:l,model:n}),r.add(e)}))}}),l},async getGraph(e){let l=await t.selectFrom("kubun_graph_models").selectAll().where("id","=",e).executeTakeFirst();if(null==l)return null;let n={};for(let l 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()))n[l.id]=s(l);return{...l,record:n}},async getClusterForModel(e){let l=await t.selectFrom("kubun_graph_cluster_models").select("cluster_id").where("model_id","=",e).executeTakeFirst();return l?.cluster_id},getClusterModels:async e=>await t.selectFrom("kubun_graph_cluster_models").selectAll().where("cluster_id","=",e).orderBy("cluster_index").execute(),async saveCluster(e,l){await t.insertInto("kubun_graph_clusters").values({id:e,definition:d.encodeJSON(l)}).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 l=await t.selectFrom("kubun_graph_clusters").selectAll().where("id","in",e).execute(),n={};for(let e of l)n[e.id]=e.definition;return n},async addAttachments(e){await t.insertInto("kubun_graph_document_attachments").values(e).onConflict(e=>e.doNothing()).execute()},async createSearchIndex(e,l){await d.createSearchIndex(t,{modelID:e,fields:l})},async dropSearchIndex(e){await d.dropSearchIndex(t,e)},async updateSearchEntry(e,l,n,a){let r={};for(let e of a){let t=function(e,t){let l=t.split("."),n=e;for(let e of l){if(null==n||"object"!=typeof n)return null;n=n[e]}return n}(n,e);null!=t&&(r[e]=String(t))}await d.updateSearchEntry(t,e,l,r,a)},async removeSearchEntry(e,l){await d.removeSearchEntry(t,e,l)},async searchDocuments(e){let l=[];for(let n of e.modelIDs)for(let a of(await d.searchIndex(t,{query:e.query,modelID:n,limit:e.first??50})))l.push({documentID:a.documentID,modelID:n,rank:a.rank});return(l.sort((e,t)=>Math.abs(t.rank)-Math.abs(e.rank)),e.first)?l.slice(0,e.first):l},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 getCatalogs(e){let l=new Map;if(0===e.length)return l;for(let n of(await t.selectFrom("kubun_graph_catalogs").selectAll().where("id","in",e).execute()))l.set(n.id,n);return l},async updateCatalog(e,l){let n={};null!=l.name&&(n.name=l.name),null!=l.description&&(n.description=l.description),null!=l.filter_criteria&&(n.filter_criteria=d.encodeJSON(l.filter_criteria)),null!=l.hlc&&(n.hlc=l.hlc),n.updated_at=d.encodeTimestamp(new Date),await t.updateTable("kubun_graph_catalogs").set(n).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,l=await w.getCatalog(e);if(null==l)return{models:void 0,owners:void 0};let n=l.filter_criteria,a=null!=n.models&&n.models.length>0?n.models:void 0;return null!=n.owners&&n.owners.length>0&&(t=[...n.owners]),{models:a,owners:t}},async registerClusterModels(e,l){0!==l.length&&await t.insertInto("kubun_graph_cluster_models").values(l).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,l,n){let a=await t.selectFrom("kubun_graph_user_model_access_defaults").select(["access_level","allowed_dids","allowed_circles","allowed_groups"]).where("owner_did","=",e).where("model_id","=",l).where("permission_type","=",n).executeTakeFirst();return a?{level:a.access_level,allowedDIDs:a.allowed_dids,allowedCircles:a.allowed_circles,allowedGroups:a.allowed_groups}: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,allowed_circles:e.allowedCircles?d.encodeJSON(e.allowedCircles):null,allowed_groups:e.allowedGroups?d.encodeJSON(e.allowedGroups):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,allowed_circles:e.allowedCircles?d.encodeJSON(e.allowedCircles):null,allowed_groups:e.allowedGroups?d.encodeJSON(e.allowedGroups):null,updated_at:d.encodeTimestamp(new Date)})).execute()},async removeUserModelAccessDefaults(e,l,n){await t.deleteFrom("kubun_graph_user_model_access_defaults").where("owner_did","=",e).where("model_id","=",l).where("permission_type","in",n).execute()},async getDocumentIDsForScope(e,l=[]){let a=[];for(let l of e)try{let e=await t.selectFrom(`k_${l.modelID}`).select("id").where("owner","=",l.ownerDID).execute();a.push(...e.map(e=>e.id))}catch(e){if(!n(e,`k_${l.modelID}`))throw e}if(l.length>0){let e=new Set(l);return a.filter(t=>!e.has(t))}return a},getDocumentMetadataForSync:async(e,l)=>0===l.length?[]:(await t.selectFrom(`k_${e}`).select(["id","model","owner"]).where("id","in",l).execute()).map(e=>({id:e.id,model:e.model,owner:e.owner}))};return w}
package/lib/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import type { StoreProvider } from '@kubun/db';
2
2
  import type { GraphStoreAPI } from './api.js';
3
- export type { GraphStoreAPI } from './api.js';
3
+ export type { GraphStoreAPI, StoredAccessRule } from './api.js';
4
4
  export { createGraphStore } from './api.js';
5
5
  export { graphStoreDefinition } from './definition.js';
6
6
  export declare const GRAPH_STORE: "graph";
7
7
  export declare function getGraphStore(provider: StoreProvider): Promise<GraphStoreAPI>;
8
- export type { AccessPermissions, AddDocumentModelParams, Catalog, ClusterDefinitionRow, ClusterModel, ConnectionArguments, CountDocumentsParams, CreateDocumentParams, CreateGraphParams, CursorDocument, Document, DocumentAttachment, DocumentData, DocumentModelRow, DocumentParams, GraphModel, GraphModelWithRecord, GraphTables, InsertCatalog, InsertClusterModel, InsertDocument, InsertDocumentAttachment, InsertDocumentModel, InsertDocumentModelInterface, InsertMutationLogEntry, ListDocumentsParams, MutationLogEntry, PaginatedResult, PaginationParams, QueryDocumentsParams, QueryDocumentsResult, SaveDocumentParams, SearchConfig, SearchDocumentResult, SearchDocumentsParams, UpdateDocument, UpdateDocumentModel, } from './tables.js';
8
+ export type { AccessLevel, AccessPermissions, AddDocumentModelParams, Catalog, ClusterDefinitionRow, ClusterModel, ConnectionArguments, CountDocumentsParams, CreateDocumentParams, CreateGraphParams, CursorDocument, Document, DocumentAttachment, DocumentData, DocumentModelRow, DocumentParams, GraphModel, GraphModelWithRecord, GraphTables, InsertCatalog, InsertClusterModel, InsertDocument, InsertDocumentAttachment, InsertDocumentModel, InsertDocumentModelInterface, InsertMutationLogEntry, ListDocumentsParams, MutationLogEntry, PaginatedResult, PaginationParams, QueryDocumentsParams, QueryDocumentsResult, SaveDocumentParams, SearchConfig, SearchDocumentResult, SearchDocumentsParams, UpdateDocument, UpdateDocumentModel, } from './tables.js';
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("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()}}}}
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("allowed_circles",t.json).addColumn("allowed_groups",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
@@ -96,6 +96,8 @@ export type UserModelAccessDefaultTable = {
96
96
  permission_type: string;
97
97
  access_level: string;
98
98
  allowed_dids: JSONValueColumn<Array<string>> | null;
99
+ allowed_circles: JSONValueColumn<Array<string>> | null;
100
+ allowed_groups: JSONValueColumn<Array<string>> | null;
99
101
  created_at: CreatedAtColumn;
100
102
  updated_at: UpdatedAtColumn;
101
103
  };
@@ -206,13 +208,18 @@ export type SearchDocumentResult = {
206
208
  modelID: string;
207
209
  rank: number;
208
210
  };
211
+ /**
212
+ * Access level token used in `AccessRule`, persisted access defaults, and
213
+ * document access overrides.
214
+ */
215
+ export type AccessLevel = 'only_owner' | 'anyone' | 'restricted';
209
216
  export type AccessPermissions = {
210
217
  read?: {
211
- level: 'only_owner' | 'anyone' | 'allowed_dids';
218
+ level: 'only_owner' | 'anyone' | 'restricted';
212
219
  allowedDIDs?: Array<string>;
213
220
  };
214
221
  write?: {
215
- level: 'only_owner' | 'allowed_dids';
222
+ level: 'only_owner' | 'restricted';
216
223
  allowedDIDs?: Array<string>;
217
224
  };
218
225
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubun/store-graph",
3
- "version": "0.8.1",
3
+ "version": "0.9.0",
4
4
  "license": "see LICENSE.md",
5
5
  "keywords": [],
6
6
  "type": "module",
@@ -15,17 +15,17 @@
15
15
  ],
16
16
  "sideEffects": false,
17
17
  "dependencies": {
18
- "@enkaku/codec": "^0.14.0",
19
- "kysely": "^0.28.16",
20
- "@kubun/db": "^0.8.1",
21
- "@kubun/db-adapter": "^0.8.1",
22
- "@kubun/protocol": "^0.8.1",
23
- "@kubun/id": "^0.8.0"
18
+ "@enkaku/codec": "^0.15.0",
19
+ "kysely": "^0.28.17",
20
+ "@kubun/db": "^0.9.0",
21
+ "@kubun/db-adapter": "^0.9.0",
22
+ "@kubun/id": "^0.9.0",
23
+ "@kubun/protocol": "^0.9.0"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@testcontainers/postgresql": "^11.14.0",
27
- "@kubun/db-better-sqlite": "^0.8.1",
28
- "@kubun/db-postgres": "^0.8.1"
27
+ "@kubun/db-postgres": "^0.9.0",
28
+ "@kubun/db-better-sqlite": "^0.9.0"
29
29
  },
30
30
  "scripts": {
31
31
  "build:clean": "del lib",