appwrite-utils-cli 1.5.2 → 1.6.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/CHANGELOG.md +199 -0
- package/README.md +251 -29
- package/dist/adapters/AdapterFactory.d.ts +10 -3
- package/dist/adapters/AdapterFactory.js +213 -17
- package/dist/adapters/TablesDBAdapter.js +60 -17
- 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 +160 -0
- package/dist/cli/commands/databaseCommands.d.ts +13 -0
- package/dist/cli/commands/databaseCommands.js +478 -0
- package/dist/cli/commands/functionCommands.d.ts +7 -0
- package/dist/cli/commands/functionCommands.js +289 -0
- package/dist/cli/commands/schemaCommands.d.ts +7 -0
- package/dist/cli/commands/schemaCommands.js +134 -0
- package/dist/cli/commands/transferCommands.d.ts +5 -0
- package/dist/cli/commands/transferCommands.js +384 -0
- package/dist/collections/attributes.d.ts +5 -4
- package/dist/collections/attributes.js +539 -246
- package/dist/collections/indexes.js +39 -37
- package/dist/collections/methods.d.ts +2 -16
- package/dist/collections/methods.js +90 -538
- package/dist/collections/transferOperations.d.ts +7 -0
- package/dist/collections/transferOperations.js +331 -0
- package/dist/collections/wipeOperations.d.ts +16 -0
- package/dist/collections/wipeOperations.js +328 -0
- package/dist/config/configMigration.d.ts +87 -0
- package/dist/config/configMigration.js +390 -0
- package/dist/config/configValidation.d.ts +66 -0
- package/dist/config/configValidation.js +358 -0
- package/dist/config/yamlConfig.d.ts +455 -1
- package/dist/config/yamlConfig.js +145 -52
- package/dist/databases/methods.js +3 -2
- package/dist/databases/setup.d.ts +1 -2
- package/dist/databases/setup.js +9 -87
- package/dist/examples/yamlTerminologyExample.d.ts +42 -0
- package/dist/examples/yamlTerminologyExample.js +269 -0
- package/dist/functions/deployments.js +11 -10
- package/dist/functions/methods.d.ts +1 -1
- package/dist/functions/methods.js +5 -4
- package/dist/init.js +9 -9
- package/dist/interactiveCLI.d.ts +8 -17
- package/dist/interactiveCLI.js +181 -1172
- package/dist/main.js +364 -21
- package/dist/migrations/afterImportActions.js +22 -30
- package/dist/migrations/appwriteToX.js +71 -25
- package/dist/migrations/dataLoader.js +35 -26
- package/dist/migrations/importController.js +29 -30
- package/dist/migrations/relationships.js +13 -12
- package/dist/migrations/services/ImportOrchestrator.js +16 -19
- package/dist/migrations/transfer.js +46 -46
- package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +3 -1
- package/dist/migrations/yaml/YamlImportConfigLoader.js +6 -3
- package/dist/migrations/yaml/YamlImportIntegration.d.ts +9 -3
- package/dist/migrations/yaml/YamlImportIntegration.js +22 -11
- package/dist/migrations/yaml/generateImportSchemas.d.ts +14 -1
- package/dist/migrations/yaml/generateImportSchemas.js +736 -7
- package/dist/schemas/authUser.d.ts +1 -1
- package/dist/setupController.js +3 -2
- 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.js +15 -15
- package/dist/shared/errorUtils.d.ts +54 -0
- package/dist/shared/errorUtils.js +95 -0
- package/dist/shared/functionManager.js +20 -19
- package/dist/shared/indexManager.js +12 -11
- package/dist/shared/jsonSchemaGenerator.js +10 -26
- package/dist/shared/logging.d.ts +51 -0
- package/dist/shared/logging.js +70 -0
- package/dist/shared/messageFormatter.d.ts +2 -0
- package/dist/shared/messageFormatter.js +10 -0
- package/dist/shared/migrationHelpers.d.ts +6 -16
- package/dist/shared/migrationHelpers.js +24 -21
- package/dist/shared/operationLogger.d.ts +8 -1
- package/dist/shared/operationLogger.js +11 -24
- package/dist/shared/operationQueue.d.ts +28 -1
- package/dist/shared/operationQueue.js +268 -66
- package/dist/shared/operationsTable.d.ts +26 -0
- package/dist/shared/operationsTable.js +286 -0
- package/dist/shared/operationsTableSchema.d.ts +48 -0
- package/dist/shared/operationsTableSchema.js +35 -0
- package/dist/shared/relationshipExtractor.d.ts +56 -0
- package/dist/shared/relationshipExtractor.js +138 -0
- package/dist/shared/schemaGenerator.d.ts +19 -1
- package/dist/shared/schemaGenerator.js +56 -75
- package/dist/storage/backupCompression.d.ts +20 -0
- package/dist/storage/backupCompression.js +67 -0
- package/dist/storage/methods.d.ts +16 -2
- package/dist/storage/methods.js +98 -14
- package/dist/users/methods.js +9 -8
- package/dist/utils/configDiscovery.d.ts +78 -0
- package/dist/utils/configDiscovery.js +430 -0
- package/dist/utils/directoryUtils.d.ts +22 -0
- package/dist/utils/directoryUtils.js +59 -0
- package/dist/utils/getClientFromConfig.d.ts +17 -8
- package/dist/utils/getClientFromConfig.js +162 -17
- package/dist/utils/helperFunctions.d.ts +16 -2
- package/dist/utils/helperFunctions.js +19 -5
- package/dist/utils/loadConfigs.d.ts +34 -9
- package/dist/utils/loadConfigs.js +236 -316
- package/dist/utils/pathResolvers.d.ts +53 -0
- package/dist/utils/pathResolvers.js +72 -0
- package/dist/utils/projectConfig.d.ts +119 -0
- package/dist/utils/projectConfig.js +171 -0
- package/dist/utils/retryFailedPromises.js +4 -2
- package/dist/utils/sessionAuth.d.ts +48 -0
- package/dist/utils/sessionAuth.js +164 -0
- package/dist/utils/sessionPreservationExample.d.ts +1666 -0
- package/dist/utils/sessionPreservationExample.js +101 -0
- package/dist/utils/setupFiles.js +301 -41
- package/dist/utils/typeGuards.d.ts +35 -0
- package/dist/utils/typeGuards.js +57 -0
- package/dist/utils/versionDetection.js +145 -9
- package/dist/utils/yamlConverter.d.ts +53 -3
- package/dist/utils/yamlConverter.js +232 -13
- package/dist/utils/yamlLoader.d.ts +70 -0
- package/dist/utils/yamlLoader.js +263 -0
- package/dist/utilsController.d.ts +36 -3
- package/dist/utilsController.js +186 -56
- package/package.json +12 -2
- package/src/adapters/AdapterFactory.ts +263 -35
- package/src/adapters/TablesDBAdapter.ts +225 -36
- package/src/backups/operations/bucketBackup.ts +277 -0
- package/src/backups/operations/collectionBackup.ts +310 -0
- package/src/backups/operations/comprehensiveBackup.ts +342 -0
- package/src/backups/schemas/bucketManifest.ts +78 -0
- package/src/backups/schemas/comprehensiveManifest.ts +76 -0
- package/src/backups/tracking/centralizedTracking.ts +352 -0
- package/src/cli/commands/configCommands.ts +194 -0
- package/src/cli/commands/databaseCommands.ts +635 -0
- package/src/cli/commands/functionCommands.ts +379 -0
- package/src/cli/commands/schemaCommands.ts +163 -0
- package/src/cli/commands/transferCommands.ts +457 -0
- package/src/collections/attributes.ts +900 -621
- package/src/collections/attributes.ts.backup +1555 -0
- package/src/collections/indexes.ts +116 -114
- package/src/collections/methods.ts +295 -968
- package/src/collections/transferOperations.ts +516 -0
- package/src/collections/wipeOperations.ts +501 -0
- package/src/config/README.md +274 -0
- package/src/config/configMigration.ts +575 -0
- package/src/config/configValidation.ts +445 -0
- package/src/config/yamlConfig.ts +168 -55
- package/src/databases/methods.ts +3 -2
- package/src/databases/setup.ts +11 -138
- package/src/examples/yamlTerminologyExample.ts +341 -0
- package/src/functions/deployments.ts +14 -12
- package/src/functions/methods.ts +11 -11
- package/src/functions/templates/hono-typescript/README.md +286 -0
- package/src/functions/templates/hono-typescript/package.json +26 -0
- package/src/functions/templates/hono-typescript/src/adapters/request.ts +74 -0
- package/src/functions/templates/hono-typescript/src/adapters/response.ts +106 -0
- package/src/functions/templates/hono-typescript/src/app.ts +180 -0
- package/src/functions/templates/hono-typescript/src/context.ts +103 -0
- package/src/functions/templates/hono-typescript/src/index.ts +54 -0
- package/src/functions/templates/hono-typescript/src/middleware/appwrite.ts +119 -0
- package/src/functions/templates/hono-typescript/tsconfig.json +20 -0
- package/src/functions/templates/typescript-node/package.json +2 -1
- package/src/functions/templates/typescript-node/src/context.ts +103 -0
- package/src/functions/templates/typescript-node/src/index.ts +18 -12
- package/src/functions/templates/uv/pyproject.toml +1 -0
- package/src/functions/templates/uv/src/context.py +125 -0
- package/src/functions/templates/uv/src/index.py +35 -5
- package/src/init.ts +9 -11
- package/src/interactiveCLI.ts +278 -1596
- package/src/main.ts +418 -24
- package/src/migrations/afterImportActions.ts +71 -44
- package/src/migrations/appwriteToX.ts +100 -34
- package/src/migrations/dataLoader.ts +48 -34
- package/src/migrations/importController.ts +44 -39
- package/src/migrations/relationships.ts +28 -18
- package/src/migrations/services/ImportOrchestrator.ts +24 -27
- package/src/migrations/transfer.ts +159 -121
- package/src/migrations/yaml/YamlImportConfigLoader.ts +11 -4
- package/src/migrations/yaml/YamlImportIntegration.ts +47 -20
- package/src/migrations/yaml/generateImportSchemas.ts +751 -12
- package/src/setupController.ts +3 -2
- package/src/shared/backupMetadataSchema.ts +93 -0
- package/src/shared/backupTracking.ts +211 -0
- package/src/shared/confirmationDialogs.ts +19 -19
- package/src/shared/errorUtils.ts +110 -0
- package/src/shared/functionManager.ts +21 -20
- package/src/shared/indexManager.ts +12 -11
- package/src/shared/jsonSchemaGenerator.ts +38 -52
- package/src/shared/logging.ts +75 -0
- package/src/shared/messageFormatter.ts +14 -1
- package/src/shared/migrationHelpers.ts +45 -38
- package/src/shared/operationLogger.ts +11 -36
- package/src/shared/operationQueue.ts +322 -93
- package/src/shared/operationsTable.ts +338 -0
- package/src/shared/operationsTableSchema.ts +60 -0
- package/src/shared/relationshipExtractor.ts +214 -0
- package/src/shared/schemaGenerator.ts +179 -219
- package/src/storage/backupCompression.ts +88 -0
- package/src/storage/methods.ts +131 -34
- package/src/users/methods.ts +11 -9
- package/src/utils/configDiscovery.ts +502 -0
- package/src/utils/directoryUtils.ts +61 -0
- package/src/utils/getClientFromConfig.ts +205 -22
- package/src/utils/helperFunctions.ts +23 -5
- package/src/utils/loadConfigs.ts +313 -345
- package/src/utils/pathResolvers.ts +81 -0
- package/src/utils/projectConfig.ts +299 -0
- package/src/utils/retryFailedPromises.ts +4 -2
- package/src/utils/sessionAuth.ts +230 -0
- package/src/utils/setupFiles.ts +322 -54
- package/src/utils/typeGuards.ts +65 -0
- package/src/utils/versionDetection.ts +218 -64
- package/src/utils/yamlConverter.ts +296 -13
- package/src/utils/yamlLoader.ts +364 -0
- package/src/utilsController.ts +314 -110
- package/tests/README.md +497 -0
- package/tests/adapters/AdapterFactory.test.ts +277 -0
- package/tests/integration/syncOperations.test.ts +463 -0
- package/tests/jest.config.js +25 -0
- package/tests/migration/configMigration.test.ts +546 -0
- package/tests/setup.ts +62 -0
- package/tests/testUtils.ts +340 -0
- package/tests/utils/loadConfigs.test.ts +350 -0
- package/tests/validation/configValidation.test.ts +412 -0
- package/src/utils/schemaStrings.ts +0 -517
package/src/storage/methods.ts
CHANGED
@@ -17,6 +17,9 @@ import { retryFailedPromises } from "../utils/retryFailedPromises.js";
|
|
17
17
|
import { InputFile } from "node-appwrite/file";
|
18
18
|
import { MessageFormatter, Messages } from "../shared/messageFormatter.js";
|
19
19
|
import { ProgressManager } from "../shared/progressManager.js";
|
20
|
+
import { recordBackup } from "../shared/backupTracking.js";
|
21
|
+
import { AdapterFactory } from "../adapters/AdapterFactory.js";
|
22
|
+
import { createBackupZip } from "./backupCompression.js";
|
20
23
|
|
21
24
|
export const getStorage = (config: AppwriteConfig) => {
|
22
25
|
const client = getClientFromConfig(config);
|
@@ -274,30 +277,70 @@ export const initOrGetDocumentStorage = async (
|
|
274
277
|
}
|
275
278
|
};
|
276
279
|
|
277
|
-
|
278
|
-
|
280
|
+
/**
|
281
|
+
* Initializes or gets the centralized backup bucket
|
282
|
+
* All backups are stored in a single "appwrite-backups" bucket
|
283
|
+
*/
|
284
|
+
export const initBackupBucket = async (
|
279
285
|
storage: Storage
|
280
|
-
) => {
|
286
|
+
): Promise<Models.Bucket | undefined> => {
|
287
|
+
const BACKUP_BUCKET_ID = "appwrite-backups";
|
288
|
+
const BACKUP_BUCKET_NAME = "Backups";
|
289
|
+
|
281
290
|
try {
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
} catch (
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
291
|
+
// Try to get existing bucket
|
292
|
+
const bucket = await storage.getBucket(BACKUP_BUCKET_ID);
|
293
|
+
return bucket;
|
294
|
+
} catch (error) {
|
295
|
+
// Bucket doesn't exist, create it
|
296
|
+
try {
|
297
|
+
const bucket = await storage.createBucket(
|
298
|
+
BACKUP_BUCKET_ID,
|
299
|
+
BACKUP_BUCKET_NAME,
|
300
|
+
[
|
301
|
+
Permission.read(Role.any()),
|
302
|
+
Permission.create(Role.users()),
|
303
|
+
Permission.update(Role.users()),
|
304
|
+
Permission.delete(Role.users())
|
305
|
+
],
|
306
|
+
false, // fileSecurity
|
307
|
+
true, // enabled
|
308
|
+
undefined, // maximumFileSize
|
309
|
+
undefined, // allowedFileExtensions
|
310
|
+
Compression.Gzip, // compression
|
311
|
+
false, // encryption
|
312
|
+
false // antivirus
|
313
|
+
);
|
314
|
+
|
315
|
+
MessageFormatter.success(`Created backup bucket: ${BACKUP_BUCKET_ID}`);
|
316
|
+
return bucket;
|
317
|
+
} catch (createError) {
|
318
|
+
MessageFormatter.error("Failed to create backup bucket",
|
319
|
+
createError instanceof Error ? createError : new Error(String(createError))
|
320
|
+
);
|
321
|
+
return undefined;
|
322
|
+
}
|
292
323
|
}
|
293
324
|
};
|
294
325
|
|
326
|
+
export interface DatabaseBackupResult {
|
327
|
+
backupFileId: string;
|
328
|
+
backupFileName: string;
|
329
|
+
backupSizeBytes: number;
|
330
|
+
databaseId: string;
|
331
|
+
databaseName: string;
|
332
|
+
collectionCount: number;
|
333
|
+
documentCount: number;
|
334
|
+
format: 'json' | 'zip';
|
335
|
+
}
|
336
|
+
|
295
337
|
export const backupDatabase = async (
|
296
338
|
config: AppwriteConfig,
|
297
339
|
database: Databases,
|
298
340
|
databaseId: string,
|
299
|
-
storage: Storage
|
300
|
-
|
341
|
+
storage: Storage,
|
342
|
+
format: 'json' | 'zip' = 'json'
|
343
|
+
): Promise<DatabaseBackupResult> => {
|
301
344
|
const startTime = Date.now();
|
302
345
|
|
303
346
|
MessageFormatter.banner("Database Backup", `Backing up database: ${databaseId}`);
|
@@ -317,7 +360,7 @@ export const backupDatabase = async (
|
|
317
360
|
total: 100,
|
318
361
|
error: "",
|
319
362
|
status: "in_progress",
|
320
|
-
}
|
363
|
+
});
|
321
364
|
|
322
365
|
let progress: ProgressManager | null = null;
|
323
366
|
let totalDocuments = 0;
|
@@ -449,8 +492,7 @@ export const backupDatabase = async (
|
|
449
492
|
error: "",
|
450
493
|
status: "in_progress",
|
451
494
|
},
|
452
|
-
backupOperation.$id
|
453
|
-
config.useMigrations
|
495
|
+
backupOperation.$id
|
454
496
|
);
|
455
497
|
}
|
456
498
|
|
@@ -484,21 +526,65 @@ export const backupDatabase = async (
|
|
484
526
|
}
|
485
527
|
|
486
528
|
MessageFormatter.step(3, 3, "Creating backup file");
|
487
|
-
|
488
|
-
const bucket = await
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
529
|
+
|
530
|
+
const bucket = await initBackupBucket(storage);
|
531
|
+
if (!bucket) {
|
532
|
+
throw new Error("Failed to initialize backup bucket");
|
533
|
+
}
|
534
|
+
|
535
|
+
let inputFile: any;
|
536
|
+
let fileName: string;
|
537
|
+
let backupSize: number;
|
538
|
+
|
539
|
+
if (format === 'zip') {
|
540
|
+
// Create compressed backup
|
541
|
+
const zipBuffer = await createBackupZip(data);
|
542
|
+
fileName = `${new Date().toISOString()}-${databaseId}.zip`;
|
543
|
+
backupSize = zipBuffer.length;
|
544
|
+
inputFile = InputFile.fromBuffer(new Uint8Array(zipBuffer), fileName);
|
545
|
+
} else {
|
546
|
+
// Use JSON format (existing logic)
|
547
|
+
const backupData = JSON.stringify(data, null, 2);
|
548
|
+
fileName = `${new Date().toISOString()}-${databaseId}.json`;
|
549
|
+
backupSize = Buffer.byteLength(backupData, 'utf8');
|
550
|
+
inputFile = InputFile.fromPlainText(backupData, fileName);
|
551
|
+
}
|
552
|
+
|
494
553
|
const fileCreated = await storage.createFile(
|
495
|
-
bucket
|
554
|
+
bucket.$id,
|
496
555
|
ulid(),
|
497
556
|
inputFile
|
498
557
|
);
|
499
558
|
|
500
559
|
progress?.stop();
|
501
560
|
|
561
|
+
// Record backup metadata
|
562
|
+
try {
|
563
|
+
const { adapter } = await AdapterFactory.create({
|
564
|
+
appwriteEndpoint: config.appwriteEndpoint,
|
565
|
+
appwriteProject: config.appwriteProject,
|
566
|
+
appwriteKey: config.appwriteKey,
|
567
|
+
sessionCookie: config.sessionCookie
|
568
|
+
});
|
569
|
+
|
570
|
+
await recordBackup(adapter, databaseId, {
|
571
|
+
backupId: fileCreated.$id,
|
572
|
+
backupType: 'database',
|
573
|
+
databaseId: databaseId,
|
574
|
+
sizeBytes: backupSize,
|
575
|
+
collections: data.collections.length,
|
576
|
+
documents: processedDocuments,
|
577
|
+
format: format,
|
578
|
+
status: 'completed',
|
579
|
+
restorationStatus: 'not_restored'
|
580
|
+
});
|
581
|
+
} catch (metadataError) {
|
582
|
+
// Don't fail backup if metadata recording fails
|
583
|
+
MessageFormatter.warning(
|
584
|
+
`Failed to record backup metadata: ${metadataError instanceof Error ? metadataError.message : String(metadataError)}`
|
585
|
+
);
|
586
|
+
}
|
587
|
+
|
502
588
|
if (backupOperation) {
|
503
589
|
await logOperation(
|
504
590
|
database,
|
@@ -512,13 +598,12 @@ export const backupDatabase = async (
|
|
512
598
|
error: "",
|
513
599
|
status: "completed",
|
514
600
|
},
|
515
|
-
backupOperation.$id
|
516
|
-
config.useMigrations
|
601
|
+
backupOperation.$id
|
517
602
|
);
|
518
603
|
}
|
519
604
|
|
520
605
|
const duration = Date.now() - startTime;
|
521
|
-
|
606
|
+
|
522
607
|
MessageFormatter.operationSummary("Backup", {
|
523
608
|
database: databaseId,
|
524
609
|
collections: data.collections.length,
|
@@ -529,11 +614,24 @@ export const backupDatabase = async (
|
|
529
614
|
}, duration);
|
530
615
|
|
531
616
|
MessageFormatter.success(Messages.BACKUP_COMPLETED(databaseId, backupSize));
|
617
|
+
|
618
|
+
// Return backup result for tracking
|
619
|
+
const dbData = JSON.parse(data.database);
|
620
|
+
return {
|
621
|
+
backupFileId: fileCreated.$id,
|
622
|
+
backupFileName: fileName,
|
623
|
+
backupSizeBytes: backupSize,
|
624
|
+
databaseId: databaseId,
|
625
|
+
databaseName: dbData.name || databaseId,
|
626
|
+
collectionCount: data.collections.length,
|
627
|
+
documentCount: processedDocuments,
|
628
|
+
format: format
|
629
|
+
};
|
532
630
|
} catch (error) {
|
533
631
|
progress?.fail(error instanceof Error ? error.message : String(error));
|
534
|
-
|
632
|
+
|
535
633
|
MessageFormatter.error("Backup failed", error instanceof Error ? error : new Error(String(error)));
|
536
|
-
|
634
|
+
|
537
635
|
if (backupOperation) {
|
538
636
|
await logOperation(
|
539
637
|
database,
|
@@ -547,11 +645,10 @@ export const backupDatabase = async (
|
|
547
645
|
error: String(error),
|
548
646
|
status: "error",
|
549
647
|
},
|
550
|
-
backupOperation.$id
|
551
|
-
config.useMigrations
|
648
|
+
backupOperation.$id
|
552
649
|
);
|
553
650
|
}
|
554
|
-
|
651
|
+
|
555
652
|
throw error;
|
556
653
|
}
|
557
654
|
};
|
package/src/users/methods.ts
CHANGED
@@ -20,6 +20,7 @@ import {
|
|
20
20
|
} from "../utils/helperFunctions.js";
|
21
21
|
import { isUndefined } from "es-toolkit/compat";
|
22
22
|
import { isEmpty } from "es-toolkit/compat";
|
23
|
+
import { MessageFormatter } from "../shared/messageFormatter.js";
|
23
24
|
|
24
25
|
export class UsersController {
|
25
26
|
private config: AppwriteConfig;
|
@@ -43,7 +44,7 @@ export class UsersController {
|
|
43
44
|
|
44
45
|
async wipeUsers() {
|
45
46
|
const allUsers = await this.getAllUsers();
|
46
|
-
|
47
|
+
MessageFormatter.progress("Deleting all users...", { prefix: "Users" });
|
47
48
|
|
48
49
|
const createBatches = (finalData: any[], batchSize: number) => {
|
49
50
|
const finalBatches: any[][] = [];
|
@@ -58,7 +59,7 @@ export class UsersController {
|
|
58
59
|
const batchedUserPromises = createBatches(allUsers, 25); // Batch size of 25
|
59
60
|
|
60
61
|
for (const batch of batchedUserPromises) {
|
61
|
-
|
62
|
+
MessageFormatter.progress(`Deleting ${batch.length} users...`, { prefix: "Users" });
|
62
63
|
await Promise.all(
|
63
64
|
batch.map((user) =>
|
64
65
|
tryAwaitWithRetry(async () => await this.users.delete(user.$id))
|
@@ -66,11 +67,11 @@ export class UsersController {
|
|
66
67
|
);
|
67
68
|
usersDeleted += batch.length;
|
68
69
|
if (usersDeleted % 100 === 0) {
|
69
|
-
|
70
|
+
MessageFormatter.progress(`Deleted ${usersDeleted} users...`, { prefix: "Users" });
|
70
71
|
}
|
71
72
|
}
|
72
73
|
} else {
|
73
|
-
|
74
|
+
MessageFormatter.info("No users to delete", { prefix: "Users" });
|
74
75
|
}
|
75
76
|
}
|
76
77
|
|
@@ -194,7 +195,7 @@ export class UsersController {
|
|
194
195
|
item.email
|
195
196
|
);
|
196
197
|
} else {
|
197
|
-
|
198
|
+
MessageFormatter.warning("Email update skipped: Email already exists.", { prefix: "Users" });
|
198
199
|
}
|
199
200
|
}
|
200
201
|
if (item.password) {
|
@@ -228,8 +229,9 @@ export class UsersController {
|
|
228
229
|
}
|
229
230
|
}
|
230
231
|
if (item.$createdAt && item.$updatedAt) {
|
231
|
-
|
232
|
-
"$createdAt and $updatedAt are not yet supported, sorry about that!"
|
232
|
+
MessageFormatter.warning(
|
233
|
+
"$createdAt and $updatedAt are not yet supported, sorry about that!",
|
234
|
+
{ prefix: "Users" }
|
233
235
|
);
|
234
236
|
}
|
235
237
|
if (item.labels && item.labels.length) {
|
@@ -305,10 +307,10 @@ export class UsersController {
|
|
305
307
|
let fromUsers = await localUsers.list([Query.limit(50)]);
|
306
308
|
|
307
309
|
if (fromUsers.users.length === 0) {
|
308
|
-
|
310
|
+
MessageFormatter.info("No users found", { prefix: "Users" });
|
309
311
|
return;
|
310
312
|
} else if (fromUsers.users.length < 50) {
|
311
|
-
|
313
|
+
MessageFormatter.progress(`Transferring ${fromUsers.users.length} users to remote`, { prefix: "Users" });
|
312
314
|
const batchedPromises = fromUsers.users.map((user) => {
|
313
315
|
return tryAwaitWithRetry(async () => {
|
314
316
|
const toCreateObject: Partial<typeof user> = {
|