@edgebasejs/core 0.1.8 → 0.1.9
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/README.md +15 -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.map +1 -1
- package/dist/core/src/access-rules/engine.js +2 -1
- package/dist/core/src/access-rules/engine.js.map +1 -1
- 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/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 +12 -0
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/index.js +12 -0
- package/dist/core/src/index.js.map +1 -1
- 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/sync-engine.d.ts +22 -0
- package/dist/core/src/sync/sync-engine.d.ts.map +1 -1
- package/dist/core/src/sync/sync-engine.js +123 -10
- package/dist/core/src/sync/sync-engine.js.map +1 -1
- 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/package.json +2 -2
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch processing for multiple CRUD operations
|
|
3
|
+
* Supports atomic transactions and individual operation processing
|
|
4
|
+
*/
|
|
5
|
+
import type { User } from '@edgebasejs/types';
|
|
6
|
+
import { EncryptionManager } from '../encryption/encryption-manager';
|
|
7
|
+
import type { SyncDatabase, EntitySchema } from './sync-engine';
|
|
8
|
+
export interface BatchOperation {
|
|
9
|
+
entity: string;
|
|
10
|
+
id: string;
|
|
11
|
+
operation: 'create' | 'update' | 'delete';
|
|
12
|
+
data?: Record<string, any>;
|
|
13
|
+
version?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface BatchRequest {
|
|
16
|
+
create?: BatchOperation[];
|
|
17
|
+
update?: BatchOperation[];
|
|
18
|
+
delete?: BatchOperation[];
|
|
19
|
+
atomic?: boolean;
|
|
20
|
+
isolationLevel?: 'READ_UNCOMMITTED' | 'READ_COMMITTED' | 'SERIALIZABLE';
|
|
21
|
+
}
|
|
22
|
+
export interface BatchResult {
|
|
23
|
+
applied: Array<BatchOperation & {
|
|
24
|
+
version: number;
|
|
25
|
+
serverTimestamp: number;
|
|
26
|
+
}>;
|
|
27
|
+
conflicts: Array<{
|
|
28
|
+
entity: string;
|
|
29
|
+
id: string;
|
|
30
|
+
operation: string;
|
|
31
|
+
clientVersion?: number;
|
|
32
|
+
serverVersion: number;
|
|
33
|
+
serverData: Record<string, any>;
|
|
34
|
+
}>;
|
|
35
|
+
errors: Array<{
|
|
36
|
+
entity: string;
|
|
37
|
+
id: string;
|
|
38
|
+
operation: string;
|
|
39
|
+
error: string;
|
|
40
|
+
code: string;
|
|
41
|
+
}>;
|
|
42
|
+
appliedCount: number;
|
|
43
|
+
conflictCount: number;
|
|
44
|
+
errorCount: number;
|
|
45
|
+
}
|
|
46
|
+
export interface BatchProcessorOptions {
|
|
47
|
+
schemas: Map<string, EntitySchema>;
|
|
48
|
+
db: SyncDatabase;
|
|
49
|
+
user: User;
|
|
50
|
+
maxBatchSize?: number;
|
|
51
|
+
encryption?: EncryptionManager;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Batch processor for handling multiple CRUD operations
|
|
55
|
+
*/
|
|
56
|
+
export declare class BatchProcessor {
|
|
57
|
+
private schemas;
|
|
58
|
+
private db;
|
|
59
|
+
private user;
|
|
60
|
+
private serverTimestamp;
|
|
61
|
+
private maxBatchSize;
|
|
62
|
+
private encryption?;
|
|
63
|
+
constructor(options: BatchProcessorOptions);
|
|
64
|
+
/**
|
|
65
|
+
* Process a batch of operations
|
|
66
|
+
*/
|
|
67
|
+
processBatch(request: BatchRequest): Promise<BatchResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Process batch atomically - all succeed or all fail
|
|
70
|
+
*/
|
|
71
|
+
private processBatchAtomic;
|
|
72
|
+
/**
|
|
73
|
+
* Process batch operations individually
|
|
74
|
+
*/
|
|
75
|
+
private processBatchIndividual;
|
|
76
|
+
/**
|
|
77
|
+
* Validate a single operation
|
|
78
|
+
*/
|
|
79
|
+
private validateOperation;
|
|
80
|
+
/**
|
|
81
|
+
* Check access rules for operation
|
|
82
|
+
*/
|
|
83
|
+
private checkAccess;
|
|
84
|
+
/**
|
|
85
|
+
* Check for conflicts (version mismatch)
|
|
86
|
+
*/
|
|
87
|
+
private checkConflict;
|
|
88
|
+
/**
|
|
89
|
+
* Get current version for an entity record
|
|
90
|
+
*/
|
|
91
|
+
private getVersion;
|
|
92
|
+
/**
|
|
93
|
+
* Prepare SQL statements for an operation
|
|
94
|
+
*/
|
|
95
|
+
private prepareStatements;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=batch-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-processor.d.ts","sourceRoot":"","sources":["../../../../src/sync/batch-processor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAe,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,kBAAkB,GAAG,gBAAgB,GAAG,cAAc,CAAC;CACzE;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC,cAAc,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9E,SAAS,EAAE,KAAK,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACjC,CAAC,CAAC;IACH,MAAM,EAAE,KAAK,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACnC,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,EAAE,CAAe;IACzB,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAoB;gBAE3B,OAAO,EAAE,qBAAqB;IAS1C;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAwC/D;;OAEG;YACW,kBAAkB;IAwEhC;;OAEG;YACW,sBAAsB;IAgFpC;;OAEG;YACW,iBAAiB;IAqB/B;;OAEG;YACW,WAAW;IA6BzB;;OAEG;YACW,aAAa;IAyB3B;;OAEG;YACW,UAAU;IAQxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAyD1B"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch processing for multiple CRUD operations
|
|
3
|
+
* Supports atomic transactions and individual operation processing
|
|
4
|
+
*/
|
|
5
|
+
import { AccessRulesEngine } from '../access-rules/engine';
|
|
6
|
+
/**
|
|
7
|
+
* Batch processor for handling multiple CRUD operations
|
|
8
|
+
*/
|
|
9
|
+
export class BatchProcessor {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.schemas = options.schemas;
|
|
12
|
+
this.db = options.db;
|
|
13
|
+
this.user = options.user;
|
|
14
|
+
this.serverTimestamp = Date.now();
|
|
15
|
+
this.maxBatchSize = options.maxBatchSize || 1000;
|
|
16
|
+
this.encryption = options.encryption;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Process a batch of operations
|
|
20
|
+
*/
|
|
21
|
+
async processBatch(request) {
|
|
22
|
+
const result = {
|
|
23
|
+
applied: [],
|
|
24
|
+
conflicts: [],
|
|
25
|
+
errors: [],
|
|
26
|
+
appliedCount: 0,
|
|
27
|
+
conflictCount: 0,
|
|
28
|
+
errorCount: 0,
|
|
29
|
+
};
|
|
30
|
+
// Collect all operations
|
|
31
|
+
const allOperations = [];
|
|
32
|
+
allOperations.push(...(request.create || []));
|
|
33
|
+
allOperations.push(...(request.update || []));
|
|
34
|
+
allOperations.push(...(request.delete || []));
|
|
35
|
+
// Check batch size
|
|
36
|
+
if (allOperations.length > this.maxBatchSize) {
|
|
37
|
+
result.errors.push({
|
|
38
|
+
entity: '',
|
|
39
|
+
id: '',
|
|
40
|
+
operation: 'batch',
|
|
41
|
+
error: `Batch size (${allOperations.length}) exceeds maximum (${this.maxBatchSize})`,
|
|
42
|
+
code: 'BATCH_TOO_LARGE',
|
|
43
|
+
});
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
if (allOperations.length === 0) {
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
// Process atomically or individually
|
|
50
|
+
if (request.atomic) {
|
|
51
|
+
return this.processBatchAtomic(allOperations, request, result);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
return this.processBatchIndividual(allOperations, request, result);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Process batch atomically - all succeed or all fail
|
|
59
|
+
*/
|
|
60
|
+
async processBatchAtomic(operations, request, result) {
|
|
61
|
+
const statements = [];
|
|
62
|
+
const operationMap = new Map();
|
|
63
|
+
try {
|
|
64
|
+
// Validate and prepare all operations
|
|
65
|
+
for (const op of operations) {
|
|
66
|
+
const key = `${op.entity}:${op.id}`;
|
|
67
|
+
operationMap.set(key, op);
|
|
68
|
+
// Validate operation
|
|
69
|
+
const validation = await this.validateOperation(op);
|
|
70
|
+
if (validation.error) {
|
|
71
|
+
throw new Error(`Operation validation failed for ${key}: ${validation.error}`);
|
|
72
|
+
}
|
|
73
|
+
// Check access rules
|
|
74
|
+
const accessCheck = await this.checkAccess(op);
|
|
75
|
+
if (!accessCheck.allowed) {
|
|
76
|
+
throw new Error(`Access denied for ${key}: ${accessCheck.reason}`);
|
|
77
|
+
}
|
|
78
|
+
// Check conflicts
|
|
79
|
+
const conflictCheck = await this.checkConflict(op);
|
|
80
|
+
if (conflictCheck.hasConflict) {
|
|
81
|
+
throw new Error(`Conflict detected for ${key}`);
|
|
82
|
+
}
|
|
83
|
+
// Prepare SQL statements
|
|
84
|
+
const preparedStatements = this.prepareStatements(op);
|
|
85
|
+
statements.push(...preparedStatements);
|
|
86
|
+
}
|
|
87
|
+
// Execute all statements atomically
|
|
88
|
+
if (statements.length > 0) {
|
|
89
|
+
await this.db.batch(statements);
|
|
90
|
+
}
|
|
91
|
+
// Add all operations to applied list
|
|
92
|
+
let version = 1;
|
|
93
|
+
for (const op of operations) {
|
|
94
|
+
const currentVersion = (await this.getVersion(op.entity, op.id)) || 0;
|
|
95
|
+
result.applied.push({
|
|
96
|
+
...op,
|
|
97
|
+
version: currentVersion + 1,
|
|
98
|
+
serverTimestamp: this.serverTimestamp,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
result.appliedCount = result.applied.length;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
// Atomic transaction failed - return error
|
|
105
|
+
const errorMsg = error instanceof Error ? error.message : 'Atomic batch failed';
|
|
106
|
+
for (const op of operations) {
|
|
107
|
+
result.errors.push({
|
|
108
|
+
entity: op.entity,
|
|
109
|
+
id: op.id,
|
|
110
|
+
operation: op.operation,
|
|
111
|
+
error: errorMsg,
|
|
112
|
+
code: 'ATOMIC_BATCH_FAILED',
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
result.errorCount = result.errors.length;
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Process batch operations individually
|
|
121
|
+
*/
|
|
122
|
+
async processBatchIndividual(operations, request, result) {
|
|
123
|
+
for (const op of operations) {
|
|
124
|
+
try {
|
|
125
|
+
// Validate operation
|
|
126
|
+
const validation = await this.validateOperation(op);
|
|
127
|
+
if (validation.error) {
|
|
128
|
+
result.errors.push({
|
|
129
|
+
entity: op.entity,
|
|
130
|
+
id: op.id,
|
|
131
|
+
operation: op.operation,
|
|
132
|
+
error: validation.error,
|
|
133
|
+
code: 'VALIDATION_ERROR',
|
|
134
|
+
});
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
// Check access rules
|
|
138
|
+
const accessCheck = await this.checkAccess(op);
|
|
139
|
+
if (!accessCheck.allowed) {
|
|
140
|
+
result.errors.push({
|
|
141
|
+
entity: op.entity,
|
|
142
|
+
id: op.id,
|
|
143
|
+
operation: op.operation,
|
|
144
|
+
error: accessCheck.reason || 'Access denied',
|
|
145
|
+
code: 'ACCESS_DENIED',
|
|
146
|
+
});
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
// Check for conflicts
|
|
150
|
+
const conflictCheck = await this.checkConflict(op);
|
|
151
|
+
if (conflictCheck.hasConflict) {
|
|
152
|
+
result.conflicts.push({
|
|
153
|
+
entity: op.entity,
|
|
154
|
+
id: op.id,
|
|
155
|
+
operation: op.operation,
|
|
156
|
+
clientVersion: op.version,
|
|
157
|
+
serverVersion: conflictCheck.serverVersion || 0,
|
|
158
|
+
serverData: conflictCheck.serverData || {},
|
|
159
|
+
});
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
// Apply operation
|
|
163
|
+
const currentVersion = (await this.getVersion(op.entity, op.id)) || 0;
|
|
164
|
+
const newVersion = currentVersion + 1;
|
|
165
|
+
const statements = this.prepareStatements(op, newVersion);
|
|
166
|
+
if (statements.length > 0) {
|
|
167
|
+
await this.db.batch(statements);
|
|
168
|
+
}
|
|
169
|
+
result.applied.push({
|
|
170
|
+
...op,
|
|
171
|
+
version: newVersion,
|
|
172
|
+
serverTimestamp: this.serverTimestamp,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
const errorMsg = error instanceof Error ? error.message : 'Processing failed';
|
|
177
|
+
result.errors.push({
|
|
178
|
+
entity: op.entity,
|
|
179
|
+
id: op.id,
|
|
180
|
+
operation: op.operation,
|
|
181
|
+
error: errorMsg,
|
|
182
|
+
code: 'PROCESSING_ERROR',
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
result.appliedCount = result.applied.length;
|
|
187
|
+
result.conflictCount = result.conflicts.length;
|
|
188
|
+
result.errorCount = result.errors.length;
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Validate a single operation
|
|
193
|
+
*/
|
|
194
|
+
async validateOperation(op) {
|
|
195
|
+
if (!op.entity) {
|
|
196
|
+
return { error: 'Missing entity' };
|
|
197
|
+
}
|
|
198
|
+
if (!op.id) {
|
|
199
|
+
return { error: 'Missing record id' };
|
|
200
|
+
}
|
|
201
|
+
if ((op.operation === 'create' || op.operation === 'update') && (!op.data || typeof op.data !== 'object')) {
|
|
202
|
+
return { error: 'Missing data' };
|
|
203
|
+
}
|
|
204
|
+
const schema = this.schemas.get(op.entity);
|
|
205
|
+
if (!schema) {
|
|
206
|
+
return { error: 'Unknown entity' };
|
|
207
|
+
}
|
|
208
|
+
return {};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Check access rules for operation
|
|
212
|
+
*/
|
|
213
|
+
async checkAccess(op) {
|
|
214
|
+
const schema = this.schemas.get(op.entity);
|
|
215
|
+
if (!schema) {
|
|
216
|
+
return { allowed: false, reason: 'Unknown entity' };
|
|
217
|
+
}
|
|
218
|
+
const accessContext = {
|
|
219
|
+
user: this.user,
|
|
220
|
+
operation: op.operation,
|
|
221
|
+
data: op.data ?? {},
|
|
222
|
+
};
|
|
223
|
+
// Get existing data for update/delete operations
|
|
224
|
+
if (op.operation === 'update' || op.operation === 'delete') {
|
|
225
|
+
const existing = await this.db.getOne(`SELECT * FROM ${op.entity} WHERE id = ?`, [op.id]);
|
|
226
|
+
if (existing) {
|
|
227
|
+
accessContext.existingData = existing;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Evaluate access rules
|
|
231
|
+
const accessDecision = await AccessRulesEngine.evaluate(accessContext, schema.accessRules);
|
|
232
|
+
return {
|
|
233
|
+
allowed: accessDecision.allowed,
|
|
234
|
+
reason: accessDecision.reason,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Check for conflicts (version mismatch)
|
|
239
|
+
*/
|
|
240
|
+
async checkConflict(op) {
|
|
241
|
+
const metadata = await this.db.getOne('SELECT version FROM sync_metadata WHERE entity = ? AND record_id = ?', [op.entity, op.id]);
|
|
242
|
+
const serverVersion = metadata?.version || 0;
|
|
243
|
+
// Check if operation version matches server version
|
|
244
|
+
if (metadata && op.version !== undefined && op.version !== serverVersion) {
|
|
245
|
+
const serverData = await this.db.getOne(`SELECT * FROM ${op.entity} WHERE id = ?`, [op.id]);
|
|
246
|
+
return {
|
|
247
|
+
hasConflict: true,
|
|
248
|
+
serverVersion,
|
|
249
|
+
serverData: serverData || {},
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
return { hasConflict: false, serverVersion };
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get current version for an entity record
|
|
256
|
+
*/
|
|
257
|
+
async getVersion(entity, recordId) {
|
|
258
|
+
const metadata = await this.db.getOne('SELECT version FROM sync_metadata WHERE entity = ? AND record_id = ?', [entity, recordId]);
|
|
259
|
+
return metadata?.version ?? null;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Prepare SQL statements for an operation
|
|
263
|
+
*/
|
|
264
|
+
prepareStatements(op, version) {
|
|
265
|
+
const now = Date.now();
|
|
266
|
+
const finalVersion = version !== undefined ? version : 1;
|
|
267
|
+
const statements = [];
|
|
268
|
+
switch (op.operation) {
|
|
269
|
+
case 'create': {
|
|
270
|
+
const columns = ['id', ...Object.keys(op.data || {})];
|
|
271
|
+
const values = [op.id, ...Object.values(op.data || {})];
|
|
272
|
+
const placeholders = columns.map(() => '?').join(', ');
|
|
273
|
+
statements.push({
|
|
274
|
+
sql: `INSERT INTO ${op.entity} (${columns.join(', ')}) VALUES (${placeholders})`,
|
|
275
|
+
params: values,
|
|
276
|
+
});
|
|
277
|
+
statements.push({
|
|
278
|
+
sql: 'INSERT OR REPLACE INTO sync_metadata (entity, record_id, version, updated_at) VALUES (?, ?, ?, ?)',
|
|
279
|
+
params: [op.entity, op.id, finalVersion, now],
|
|
280
|
+
});
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
case 'update': {
|
|
284
|
+
const updates = Object.entries(op.data || {})
|
|
285
|
+
.map(([key]) => `${key} = ?`)
|
|
286
|
+
.join(', ');
|
|
287
|
+
const values = [...Object.values(op.data || {}), op.id];
|
|
288
|
+
statements.push({
|
|
289
|
+
sql: `UPDATE ${op.entity} SET ${updates} WHERE id = ?`,
|
|
290
|
+
params: values,
|
|
291
|
+
});
|
|
292
|
+
statements.push({
|
|
293
|
+
sql: 'INSERT OR REPLACE INTO sync_metadata (entity, record_id, version, updated_at) VALUES (?, ?, ?, ?)',
|
|
294
|
+
params: [op.entity, op.id, finalVersion, now],
|
|
295
|
+
});
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
case 'delete': {
|
|
299
|
+
statements.push({
|
|
300
|
+
sql: `DELETE FROM ${op.entity} WHERE id = ?`,
|
|
301
|
+
params: [op.id],
|
|
302
|
+
});
|
|
303
|
+
statements.push({
|
|
304
|
+
sql: 'DELETE FROM sync_metadata WHERE entity = ? AND record_id = ?',
|
|
305
|
+
params: [op.entity, op.id],
|
|
306
|
+
});
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return statements;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=batch-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-processor.js","sourceRoot":"","sources":["../../../../src/sync/batch-processor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAsB,MAAM,wBAAwB,CAAC;AAkD/E;;GAEG;AACH,MAAM,OAAO,cAAc;IAQzB,YAAY,OAA8B;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;QACjD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAqB;QACtC,MAAM,MAAM,GAAgB;YAC1B,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,UAAU,EAAE,CAAC;SACd,CAAC;QAEF,yBAAyB;QACzB,MAAM,aAAa,GAAqB,EAAE,CAAC;QAC3C,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QAE9C,mBAAmB;QACnB,IAAI,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,MAAM,EAAE,EAAE;gBACV,EAAE,EAAE,EAAE;gBACN,SAAS,EAAE,OAAO;gBAClB,KAAK,EAAE,eAAe,aAAa,CAAC,MAAM,sBAAsB,IAAI,CAAC,YAAY,GAAG;gBACpF,IAAI,EAAE,iBAAiB;aACxB,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,qCAAqC;QACrC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,sBAAsB,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAC9B,UAA4B,EAC5B,OAAqB,EACrB,MAAmB;QAEnB,MAAM,UAAU,GAA2C,EAAE,CAAC;QAC9D,MAAM,YAAY,GAAgC,IAAI,GAAG,EAAE,CAAC;QAE5D,IAAI,CAAC;YACH,sCAAsC;YACtC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAE1B,qBAAqB;gBACrB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBACpD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;oBACrB,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;gBACjF,CAAC;gBAED,qBAAqB;gBACrB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAC/C,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;gBACrE,CAAC;gBAED,kBAAkB;gBAClB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACnD,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;oBAC9B,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;gBAClD,CAAC;gBAED,yBAAyB;gBACzB,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBACtD,UAAU,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAC;YACzC,CAAC;YAED,oCAAoC;YACpC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAClC,CAAC;YAED,qCAAqC;YACrC,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;gBAC5B,MAAM,cAAc,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBACtE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;oBAClB,GAAG,EAAE;oBACL,OAAO,EAAE,cAAc,GAAG,CAAC;oBAC3B,eAAe,EAAE,IAAI,CAAC,eAAe;iBACtC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2CAA2C;YAC3C,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;YAChF,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,MAAM,EAAE,EAAE,CAAC,MAAM;oBACjB,EAAE,EAAE,EAAE,CAAC,EAAE;oBACT,SAAS,EAAE,EAAE,CAAC,SAAS;oBACvB,KAAK,EAAE,QAAQ;oBACf,IAAI,EAAE,qBAAqB;iBAC5B,CAAC,CAAC;YACL,CAAC;YACD,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3C,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB,CAClC,UAA4B,EAC5B,OAAqB,EACrB,MAAmB;QAEnB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,qBAAqB;gBACrB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBACpD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;oBACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;wBACjB,MAAM,EAAE,EAAE,CAAC,MAAM;wBACjB,EAAE,EAAE,EAAE,CAAC,EAAE;wBACT,SAAS,EAAE,EAAE,CAAC,SAAS;wBACvB,KAAK,EAAE,UAAU,CAAC,KAAK;wBACvB,IAAI,EAAE,kBAAkB;qBACzB,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBAED,qBAAqB;gBACrB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAC/C,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;wBACjB,MAAM,EAAE,EAAE,CAAC,MAAM;wBACjB,EAAE,EAAE,EAAE,CAAC,EAAE;wBACT,SAAS,EAAE,EAAE,CAAC,SAAS;wBACvB,KAAK,EAAE,WAAW,CAAC,MAAM,IAAI,eAAe;wBAC5C,IAAI,EAAE,eAAe;qBACtB,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBAED,sBAAsB;gBACtB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACnD,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;oBAC9B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;wBACpB,MAAM,EAAE,EAAE,CAAC,MAAM;wBACjB,EAAE,EAAE,EAAE,CAAC,EAAE;wBACT,SAAS,EAAE,EAAE,CAAC,SAAS;wBACvB,aAAa,EAAE,EAAE,CAAC,OAAO;wBACzB,aAAa,EAAE,aAAa,CAAC,aAAa,IAAI,CAAC;wBAC/C,UAAU,EAAE,aAAa,CAAC,UAAU,IAAI,EAAE;qBAC3C,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBAED,kBAAkB;gBAClB,MAAM,cAAc,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBACtE,MAAM,UAAU,GAAG,cAAc,GAAG,CAAC,CAAC;gBAEtC,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;gBAC1D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAClC,CAAC;gBAED,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;oBAClB,GAAG,EAAE;oBACL,OAAO,EAAE,UAAU;oBACnB,eAAe,EAAE,IAAI,CAAC,eAAe;iBACtC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;gBAC9E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,MAAM,EAAE,EAAE,CAAC,MAAM;oBACjB,EAAE,EAAE,EAAE,CAAC,EAAE;oBACT,SAAS,EAAE,EAAE,CAAC,SAAS;oBACvB,KAAK,EAAE,QAAQ;oBACf,IAAI,EAAE,kBAAkB;iBACzB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC5C,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;QAC/C,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QAEzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAAC,EAAkB;QAChD,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACX,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,SAAS,KAAK,QAAQ,IAAI,EAAE,CAAC,SAAS,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;YAC1G,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QACnC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QACrC,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CAAC,EAAkB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;QACtD,CAAC;QAED,MAAM,aAAa,GAAkB;YACnC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,EAAE,CAAC,SAAS;YACvB,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE;SACpB,CAAC;QAEF,iDAAiD;QACjD,IAAI,EAAE,CAAC,SAAS,KAAK,QAAQ,IAAI,EAAE,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,MAAM,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1F,IAAI,QAAQ,EAAE,CAAC;gBACb,aAAa,CAAC,YAAY,GAAG,QAAQ,CAAC;YACxC,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QAE3F,OAAO;YACL,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,MAAM,EAAE,cAAc,CAAC,MAAM;SAC9B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,EAAkB;QAK5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CACnC,sEAAsE,EACtE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CACnB,CAAC;QAEF,MAAM,aAAa,GAAG,QAAQ,EAAE,OAAO,IAAI,CAAC,CAAC;QAE7C,oDAAoD;QACpD,IAAI,QAAQ,IAAI,EAAE,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;YACzE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,MAAM,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5F,OAAO;gBACL,WAAW,EAAE,IAAI;gBACjB,aAAa;gBACb,UAAU,EAAE,UAAU,IAAI,EAAE;aAC7B,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAC/C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,QAAgB;QACvD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CACnC,sEAAsE,EACtE,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnB,CAAC;QACF,OAAO,QAAQ,EAAE,OAAO,IAAI,IAAI,CAAC;IACnC,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,EAAkB,EAAE,OAAgB;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,UAAU,GAA2C,EAAE,CAAC;QAE9D,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;gBACtD,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEvD,UAAU,CAAC,IAAI,CAAC;oBACd,GAAG,EAAE,eAAe,EAAE,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,YAAY,GAAG;oBAChF,MAAM,EAAE,MAAM;iBACf,CAAC,CAAC;gBAEH,UAAU,CAAC,IAAI,CAAC;oBACd,GAAG,EAAE,mGAAmG;oBACxG,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC;iBAC9C,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;qBAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC;qBAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;gBAExD,UAAU,CAAC,IAAI,CAAC;oBACd,GAAG,EAAE,UAAU,EAAE,CAAC,MAAM,QAAQ,OAAO,eAAe;oBACtD,MAAM,EAAE,MAAM;iBACf,CAAC,CAAC;gBAEH,UAAU,CAAC,IAAI,CAAC;oBACd,GAAG,EAAE,mGAAmG;oBACxG,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC;iBAC9C,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,UAAU,CAAC,IAAI,CAAC;oBACd,GAAG,EAAE,eAAe,EAAE,CAAC,MAAM,eAAe;oBAC5C,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;iBAChB,CAAC,CAAC;gBAEH,UAAU,CAAC,IAAI,CAAC;oBACd,GAAG,EAAE,8DAA8D;oBACnE,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;iBAC3B,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSV import/export processor
|
|
3
|
+
* Handles CSV data transformation for bulk import/export operations
|
|
4
|
+
*/
|
|
5
|
+
export interface CSVImportOptions {
|
|
6
|
+
entity: string;
|
|
7
|
+
data: string;
|
|
8
|
+
hasHeader?: boolean;
|
|
9
|
+
skipErrors?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface CSVImportResult {
|
|
12
|
+
entity: string;
|
|
13
|
+
totalRows: number;
|
|
14
|
+
validRows: number;
|
|
15
|
+
invalidRows: number;
|
|
16
|
+
errors: Array<{
|
|
17
|
+
row: number;
|
|
18
|
+
error: string;
|
|
19
|
+
data?: any;
|
|
20
|
+
}>;
|
|
21
|
+
data: Array<Record<string, any>>;
|
|
22
|
+
}
|
|
23
|
+
export interface CSVExportOptions {
|
|
24
|
+
entity: string;
|
|
25
|
+
data: Array<Record<string, any>>;
|
|
26
|
+
columns?: string[];
|
|
27
|
+
includeMetadata?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface CSVExportResult {
|
|
30
|
+
entity: string;
|
|
31
|
+
columns: string[];
|
|
32
|
+
rows: Array<string[]>;
|
|
33
|
+
csv: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* CSV processor for import/export operations
|
|
37
|
+
*/
|
|
38
|
+
export declare class CSVProcessor {
|
|
39
|
+
/**
|
|
40
|
+
* Parse CSV string to objects
|
|
41
|
+
*/
|
|
42
|
+
static parseCSV(content: string, hasHeader?: boolean): CSVImportResult & {
|
|
43
|
+
data: Array<Record<string, any>>;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Convert CSV string to objects for import
|
|
47
|
+
*/
|
|
48
|
+
static importFromCSV(options: CSVImportOptions): Promise<CSVImportResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Convert objects to CSV string for export
|
|
51
|
+
*/
|
|
52
|
+
static exportToCSV(options: CSVExportOptions): CSVExportResult;
|
|
53
|
+
/**
|
|
54
|
+
* Parse a single CSV line, handling quoted fields
|
|
55
|
+
*/
|
|
56
|
+
private static parseCSVLine;
|
|
57
|
+
/**
|
|
58
|
+
* Convert CSV string value to appropriate type
|
|
59
|
+
*/
|
|
60
|
+
private static convertValue;
|
|
61
|
+
/**
|
|
62
|
+
* Format a value for CSV output
|
|
63
|
+
*/
|
|
64
|
+
private static formatCSVValue;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=csv-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv-processor.d.ts","sourceRoot":"","sources":["../../../../src/sync/csv-processor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,GAAG,CAAC;KACZ,CAAC,CAAC;IACH,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,UAAO,GAAG,eAAe,GAAG;QAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;KAAE;IAmE1G;;OAEG;WACU,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAiB/E;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe;IAoD9D;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAiC3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAgC3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;CAuB9B"}
|