@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 +23 -7
- package/lib/api.js +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/migrations.js +1 -1
- package/lib/tables.d.ts +9 -2
- package/package.json +9 -9
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:
|
|
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' | '
|
|
218
|
+
level: 'only_owner' | 'anyone' | 'restricted';
|
|
212
219
|
allowedDIDs?: Array<string>;
|
|
213
220
|
};
|
|
214
221
|
write?: {
|
|
215
|
-
level: 'only_owner' | '
|
|
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.
|
|
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.
|
|
19
|
-
"kysely": "^0.28.
|
|
20
|
-
"@kubun/db": "^0.
|
|
21
|
-
"@kubun/db-adapter": "^0.
|
|
22
|
-
"@kubun/
|
|
23
|
-
"@kubun/
|
|
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-
|
|
28
|
-
"@kubun/db-
|
|
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",
|