@forgebase/database 0.0.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/LICENSE +21 -0
- package/README.md +470 -0
- package/dist/cjs/adapters/base.d.ts +20 -0
- package/dist/cjs/adapters/base.d.ts.map +1 -0
- package/dist/cjs/adapters/base.js +13 -0
- package/dist/cjs/adapters/base.js.map +1 -0
- package/dist/cjs/adapters/index.d.ts +6 -0
- package/dist/cjs/adapters/index.d.ts.map +1 -0
- package/dist/cjs/adapters/index.js +24 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/postgres.d.ts +13 -0
- package/dist/cjs/adapters/postgres.d.ts.map +1 -0
- package/dist/cjs/adapters/postgres.js +51 -0
- package/dist/cjs/adapters/postgres.js.map +1 -0
- package/dist/cjs/adapters/sqlite.d.ts +13 -0
- package/dist/cjs/adapters/sqlite.d.ts.map +1 -0
- package/dist/cjs/adapters/sqlite.js +47 -0
- package/dist/cjs/adapters/sqlite.js.map +1 -0
- package/dist/cjs/adapters/types.d.ts +8 -0
- package/dist/cjs/adapters/types.d.ts.map +1 -0
- package/dist/cjs/adapters/types.js +3 -0
- package/dist/cjs/adapters/types.js.map +1 -0
- package/dist/cjs/database.d.ts +73 -0
- package/dist/cjs/database.d.ts.map +1 -0
- package/dist/cjs/database.js +673 -0
- package/dist/cjs/database.js.map +1 -0
- package/dist/cjs/errors.d.ts +37 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +64 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.d.ts +16 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +31 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/kysely-hooks.d.ts +45 -0
- package/dist/cjs/kysely-hooks.d.ts.map +1 -0
- package/dist/cjs/kysely-hooks.js +93 -0
- package/dist/cjs/kysely-hooks.js.map +1 -0
- package/dist/cjs/libsql/example.d.ts +2 -0
- package/dist/cjs/libsql/example.d.ts.map +1 -0
- package/dist/cjs/libsql/example.js +44 -0
- package/dist/cjs/libsql/example.js.map +1 -0
- package/dist/cjs/libsql/index.d.ts +36 -0
- package/dist/cjs/libsql/index.d.ts.map +1 -0
- package/dist/cjs/libsql/index.js +155 -0
- package/dist/cjs/libsql/index.js.map +1 -0
- package/dist/cjs/permissionService.d.ts +20 -0
- package/dist/cjs/permissionService.d.ts.map +1 -0
- package/dist/cjs/permissionService.js +107 -0
- package/dist/cjs/permissionService.js.map +1 -0
- package/dist/cjs/rlsFunctionRegistry.d.ts +43 -0
- package/dist/cjs/rlsFunctionRegistry.d.ts.map +1 -0
- package/dist/cjs/rlsFunctionRegistry.js +63 -0
- package/dist/cjs/rlsFunctionRegistry.js.map +1 -0
- package/dist/cjs/rlsManager.d.ts +23 -0
- package/dist/cjs/rlsManager.d.ts.map +1 -0
- package/dist/cjs/rlsManager.js +371 -0
- package/dist/cjs/rlsManager.js.map +1 -0
- package/dist/cjs/schema.d.ts +15 -0
- package/dist/cjs/schema.d.ts.map +1 -0
- package/dist/cjs/schema.js +119 -0
- package/dist/cjs/schema.js.map +1 -0
- package/dist/cjs/sdk/client.d.ts +324 -0
- package/dist/cjs/sdk/client.d.ts.map +1 -0
- package/dist/cjs/sdk/client.js +554 -0
- package/dist/cjs/sdk/client.js.map +1 -0
- package/dist/cjs/sdk/examples.d.ts +68 -0
- package/dist/cjs/sdk/examples.d.ts.map +1 -0
- package/dist/cjs/sdk/examples.js +232 -0
- package/dist/cjs/sdk/examples.js.map +1 -0
- package/dist/cjs/sdk/server.d.ts +115 -0
- package/dist/cjs/sdk/server.d.ts.map +1 -0
- package/dist/cjs/sdk/server.js +140 -0
- package/dist/cjs/sdk/server.js.map +1 -0
- package/dist/cjs/types.d.ts +217 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +5 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils/column-utils.d.ts +8 -0
- package/dist/cjs/utils/column-utils.d.ts.map +1 -0
- package/dist/cjs/utils/column-utils.js +131 -0
- package/dist/cjs/utils/column-utils.js.map +1 -0
- package/dist/cjs/utils/db.d.ts +2 -0
- package/dist/cjs/utils/db.d.ts.map +1 -0
- package/dist/cjs/utils/db.js +6 -0
- package/dist/cjs/utils/db.js.map +1 -0
- package/dist/cjs/utils/inspector.d.ts +39 -0
- package/dist/cjs/utils/inspector.d.ts.map +1 -0
- package/dist/cjs/utils/inspector.js +164 -0
- package/dist/cjs/utils/inspector.js.map +1 -0
- package/dist/cjs/utils/permission-initializer.d.ts +15 -0
- package/dist/cjs/utils/permission-initializer.d.ts.map +1 -0
- package/dist/cjs/utils/permission-initializer.js +173 -0
- package/dist/cjs/utils/permission-initializer.js.map +1 -0
- package/dist/cjs/websocket/RealtimeAdapter.d.ts +22 -0
- package/dist/cjs/websocket/RealtimeAdapter.d.ts.map +1 -0
- package/dist/cjs/websocket/RealtimeAdapter.js +3 -0
- package/dist/cjs/websocket/RealtimeAdapter.js.map +1 -0
- package/dist/cjs/websocket/SSEManager.d.ts +40 -0
- package/dist/cjs/websocket/SSEManager.d.ts.map +1 -0
- package/dist/cjs/websocket/SSEManager.js +268 -0
- package/dist/cjs/websocket/SSEManager.js.map +1 -0
- package/dist/cjs/websocket/WebSocketManager.d.ts +28 -0
- package/dist/cjs/websocket/WebSocketManager.d.ts.map +1 -0
- package/dist/cjs/websocket/WebSocketManager.js +156 -0
- package/dist/cjs/websocket/WebSocketManager.js.map +1 -0
- package/dist/cjs/websocket/index.d.ts +4 -0
- package/dist/cjs/websocket/index.d.ts.map +1 -0
- package/dist/cjs/websocket/index.js +20 -0
- package/dist/cjs/websocket/index.js.map +1 -0
- package/dist/esm/adapters/base.d.ts +20 -0
- package/dist/esm/adapters/base.d.ts.map +1 -0
- package/dist/esm/adapters/base.js +10 -0
- package/dist/esm/adapters/base.js.map +1 -0
- package/dist/esm/adapters/index.d.ts +6 -0
- package/dist/esm/adapters/index.d.ts.map +1 -0
- package/dist/esm/adapters/index.js +19 -0
- package/dist/esm/adapters/index.js.map +1 -0
- package/dist/esm/adapters/postgres.d.ts +13 -0
- package/dist/esm/adapters/postgres.d.ts.map +1 -0
- package/dist/esm/adapters/postgres.js +47 -0
- package/dist/esm/adapters/postgres.js.map +1 -0
- package/dist/esm/adapters/sqlite.d.ts +13 -0
- package/dist/esm/adapters/sqlite.d.ts.map +1 -0
- package/dist/esm/adapters/sqlite.js +43 -0
- package/dist/esm/adapters/sqlite.js.map +1 -0
- package/dist/esm/adapters/types.d.ts +8 -0
- package/dist/esm/adapters/types.d.ts.map +1 -0
- package/dist/esm/adapters/types.js +2 -0
- package/dist/esm/adapters/types.js.map +1 -0
- package/dist/esm/database.d.ts +73 -0
- package/dist/esm/database.d.ts.map +1 -0
- package/dist/esm/database.js +668 -0
- package/dist/esm/database.js.map +1 -0
- package/dist/esm/errors.d.ts +37 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +55 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +16 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/kysely-hooks.d.ts +45 -0
- package/dist/esm/kysely-hooks.d.ts.map +1 -0
- package/dist/esm/kysely-hooks.js +86 -0
- package/dist/esm/kysely-hooks.js.map +1 -0
- package/dist/esm/libsql/example.d.ts +2 -0
- package/dist/esm/libsql/example.d.ts.map +1 -0
- package/dist/esm/libsql/example.js +42 -0
- package/dist/esm/libsql/example.js.map +1 -0
- package/dist/esm/libsql/index.d.ts +36 -0
- package/dist/esm/libsql/index.d.ts.map +1 -0
- package/dist/esm/libsql/index.js +116 -0
- package/dist/esm/libsql/index.js.map +1 -0
- package/dist/esm/permissionService.d.ts +20 -0
- package/dist/esm/permissionService.d.ts.map +1 -0
- package/dist/esm/permissionService.js +103 -0
- package/dist/esm/permissionService.js.map +1 -0
- package/dist/esm/rlsFunctionRegistry.d.ts +43 -0
- package/dist/esm/rlsFunctionRegistry.d.ts.map +1 -0
- package/dist/esm/rlsFunctionRegistry.js +60 -0
- package/dist/esm/rlsFunctionRegistry.js.map +1 -0
- package/dist/esm/rlsManager.d.ts +23 -0
- package/dist/esm/rlsManager.d.ts.map +1 -0
- package/dist/esm/rlsManager.js +366 -0
- package/dist/esm/rlsManager.js.map +1 -0
- package/dist/esm/schema.d.ts +15 -0
- package/dist/esm/schema.d.ts.map +1 -0
- package/dist/esm/schema.js +113 -0
- package/dist/esm/schema.js.map +1 -0
- package/dist/esm/sdk/client.d.ts +324 -0
- package/dist/esm/sdk/client.d.ts.map +1 -0
- package/dist/esm/sdk/client.js +550 -0
- package/dist/esm/sdk/client.js.map +1 -0
- package/dist/esm/sdk/examples.d.ts +68 -0
- package/dist/esm/sdk/examples.d.ts.map +1 -0
- package/dist/esm/sdk/examples.js +229 -0
- package/dist/esm/sdk/examples.js.map +1 -0
- package/dist/esm/sdk/server.d.ts +115 -0
- package/dist/esm/sdk/server.d.ts.map +1 -0
- package/dist/esm/sdk/server.js +136 -0
- package/dist/esm/sdk/server.js.map +1 -0
- package/dist/esm/types.d.ts +217 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils/column-utils.d.ts +8 -0
- package/dist/esm/utils/column-utils.d.ts.map +1 -0
- package/dist/esm/utils/column-utils.js +127 -0
- package/dist/esm/utils/column-utils.js.map +1 -0
- package/dist/esm/utils/db.d.ts +2 -0
- package/dist/esm/utils/db.d.ts.map +1 -0
- package/dist/esm/utils/db.js +3 -0
- package/dist/esm/utils/db.js.map +1 -0
- package/dist/esm/utils/inspector.d.ts +39 -0
- package/dist/esm/utils/inspector.d.ts.map +1 -0
- package/dist/esm/utils/inspector.js +160 -0
- package/dist/esm/utils/inspector.js.map +1 -0
- package/dist/esm/utils/permission-initializer.d.ts +15 -0
- package/dist/esm/utils/permission-initializer.d.ts.map +1 -0
- package/dist/esm/utils/permission-initializer.js +137 -0
- package/dist/esm/utils/permission-initializer.js.map +1 -0
- package/dist/esm/websocket/RealtimeAdapter.d.ts +22 -0
- package/dist/esm/websocket/RealtimeAdapter.d.ts.map +1 -0
- package/dist/esm/websocket/RealtimeAdapter.js +2 -0
- package/dist/esm/websocket/RealtimeAdapter.js.map +1 -0
- package/dist/esm/websocket/SSEManager.d.ts +40 -0
- package/dist/esm/websocket/SSEManager.d.ts.map +1 -0
- package/dist/esm/websocket/SSEManager.js +231 -0
- package/dist/esm/websocket/SSEManager.js.map +1 -0
- package/dist/esm/websocket/WebSocketManager.d.ts +28 -0
- package/dist/esm/websocket/WebSocketManager.d.ts.map +1 -0
- package/dist/esm/websocket/WebSocketManager.js +152 -0
- package/dist/esm/websocket/WebSocketManager.js.map +1 -0
- package/dist/esm/websocket/index.d.ts +4 -0
- package/dist/esm/websocket/index.d.ts.map +1 -0
- package/dist/esm/websocket/index.js +4 -0
- package/dist/esm/websocket/index.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { sql } from 'kysely';
|
|
2
|
+
import { FG_PERMISSION_TABLE } from './types';
|
|
3
|
+
import { LRUCache } from 'lru-cache';
|
|
4
|
+
export class PermissionService {
|
|
5
|
+
constructor(db) {
|
|
6
|
+
this.db = db;
|
|
7
|
+
this.cache = new LRUCache({
|
|
8
|
+
max: 500,
|
|
9
|
+
ttl: 5 * 60 * 1000, // 5 minutes TTL
|
|
10
|
+
allowStale: false,
|
|
11
|
+
updateAgeOnGet: true,
|
|
12
|
+
});
|
|
13
|
+
this.initPromise = this.initializeDatabase();
|
|
14
|
+
}
|
|
15
|
+
async ready() {
|
|
16
|
+
return this.initPromise;
|
|
17
|
+
}
|
|
18
|
+
async initializeDatabase() {
|
|
19
|
+
try {
|
|
20
|
+
const adapterName = this.db.getExecutor().adapter.constructor.name;
|
|
21
|
+
const isSqlite = adapterName.includes('Sqlite') || adapterName.includes('Libsql');
|
|
22
|
+
const now = isSqlite ? sql `CURRENT_TIMESTAMP` : sql `now()`;
|
|
23
|
+
await this.db.schema
|
|
24
|
+
.createTable(FG_PERMISSION_TABLE)
|
|
25
|
+
.ifNotExists()
|
|
26
|
+
.addColumn('table_name', 'varchar(255)', (col) => col.primaryKey().notNull())
|
|
27
|
+
.addColumn('permissions', 'json', (col) => col.notNull())
|
|
28
|
+
.addColumn('created_at', 'timestamp', (col) => col.defaultTo(now))
|
|
29
|
+
.addColumn('updated_at', 'timestamp', (col) => col.defaultTo(now))
|
|
30
|
+
.execute();
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
console.warn('Permission table initialization warning:', e);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Sync-only lookup: returns cached permissions or undefined if not cached.
|
|
38
|
+
* Avoids async overhead when the permission is already in the LRU cache.
|
|
39
|
+
*/
|
|
40
|
+
getPermissionsForTableSync(tableName) {
|
|
41
|
+
return this.cache.get(tableName);
|
|
42
|
+
}
|
|
43
|
+
async getPermissionsForTable(tableName, trx) {
|
|
44
|
+
const cachedPermissions = this.cache.get(tableName);
|
|
45
|
+
if (cachedPermissions) {
|
|
46
|
+
return cachedPermissions;
|
|
47
|
+
}
|
|
48
|
+
const executor = trx || this.db;
|
|
49
|
+
const result = await executor
|
|
50
|
+
.selectFrom(FG_PERMISSION_TABLE)
|
|
51
|
+
.where('table_name', '=', tableName)
|
|
52
|
+
.selectAll()
|
|
53
|
+
.executeTakeFirst();
|
|
54
|
+
if (!result)
|
|
55
|
+
return {};
|
|
56
|
+
let permissions = result.permissions;
|
|
57
|
+
if (typeof permissions === 'string') {
|
|
58
|
+
try {
|
|
59
|
+
permissions = JSON.parse(permissions);
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
// ignore
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
this.cache.set(tableName, permissions);
|
|
66
|
+
return permissions;
|
|
67
|
+
}
|
|
68
|
+
async setPermissionsForTable(tableName, permissions, trx) {
|
|
69
|
+
const executor = trx || this.db;
|
|
70
|
+
const permissionsJson = JSON.stringify(permissions);
|
|
71
|
+
const adapterName = this.db.getExecutor().adapter.constructor.name;
|
|
72
|
+
const isSqlite = adapterName.includes('Sqlite') || adapterName.includes('Libsql');
|
|
73
|
+
const now = isSqlite ? sql `CURRENT_TIMESTAMP` : sql `now()`;
|
|
74
|
+
await executor
|
|
75
|
+
.insertInto(FG_PERMISSION_TABLE)
|
|
76
|
+
.values({
|
|
77
|
+
table_name: tableName,
|
|
78
|
+
permissions: permissionsJson,
|
|
79
|
+
updated_at: now,
|
|
80
|
+
})
|
|
81
|
+
.onConflict((oc) => oc.column('table_name').doUpdateSet({
|
|
82
|
+
permissions: permissionsJson,
|
|
83
|
+
updated_at: now,
|
|
84
|
+
}))
|
|
85
|
+
.execute();
|
|
86
|
+
this.cache.set(tableName, permissions);
|
|
87
|
+
return permissions;
|
|
88
|
+
}
|
|
89
|
+
async deletePermissionsForTable(tableName, trx) {
|
|
90
|
+
const executor = trx || this.db;
|
|
91
|
+
await executor
|
|
92
|
+
.deleteFrom(FG_PERMISSION_TABLE)
|
|
93
|
+
.where('table_name', '=', tableName)
|
|
94
|
+
.execute();
|
|
95
|
+
// Remove from cache
|
|
96
|
+
this.cache.delete(tableName);
|
|
97
|
+
}
|
|
98
|
+
// Method to clear the entire cache
|
|
99
|
+
clearCache() {
|
|
100
|
+
this.cache.clear();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=permissionService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionService.js","sourceRoot":"","sources":["../../src/permissionService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { CustomRlsFunction } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Registry for custom RLS functions that can be used in permission rules
|
|
4
|
+
*/
|
|
5
|
+
declare class RlsFunctionRegistry {
|
|
6
|
+
private functions;
|
|
7
|
+
/**
|
|
8
|
+
* Register a custom RLS function
|
|
9
|
+
* @param name Unique name for the function
|
|
10
|
+
* @param fn The function implementation
|
|
11
|
+
*/
|
|
12
|
+
register(name: string, fn: CustomRlsFunction): void;
|
|
13
|
+
/**
|
|
14
|
+
* Get a registered RLS function by name
|
|
15
|
+
* @param name Name of the function to retrieve
|
|
16
|
+
* @returns The function or undefined if not found
|
|
17
|
+
*/
|
|
18
|
+
get(name: string): CustomRlsFunction | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Check if a function with the given name exists
|
|
21
|
+
* @param name Name to check
|
|
22
|
+
* @returns True if the function exists
|
|
23
|
+
*/
|
|
24
|
+
has(name: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Remove a function from the registry
|
|
27
|
+
* @param name Name of the function to remove
|
|
28
|
+
* @returns True if the function was removed
|
|
29
|
+
*/
|
|
30
|
+
unregister(name: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Clear all registered functions
|
|
33
|
+
*/
|
|
34
|
+
clear(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Get all registered function names
|
|
37
|
+
* @returns Array of function names
|
|
38
|
+
*/
|
|
39
|
+
getRegisteredFunctionNames(): string[];
|
|
40
|
+
}
|
|
41
|
+
declare const rlsFunctionRegistry: RlsFunctionRegistry;
|
|
42
|
+
export { rlsFunctionRegistry };
|
|
43
|
+
//# sourceMappingURL=rlsFunctionRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlsFunctionRegistry.d.ts","sourceRoot":"","sources":["../../src/rlsFunctionRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;GAEG;AACH,cAAM,mBAAmB;IACvB,OAAO,CAAC,SAAS,CAA6C;IAE9D;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAOnD;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIhD;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,0BAA0B,IAAI,MAAM,EAAE;CAGvC;AAGD,QAAA,MAAM,mBAAmB,qBAA4B,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry for custom RLS functions that can be used in permission rules
|
|
3
|
+
*/
|
|
4
|
+
class RlsFunctionRegistry {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.functions = new Map();
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Register a custom RLS function
|
|
10
|
+
* @param name Unique name for the function
|
|
11
|
+
* @param fn The function implementation
|
|
12
|
+
*/
|
|
13
|
+
register(name, fn) {
|
|
14
|
+
if (this.functions.has(name)) {
|
|
15
|
+
console.warn(`RLS function "${name}" is being overwritten`);
|
|
16
|
+
}
|
|
17
|
+
this.functions.set(name, fn);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get a registered RLS function by name
|
|
21
|
+
* @param name Name of the function to retrieve
|
|
22
|
+
* @returns The function or undefined if not found
|
|
23
|
+
*/
|
|
24
|
+
get(name) {
|
|
25
|
+
return this.functions.get(name);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if a function with the given name exists
|
|
29
|
+
* @param name Name to check
|
|
30
|
+
* @returns True if the function exists
|
|
31
|
+
*/
|
|
32
|
+
has(name) {
|
|
33
|
+
return this.functions.has(name);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Remove a function from the registry
|
|
37
|
+
* @param name Name of the function to remove
|
|
38
|
+
* @returns True if the function was removed
|
|
39
|
+
*/
|
|
40
|
+
unregister(name) {
|
|
41
|
+
return this.functions.delete(name);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Clear all registered functions
|
|
45
|
+
*/
|
|
46
|
+
clear() {
|
|
47
|
+
this.functions.clear();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get all registered function names
|
|
51
|
+
* @returns Array of function names
|
|
52
|
+
*/
|
|
53
|
+
getRegisteredFunctionNames() {
|
|
54
|
+
return Array.from(this.functions.keys());
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Create a singleton instance
|
|
58
|
+
const rlsFunctionRegistry = new RlsFunctionRegistry();
|
|
59
|
+
export { rlsFunctionRegistry };
|
|
60
|
+
//# sourceMappingURL=rlsFunctionRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlsFunctionRegistry.js","sourceRoot":"","sources":["../../src/rlsFunctionRegistry.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,mBAAmB;IAAzB;QACU,cAAS,GAAmC,IAAI,GAAG,EAAE,CAAC;IAuDhE,CAAC;IArDC;;;;OAIG;IACH,QAAQ,CAAC,IAAY,EAAE,EAAqB;QAC1C,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,iBAAiB,IAAI,wBAAwB,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,0BAA0B;QACxB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,8BAA8B;AAC9B,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { PermissionRule, UserContext } from './types';
|
|
2
|
+
import { PermissionService } from './permissionService';
|
|
3
|
+
import type { Kysely } from 'kysely';
|
|
4
|
+
export declare function evaluatePermission(rules: PermissionRule[], userContext: UserContext, row?: Record<string, unknown>, db?: Kysely<any>): Promise<boolean>;
|
|
5
|
+
/**
|
|
6
|
+
* Fast path: evaluate pre-extracted fieldCheck rules against a single row.
|
|
7
|
+
* Avoids the full enforcePermissions overhead (permission lookup, rule
|
|
8
|
+
* classification, array handling) when we already know we need a fieldCheck
|
|
9
|
+
* evaluation for one specific record.
|
|
10
|
+
*/
|
|
11
|
+
export declare function evaluateFieldCheckForRow(fieldCheckRules: PermissionRule[], userContext: UserContext, row: Record<string, unknown>, db?: Kysely<any>): Promise<boolean>;
|
|
12
|
+
type Row = Record<string, unknown>;
|
|
13
|
+
export declare function enforcePermissions(tableName: string, operation: 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE', userContext: UserContext, permissionService: PermissionService, rows?: Row | Row[], db?: Kysely<any>): Promise<{
|
|
14
|
+
row?: Row | Row[];
|
|
15
|
+
status: boolean;
|
|
16
|
+
message?: string;
|
|
17
|
+
hasFieldCheck: boolean;
|
|
18
|
+
hasCustomFunction: boolean;
|
|
19
|
+
fieldCheckRules?: PermissionRule[];
|
|
20
|
+
customFunctionRules?: PermissionRule[];
|
|
21
|
+
}>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=rlsManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlsManager.d.ts","sourceRoot":"","sources":["../../src/rlsManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,WAAW,EAEZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,cAAc,EAAE,EACvB,WAAW,EAAE,WAAW,EACxB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACjC,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GACf,OAAO,CAAC,OAAO,CAAC,CAiMlB;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,cAAc,EAAE,EACjC,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GACf,OAAO,CAAC,OAAO,CAAC,CAOlB;AAID,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnC,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACpD,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,iBAAiB,EACpC,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,EAClB,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GACf,OAAO,CAAC;IACT,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,mBAAmB,CAAC,EAAE,cAAc,EAAE,CAAC;CACxC,CAAC,CAwND"}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { sql } from 'kysely';
|
|
2
|
+
import { rlsFunctionRegistry } from './rlsFunctionRegistry';
|
|
3
|
+
export async function evaluatePermission(rules, userContext, row = {}, db) {
|
|
4
|
+
for (const rule of rules) {
|
|
5
|
+
switch (rule.allow) {
|
|
6
|
+
case 'public':
|
|
7
|
+
return true;
|
|
8
|
+
case 'private':
|
|
9
|
+
return false;
|
|
10
|
+
case 'role':
|
|
11
|
+
if (!rule.roles || rule.roles.length === 0) {
|
|
12
|
+
// If no roles specified, continue to next rule
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
if (rule.roles &&
|
|
16
|
+
userContext.role &&
|
|
17
|
+
rule.roles?.includes(userContext.role)) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
// If we reach here, the role rule didn't match
|
|
21
|
+
// Continue to the next rule instead of returning false
|
|
22
|
+
continue;
|
|
23
|
+
case 'auth':
|
|
24
|
+
if (userContext.userId) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
// If we reach here, the auth rule didn't match
|
|
28
|
+
// Continue to the next rule instead of breaking
|
|
29
|
+
continue;
|
|
30
|
+
case 'guest':
|
|
31
|
+
if (!userContext.userId)
|
|
32
|
+
return true;
|
|
33
|
+
// If we reach here, the guest rule didn't match
|
|
34
|
+
// Continue to the next rule instead of breaking
|
|
35
|
+
continue;
|
|
36
|
+
case 'labels':
|
|
37
|
+
if (rule.labels !== undefined &&
|
|
38
|
+
userContext.labels.some((label) => rule.labels && rule.labels.includes(label))) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
// If we reach here, the labels rule didn't match
|
|
42
|
+
// Continue to the next rule instead of breaking
|
|
43
|
+
continue;
|
|
44
|
+
case 'teams':
|
|
45
|
+
if (rule.teams !== undefined &&
|
|
46
|
+
userContext.teams.some((team) => rule.teams && rule.teams.includes(team))) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
// If we reach here, the teams rule didn't match
|
|
50
|
+
// Continue to the next rule instead of breaking
|
|
51
|
+
continue;
|
|
52
|
+
case 'static':
|
|
53
|
+
if (typeof rule.static === 'boolean') {
|
|
54
|
+
return rule.static;
|
|
55
|
+
}
|
|
56
|
+
// If we reach here, the static rule didn't match
|
|
57
|
+
// Continue to the next rule instead of breaking
|
|
58
|
+
continue;
|
|
59
|
+
case 'fieldCheck':
|
|
60
|
+
if (rule.fieldCheck) {
|
|
61
|
+
const { field, operator, valueType, value } = rule.fieldCheck;
|
|
62
|
+
const dataValue = row[field];
|
|
63
|
+
// console.log('Data value:', dataValue);
|
|
64
|
+
const comparisonValue = valueType === 'userContext'
|
|
65
|
+
? userContext[value]
|
|
66
|
+
: value;
|
|
67
|
+
switch (operator) {
|
|
68
|
+
case '===':
|
|
69
|
+
if (dataValue === comparisonValue)
|
|
70
|
+
return true;
|
|
71
|
+
break;
|
|
72
|
+
case '!==':
|
|
73
|
+
if (dataValue !== comparisonValue)
|
|
74
|
+
return true;
|
|
75
|
+
break;
|
|
76
|
+
case 'in':
|
|
77
|
+
if (Array.isArray(comparisonValue) &&
|
|
78
|
+
comparisonValue.includes(dataValue)) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
case 'notIn':
|
|
83
|
+
if (Array.isArray(comparisonValue) &&
|
|
84
|
+
!comparisonValue.includes(dataValue)) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// If we reach here, the fieldCheck rule didn't match
|
|
91
|
+
// Continue to the next rule instead of breaking
|
|
92
|
+
continue;
|
|
93
|
+
case 'customSql':
|
|
94
|
+
if (rule.customSql && db) {
|
|
95
|
+
try {
|
|
96
|
+
// Replace placeholders with userContext values
|
|
97
|
+
const parsedSql = rule.customSql.replace(/:([a-zA-Z_]+)/g, (_match, key) => {
|
|
98
|
+
if (userContext[key] === undefined) {
|
|
99
|
+
throw new Error(`Missing context value for key: ${key}`);
|
|
100
|
+
}
|
|
101
|
+
// For SQL parameters, we need to handle different types appropriately
|
|
102
|
+
const value = userContext[key];
|
|
103
|
+
if (typeof value === 'string') {
|
|
104
|
+
return `'${value.replace(/'/g, "''")}'`; // Escape single quotes for SQL
|
|
105
|
+
}
|
|
106
|
+
else if (value === null) {
|
|
107
|
+
return 'NULL';
|
|
108
|
+
}
|
|
109
|
+
else if (Array.isArray(value)) {
|
|
110
|
+
// Convert array to SQL array format
|
|
111
|
+
return `(${value
|
|
112
|
+
.map((item) => {
|
|
113
|
+
if (typeof item === 'string')
|
|
114
|
+
return `'${item.replace(/'/g, "''")}'`;
|
|
115
|
+
return item;
|
|
116
|
+
})
|
|
117
|
+
.join(', ')})`;
|
|
118
|
+
}
|
|
119
|
+
return String(value);
|
|
120
|
+
});
|
|
121
|
+
// console.log(`Executing custom SQL: ${parsedSql}`);
|
|
122
|
+
// Execute the SQL query
|
|
123
|
+
// Kysely sql.raw returns a builder, we need to execute it.
|
|
124
|
+
const result = await sql.raw(parsedSql).execute(db);
|
|
125
|
+
const rows = result.rows;
|
|
126
|
+
// Check if the query returned any rows or a truthy value
|
|
127
|
+
// Kysely result.rows is array of rows
|
|
128
|
+
return rows.length > 0;
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error(`Error executing custom SQL:`, error);
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// If we reach here, the customSql rule didn't match
|
|
136
|
+
// Continue to the next rule instead of breaking
|
|
137
|
+
continue;
|
|
138
|
+
case 'customFunction':
|
|
139
|
+
if (rule.customFunction) {
|
|
140
|
+
try {
|
|
141
|
+
// Get the function from the registry
|
|
142
|
+
const customFn = rlsFunctionRegistry.get(rule.customFunction);
|
|
143
|
+
if (!customFn) {
|
|
144
|
+
console.error(`Custom RLS function "${rule.customFunction}" not found in registry`);
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
// Execute the custom function with userContext and row data
|
|
148
|
+
const result = await Promise.resolve(customFn(userContext, row, db));
|
|
149
|
+
return !!result;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
console.error(`Error executing custom RLS function "${rule.customFunction}":`, error);
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// If we reach here, the customFunction rule didn't match
|
|
157
|
+
// Continue to the next rule instead of breaking
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Fast path: evaluate pre-extracted fieldCheck rules against a single row.
|
|
165
|
+
* Avoids the full enforcePermissions overhead (permission lookup, rule
|
|
166
|
+
* classification, array handling) when we already know we need a fieldCheck
|
|
167
|
+
* evaluation for one specific record.
|
|
168
|
+
*/
|
|
169
|
+
export async function evaluateFieldCheckForRow(fieldCheckRules, userContext, row, db) {
|
|
170
|
+
for (const rule of fieldCheckRules) {
|
|
171
|
+
if (await evaluatePermission([rule], userContext, row, db)) {
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
const CHUNK_SIZE = 1000;
|
|
178
|
+
export async function enforcePermissions(tableName, operation, userContext, permissionService, rows, db) {
|
|
179
|
+
// Try sync cache lookup first to avoid async overhead on cache hits
|
|
180
|
+
const tablePermissions = (permissionService.getPermissionsForTableSync(tableName) ??
|
|
181
|
+
(await permissionService.getPermissionsForTable(tableName)));
|
|
182
|
+
if (!tablePermissions) {
|
|
183
|
+
return {
|
|
184
|
+
row: rows,
|
|
185
|
+
status: false,
|
|
186
|
+
message: `No permissions defined for table "${tableName}"`,
|
|
187
|
+
hasFieldCheck: false,
|
|
188
|
+
hasCustomFunction: false,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
if (!tablePermissions?.operations?.[operation]) {
|
|
192
|
+
return {
|
|
193
|
+
row: rows,
|
|
194
|
+
status: false,
|
|
195
|
+
message: `No permissions defined for operation "${operation}" on table "${tableName}"`,
|
|
196
|
+
hasFieldCheck: false,
|
|
197
|
+
hasCustomFunction: false,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
const rules = tablePermissions.operations[operation];
|
|
201
|
+
// Early return if no rules
|
|
202
|
+
if (!rules || rules.length === 0) {
|
|
203
|
+
return {
|
|
204
|
+
row: rows,
|
|
205
|
+
status: true,
|
|
206
|
+
hasFieldCheck: false,
|
|
207
|
+
hasCustomFunction: false,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
// Single-pass rule classification (avoids 3× Array.filter)
|
|
211
|
+
const fieldCheckRules = [];
|
|
212
|
+
const customFunctionRules = [];
|
|
213
|
+
const simpleRules = [];
|
|
214
|
+
for (const rule of rules) {
|
|
215
|
+
if (rule.allow === 'fieldCheck')
|
|
216
|
+
fieldCheckRules.push(rule);
|
|
217
|
+
else if (rule.allow === 'customFunction')
|
|
218
|
+
customFunctionRules.push(rule);
|
|
219
|
+
else
|
|
220
|
+
simpleRules.push(rule);
|
|
221
|
+
}
|
|
222
|
+
// First check simple rules that don't need row data
|
|
223
|
+
if (simpleRules.length > 0) {
|
|
224
|
+
// Check each rule and find the first one that grants access
|
|
225
|
+
for (const rule of simpleRules) {
|
|
226
|
+
const hasAccess = await evaluatePermission([rule], userContext, {}, db);
|
|
227
|
+
if (hasAccess) {
|
|
228
|
+
return {
|
|
229
|
+
row: rows,
|
|
230
|
+
status: true,
|
|
231
|
+
hasFieldCheck: false,
|
|
232
|
+
hasCustomFunction: false,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Check customFunction rules if no simple rules matched
|
|
238
|
+
// These need row data like fieldCheck rules
|
|
239
|
+
if (customFunctionRules.length > 0) {
|
|
240
|
+
// If no rows provided but we need to check with custom functions, return early
|
|
241
|
+
if (!rows) {
|
|
242
|
+
return {
|
|
243
|
+
row: undefined,
|
|
244
|
+
status: false,
|
|
245
|
+
hasFieldCheck: false,
|
|
246
|
+
hasCustomFunction: true,
|
|
247
|
+
fieldCheckRules,
|
|
248
|
+
customFunctionRules,
|
|
249
|
+
message: 'Custom function check required, please provide row data',
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
// Handle array of rows
|
|
253
|
+
if (Array.isArray(rows)) {
|
|
254
|
+
const result = [];
|
|
255
|
+
for (let i = 0; i < rows.length; i += CHUNK_SIZE) {
|
|
256
|
+
const chunk = rows.slice(i, i + CHUNK_SIZE);
|
|
257
|
+
// Filter rows based on custom function rules
|
|
258
|
+
const filteredChunk = [];
|
|
259
|
+
for (const row of chunk) {
|
|
260
|
+
// Check each row against all custom function rules
|
|
261
|
+
for (const rule of customFunctionRules) {
|
|
262
|
+
const hasAccess = await evaluatePermission([rule], userContext, row, db);
|
|
263
|
+
if (hasAccess) {
|
|
264
|
+
filteredChunk.push(row);
|
|
265
|
+
break; // Move to the next row once we find a rule that grants access
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
result.push(...filteredChunk);
|
|
270
|
+
}
|
|
271
|
+
// If any rows passed the custom function checks, return success
|
|
272
|
+
if (result.length > 0) {
|
|
273
|
+
return {
|
|
274
|
+
row: result,
|
|
275
|
+
status: true,
|
|
276
|
+
hasFieldCheck: false,
|
|
277
|
+
hasCustomFunction: false,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
// Handle single row
|
|
283
|
+
for (const rule of customFunctionRules) {
|
|
284
|
+
const hasAccess = await evaluatePermission([rule], userContext, rows, db);
|
|
285
|
+
if (hasAccess) {
|
|
286
|
+
return {
|
|
287
|
+
row: rows,
|
|
288
|
+
status: true,
|
|
289
|
+
hasFieldCheck: false,
|
|
290
|
+
hasCustomFunction: false,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// If we reach here, no non-fieldCheck rules passed
|
|
297
|
+
// Check if we have fieldCheck rules
|
|
298
|
+
if (fieldCheckRules.length > 0) {
|
|
299
|
+
// If no rows provided but we need to check fields, return early
|
|
300
|
+
if (!rows) {
|
|
301
|
+
return {
|
|
302
|
+
row: undefined,
|
|
303
|
+
status: false,
|
|
304
|
+
hasFieldCheck: true,
|
|
305
|
+
hasCustomFunction: false,
|
|
306
|
+
fieldCheckRules,
|
|
307
|
+
customFunctionRules,
|
|
308
|
+
message: 'Field-level check required, please provide row data',
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
// Handle array of rows
|
|
312
|
+
if (Array.isArray(rows)) {
|
|
313
|
+
const result = [];
|
|
314
|
+
for (let i = 0; i < rows.length; i += CHUNK_SIZE) {
|
|
315
|
+
const chunk = rows.slice(i, i + CHUNK_SIZE);
|
|
316
|
+
// Filter rows based on field check rules
|
|
317
|
+
const filteredChunk = [];
|
|
318
|
+
for (const row of chunk) {
|
|
319
|
+
// Check each row against all field check rules
|
|
320
|
+
for (const rule of fieldCheckRules) {
|
|
321
|
+
const hasAccess = await evaluatePermission([rule], userContext, row, db);
|
|
322
|
+
if (hasAccess) {
|
|
323
|
+
filteredChunk.push(row);
|
|
324
|
+
break; // Move to the next row once we find a rule that grants access
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
result.push(...filteredChunk);
|
|
329
|
+
}
|
|
330
|
+
return {
|
|
331
|
+
row: result,
|
|
332
|
+
status: result.length > 0,
|
|
333
|
+
hasFieldCheck: false,
|
|
334
|
+
hasCustomFunction: false,
|
|
335
|
+
message: result.length === 0
|
|
336
|
+
? 'No rows matched the field-level permission rules'
|
|
337
|
+
: undefined,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
// Handle single row
|
|
341
|
+
let hasFieldAccess = false;
|
|
342
|
+
for (const rule of fieldCheckRules) {
|
|
343
|
+
hasFieldAccess = await evaluatePermission([rule], userContext, rows, db);
|
|
344
|
+
if (hasFieldAccess)
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
return {
|
|
348
|
+
row: rows,
|
|
349
|
+
status: hasFieldAccess,
|
|
350
|
+
hasFieldCheck: false,
|
|
351
|
+
hasCustomFunction: false,
|
|
352
|
+
message: !hasFieldAccess
|
|
353
|
+
? `User does not have field-level permission to perform operation "${operation}" on table "${tableName}"`
|
|
354
|
+
: undefined,
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
// If we reach here, no rules passed
|
|
358
|
+
return {
|
|
359
|
+
row: rows,
|
|
360
|
+
status: false,
|
|
361
|
+
hasFieldCheck: false,
|
|
362
|
+
hasCustomFunction: false,
|
|
363
|
+
message: `User does not have permission to perform operation "${operation}" on table "${tableName}"`,
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=rlsManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlsManager.js","sourceRoot":"","sources":["../../src/rlsManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Kysely, type Transaction } from 'kysely';
|
|
2
|
+
import type { AddForeignKeyParams, DropForeignKeyParams, ModifySchemaParams } from './types';
|
|
3
|
+
export declare function addForeignKey(params: AddForeignKeyParams, db: Kysely<any>, trx?: Transaction<any>): Promise<{
|
|
4
|
+
message: string;
|
|
5
|
+
}>;
|
|
6
|
+
export declare function dropForeignKey(params: DropForeignKeyParams, db: Kysely<any>, trx?: Transaction<any>): Promise<{
|
|
7
|
+
message: string;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function modifySchema(db: Kysely<any>, params: ModifySchemaParams, trx?: Transaction<any>): Promise<{
|
|
10
|
+
message: string;
|
|
11
|
+
}>;
|
|
12
|
+
export declare function truncateTable(tableName: string, db: Kysely<any>, trx?: Transaction<any>): Promise<{
|
|
13
|
+
message: string;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,WAAW,EAGjB,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAGjB,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,EAC3B,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EACf,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC;;GAmBvB;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,EAC5B,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EACf,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC;;GAwBvB;AAED,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EACf,MAAM,EAAE,kBAAkB,EAC1B,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC;;GA0EvB;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EACf,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC;;GA0BvB"}
|