appwrite-utils-cli 1.11.0 → 1.12.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/{src/adapters/index.ts → dist/adapters/index.d.ts} +0 -1
- package/dist/adapters/index.js +10 -0
- package/dist/backups/operations/bucketBackup.d.ts +19 -0
- package/dist/backups/operations/bucketBackup.js +197 -0
- package/dist/backups/operations/collectionBackup.d.ts +30 -0
- package/dist/backups/operations/collectionBackup.js +201 -0
- package/dist/backups/operations/comprehensiveBackup.d.ts +25 -0
- package/dist/backups/operations/comprehensiveBackup.js +238 -0
- package/dist/backups/schemas/bucketManifest.d.ts +93 -0
- package/dist/backups/schemas/bucketManifest.js +33 -0
- package/dist/backups/schemas/comprehensiveManifest.d.ts +108 -0
- package/dist/backups/schemas/comprehensiveManifest.js +32 -0
- package/dist/backups/tracking/centralizedTracking.d.ts +34 -0
- package/dist/backups/tracking/centralizedTracking.js +274 -0
- package/dist/cli/commands/configCommands.d.ts +8 -0
- package/dist/cli/commands/configCommands.js +210 -0
- package/dist/cli/commands/databaseCommands.d.ts +14 -0
- package/dist/cli/commands/databaseCommands.js +696 -0
- package/dist/cli/commands/functionCommands.d.ts +7 -0
- package/dist/cli/commands/functionCommands.js +330 -0
- package/dist/cli/commands/importFileCommands.d.ts +7 -0
- package/dist/cli/commands/importFileCommands.js +674 -0
- package/dist/cli/commands/schemaCommands.d.ts +7 -0
- package/dist/cli/commands/schemaCommands.js +169 -0
- package/dist/cli/commands/storageCommands.d.ts +5 -0
- package/dist/cli/commands/storageCommands.js +142 -0
- package/dist/cli/commands/transferCommands.d.ts +5 -0
- package/dist/cli/commands/transferCommands.js +382 -0
- package/dist/collections/columns.d.ts +13 -0
- package/dist/collections/columns.js +1339 -0
- package/dist/collections/indexes.d.ts +12 -0
- package/dist/collections/indexes.js +215 -0
- package/dist/collections/methods.d.ts +19 -0
- package/dist/collections/methods.js +605 -0
- package/dist/collections/tableOperations.d.ts +87 -0
- package/dist/collections/tableOperations.js +466 -0
- package/dist/collections/transferOperations.d.ts +8 -0
- package/dist/collections/transferOperations.js +411 -0
- package/dist/collections/wipeOperations.d.ts +17 -0
- package/dist/collections/wipeOperations.js +306 -0
- package/dist/databases/methods.d.ts +6 -0
- package/dist/databases/methods.js +35 -0
- package/dist/databases/setup.d.ts +5 -0
- package/dist/databases/setup.js +45 -0
- package/dist/examples/yamlTerminologyExample.d.ts +42 -0
- package/dist/examples/yamlTerminologyExample.js +272 -0
- package/dist/functions/deployments.d.ts +4 -0
- package/dist/functions/deployments.js +146 -0
- package/dist/functions/fnConfigDiscovery.d.ts +3 -0
- package/dist/functions/fnConfigDiscovery.js +108 -0
- package/dist/functions/methods.d.ts +16 -0
- package/dist/functions/methods.js +174 -0
- package/dist/init.d.ts +2 -0
- package/dist/init.js +57 -0
- package/dist/interactiveCLI.d.ts +36 -0
- package/dist/interactiveCLI.js +952 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +1125 -0
- package/dist/migrations/afterImportActions.d.ts +17 -0
- package/dist/migrations/afterImportActions.js +305 -0
- package/dist/migrations/appwriteToX.d.ts +211 -0
- package/dist/migrations/appwriteToX.js +493 -0
- package/dist/migrations/comprehensiveTransfer.d.ts +147 -0
- package/dist/migrations/comprehensiveTransfer.js +1315 -0
- package/dist/migrations/dataLoader.d.ts +755 -0
- package/dist/migrations/dataLoader.js +1272 -0
- package/dist/migrations/importController.d.ts +25 -0
- package/dist/migrations/importController.js +283 -0
- package/dist/migrations/importDataActions.d.ts +50 -0
- package/dist/migrations/importDataActions.js +230 -0
- package/dist/migrations/relationships.d.ts +29 -0
- package/dist/migrations/relationships.js +203 -0
- package/dist/migrations/services/DataTransformationService.d.ts +55 -0
- package/dist/migrations/services/DataTransformationService.js +158 -0
- package/dist/migrations/services/FileHandlerService.d.ts +75 -0
- package/dist/migrations/services/FileHandlerService.js +236 -0
- package/dist/migrations/services/ImportOrchestrator.d.ts +99 -0
- package/dist/migrations/services/ImportOrchestrator.js +493 -0
- package/dist/migrations/services/RateLimitManager.d.ts +138 -0
- package/dist/migrations/services/RateLimitManager.js +279 -0
- package/dist/migrations/services/RelationshipResolver.d.ts +120 -0
- package/dist/migrations/services/RelationshipResolver.js +332 -0
- package/dist/migrations/services/UserMappingService.d.ts +109 -0
- package/dist/migrations/services/UserMappingService.js +277 -0
- package/dist/migrations/services/ValidationService.d.ts +74 -0
- package/dist/migrations/services/ValidationService.js +260 -0
- package/dist/migrations/transfer.d.ts +30 -0
- package/dist/migrations/transfer.js +661 -0
- package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +131 -0
- package/dist/migrations/yaml/YamlImportConfigLoader.js +383 -0
- package/dist/migrations/yaml/YamlImportIntegration.d.ts +93 -0
- package/dist/migrations/yaml/YamlImportIntegration.js +341 -0
- package/dist/migrations/yaml/generateImportSchemas.d.ts +30 -0
- package/dist/migrations/yaml/generateImportSchemas.js +1327 -0
- package/dist/schemas/authUser.d.ts +24 -0
- package/dist/schemas/authUser.js +17 -0
- package/dist/setup.d.ts +2 -0
- package/{src/setup.ts → dist/setup.js} +0 -3
- package/dist/setupCommands.d.ts +58 -0
- package/dist/setupCommands.js +489 -0
- package/dist/setupController.d.ts +9 -0
- package/dist/setupController.js +34 -0
- package/dist/shared/backupMetadataSchema.d.ts +94 -0
- package/dist/shared/backupMetadataSchema.js +38 -0
- package/dist/shared/backupTracking.d.ts +18 -0
- package/dist/shared/backupTracking.js +176 -0
- package/dist/shared/confirmationDialogs.d.ts +75 -0
- package/dist/shared/confirmationDialogs.js +236 -0
- package/dist/shared/migrationHelpers.d.ts +61 -0
- package/dist/shared/migrationHelpers.js +145 -0
- package/{src/shared/operationLogger.ts → dist/shared/operationLogger.d.ts} +1 -11
- package/dist/shared/operationLogger.js +12 -0
- package/dist/shared/operationQueue.d.ts +40 -0
- package/dist/shared/operationQueue.js +310 -0
- package/dist/shared/operationsTable.d.ts +26 -0
- package/dist/shared/operationsTable.js +287 -0
- package/dist/shared/operationsTableSchema.d.ts +48 -0
- package/dist/shared/operationsTableSchema.js +35 -0
- package/dist/shared/progressManager.d.ts +62 -0
- package/dist/shared/progressManager.js +215 -0
- package/dist/shared/relationshipExtractor.d.ts +56 -0
- package/dist/shared/relationshipExtractor.js +138 -0
- package/dist/shared/selectionDialogs.d.ts +220 -0
- package/dist/shared/selectionDialogs.js +588 -0
- package/dist/storage/backupCompression.d.ts +20 -0
- package/dist/storage/backupCompression.js +67 -0
- package/dist/storage/methods.d.ts +44 -0
- package/dist/storage/methods.js +475 -0
- package/dist/storage/schemas.d.ts +842 -0
- package/dist/storage/schemas.js +175 -0
- package/dist/tables/indexManager.d.ts +65 -0
- package/dist/tables/indexManager.js +294 -0
- package/{src/types.ts → dist/types.d.ts} +1 -6
- package/dist/types.js +3 -0
- package/dist/users/methods.d.ts +16 -0
- package/dist/users/methods.js +276 -0
- package/dist/utils/configMigration.d.ts +1 -0
- package/dist/utils/configMigration.js +261 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/loadConfigs.d.ts +50 -0
- package/dist/utils/loadConfigs.js +357 -0
- package/dist/utils/setupFiles.d.ts +4 -0
- package/dist/utils/setupFiles.js +1190 -0
- package/dist/utilsController.d.ts +114 -0
- package/dist/utilsController.js +898 -0
- package/package.json +6 -3
- package/CHANGELOG.md +0 -35
- package/CONFIG_TODO.md +0 -1189
- package/SELECTION_DIALOGS.md +0 -146
- package/SERVICE_IMPLEMENTATION_REPORT.md +0 -462
- package/scripts/copy-templates.ts +0 -23
- package/src/backups/operations/bucketBackup.ts +0 -277
- package/src/backups/operations/collectionBackup.ts +0 -310
- package/src/backups/operations/comprehensiveBackup.ts +0 -342
- package/src/backups/schemas/bucketManifest.ts +0 -78
- package/src/backups/schemas/comprehensiveManifest.ts +0 -76
- package/src/backups/tracking/centralizedTracking.ts +0 -352
- package/src/cli/commands/configCommands.ts +0 -265
- package/src/cli/commands/databaseCommands.ts +0 -931
- package/src/cli/commands/functionCommands.ts +0 -419
- package/src/cli/commands/importFileCommands.ts +0 -815
- package/src/cli/commands/schemaCommands.ts +0 -200
- package/src/cli/commands/storageCommands.ts +0 -151
- package/src/cli/commands/transferCommands.ts +0 -454
- package/src/collections/attributes.ts.backup +0 -1555
- package/src/collections/columns.ts +0 -2025
- package/src/collections/indexes.ts +0 -350
- package/src/collections/methods.ts +0 -714
- package/src/collections/tableOperations.ts +0 -542
- package/src/collections/transferOperations.ts +0 -589
- package/src/collections/wipeOperations.ts +0 -449
- package/src/databases/methods.ts +0 -49
- package/src/databases/setup.ts +0 -77
- package/src/examples/yamlTerminologyExample.ts +0 -346
- package/src/functions/deployments.ts +0 -221
- package/src/functions/fnConfigDiscovery.ts +0 -103
- package/src/functions/methods.ts +0 -284
- package/src/init.ts +0 -62
- package/src/interactiveCLI.ts +0 -1201
- package/src/main.ts +0 -1517
- package/src/migrations/afterImportActions.ts +0 -579
- package/src/migrations/appwriteToX.ts +0 -668
- package/src/migrations/comprehensiveTransfer.ts +0 -2285
- package/src/migrations/dataLoader.ts +0 -1729
- package/src/migrations/importController.ts +0 -440
- package/src/migrations/importDataActions.ts +0 -315
- package/src/migrations/relationships.ts +0 -333
- package/src/migrations/services/DataTransformationService.ts +0 -196
- package/src/migrations/services/FileHandlerService.ts +0 -311
- package/src/migrations/services/ImportOrchestrator.ts +0 -675
- package/src/migrations/services/RateLimitManager.ts +0 -363
- package/src/migrations/services/RelationshipResolver.ts +0 -461
- package/src/migrations/services/UserMappingService.ts +0 -345
- package/src/migrations/services/ValidationService.ts +0 -349
- package/src/migrations/transfer.ts +0 -1113
- package/src/migrations/yaml/YamlImportConfigLoader.ts +0 -439
- package/src/migrations/yaml/YamlImportIntegration.ts +0 -446
- package/src/migrations/yaml/generateImportSchemas.ts +0 -1354
- package/src/schemas/authUser.ts +0 -23
- package/src/setupCommands.ts +0 -602
- package/src/setupController.ts +0 -43
- package/src/shared/backupMetadataSchema.ts +0 -93
- package/src/shared/backupTracking.ts +0 -211
- package/src/shared/confirmationDialogs.ts +0 -327
- package/src/shared/migrationHelpers.ts +0 -232
- package/src/shared/operationQueue.ts +0 -376
- package/src/shared/operationsTable.ts +0 -338
- package/src/shared/operationsTableSchema.ts +0 -60
- package/src/shared/progressManager.ts +0 -278
- package/src/shared/relationshipExtractor.ts +0 -214
- package/src/shared/selectionDialogs.ts +0 -802
- package/src/storage/backupCompression.ts +0 -88
- package/src/storage/methods.ts +0 -711
- package/src/storage/schemas.ts +0 -205
- package/src/tables/indexManager.ts +0 -409
- package/src/types/node-appwrite-tablesdb.d.ts +0 -44
- package/src/users/methods.ts +0 -358
- package/src/utils/configMigration.ts +0 -348
- package/src/utils/loadConfigs.ts +0 -457
- package/src/utils/setupFiles.ts +0 -1236
- package/src/utilsController.ts +0 -1263
- package/tests/README.md +0 -497
- package/tests/adapters/AdapterFactory.test.ts +0 -277
- package/tests/integration/syncOperations.test.ts +0 -463
- package/tests/jest.config.js +0 -25
- package/tests/migration/configMigration.test.ts +0 -546
- package/tests/setup.ts +0 -62
- package/tests/testUtils.ts +0 -340
- package/tests/utils/loadConfigs.test.ts +0 -350
- package/tests/validation/configValidation.test.ts +0 -412
- package/tsconfig.json +0 -44
- /package/{src → dist}/functions/templates/count-docs-in-collection/README.md +0 -0
- /package/{src → dist}/functions/templates/count-docs-in-collection/src/main.ts +0 -0
- /package/{src → dist}/functions/templates/count-docs-in-collection/src/request.ts +0 -0
- /package/{src → dist}/functions/templates/hono-typescript/README.md +0 -0
- /package/{src → dist}/functions/templates/hono-typescript/src/adapters/request.ts +0 -0
- /package/{src → dist}/functions/templates/hono-typescript/src/adapters/response.ts +0 -0
- /package/{src → dist}/functions/templates/hono-typescript/src/app.ts +0 -0
- /package/{src → dist}/functions/templates/hono-typescript/src/context.ts +0 -0
- /package/{src → dist}/functions/templates/hono-typescript/src/main.ts +0 -0
- /package/{src → dist}/functions/templates/hono-typescript/src/middleware/appwrite.ts +0 -0
- /package/{src → dist}/functions/templates/typescript-node/README.md +0 -0
- /package/{src → dist}/functions/templates/typescript-node/src/context.ts +0 -0
- /package/{src → dist}/functions/templates/typescript-node/src/main.ts +0 -0
- /package/{src → dist}/functions/templates/uv/README.md +0 -0
- /package/{src → dist}/functions/templates/uv/pyproject.toml +0 -0
- /package/{src → dist}/functions/templates/uv/src/__init__.py +0 -0
- /package/{src → dist}/functions/templates/uv/src/context.py +0 -0
- /package/{src → dist}/functions/templates/uv/src/main.py +0 -0
- /package/{src/utils/index.ts → dist/utils/index.d.ts} +0 -0
|
@@ -1,440 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AppwriteException,
|
|
3
|
-
ID,
|
|
4
|
-
Query,
|
|
5
|
-
type Databases,
|
|
6
|
-
type Models,
|
|
7
|
-
type Storage,
|
|
8
|
-
} from "node-appwrite";
|
|
9
|
-
import type {
|
|
10
|
-
AppwriteConfig,
|
|
11
|
-
ConfigCollection,
|
|
12
|
-
ConfigDatabase,
|
|
13
|
-
AttributeMappings,
|
|
14
|
-
} from "appwrite-utils";
|
|
15
|
-
import type { ImportDataActions } from "./importDataActions.js";
|
|
16
|
-
import { areCollectionNamesSame, tryAwaitWithRetry } from "appwrite-utils-helpers";
|
|
17
|
-
import type { SetupOptions } from "../utilsController.js";
|
|
18
|
-
import { resolveAndUpdateRelationships } from "./relationships.js";
|
|
19
|
-
import { UsersController } from "../users/methods.js";
|
|
20
|
-
import { logger, AdapterFactory, type DatabaseAdapter } from "appwrite-utils-helpers";
|
|
21
|
-
import { updateOperation } from "../shared/migrationHelpers.js";
|
|
22
|
-
import {
|
|
23
|
-
BatchSchema,
|
|
24
|
-
OperationCreateSchema,
|
|
25
|
-
OperationSchema,
|
|
26
|
-
} from "../storage/schemas.js";
|
|
27
|
-
import { DataLoader, type CollectionImportData } from "./dataLoader.js";
|
|
28
|
-
import {
|
|
29
|
-
transferDatabaseLocalToLocal,
|
|
30
|
-
transferStorageLocalToLocal,
|
|
31
|
-
} from "./transfer.js";
|
|
32
|
-
import { MessageFormatter } from "appwrite-utils-helpers";
|
|
33
|
-
import { ProgressManager } from "../shared/progressManager.js";
|
|
34
|
-
|
|
35
|
-
export class ImportController {
|
|
36
|
-
private config: AppwriteConfig;
|
|
37
|
-
private database: Databases;
|
|
38
|
-
private storage: Storage;
|
|
39
|
-
private appwriteFolderPath: string;
|
|
40
|
-
private importDataActions: ImportDataActions;
|
|
41
|
-
private setupOptions: SetupOptions;
|
|
42
|
-
private documentCache: Map<string, any>;
|
|
43
|
-
private batchLimit: number = 25; // Define batch size limit
|
|
44
|
-
private hasImportedUsers = false;
|
|
45
|
-
private postImportActionsQueue: {
|
|
46
|
-
context: any;
|
|
47
|
-
finalItem: any;
|
|
48
|
-
attributeMappings: AttributeMappings;
|
|
49
|
-
}[] = [];
|
|
50
|
-
private databasesToRun: Models.Database[];
|
|
51
|
-
private _adapter: DatabaseAdapter | null = null;
|
|
52
|
-
|
|
53
|
-
private async getAdapter(): Promise<DatabaseAdapter> {
|
|
54
|
-
if (!this._adapter) {
|
|
55
|
-
const { adapter } = await AdapterFactory.createFromConfig(this.config);
|
|
56
|
-
this._adapter = adapter;
|
|
57
|
-
}
|
|
58
|
-
return this._adapter;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
constructor(
|
|
62
|
-
config: AppwriteConfig,
|
|
63
|
-
database: Databases,
|
|
64
|
-
storage: Storage,
|
|
65
|
-
appwriteFolderPath: string,
|
|
66
|
-
importDataActions: ImportDataActions,
|
|
67
|
-
setupOptions: SetupOptions,
|
|
68
|
-
databasesToRun?: Models.Database[]
|
|
69
|
-
) {
|
|
70
|
-
this.config = config;
|
|
71
|
-
this.database = database;
|
|
72
|
-
this.storage = storage;
|
|
73
|
-
this.appwriteFolderPath = appwriteFolderPath;
|
|
74
|
-
this.importDataActions = importDataActions;
|
|
75
|
-
this.setupOptions = setupOptions;
|
|
76
|
-
this.documentCache = new Map();
|
|
77
|
-
this.databasesToRun = databasesToRun || [];
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
async run(specificCollections?: string[]) {
|
|
81
|
-
let databasesToProcess: Models.Database[];
|
|
82
|
-
|
|
83
|
-
if (this.databasesToRun.length > 0) {
|
|
84
|
-
// Use the provided databases
|
|
85
|
-
databasesToProcess = this.databasesToRun;
|
|
86
|
-
} else {
|
|
87
|
-
// If no databases are specified, fetch all databases
|
|
88
|
-
const allDatabases = await this.database.list();
|
|
89
|
-
databasesToProcess = allDatabases.databases;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
let dataLoader: DataLoader | undefined;
|
|
93
|
-
let databaseRan: Models.Database | undefined;
|
|
94
|
-
|
|
95
|
-
for (let db of databasesToProcess) {
|
|
96
|
-
MessageFormatter.banner(`Starting import data for database: ${db.name}`, "Database Import");
|
|
97
|
-
|
|
98
|
-
if (!databaseRan) {
|
|
99
|
-
databaseRan = db;
|
|
100
|
-
dataLoader = new DataLoader(
|
|
101
|
-
this.appwriteFolderPath,
|
|
102
|
-
this.importDataActions,
|
|
103
|
-
this.database,
|
|
104
|
-
this.config,
|
|
105
|
-
this.setupOptions.shouldWriteFile
|
|
106
|
-
);
|
|
107
|
-
await dataLoader.setupMaps(db.$id, specificCollections);
|
|
108
|
-
await dataLoader.start(db.$id, specificCollections);
|
|
109
|
-
await this.importCollections(db, dataLoader, specificCollections);
|
|
110
|
-
await resolveAndUpdateRelationships(db.$id, this.database, this.config);
|
|
111
|
-
await this.executePostImportActions(
|
|
112
|
-
db.$id,
|
|
113
|
-
dataLoader,
|
|
114
|
-
specificCollections
|
|
115
|
-
);
|
|
116
|
-
} else if (databaseRan.$id !== db.$id) {
|
|
117
|
-
await this.updateOthersToFinalData(databaseRan, db);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
MessageFormatter.divider();
|
|
121
|
-
MessageFormatter.success(`Finished import data for database: ${db.name}`, { prefix: "Import" });
|
|
122
|
-
MessageFormatter.divider();
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
async updateOthersToFinalData(
|
|
127
|
-
updatedDb: Models.Database,
|
|
128
|
-
targetDb: Models.Database
|
|
129
|
-
) {
|
|
130
|
-
if (this.database) {
|
|
131
|
-
await transferDatabaseLocalToLocal(
|
|
132
|
-
this.database,
|
|
133
|
-
updatedDb.$id,
|
|
134
|
-
targetDb.$id
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
if (this.storage) {
|
|
139
|
-
// Find the corresponding database configs
|
|
140
|
-
const updatedDbConfig = this.config.databases.find(
|
|
141
|
-
(db) => db.$id === updatedDb.$id
|
|
142
|
-
);
|
|
143
|
-
const targetDbConfig = this.config.databases.find(
|
|
144
|
-
(db) => db.$id === targetDb.$id
|
|
145
|
-
);
|
|
146
|
-
|
|
147
|
-
const allBuckets = await this.storage.listBuckets([Query.limit(1000)]);
|
|
148
|
-
const bucketsWithDbIdInThem = allBuckets.buckets.filter((bucket) =>
|
|
149
|
-
bucket.name.toLowerCase().includes(updatedDb.$id.toLowerCase())
|
|
150
|
-
);
|
|
151
|
-
const configuredUpdatedBucketId = `${
|
|
152
|
-
this.config.documentBucketId
|
|
153
|
-
}_${updatedDb.$id.toLowerCase().trim().replace(" ", "")}`;
|
|
154
|
-
const configuredTargetBucketId = `${
|
|
155
|
-
this.config.documentBucketId
|
|
156
|
-
}_${targetDb.$id.toLowerCase().trim().replace(" ", "")}`;
|
|
157
|
-
|
|
158
|
-
let sourceBucketId: string | undefined;
|
|
159
|
-
let targetBucketId: string | undefined;
|
|
160
|
-
|
|
161
|
-
if (
|
|
162
|
-
bucketsWithDbIdInThem.find(
|
|
163
|
-
(bucket) => bucket.$id === configuredUpdatedBucketId
|
|
164
|
-
)
|
|
165
|
-
) {
|
|
166
|
-
sourceBucketId = configuredUpdatedBucketId;
|
|
167
|
-
} else if (
|
|
168
|
-
bucketsWithDbIdInThem.find(
|
|
169
|
-
(bucket) => bucket.$id === configuredTargetBucketId
|
|
170
|
-
)
|
|
171
|
-
) {
|
|
172
|
-
targetBucketId = configuredTargetBucketId;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
if (!sourceBucketId) {
|
|
176
|
-
sourceBucketId =
|
|
177
|
-
updatedDbConfig?.bucket?.$id || bucketsWithDbIdInThem[0]?.$id;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
if (!targetBucketId) {
|
|
181
|
-
targetBucketId =
|
|
182
|
-
targetDbConfig?.bucket?.$id || bucketsWithDbIdInThem[0]?.$id;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
if (sourceBucketId && targetBucketId) {
|
|
186
|
-
await transferStorageLocalToLocal(
|
|
187
|
-
this.storage,
|
|
188
|
-
sourceBucketId,
|
|
189
|
-
targetBucketId
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
async importCollections(
|
|
196
|
-
db: ConfigDatabase,
|
|
197
|
-
dataLoader: DataLoader,
|
|
198
|
-
specificCollections?: string[]
|
|
199
|
-
) {
|
|
200
|
-
const collectionsToImport =
|
|
201
|
-
specificCollections ||
|
|
202
|
-
(this.config.collections
|
|
203
|
-
? this.config.collections.map((c) => c.name)
|
|
204
|
-
: []);
|
|
205
|
-
|
|
206
|
-
for (const collection of this.config.collections || []) {
|
|
207
|
-
if (collectionsToImport.includes(collection.name)) {
|
|
208
|
-
let isUsersCollection =
|
|
209
|
-
this.config.usersCollectionName &&
|
|
210
|
-
dataLoader.getCollectionKey(this.config.usersCollectionName) ===
|
|
211
|
-
dataLoader.getCollectionKey(collection.name);
|
|
212
|
-
const importOperationId = dataLoader.collectionImportOperations.get(
|
|
213
|
-
dataLoader.getCollectionKey(collection.name)
|
|
214
|
-
);
|
|
215
|
-
const createBatches = (finalData: CollectionImportData["data"]) => {
|
|
216
|
-
let maxBatchLength = 50;
|
|
217
|
-
const finalBatches: CollectionImportData["data"][] = [];
|
|
218
|
-
for (let i = 0; i < finalData.length; i++) {
|
|
219
|
-
if (i % maxBatchLength === 0) {
|
|
220
|
-
finalBatches.push([]);
|
|
221
|
-
}
|
|
222
|
-
finalBatches[finalBatches.length - 1].push(finalData[i]);
|
|
223
|
-
}
|
|
224
|
-
return finalBatches;
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
if (isUsersCollection && !this.hasImportedUsers) {
|
|
228
|
-
const usersDataMap = dataLoader.importMap.get(
|
|
229
|
-
dataLoader.getCollectionKey("users")
|
|
230
|
-
);
|
|
231
|
-
const usersData = usersDataMap?.data;
|
|
232
|
-
const usersController = new UsersController(
|
|
233
|
-
this.config,
|
|
234
|
-
this.database
|
|
235
|
-
);
|
|
236
|
-
if (usersData) {
|
|
237
|
-
console.log("Found users data", usersData.length);
|
|
238
|
-
const userDataBatches = createBatches(usersData);
|
|
239
|
-
for (const batch of userDataBatches) {
|
|
240
|
-
console.log("Importing users batch", batch.length);
|
|
241
|
-
const userBatchPromises = batch
|
|
242
|
-
.filter((item) => {
|
|
243
|
-
let itemId: string | undefined;
|
|
244
|
-
if (item.finalData.userId) {
|
|
245
|
-
itemId = item.finalData.userId;
|
|
246
|
-
} else if (item.finalData.docId) {
|
|
247
|
-
itemId = item.finalData.docId;
|
|
248
|
-
}
|
|
249
|
-
if (!itemId) {
|
|
250
|
-
return false;
|
|
251
|
-
}
|
|
252
|
-
return (
|
|
253
|
-
item &&
|
|
254
|
-
item.finalData &&
|
|
255
|
-
!dataLoader.userExistsMap.has(itemId)
|
|
256
|
-
);
|
|
257
|
-
})
|
|
258
|
-
.map((item) => {
|
|
259
|
-
dataLoader.userExistsMap.set(
|
|
260
|
-
item.finalData.userId ||
|
|
261
|
-
item.finalData.docId ||
|
|
262
|
-
item.context.userId ||
|
|
263
|
-
item.context.docId,
|
|
264
|
-
true
|
|
265
|
-
);
|
|
266
|
-
return usersController.createUserAndReturn(item.finalData);
|
|
267
|
-
});
|
|
268
|
-
const promiseResults = await Promise.allSettled(
|
|
269
|
-
userBatchPromises
|
|
270
|
-
);
|
|
271
|
-
for (const item of batch) {
|
|
272
|
-
if (item && item.finalData) {
|
|
273
|
-
dataLoader.userExistsMap.set(
|
|
274
|
-
item.finalData.userId ||
|
|
275
|
-
item.finalData.docId ||
|
|
276
|
-
item.context.userId ||
|
|
277
|
-
item.context.docId,
|
|
278
|
-
true
|
|
279
|
-
);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
MessageFormatter.success("Finished importing users batch", { prefix: "Import" });
|
|
283
|
-
}
|
|
284
|
-
this.hasImportedUsers = true;
|
|
285
|
-
MessageFormatter.success("Finished importing users", { prefix: "Import" });
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
let importOperation: any = null;
|
|
290
|
-
if (importOperationId) {
|
|
291
|
-
try {
|
|
292
|
-
importOperation = await this.database.getDocument(
|
|
293
|
-
"migrations",
|
|
294
|
-
"currentOperations",
|
|
295
|
-
importOperationId
|
|
296
|
-
);
|
|
297
|
-
const adapter = await this.getAdapter();
|
|
298
|
-
await updateOperation(adapter, db.$id, importOperation.$id, {
|
|
299
|
-
status: "in_progress",
|
|
300
|
-
});
|
|
301
|
-
} catch {
|
|
302
|
-
importOperation = null;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
const collectionData = dataLoader.importMap.get(
|
|
307
|
-
dataLoader.getCollectionKey(collection.name)
|
|
308
|
-
);
|
|
309
|
-
MessageFormatter.processing(`Processing collection: ${collection.name}...`, { prefix: "Import" });
|
|
310
|
-
if (!collectionData) {
|
|
311
|
-
MessageFormatter.warning(`No collection data for ${collection.name}`, { prefix: "Import" });
|
|
312
|
-
continue;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
const dataSplit = createBatches(collectionData.data);
|
|
316
|
-
let processedItems = 0;
|
|
317
|
-
for (let i = 0; i < dataSplit.length; i++) {
|
|
318
|
-
const batches = dataSplit[i];
|
|
319
|
-
MessageFormatter.progress(`Processing batch ${i + 1} of ${dataSplit.length}`, { prefix: "Import" });
|
|
320
|
-
|
|
321
|
-
const batchPromises = batches.map((item, index) => {
|
|
322
|
-
try {
|
|
323
|
-
const id =
|
|
324
|
-
item.finalData.docId ||
|
|
325
|
-
item.finalData.userId ||
|
|
326
|
-
item.context.docId ||
|
|
327
|
-
item.context.userId;
|
|
328
|
-
|
|
329
|
-
if (item.finalData.hasOwnProperty("userId")) {
|
|
330
|
-
delete item.finalData.userId;
|
|
331
|
-
}
|
|
332
|
-
if (item.finalData.hasOwnProperty("docId")) {
|
|
333
|
-
delete item.finalData.docId;
|
|
334
|
-
}
|
|
335
|
-
if (!item.finalData) {
|
|
336
|
-
return Promise.resolve();
|
|
337
|
-
}
|
|
338
|
-
return tryAwaitWithRetry(
|
|
339
|
-
async () =>
|
|
340
|
-
await this.database.createDocument(
|
|
341
|
-
db.$id,
|
|
342
|
-
collection.$id!,
|
|
343
|
-
id,
|
|
344
|
-
item.finalData
|
|
345
|
-
)
|
|
346
|
-
);
|
|
347
|
-
} catch (error) {
|
|
348
|
-
MessageFormatter.error(
|
|
349
|
-
"Error creating document",
|
|
350
|
-
error instanceof Error ? error : new Error(String(error)),
|
|
351
|
-
{ prefix: "Import" }
|
|
352
|
-
);
|
|
353
|
-
return Promise.resolve();
|
|
354
|
-
}
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
// Wait for all promises in the current batch to resolve
|
|
358
|
-
await Promise.all(batchPromises);
|
|
359
|
-
MessageFormatter.success(`Completed batch ${i + 1} of ${dataSplit.length}`, { prefix: "Import" });
|
|
360
|
-
if (importOperation) {
|
|
361
|
-
try {
|
|
362
|
-
const opAdapter = await this.getAdapter();
|
|
363
|
-
await updateOperation(opAdapter, db.$id, importOperation.$id, {
|
|
364
|
-
progress: processedItems,
|
|
365
|
-
});
|
|
366
|
-
} catch { /* operations tracking is non-fatal */ }
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
if (importOperation) {
|
|
370
|
-
try {
|
|
371
|
-
const opAdapter = await this.getAdapter();
|
|
372
|
-
await updateOperation(opAdapter, db.$id, importOperation.$id, {
|
|
373
|
-
status: "completed",
|
|
374
|
-
});
|
|
375
|
-
} catch { /* operations tracking is non-fatal */ }
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
async executePostImportActions(
|
|
382
|
-
dbId: string,
|
|
383
|
-
dataLoader: DataLoader,
|
|
384
|
-
specificCollections?: string[]
|
|
385
|
-
) {
|
|
386
|
-
MessageFormatter.info("Executing post-import actions...", { prefix: "Import" });
|
|
387
|
-
const collectionsToProcess =
|
|
388
|
-
specificCollections && specificCollections.length > 0
|
|
389
|
-
? specificCollections
|
|
390
|
-
: this.config.collections
|
|
391
|
-
? this.config.collections.map((c) => c.name)
|
|
392
|
-
: Array.from(dataLoader.importMap.keys());
|
|
393
|
-
MessageFormatter.info(`Collections to process: ${collectionsToProcess.join(", ")}`, { prefix: "Import" });
|
|
394
|
-
// Iterate over each collection in the importMap
|
|
395
|
-
for (const [
|
|
396
|
-
collectionKey,
|
|
397
|
-
collectionData,
|
|
398
|
-
] of dataLoader.importMap.entries()) {
|
|
399
|
-
const allCollectionKeys = collectionsToProcess.map((c) =>
|
|
400
|
-
dataLoader.getCollectionKey(c)
|
|
401
|
-
);
|
|
402
|
-
if (allCollectionKeys.includes(collectionKey)) {
|
|
403
|
-
MessageFormatter.processing(
|
|
404
|
-
`Processing post-import actions for collection: ${collectionKey}`,
|
|
405
|
-
{ prefix: "Import" }
|
|
406
|
-
);
|
|
407
|
-
|
|
408
|
-
// Iterate over each item in the collectionData.data
|
|
409
|
-
for (const item of collectionData.data) {
|
|
410
|
-
// Assuming each item has attributeMappings that contain actions to be executed
|
|
411
|
-
if (item.importDef && item.importDef.attributeMappings) {
|
|
412
|
-
// Use item.context as the context for action execution
|
|
413
|
-
const context = item.context; // Directly use item.context as the context for action execution
|
|
414
|
-
// Iterate through attributeMappings to execute actions
|
|
415
|
-
try {
|
|
416
|
-
// Execute post-import actions for the current attributeMapping
|
|
417
|
-
// Pass item.finalData as the data to be processed along with the context
|
|
418
|
-
await this.importDataActions.executeAfterImportActions(
|
|
419
|
-
item.finalData,
|
|
420
|
-
item.importDef.attributeMappings,
|
|
421
|
-
context
|
|
422
|
-
);
|
|
423
|
-
} catch (error) {
|
|
424
|
-
MessageFormatter.error(
|
|
425
|
-
`Failed to execute post-import actions for item in collection ${collectionKey}`,
|
|
426
|
-
error instanceof Error ? error : new Error(String(error)),
|
|
427
|
-
{ prefix: "Import" }
|
|
428
|
-
);
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
} else {
|
|
433
|
-
MessageFormatter.info(
|
|
434
|
-
`Skipping collection: ${collectionKey} because it's not valid for post-import actions`,
|
|
435
|
-
{ prefix: "Import" }
|
|
436
|
-
);
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
}
|