@edgebasejs/adapter-d1 0.1.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/dist/adapter-d1/src/d1-adapter.d.ts +29 -0
- package/dist/adapter-d1/src/d1-adapter.d.ts.map +1 -0
- package/dist/adapter-d1/src/d1-adapter.js +36 -0
- package/dist/adapter-d1/src/d1-adapter.js.map +1 -0
- package/dist/adapter-d1/src/index.d.ts +3 -0
- package/dist/adapter-d1/src/index.d.ts.map +1 -0
- package/dist/adapter-d1/src/index.js +3 -0
- package/dist/adapter-d1/src/index.js.map +1 -0
- package/dist/adapter-d1/src/schema-to-sql.d.ts +18 -0
- package/dist/adapter-d1/src/schema-to-sql.d.ts.map +1 -0
- package/dist/adapter-d1/src/schema-to-sql.js +304 -0
- package/dist/adapter-d1/src/schema-to-sql.js.map +1 -0
- package/dist/core/src/access-rules/column-security.d.ts +80 -0
- package/dist/core/src/access-rules/column-security.d.ts.map +1 -0
- package/dist/core/src/access-rules/column-security.js +191 -0
- package/dist/core/src/access-rules/column-security.js.map +1 -0
- package/dist/core/src/access-rules/engine.d.ts +26 -0
- package/dist/core/src/access-rules/engine.d.ts.map +1 -0
- package/dist/core/src/access-rules/engine.js +76 -0
- package/dist/core/src/access-rules/engine.js.map +1 -0
- package/dist/core/src/access-rules/index.d.ts +3 -0
- package/dist/core/src/access-rules/index.d.ts.map +1 -0
- package/dist/core/src/access-rules/index.js +3 -0
- package/dist/core/src/access-rules/index.js.map +1 -0
- package/dist/core/src/audit/audit-manager.d.ts +108 -0
- package/dist/core/src/audit/audit-manager.d.ts.map +1 -0
- package/dist/core/src/audit/audit-manager.js +265 -0
- package/dist/core/src/audit/audit-manager.js.map +1 -0
- package/dist/core/src/auth/auth-service.d.ts +71 -0
- package/dist/core/src/auth/auth-service.d.ts.map +1 -0
- package/dist/core/src/auth/auth-service.js +177 -0
- package/dist/core/src/auth/auth-service.js.map +1 -0
- package/dist/core/src/auth/index.d.ts +4 -0
- package/dist/core/src/auth/index.d.ts.map +1 -0
- package/dist/core/src/auth/index.js +4 -0
- package/dist/core/src/auth/index.js.map +1 -0
- package/dist/core/src/encryption/encryption-manager.d.ts +97 -0
- package/dist/core/src/encryption/encryption-manager.d.ts.map +1 -0
- package/dist/core/src/encryption/encryption-manager.js +224 -0
- package/dist/core/src/encryption/encryption-manager.js.map +1 -0
- package/dist/core/src/index.d.ts +16 -0
- package/dist/core/src/index.d.ts.map +1 -0
- package/dist/core/src/index.js +16 -0
- package/dist/core/src/index.js.map +1 -0
- package/dist/core/src/realtime/change-notifier.d.ts +50 -0
- package/dist/core/src/realtime/change-notifier.d.ts.map +1 -0
- package/dist/core/src/realtime/change-notifier.js +145 -0
- package/dist/core/src/realtime/change-notifier.js.map +1 -0
- package/dist/core/src/realtime/message-types.d.ts +39 -0
- package/dist/core/src/realtime/message-types.d.ts.map +1 -0
- package/dist/core/src/realtime/message-types.js +5 -0
- package/dist/core/src/realtime/message-types.js.map +1 -0
- package/dist/core/src/realtime/subscription-manager.d.ts +67 -0
- package/dist/core/src/realtime/subscription-manager.d.ts.map +1 -0
- package/dist/core/src/realtime/subscription-manager.js +229 -0
- package/dist/core/src/realtime/subscription-manager.js.map +1 -0
- package/dist/core/src/search/search-manager.d.ts +93 -0
- package/dist/core/src/search/search-manager.d.ts.map +1 -0
- package/dist/core/src/search/search-manager.js +258 -0
- package/dist/core/src/search/search-manager.js.map +1 -0
- package/dist/core/src/storage/file-manager.d.ts +138 -0
- package/dist/core/src/storage/file-manager.d.ts.map +1 -0
- package/dist/core/src/storage/file-manager.js +224 -0
- package/dist/core/src/storage/file-manager.js.map +1 -0
- package/dist/core/src/sync/batch-processor.d.ts +97 -0
- package/dist/core/src/sync/batch-processor.d.ts.map +1 -0
- package/dist/core/src/sync/batch-processor.js +313 -0
- package/dist/core/src/sync/batch-processor.js.map +1 -0
- package/dist/core/src/sync/csv-processor.d.ts +66 -0
- package/dist/core/src/sync/csv-processor.d.ts.map +1 -0
- package/dist/core/src/sync/csv-processor.js +223 -0
- package/dist/core/src/sync/csv-processor.js.map +1 -0
- package/dist/core/src/sync/index.d.ts +3 -0
- package/dist/core/src/sync/index.d.ts.map +1 -0
- package/dist/core/src/sync/index.js +3 -0
- package/dist/core/src/sync/index.js.map +1 -0
- package/dist/core/src/sync/sync-engine.d.ts +68 -0
- package/dist/core/src/sync/sync-engine.d.ts.map +1 -0
- package/dist/core/src/sync/sync-engine.js +317 -0
- package/dist/core/src/sync/sync-engine.js.map +1 -0
- package/dist/core/src/sync/transaction-manager.d.ts +83 -0
- package/dist/core/src/sync/transaction-manager.d.ts.map +1 -0
- package/dist/core/src/sync/transaction-manager.js +227 -0
- package/dist/core/src/sync/transaction-manager.js.map +1 -0
- package/dist/core/src/webhooks/webhook-manager.d.ts +137 -0
- package/dist/core/src/webhooks/webhook-manager.d.ts.map +1 -0
- package/dist/core/src/webhooks/webhook-manager.js +334 -0
- package/dist/core/src/webhooks/webhook-manager.js.map +1 -0
- package/dist/shared-types/src/admin.d.ts +101 -0
- package/dist/shared-types/src/admin.d.ts.map +1 -0
- package/dist/shared-types/src/admin.js +3 -0
- package/dist/shared-types/src/admin.js.map +1 -0
- package/dist/shared-types/src/auth.d.ts +27 -0
- package/dist/shared-types/src/auth.d.ts.map +1 -0
- package/dist/shared-types/src/auth.js +2 -0
- package/dist/shared-types/src/auth.js.map +1 -0
- package/dist/shared-types/src/index.d.ts +5 -0
- package/dist/shared-types/src/index.d.ts.map +1 -0
- package/dist/shared-types/src/index.js +5 -0
- package/dist/shared-types/src/index.js.map +1 -0
- package/dist/shared-types/src/schema.d.ts +34 -0
- package/dist/shared-types/src/schema.d.ts.map +1 -0
- package/dist/shared-types/src/schema.js +2 -0
- package/dist/shared-types/src/schema.js.map +1 -0
- package/dist/shared-types/src/sync.d.ts +37 -0
- package/dist/shared-types/src/sync.d.ts.map +1 -0
- package/dist/shared-types/src/sync.js +2 -0
- package/dist/shared-types/src/sync.js.map +1 -0
- package/package.json +25 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SyncDatabase } from '@edgebasejs/core';
|
|
2
|
+
/**
|
|
3
|
+
* D1 database adapter that implements the SyncDatabase interface
|
|
4
|
+
* for use with Cloudflare Workers D1 database
|
|
5
|
+
*/
|
|
6
|
+
export declare class D1SyncDatabase implements SyncDatabase {
|
|
7
|
+
private db;
|
|
8
|
+
constructor(db: D1Database);
|
|
9
|
+
/**
|
|
10
|
+
* Get a single row from the database
|
|
11
|
+
*/
|
|
12
|
+
getOne(sql: string, params: any[]): Promise<any>;
|
|
13
|
+
/**
|
|
14
|
+
* Get all matching rows from the database
|
|
15
|
+
*/
|
|
16
|
+
getAll(sql: string, params: any[]): Promise<any[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Execute a SQL statement that doesn't return rows
|
|
19
|
+
*/
|
|
20
|
+
run(sql: string, params: any[]): Promise<any>;
|
|
21
|
+
/**
|
|
22
|
+
* Execute multiple SQL statements in a batch transaction
|
|
23
|
+
*/
|
|
24
|
+
batch(statements: Array<{
|
|
25
|
+
sql: string;
|
|
26
|
+
params?: any[];
|
|
27
|
+
}>): Promise<any[]>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=d1-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"d1-adapter.d.ts","sourceRoot":"","sources":["../../../src/d1-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;GAGG;AACH,qBAAa,cAAe,YAAW,YAAY;IACrC,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,UAAU;IAElC;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAItD;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAKxD;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAInD;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAMhF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D1 database adapter that implements the SyncDatabase interface
|
|
3
|
+
* for use with Cloudflare Workers D1 database
|
|
4
|
+
*/
|
|
5
|
+
export class D1SyncDatabase {
|
|
6
|
+
constructor(db) {
|
|
7
|
+
this.db = db;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Get a single row from the database
|
|
11
|
+
*/
|
|
12
|
+
async getOne(sql, params) {
|
|
13
|
+
return this.db.prepare(sql).bind(...params).first();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get all matching rows from the database
|
|
17
|
+
*/
|
|
18
|
+
async getAll(sql, params) {
|
|
19
|
+
const result = await this.db.prepare(sql).bind(...params).all();
|
|
20
|
+
return result.results || [];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Execute a SQL statement that doesn't return rows
|
|
24
|
+
*/
|
|
25
|
+
async run(sql, params) {
|
|
26
|
+
return this.db.prepare(sql).bind(...params).run();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Execute multiple SQL statements in a batch transaction
|
|
30
|
+
*/
|
|
31
|
+
async batch(statements) {
|
|
32
|
+
const prepared = statements.map(stmt => this.db.prepare(stmt.sql).bind(...(stmt.params || [])));
|
|
33
|
+
return this.db.batch(prepared);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=d1-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"d1-adapter.js","sourceRoot":"","sources":["../../../src/d1-adapter.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,cAAc;IACzB,YAAoB,EAAc;QAAd,OAAE,GAAF,EAAE,CAAY;IAAG,CAAC;IAEtC;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,MAAa;QACrC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,MAAa;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QAChE,OAAO,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,MAAa;QAClC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,UAAkD;QAC5D,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACrC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CACvD,CAAC;QACF,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DatabaseSchema, EntitySchema } from '@edgebasejs/types';
|
|
2
|
+
/**
|
|
3
|
+
* Generate SQL for system tables (users, refresh_tokens, sync_metadata, subscriptions, subscription_filters)
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateSystemTables(): string[];
|
|
6
|
+
/**
|
|
7
|
+
* Generate CREATE TABLE SQL for an entity
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateEntityTable(entityName: string, entitySchema: EntitySchema): string;
|
|
10
|
+
/**
|
|
11
|
+
* Generate CREATE INDEX statements for an entity
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateEntityIndexes(entityName: string, entitySchema: EntitySchema): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Initialize database with system tables and entity tables
|
|
16
|
+
*/
|
|
17
|
+
export declare function initializeDatabase(db: D1Database, schema: DatabaseSchema): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=schema-to-sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-to-sql.d.ts","sourceRoot":"","sources":["../../../src/schema-to-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAa,MAAM,mBAAmB,CAAC;AAEjF;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CA8M/C;AA0BD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,MAAM,CA4C1F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,MAAM,EAAE,CAW9F;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate SQL for system tables (users, refresh_tokens, sync_metadata, subscriptions, subscription_filters)
|
|
3
|
+
*/
|
|
4
|
+
export function generateSystemTables() {
|
|
5
|
+
return [
|
|
6
|
+
`CREATE TABLE IF NOT EXISTS admins (
|
|
7
|
+
id TEXT PRIMARY KEY,
|
|
8
|
+
email TEXT NOT NULL UNIQUE,
|
|
9
|
+
password_hash TEXT NOT NULL,
|
|
10
|
+
role TEXT NOT NULL,
|
|
11
|
+
is_active INTEGER NOT NULL DEFAULT 1,
|
|
12
|
+
created_at INTEGER NOT NULL,
|
|
13
|
+
updated_at INTEGER NOT NULL
|
|
14
|
+
)`,
|
|
15
|
+
`CREATE TABLE IF NOT EXISTS admin_refresh_tokens (
|
|
16
|
+
id TEXT PRIMARY KEY,
|
|
17
|
+
admin_id TEXT NOT NULL,
|
|
18
|
+
token TEXT NOT NULL UNIQUE,
|
|
19
|
+
expires_at INTEGER NOT NULL,
|
|
20
|
+
created_at INTEGER NOT NULL,
|
|
21
|
+
FOREIGN KEY (admin_id) REFERENCES admins(id) ON DELETE CASCADE
|
|
22
|
+
)`,
|
|
23
|
+
`CREATE TABLE IF NOT EXISTS users (
|
|
24
|
+
id TEXT PRIMARY KEY,
|
|
25
|
+
email TEXT NOT NULL UNIQUE,
|
|
26
|
+
password_hash TEXT NOT NULL,
|
|
27
|
+
created_at INTEGER NOT NULL,
|
|
28
|
+
updated_at INTEGER NOT NULL
|
|
29
|
+
)`,
|
|
30
|
+
`CREATE TABLE IF NOT EXISTS refresh_tokens (
|
|
31
|
+
id TEXT PRIMARY KEY,
|
|
32
|
+
user_id TEXT NOT NULL,
|
|
33
|
+
token TEXT NOT NULL UNIQUE,
|
|
34
|
+
expires_at INTEGER NOT NULL,
|
|
35
|
+
created_at INTEGER NOT NULL,
|
|
36
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
37
|
+
)`,
|
|
38
|
+
`CREATE TABLE IF NOT EXISTS sync_metadata (
|
|
39
|
+
entity TEXT NOT NULL,
|
|
40
|
+
record_id TEXT NOT NULL,
|
|
41
|
+
version INTEGER NOT NULL,
|
|
42
|
+
updated_at INTEGER NOT NULL,
|
|
43
|
+
deleted_at INTEGER,
|
|
44
|
+
PRIMARY KEY (entity, record_id)
|
|
45
|
+
)`,
|
|
46
|
+
`CREATE TABLE IF NOT EXISTS subscriptions (
|
|
47
|
+
id TEXT PRIMARY KEY,
|
|
48
|
+
user_id TEXT NOT NULL,
|
|
49
|
+
entity TEXT NOT NULL,
|
|
50
|
+
connection_id TEXT NOT NULL,
|
|
51
|
+
created_at INTEGER NOT NULL,
|
|
52
|
+
last_heartbeat INTEGER NOT NULL,
|
|
53
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
54
|
+
)`,
|
|
55
|
+
`CREATE TABLE IF NOT EXISTS subscription_filters (
|
|
56
|
+
id TEXT PRIMARY KEY,
|
|
57
|
+
subscription_id TEXT NOT NULL,
|
|
58
|
+
filter_key TEXT NOT NULL,
|
|
59
|
+
filter_value TEXT NOT NULL,
|
|
60
|
+
created_at INTEGER NOT NULL,
|
|
61
|
+
FOREIGN KEY (subscription_id) REFERENCES subscriptions(id) ON DELETE CASCADE
|
|
62
|
+
)`,
|
|
63
|
+
`CREATE TABLE IF NOT EXISTS transactions (
|
|
64
|
+
id TEXT PRIMARY KEY,
|
|
65
|
+
user_id TEXT NOT NULL,
|
|
66
|
+
status TEXT NOT NULL,
|
|
67
|
+
isolation_level TEXT NOT NULL,
|
|
68
|
+
created_at INTEGER NOT NULL,
|
|
69
|
+
expires_at INTEGER NOT NULL,
|
|
70
|
+
completed_at INTEGER,
|
|
71
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
72
|
+
)`,
|
|
73
|
+
`CREATE TABLE IF NOT EXISTS transaction_changes (
|
|
74
|
+
id TEXT PRIMARY KEY,
|
|
75
|
+
transaction_id TEXT NOT NULL,
|
|
76
|
+
entity TEXT NOT NULL,
|
|
77
|
+
record_id TEXT NOT NULL,
|
|
78
|
+
operation TEXT NOT NULL,
|
|
79
|
+
data TEXT NOT NULL,
|
|
80
|
+
version INTEGER,
|
|
81
|
+
created_at INTEGER NOT NULL,
|
|
82
|
+
FOREIGN KEY (transaction_id) REFERENCES transactions(id) ON DELETE CASCADE
|
|
83
|
+
)`,
|
|
84
|
+
`CREATE TABLE IF NOT EXISTS column_permissions (
|
|
85
|
+
id TEXT PRIMARY KEY,
|
|
86
|
+
entity TEXT NOT NULL,
|
|
87
|
+
column_name TEXT NOT NULL,
|
|
88
|
+
role TEXT,
|
|
89
|
+
visible INTEGER DEFAULT 1,
|
|
90
|
+
readable INTEGER DEFAULT 1,
|
|
91
|
+
writable INTEGER DEFAULT 1,
|
|
92
|
+
encrypted INTEGER DEFAULT 0,
|
|
93
|
+
mask_value TEXT,
|
|
94
|
+
created_at INTEGER NOT NULL,
|
|
95
|
+
updated_at INTEGER NOT NULL,
|
|
96
|
+
UNIQUE(entity, column_name, role)
|
|
97
|
+
)`,
|
|
98
|
+
`CREATE TABLE IF NOT EXISTS files (
|
|
99
|
+
id TEXT PRIMARY KEY,
|
|
100
|
+
key TEXT NOT NULL UNIQUE,
|
|
101
|
+
file_name TEXT NOT NULL,
|
|
102
|
+
mime_type TEXT NOT NULL,
|
|
103
|
+
size INTEGER NOT NULL,
|
|
104
|
+
user_id TEXT NOT NULL,
|
|
105
|
+
bucket TEXT NOT NULL,
|
|
106
|
+
entity_type TEXT,
|
|
107
|
+
entity_id TEXT,
|
|
108
|
+
is_public INTEGER DEFAULT 0,
|
|
109
|
+
uploaded_at INTEGER NOT NULL,
|
|
110
|
+
expires_at INTEGER,
|
|
111
|
+
checksum TEXT,
|
|
112
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
113
|
+
)`,
|
|
114
|
+
`CREATE TABLE IF NOT EXISTS file_access_tokens (
|
|
115
|
+
token TEXT PRIMARY KEY,
|
|
116
|
+
file_id TEXT NOT NULL,
|
|
117
|
+
user_id TEXT NOT NULL,
|
|
118
|
+
expires_at INTEGER NOT NULL,
|
|
119
|
+
created_at INTEGER NOT NULL,
|
|
120
|
+
FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE,
|
|
121
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
122
|
+
)`,
|
|
123
|
+
`CREATE TABLE IF NOT EXISTS webhooks (
|
|
124
|
+
id TEXT PRIMARY KEY,
|
|
125
|
+
user_id TEXT NOT NULL,
|
|
126
|
+
url TEXT NOT NULL,
|
|
127
|
+
events TEXT NOT NULL,
|
|
128
|
+
secret TEXT NOT NULL,
|
|
129
|
+
is_active INTEGER DEFAULT 1,
|
|
130
|
+
description TEXT,
|
|
131
|
+
headers TEXT,
|
|
132
|
+
created_at INTEGER NOT NULL,
|
|
133
|
+
updated_at INTEGER NOT NULL,
|
|
134
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
135
|
+
)`,
|
|
136
|
+
`CREATE TABLE IF NOT EXISTS webhook_events (
|
|
137
|
+
id TEXT PRIMARY KEY,
|
|
138
|
+
webhook_id TEXT NOT NULL,
|
|
139
|
+
event_type TEXT NOT NULL,
|
|
140
|
+
payload TEXT NOT NULL,
|
|
141
|
+
signature TEXT NOT NULL,
|
|
142
|
+
attempts INTEGER DEFAULT 0,
|
|
143
|
+
max_attempts INTEGER DEFAULT 5,
|
|
144
|
+
next_retry_at INTEGER,
|
|
145
|
+
delivered_at INTEGER,
|
|
146
|
+
failed_at INTEGER,
|
|
147
|
+
error TEXT,
|
|
148
|
+
created_at INTEGER NOT NULL,
|
|
149
|
+
FOREIGN KEY (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE
|
|
150
|
+
)`,
|
|
151
|
+
`CREATE TABLE IF NOT EXISTS webhook_deliveries (
|
|
152
|
+
id TEXT PRIMARY KEY,
|
|
153
|
+
webhook_id TEXT NOT NULL,
|
|
154
|
+
event_id TEXT NOT NULL,
|
|
155
|
+
url TEXT NOT NULL,
|
|
156
|
+
event_type TEXT NOT NULL,
|
|
157
|
+
status_code INTEGER,
|
|
158
|
+
response_body TEXT,
|
|
159
|
+
error TEXT,
|
|
160
|
+
duration INTEGER NOT NULL,
|
|
161
|
+
created_at INTEGER NOT NULL,
|
|
162
|
+
FOREIGN KEY (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE,
|
|
163
|
+
FOREIGN KEY (event_id) REFERENCES webhook_events(id) ON DELETE CASCADE
|
|
164
|
+
)`,
|
|
165
|
+
`CREATE TABLE IF NOT EXISTS audit_logs (
|
|
166
|
+
id TEXT PRIMARY KEY,
|
|
167
|
+
user_id TEXT NOT NULL,
|
|
168
|
+
entity TEXT NOT NULL,
|
|
169
|
+
record_id TEXT NOT NULL,
|
|
170
|
+
operation TEXT NOT NULL,
|
|
171
|
+
before_data TEXT,
|
|
172
|
+
after_data TEXT,
|
|
173
|
+
changes TEXT,
|
|
174
|
+
metadata TEXT,
|
|
175
|
+
created_at INTEGER NOT NULL,
|
|
176
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
177
|
+
)`,
|
|
178
|
+
`CREATE INDEX IF NOT EXISTS idx_sync_metadata_updated ON sync_metadata(entity, updated_at)`,
|
|
179
|
+
`CREATE INDEX IF NOT EXISTS idx_admin_refresh_tokens_admin ON admin_refresh_tokens(admin_id)`,
|
|
180
|
+
`CREATE INDEX IF NOT EXISTS idx_admin_refresh_tokens_token ON admin_refresh_tokens(token)`,
|
|
181
|
+
`CREATE INDEX IF NOT EXISTS idx_refresh_tokens_user ON refresh_tokens(user_id)`,
|
|
182
|
+
`CREATE INDEX IF NOT EXISTS idx_refresh_tokens_token ON refresh_tokens(token)`,
|
|
183
|
+
`CREATE INDEX IF NOT EXISTS idx_subscriptions_user ON subscriptions(user_id)`,
|
|
184
|
+
`CREATE INDEX IF NOT EXISTS idx_subscriptions_entity ON subscriptions(entity)`,
|
|
185
|
+
`CREATE INDEX IF NOT EXISTS idx_subscriptions_connection ON subscriptions(connection_id)`,
|
|
186
|
+
`CREATE INDEX IF NOT EXISTS idx_subscription_filters_subscription ON subscription_filters(subscription_id)`,
|
|
187
|
+
`CREATE INDEX IF NOT EXISTS idx_transactions_user ON transactions(user_id)`,
|
|
188
|
+
`CREATE INDEX IF NOT EXISTS idx_transactions_status ON transactions(status)`,
|
|
189
|
+
`CREATE INDEX IF NOT EXISTS idx_transaction_changes_transaction ON transaction_changes(transaction_id)`,
|
|
190
|
+
`CREATE INDEX IF NOT EXISTS idx_transaction_changes_entity ON transaction_changes(entity, record_id)`,
|
|
191
|
+
`CREATE INDEX IF NOT EXISTS idx_column_permissions_entity ON column_permissions(entity)`,
|
|
192
|
+
`CREATE INDEX IF NOT EXISTS idx_column_permissions_entity_column ON column_permissions(entity, column_name)`,
|
|
193
|
+
`CREATE INDEX IF NOT EXISTS idx_files_user ON files(user_id)`,
|
|
194
|
+
`CREATE INDEX IF NOT EXISTS idx_files_entity ON files(entity_type, entity_id)`,
|
|
195
|
+
`CREATE INDEX IF NOT EXISTS idx_files_expires ON files(expires_at)`,
|
|
196
|
+
`CREATE INDEX IF NOT EXISTS idx_file_access_tokens_file ON file_access_tokens(file_id)`,
|
|
197
|
+
`CREATE INDEX IF NOT EXISTS idx_file_access_tokens_expires ON file_access_tokens(expires_at)`,
|
|
198
|
+
`CREATE INDEX IF NOT EXISTS idx_webhooks_user ON webhooks(user_id)`,
|
|
199
|
+
`CREATE INDEX IF NOT EXISTS idx_webhooks_active ON webhooks(is_active)`,
|
|
200
|
+
`CREATE INDEX IF NOT EXISTS idx_webhook_events_webhook ON webhook_events(webhook_id)`,
|
|
201
|
+
`CREATE INDEX IF NOT EXISTS idx_webhook_events_status ON webhook_events(delivered_at, failed_at, next_retry_at)`,
|
|
202
|
+
`CREATE INDEX IF NOT EXISTS idx_webhook_deliveries_webhook ON webhook_deliveries(webhook_id)`,
|
|
203
|
+
`CREATE INDEX IF NOT EXISTS idx_webhook_deliveries_event ON webhook_deliveries(event_id)`,
|
|
204
|
+
`CREATE INDEX IF NOT EXISTS idx_audit_logs_user ON audit_logs(user_id)`,
|
|
205
|
+
`CREATE INDEX IF NOT EXISTS idx_audit_logs_entity ON audit_logs(entity)`,
|
|
206
|
+
`CREATE INDEX IF NOT EXISTS idx_audit_logs_record ON audit_logs(entity, record_id)`,
|
|
207
|
+
`CREATE INDEX IF NOT EXISTS idx_audit_logs_created ON audit_logs(created_at)`,
|
|
208
|
+
`CREATE INDEX IF NOT EXISTS idx_audit_logs_operation ON audit_logs(operation)`
|
|
209
|
+
];
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Map EdgeBase field types to SQLite types
|
|
213
|
+
*/
|
|
214
|
+
function mapFieldTypeToSQL(fieldType) {
|
|
215
|
+
switch (fieldType.type) {
|
|
216
|
+
case 'string':
|
|
217
|
+
case 'text':
|
|
218
|
+
return 'TEXT';
|
|
219
|
+
case 'integer':
|
|
220
|
+
case 'timestamp':
|
|
221
|
+
return 'INTEGER';
|
|
222
|
+
case 'number':
|
|
223
|
+
return 'REAL';
|
|
224
|
+
case 'boolean':
|
|
225
|
+
return 'INTEGER'; // SQLite uses 0/1 for boolean
|
|
226
|
+
case 'json':
|
|
227
|
+
return 'TEXT'; // Store JSON as text
|
|
228
|
+
case 'reference':
|
|
229
|
+
return 'TEXT'; // Store references as text IDs
|
|
230
|
+
default:
|
|
231
|
+
return 'TEXT';
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Generate CREATE TABLE SQL for an entity
|
|
236
|
+
*/
|
|
237
|
+
export function generateEntityTable(entityName, entitySchema) {
|
|
238
|
+
const columns = [];
|
|
239
|
+
const constraints = [];
|
|
240
|
+
// Add fields from schema
|
|
241
|
+
for (const [fieldName, fieldType] of Object.entries(entitySchema.fields)) {
|
|
242
|
+
const sqlType = mapFieldTypeToSQL(fieldType);
|
|
243
|
+
const parts = [fieldName, sqlType];
|
|
244
|
+
// Primary key
|
|
245
|
+
if (fieldType.primary) {
|
|
246
|
+
parts.push('PRIMARY KEY');
|
|
247
|
+
}
|
|
248
|
+
// Required fields
|
|
249
|
+
if (fieldType.required && !fieldType.primary) {
|
|
250
|
+
parts.push('NOT NULL');
|
|
251
|
+
}
|
|
252
|
+
// Default values
|
|
253
|
+
if (fieldType.default !== undefined) {
|
|
254
|
+
if (typeof fieldType.default === 'string') {
|
|
255
|
+
parts.push(`DEFAULT '${fieldType.default}'`);
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
parts.push(`DEFAULT ${fieldType.default}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
columns.push(parts.join(' '));
|
|
262
|
+
// Foreign key constraints
|
|
263
|
+
if (fieldType.type === 'reference' && fieldType.reference) {
|
|
264
|
+
constraints.push(`FOREIGN KEY (${fieldName}) REFERENCES ${fieldType.reference}(id) ON DELETE CASCADE`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Combine columns and constraints
|
|
268
|
+
const allColumns = [...columns, ...constraints].join(',\n ');
|
|
269
|
+
return `CREATE TABLE IF NOT EXISTS ${entityName} (
|
|
270
|
+
${allColumns}
|
|
271
|
+
)`;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Generate CREATE INDEX statements for an entity
|
|
275
|
+
*/
|
|
276
|
+
export function generateEntityIndexes(entityName, entitySchema) {
|
|
277
|
+
if (!entitySchema.indexes || entitySchema.indexes.length === 0) {
|
|
278
|
+
return [];
|
|
279
|
+
}
|
|
280
|
+
return entitySchema.indexes.map((index, i) => {
|
|
281
|
+
const indexName = `idx_${entityName}_${index.fields.join('_')}`;
|
|
282
|
+
const unique = index.unique ? 'UNIQUE ' : '';
|
|
283
|
+
const fields = index.fields.join(', ');
|
|
284
|
+
return `CREATE ${unique}INDEX IF NOT EXISTS ${indexName} ON ${entityName}(${fields})`;
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Initialize database with system tables and entity tables
|
|
289
|
+
*/
|
|
290
|
+
export async function initializeDatabase(db, schema) {
|
|
291
|
+
const statements = [];
|
|
292
|
+
// Add system tables
|
|
293
|
+
statements.push(...generateSystemTables());
|
|
294
|
+
// Add entity tables
|
|
295
|
+
for (const [entityName, entitySchema] of Object.entries(schema.entities)) {
|
|
296
|
+
statements.push(generateEntityTable(entityName, entitySchema));
|
|
297
|
+
statements.push(...generateEntityIndexes(entityName, entitySchema));
|
|
298
|
+
}
|
|
299
|
+
// Execute all statements
|
|
300
|
+
for (const sql of statements) {
|
|
301
|
+
await db.prepare(sql).run();
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=schema-to-sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-to-sql.js","sourceRoot":"","sources":["../../../src/schema-to-sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Column-level security for field access control
|
|
3
|
+
* Supports role-based visibility and selective field encryption
|
|
4
|
+
*/
|
|
5
|
+
import type { User } from '@edgebasejs/types';
|
|
6
|
+
export interface ColumnRule {
|
|
7
|
+
column: string;
|
|
8
|
+
visible?: boolean | ((context: ColumnAccessContext) => boolean | Promise<boolean>);
|
|
9
|
+
readable?: boolean | ((context: ColumnAccessContext) => boolean | Promise<boolean>);
|
|
10
|
+
writable?: boolean | ((context: ColumnAccessContext) => boolean | Promise<boolean>);
|
|
11
|
+
roles?: string[];
|
|
12
|
+
encrypted?: boolean;
|
|
13
|
+
maskValue?: any;
|
|
14
|
+
}
|
|
15
|
+
export interface ColumnAccessContext {
|
|
16
|
+
user: User;
|
|
17
|
+
operation: 'read' | 'write' | 'create' | 'update';
|
|
18
|
+
record?: Record<string, any>;
|
|
19
|
+
column: string;
|
|
20
|
+
value?: any;
|
|
21
|
+
}
|
|
22
|
+
export interface ColumnSecurityRules {
|
|
23
|
+
entity: string;
|
|
24
|
+
columns: Map<string, ColumnRule>;
|
|
25
|
+
defaultVisible?: boolean;
|
|
26
|
+
defaultReadable?: boolean;
|
|
27
|
+
defaultWritable?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Column-level security manager
|
|
31
|
+
*/
|
|
32
|
+
export declare class ColumnSecurityManager {
|
|
33
|
+
private rules;
|
|
34
|
+
/**
|
|
35
|
+
* Register column security rules for an entity
|
|
36
|
+
*/
|
|
37
|
+
registerRules(entityName: string, rules: ColumnSecurityRules): void;
|
|
38
|
+
/**
|
|
39
|
+
* Get rules for an entity
|
|
40
|
+
*/
|
|
41
|
+
getRules(entityName: string): ColumnSecurityRules | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Check if a user can read a specific column
|
|
44
|
+
*/
|
|
45
|
+
canReadColumn(entityName: string, columnName: string, user: User, record?: Record<string, any>): Promise<boolean>;
|
|
46
|
+
/**
|
|
47
|
+
* Check if a user can write to a specific column
|
|
48
|
+
*/
|
|
49
|
+
canWriteColumn(entityName: string, columnName: string, user: User, value?: any, record?: Record<string, any>): Promise<boolean>;
|
|
50
|
+
/**
|
|
51
|
+
* Filter record columns based on read permissions
|
|
52
|
+
* Returns a new record with only accessible columns
|
|
53
|
+
*/
|
|
54
|
+
filterReadableColumns(entityName: string, record: Record<string, any>, user: User): Promise<Record<string, any>>;
|
|
55
|
+
/**
|
|
56
|
+
* Filter write data based on write permissions
|
|
57
|
+
* Returns a new object with only writable columns
|
|
58
|
+
*/
|
|
59
|
+
filterWritableColumns(entityName: string, data: Record<string, any>, user: User, existingRecord?: Record<string, any>): Promise<{
|
|
60
|
+
filtered: Record<string, any>;
|
|
61
|
+
rejected: string[];
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* Get list of encrypted columns for an entity
|
|
65
|
+
*/
|
|
66
|
+
getEncryptedColumns(entityName: string): string[];
|
|
67
|
+
/**
|
|
68
|
+
* Get all column rules for an entity
|
|
69
|
+
*/
|
|
70
|
+
getAllColumnRules(entityName: string): Map<string, ColumnRule> | undefined;
|
|
71
|
+
/**
|
|
72
|
+
* Clear all rules
|
|
73
|
+
*/
|
|
74
|
+
clear(): void;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Global column security manager instance
|
|
78
|
+
*/
|
|
79
|
+
export declare const columnSecurityManager: ColumnSecurityManager;
|
|
80
|
+
//# sourceMappingURL=column-security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-security.d.ts","sourceRoot":"","sources":["../../../../../core/src/access-rules/column-security.ts"],"names":[],"mappings":"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"}
|