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.
Files changed (250) hide show
  1. package/{src/adapters/index.ts → dist/adapters/index.d.ts} +0 -1
  2. package/dist/adapters/index.js +10 -0
  3. package/dist/backups/operations/bucketBackup.d.ts +19 -0
  4. package/dist/backups/operations/bucketBackup.js +197 -0
  5. package/dist/backups/operations/collectionBackup.d.ts +30 -0
  6. package/dist/backups/operations/collectionBackup.js +201 -0
  7. package/dist/backups/operations/comprehensiveBackup.d.ts +25 -0
  8. package/dist/backups/operations/comprehensiveBackup.js +238 -0
  9. package/dist/backups/schemas/bucketManifest.d.ts +93 -0
  10. package/dist/backups/schemas/bucketManifest.js +33 -0
  11. package/dist/backups/schemas/comprehensiveManifest.d.ts +108 -0
  12. package/dist/backups/schemas/comprehensiveManifest.js +32 -0
  13. package/dist/backups/tracking/centralizedTracking.d.ts +34 -0
  14. package/dist/backups/tracking/centralizedTracking.js +274 -0
  15. package/dist/cli/commands/configCommands.d.ts +8 -0
  16. package/dist/cli/commands/configCommands.js +210 -0
  17. package/dist/cli/commands/databaseCommands.d.ts +14 -0
  18. package/dist/cli/commands/databaseCommands.js +696 -0
  19. package/dist/cli/commands/functionCommands.d.ts +7 -0
  20. package/dist/cli/commands/functionCommands.js +330 -0
  21. package/dist/cli/commands/importFileCommands.d.ts +7 -0
  22. package/dist/cli/commands/importFileCommands.js +674 -0
  23. package/dist/cli/commands/schemaCommands.d.ts +7 -0
  24. package/dist/cli/commands/schemaCommands.js +169 -0
  25. package/dist/cli/commands/storageCommands.d.ts +5 -0
  26. package/dist/cli/commands/storageCommands.js +142 -0
  27. package/dist/cli/commands/transferCommands.d.ts +5 -0
  28. package/dist/cli/commands/transferCommands.js +382 -0
  29. package/dist/collections/columns.d.ts +13 -0
  30. package/dist/collections/columns.js +1339 -0
  31. package/dist/collections/indexes.d.ts +12 -0
  32. package/dist/collections/indexes.js +215 -0
  33. package/dist/collections/methods.d.ts +19 -0
  34. package/dist/collections/methods.js +605 -0
  35. package/dist/collections/tableOperations.d.ts +87 -0
  36. package/dist/collections/tableOperations.js +466 -0
  37. package/dist/collections/transferOperations.d.ts +8 -0
  38. package/dist/collections/transferOperations.js +411 -0
  39. package/dist/collections/wipeOperations.d.ts +17 -0
  40. package/dist/collections/wipeOperations.js +306 -0
  41. package/dist/databases/methods.d.ts +6 -0
  42. package/dist/databases/methods.js +35 -0
  43. package/dist/databases/setup.d.ts +5 -0
  44. package/dist/databases/setup.js +45 -0
  45. package/dist/examples/yamlTerminologyExample.d.ts +42 -0
  46. package/dist/examples/yamlTerminologyExample.js +272 -0
  47. package/dist/functions/deployments.d.ts +4 -0
  48. package/dist/functions/deployments.js +146 -0
  49. package/dist/functions/fnConfigDiscovery.d.ts +3 -0
  50. package/dist/functions/fnConfigDiscovery.js +108 -0
  51. package/dist/functions/methods.d.ts +16 -0
  52. package/dist/functions/methods.js +174 -0
  53. package/dist/init.d.ts +2 -0
  54. package/dist/init.js +57 -0
  55. package/dist/interactiveCLI.d.ts +36 -0
  56. package/dist/interactiveCLI.js +952 -0
  57. package/dist/main.d.ts +2 -0
  58. package/dist/main.js +1125 -0
  59. package/dist/migrations/afterImportActions.d.ts +17 -0
  60. package/dist/migrations/afterImportActions.js +305 -0
  61. package/dist/migrations/appwriteToX.d.ts +211 -0
  62. package/dist/migrations/appwriteToX.js +493 -0
  63. package/dist/migrations/comprehensiveTransfer.d.ts +147 -0
  64. package/dist/migrations/comprehensiveTransfer.js +1315 -0
  65. package/dist/migrations/dataLoader.d.ts +755 -0
  66. package/dist/migrations/dataLoader.js +1272 -0
  67. package/dist/migrations/importController.d.ts +25 -0
  68. package/dist/migrations/importController.js +283 -0
  69. package/dist/migrations/importDataActions.d.ts +50 -0
  70. package/dist/migrations/importDataActions.js +230 -0
  71. package/dist/migrations/relationships.d.ts +29 -0
  72. package/dist/migrations/relationships.js +203 -0
  73. package/dist/migrations/services/DataTransformationService.d.ts +55 -0
  74. package/dist/migrations/services/DataTransformationService.js +158 -0
  75. package/dist/migrations/services/FileHandlerService.d.ts +75 -0
  76. package/dist/migrations/services/FileHandlerService.js +236 -0
  77. package/dist/migrations/services/ImportOrchestrator.d.ts +99 -0
  78. package/dist/migrations/services/ImportOrchestrator.js +493 -0
  79. package/dist/migrations/services/RateLimitManager.d.ts +138 -0
  80. package/dist/migrations/services/RateLimitManager.js +279 -0
  81. package/dist/migrations/services/RelationshipResolver.d.ts +120 -0
  82. package/dist/migrations/services/RelationshipResolver.js +332 -0
  83. package/dist/migrations/services/UserMappingService.d.ts +109 -0
  84. package/dist/migrations/services/UserMappingService.js +277 -0
  85. package/dist/migrations/services/ValidationService.d.ts +74 -0
  86. package/dist/migrations/services/ValidationService.js +260 -0
  87. package/dist/migrations/transfer.d.ts +30 -0
  88. package/dist/migrations/transfer.js +661 -0
  89. package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +131 -0
  90. package/dist/migrations/yaml/YamlImportConfigLoader.js +383 -0
  91. package/dist/migrations/yaml/YamlImportIntegration.d.ts +93 -0
  92. package/dist/migrations/yaml/YamlImportIntegration.js +341 -0
  93. package/dist/migrations/yaml/generateImportSchemas.d.ts +30 -0
  94. package/dist/migrations/yaml/generateImportSchemas.js +1327 -0
  95. package/dist/schemas/authUser.d.ts +24 -0
  96. package/dist/schemas/authUser.js +17 -0
  97. package/dist/setup.d.ts +2 -0
  98. package/{src/setup.ts → dist/setup.js} +0 -3
  99. package/dist/setupCommands.d.ts +58 -0
  100. package/dist/setupCommands.js +489 -0
  101. package/dist/setupController.d.ts +9 -0
  102. package/dist/setupController.js +34 -0
  103. package/dist/shared/backupMetadataSchema.d.ts +94 -0
  104. package/dist/shared/backupMetadataSchema.js +38 -0
  105. package/dist/shared/backupTracking.d.ts +18 -0
  106. package/dist/shared/backupTracking.js +176 -0
  107. package/dist/shared/confirmationDialogs.d.ts +75 -0
  108. package/dist/shared/confirmationDialogs.js +236 -0
  109. package/dist/shared/migrationHelpers.d.ts +61 -0
  110. package/dist/shared/migrationHelpers.js +145 -0
  111. package/{src/shared/operationLogger.ts → dist/shared/operationLogger.d.ts} +1 -11
  112. package/dist/shared/operationLogger.js +12 -0
  113. package/dist/shared/operationQueue.d.ts +40 -0
  114. package/dist/shared/operationQueue.js +310 -0
  115. package/dist/shared/operationsTable.d.ts +26 -0
  116. package/dist/shared/operationsTable.js +287 -0
  117. package/dist/shared/operationsTableSchema.d.ts +48 -0
  118. package/dist/shared/operationsTableSchema.js +35 -0
  119. package/dist/shared/progressManager.d.ts +62 -0
  120. package/dist/shared/progressManager.js +215 -0
  121. package/dist/shared/relationshipExtractor.d.ts +56 -0
  122. package/dist/shared/relationshipExtractor.js +138 -0
  123. package/dist/shared/selectionDialogs.d.ts +220 -0
  124. package/dist/shared/selectionDialogs.js +588 -0
  125. package/dist/storage/backupCompression.d.ts +20 -0
  126. package/dist/storage/backupCompression.js +67 -0
  127. package/dist/storage/methods.d.ts +44 -0
  128. package/dist/storage/methods.js +475 -0
  129. package/dist/storage/schemas.d.ts +842 -0
  130. package/dist/storage/schemas.js +175 -0
  131. package/dist/tables/indexManager.d.ts +65 -0
  132. package/dist/tables/indexManager.js +294 -0
  133. package/{src/types.ts → dist/types.d.ts} +1 -6
  134. package/dist/types.js +3 -0
  135. package/dist/users/methods.d.ts +16 -0
  136. package/dist/users/methods.js +276 -0
  137. package/dist/utils/configMigration.d.ts +1 -0
  138. package/dist/utils/configMigration.js +261 -0
  139. package/dist/utils/index.js +2 -0
  140. package/dist/utils/loadConfigs.d.ts +50 -0
  141. package/dist/utils/loadConfigs.js +357 -0
  142. package/dist/utils/setupFiles.d.ts +4 -0
  143. package/dist/utils/setupFiles.js +1190 -0
  144. package/dist/utilsController.d.ts +114 -0
  145. package/dist/utilsController.js +898 -0
  146. package/package.json +6 -3
  147. package/CHANGELOG.md +0 -35
  148. package/CONFIG_TODO.md +0 -1189
  149. package/SELECTION_DIALOGS.md +0 -146
  150. package/SERVICE_IMPLEMENTATION_REPORT.md +0 -462
  151. package/scripts/copy-templates.ts +0 -23
  152. package/src/backups/operations/bucketBackup.ts +0 -277
  153. package/src/backups/operations/collectionBackup.ts +0 -310
  154. package/src/backups/operations/comprehensiveBackup.ts +0 -342
  155. package/src/backups/schemas/bucketManifest.ts +0 -78
  156. package/src/backups/schemas/comprehensiveManifest.ts +0 -76
  157. package/src/backups/tracking/centralizedTracking.ts +0 -352
  158. package/src/cli/commands/configCommands.ts +0 -265
  159. package/src/cli/commands/databaseCommands.ts +0 -931
  160. package/src/cli/commands/functionCommands.ts +0 -419
  161. package/src/cli/commands/importFileCommands.ts +0 -815
  162. package/src/cli/commands/schemaCommands.ts +0 -200
  163. package/src/cli/commands/storageCommands.ts +0 -151
  164. package/src/cli/commands/transferCommands.ts +0 -454
  165. package/src/collections/attributes.ts.backup +0 -1555
  166. package/src/collections/columns.ts +0 -2025
  167. package/src/collections/indexes.ts +0 -350
  168. package/src/collections/methods.ts +0 -714
  169. package/src/collections/tableOperations.ts +0 -542
  170. package/src/collections/transferOperations.ts +0 -589
  171. package/src/collections/wipeOperations.ts +0 -449
  172. package/src/databases/methods.ts +0 -49
  173. package/src/databases/setup.ts +0 -77
  174. package/src/examples/yamlTerminologyExample.ts +0 -346
  175. package/src/functions/deployments.ts +0 -221
  176. package/src/functions/fnConfigDiscovery.ts +0 -103
  177. package/src/functions/methods.ts +0 -284
  178. package/src/init.ts +0 -62
  179. package/src/interactiveCLI.ts +0 -1201
  180. package/src/main.ts +0 -1517
  181. package/src/migrations/afterImportActions.ts +0 -579
  182. package/src/migrations/appwriteToX.ts +0 -668
  183. package/src/migrations/comprehensiveTransfer.ts +0 -2285
  184. package/src/migrations/dataLoader.ts +0 -1729
  185. package/src/migrations/importController.ts +0 -440
  186. package/src/migrations/importDataActions.ts +0 -315
  187. package/src/migrations/relationships.ts +0 -333
  188. package/src/migrations/services/DataTransformationService.ts +0 -196
  189. package/src/migrations/services/FileHandlerService.ts +0 -311
  190. package/src/migrations/services/ImportOrchestrator.ts +0 -675
  191. package/src/migrations/services/RateLimitManager.ts +0 -363
  192. package/src/migrations/services/RelationshipResolver.ts +0 -461
  193. package/src/migrations/services/UserMappingService.ts +0 -345
  194. package/src/migrations/services/ValidationService.ts +0 -349
  195. package/src/migrations/transfer.ts +0 -1113
  196. package/src/migrations/yaml/YamlImportConfigLoader.ts +0 -439
  197. package/src/migrations/yaml/YamlImportIntegration.ts +0 -446
  198. package/src/migrations/yaml/generateImportSchemas.ts +0 -1354
  199. package/src/schemas/authUser.ts +0 -23
  200. package/src/setupCommands.ts +0 -602
  201. package/src/setupController.ts +0 -43
  202. package/src/shared/backupMetadataSchema.ts +0 -93
  203. package/src/shared/backupTracking.ts +0 -211
  204. package/src/shared/confirmationDialogs.ts +0 -327
  205. package/src/shared/migrationHelpers.ts +0 -232
  206. package/src/shared/operationQueue.ts +0 -376
  207. package/src/shared/operationsTable.ts +0 -338
  208. package/src/shared/operationsTableSchema.ts +0 -60
  209. package/src/shared/progressManager.ts +0 -278
  210. package/src/shared/relationshipExtractor.ts +0 -214
  211. package/src/shared/selectionDialogs.ts +0 -802
  212. package/src/storage/backupCompression.ts +0 -88
  213. package/src/storage/methods.ts +0 -711
  214. package/src/storage/schemas.ts +0 -205
  215. package/src/tables/indexManager.ts +0 -409
  216. package/src/types/node-appwrite-tablesdb.d.ts +0 -44
  217. package/src/users/methods.ts +0 -358
  218. package/src/utils/configMigration.ts +0 -348
  219. package/src/utils/loadConfigs.ts +0 -457
  220. package/src/utils/setupFiles.ts +0 -1236
  221. package/src/utilsController.ts +0 -1263
  222. package/tests/README.md +0 -497
  223. package/tests/adapters/AdapterFactory.test.ts +0 -277
  224. package/tests/integration/syncOperations.test.ts +0 -463
  225. package/tests/jest.config.js +0 -25
  226. package/tests/migration/configMigration.test.ts +0 -546
  227. package/tests/setup.ts +0 -62
  228. package/tests/testUtils.ts +0 -340
  229. package/tests/utils/loadConfigs.test.ts +0 -350
  230. package/tests/validation/configValidation.test.ts +0 -412
  231. package/tsconfig.json +0 -44
  232. /package/{src → dist}/functions/templates/count-docs-in-collection/README.md +0 -0
  233. /package/{src → dist}/functions/templates/count-docs-in-collection/src/main.ts +0 -0
  234. /package/{src → dist}/functions/templates/count-docs-in-collection/src/request.ts +0 -0
  235. /package/{src → dist}/functions/templates/hono-typescript/README.md +0 -0
  236. /package/{src → dist}/functions/templates/hono-typescript/src/adapters/request.ts +0 -0
  237. /package/{src → dist}/functions/templates/hono-typescript/src/adapters/response.ts +0 -0
  238. /package/{src → dist}/functions/templates/hono-typescript/src/app.ts +0 -0
  239. /package/{src → dist}/functions/templates/hono-typescript/src/context.ts +0 -0
  240. /package/{src → dist}/functions/templates/hono-typescript/src/main.ts +0 -0
  241. /package/{src → dist}/functions/templates/hono-typescript/src/middleware/appwrite.ts +0 -0
  242. /package/{src → dist}/functions/templates/typescript-node/README.md +0 -0
  243. /package/{src → dist}/functions/templates/typescript-node/src/context.ts +0 -0
  244. /package/{src → dist}/functions/templates/typescript-node/src/main.ts +0 -0
  245. /package/{src → dist}/functions/templates/uv/README.md +0 -0
  246. /package/{src → dist}/functions/templates/uv/pyproject.toml +0 -0
  247. /package/{src → dist}/functions/templates/uv/src/__init__.py +0 -0
  248. /package/{src → dist}/functions/templates/uv/src/context.py +0 -0
  249. /package/{src → dist}/functions/templates/uv/src/main.py +0 -0
  250. /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
- }