appwrite-utils-cli 1.9.7 → 1.11.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/CONFIG_TODO.md +1189 -1189
- package/README.md +1004 -1004
- package/SELECTION_DIALOGS.md +145 -145
- package/SERVICE_IMPLEMENTATION_REPORT.md +462 -462
- package/package.json +6 -3
- package/scripts/copy-templates.ts +23 -23
- package/src/adapters/index.ts +11 -37
- package/src/backups/operations/bucketBackup.ts +277 -277
- package/src/backups/operations/collectionBackup.ts +310 -310
- package/src/backups/operations/comprehensiveBackup.ts +342 -342
- package/src/backups/schemas/bucketManifest.ts +78 -78
- package/src/backups/schemas/comprehensiveManifest.ts +76 -76
- package/src/backups/tracking/centralizedTracking.ts +352 -352
- package/src/cli/commands/configCommands.ts +265 -201
- package/src/cli/commands/databaseCommands.ts +931 -879
- package/src/cli/commands/functionCommands.ts +333 -332
- package/src/cli/commands/importFileCommands.ts +815 -0
- package/src/cli/commands/schemaCommands.ts +141 -141
- package/src/cli/commands/storageCommands.ts +2 -3
- package/src/cli/commands/transferCommands.ts +454 -457
- package/src/collections/attributes.ts.backup +1555 -1555
- package/src/collections/{attributes.ts → columns.ts} +15 -10
- package/src/collections/indexes.ts +350 -352
- package/src/collections/methods.ts +714 -700
- package/src/collections/tableOperations.ts +29 -8
- package/src/collections/transferOperations.ts +376 -377
- package/src/collections/wipeOperations.ts +449 -346
- package/src/databases/methods.ts +49 -49
- package/src/databases/setup.ts +77 -77
- package/src/examples/yamlTerminologyExample.ts +346 -346
- package/src/functions/deployments.ts +221 -220
- package/src/functions/fnConfigDiscovery.ts +2 -2
- package/src/functions/methods.ts +284 -284
- package/src/functions/templates/count-docs-in-collection/README.md +53 -53
- package/src/functions/templates/count-docs-in-collection/src/main.ts +159 -159
- package/src/functions/templates/count-docs-in-collection/src/request.ts +8 -8
- package/src/functions/templates/hono-typescript/README.md +285 -285
- package/src/functions/templates/hono-typescript/src/adapters/request.ts +73 -73
- package/src/functions/templates/hono-typescript/src/adapters/response.ts +105 -105
- package/src/functions/templates/hono-typescript/src/app.ts +179 -179
- package/src/functions/templates/hono-typescript/src/context.ts +102 -102
- package/src/functions/templates/hono-typescript/src/{index.ts → main.ts} +53 -53
- package/src/functions/templates/hono-typescript/src/middleware/appwrite.ts +118 -118
- package/src/functions/templates/typescript-node/README.md +31 -31
- package/src/functions/templates/typescript-node/src/context.ts +102 -102
- package/src/functions/templates/typescript-node/src/{index.ts → main.ts} +29 -29
- package/src/functions/templates/uv/README.md +30 -30
- package/src/functions/templates/uv/pyproject.toml +29 -29
- package/src/functions/templates/uv/src/context.py +124 -124
- package/src/functions/templates/uv/src/{index.py → main.py} +45 -45
- package/src/init.ts +62 -62
- package/src/interactiveCLI.ts +1095 -1030
- package/src/main.ts +1517 -1670
- package/src/migrations/afterImportActions.ts +579 -580
- package/src/migrations/appwriteToX.ts +634 -630
- package/src/migrations/comprehensiveTransfer.ts +2149 -2149
- package/src/migrations/dataLoader.ts +1729 -1702
- package/src/migrations/importController.ts +440 -428
- package/src/migrations/importDataActions.ts +315 -315
- package/src/migrations/relationships.ts +333 -334
- package/src/migrations/services/DataTransformationService.ts +195 -195
- package/src/migrations/services/FileHandlerService.ts +310 -310
- package/src/migrations/services/ImportOrchestrator.ts +674 -665
- package/src/migrations/services/RateLimitManager.ts +362 -362
- package/src/migrations/services/RelationshipResolver.ts +460 -460
- package/src/migrations/services/UserMappingService.ts +344 -344
- package/src/migrations/services/ValidationService.ts +333 -333
- package/src/migrations/transfer.ts +987 -942
- package/src/migrations/yaml/YamlImportConfigLoader.ts +438 -438
- package/src/migrations/yaml/YamlImportIntegration.ts +438 -438
- package/src/migrations/yaml/generateImportSchemas.ts +1347 -1347
- package/src/schemas/authUser.ts +23 -23
- package/src/setup.ts +8 -8
- package/src/setupCommands.ts +5 -6
- package/src/setupController.ts +42 -42
- package/src/shared/backupMetadataSchema.ts +93 -93
- package/src/shared/backupTracking.ts +211 -211
- package/src/shared/confirmationDialogs.ts +326 -326
- package/src/shared/migrationHelpers.ts +232 -232
- package/src/shared/operationLogger.ts +20 -20
- package/src/shared/operationQueue.ts +326 -327
- package/src/shared/operationsTable.ts +338 -338
- package/src/shared/operationsTableSchema.ts +60 -60
- package/src/shared/progressManager.ts +277 -277
- package/src/shared/relationshipExtractor.ts +214 -214
- package/src/shared/selectionDialogs.ts +775 -722
- package/src/storage/backupCompression.ts +88 -88
- package/src/storage/methods.ts +695 -682
- package/src/storage/schemas.ts +205 -205
- package/src/tables/indexManager.ts +408 -408
- package/src/types/node-appwrite-tablesdb.d.ts +43 -43
- package/src/types.ts +9 -9
- package/src/users/methods.ts +358 -359
- package/src/utils/configMigration.ts +347 -347
- package/src/utils/index.ts +2 -2
- package/src/utils/loadConfigs.ts +457 -449
- package/src/utils/setupFiles.ts +1236 -1238
- package/src/utilsController.ts +1263 -1213
- package/tests/README.md +496 -496
- package/tests/adapters/AdapterFactory.test.ts +276 -276
- package/tests/integration/syncOperations.test.ts +462 -462
- package/tests/jest.config.js +24 -24
- package/tests/migration/configMigration.test.ts +545 -545
- package/tests/setup.ts +61 -61
- package/tests/testUtils.ts +339 -339
- package/tests/utils/loadConfigs.test.ts +349 -349
- package/tests/validation/configValidation.test.ts +411 -411
- package/tsconfig.json +44 -44
- package/.appwrite/.yaml_schemas/appwrite-config.schema.json +0 -380
- package/.appwrite/.yaml_schemas/collection.schema.json +0 -255
- package/.appwrite/collections/Categories.yaml +0 -182
- package/.appwrite/collections/ExampleCollection.yaml +0 -36
- package/.appwrite/collections/Posts.yaml +0 -227
- package/.appwrite/collections/Users.yaml +0 -149
- package/.appwrite/config.yaml +0 -109
- package/.appwrite/import/README.md +0 -148
- package/.appwrite/import/categories-import.yaml +0 -129
- package/.appwrite/import/posts-import.yaml +0 -208
- package/.appwrite/import/users-import.yaml +0 -130
- package/.appwrite/importData/categories.json +0 -194
- package/.appwrite/importData/posts.json +0 -270
- package/.appwrite/importData/users.json +0 -220
- package/.appwrite/schemas/categories.json +0 -128
- package/.appwrite/schemas/exampleCollection.json +0 -52
- package/.appwrite/schemas/posts.json +0 -173
- package/.appwrite/schemas/users.json +0 -125
- package/dist/adapters/AdapterFactory.d.ts +0 -94
- package/dist/adapters/AdapterFactory.js +0 -420
- package/dist/adapters/DatabaseAdapter.d.ts +0 -243
- package/dist/adapters/DatabaseAdapter.js +0 -50
- package/dist/adapters/LegacyAdapter.d.ts +0 -50
- package/dist/adapters/LegacyAdapter.js +0 -615
- package/dist/adapters/TablesDBAdapter.d.ts +0 -45
- package/dist/adapters/TablesDBAdapter.js +0 -611
- package/dist/adapters/index.d.ts +0 -11
- package/dist/adapters/index.js +0 -12
- package/dist/backups/operations/bucketBackup.d.ts +0 -19
- package/dist/backups/operations/bucketBackup.js +0 -197
- package/dist/backups/operations/collectionBackup.d.ts +0 -30
- package/dist/backups/operations/collectionBackup.js +0 -201
- package/dist/backups/operations/comprehensiveBackup.d.ts +0 -25
- package/dist/backups/operations/comprehensiveBackup.js +0 -238
- package/dist/backups/schemas/bucketManifest.d.ts +0 -93
- package/dist/backups/schemas/bucketManifest.js +0 -33
- package/dist/backups/schemas/comprehensiveManifest.d.ts +0 -108
- package/dist/backups/schemas/comprehensiveManifest.js +0 -32
- package/dist/backups/tracking/centralizedTracking.d.ts +0 -34
- package/dist/backups/tracking/centralizedTracking.js +0 -274
- package/dist/cli/commands/configCommands.d.ts +0 -8
- package/dist/cli/commands/configCommands.js +0 -166
- package/dist/cli/commands/databaseCommands.d.ts +0 -14
- package/dist/cli/commands/databaseCommands.js +0 -644
- package/dist/cli/commands/functionCommands.d.ts +0 -7
- package/dist/cli/commands/functionCommands.js +0 -330
- package/dist/cli/commands/schemaCommands.d.ts +0 -7
- package/dist/cli/commands/schemaCommands.js +0 -169
- package/dist/cli/commands/storageCommands.d.ts +0 -5
- package/dist/cli/commands/storageCommands.js +0 -143
- package/dist/cli/commands/transferCommands.d.ts +0 -5
- package/dist/cli/commands/transferCommands.js +0 -384
- package/dist/collections/attributes.d.ts +0 -13
- package/dist/collections/attributes.js +0 -1333
- package/dist/collections/indexes.d.ts +0 -12
- package/dist/collections/indexes.js +0 -217
- package/dist/collections/methods.d.ts +0 -19
- package/dist/collections/methods.js +0 -587
- package/dist/collections/tableOperations.d.ts +0 -86
- package/dist/collections/tableOperations.js +0 -447
- package/dist/collections/transferOperations.d.ts +0 -8
- package/dist/collections/transferOperations.js +0 -412
- package/dist/collections/wipeOperations.d.ts +0 -16
- package/dist/collections/wipeOperations.js +0 -233
- package/dist/config/ConfigManager.d.ts +0 -450
- package/dist/config/ConfigManager.js +0 -650
- package/dist/config/configMigration.d.ts +0 -87
- package/dist/config/configMigration.js +0 -390
- package/dist/config/configValidation.d.ts +0 -66
- package/dist/config/configValidation.js +0 -358
- package/dist/config/index.d.ts +0 -8
- package/dist/config/index.js +0 -7
- package/dist/config/services/ConfigDiscoveryService.d.ts +0 -122
- package/dist/config/services/ConfigDiscoveryService.js +0 -322
- package/dist/config/services/ConfigLoaderService.d.ts +0 -129
- package/dist/config/services/ConfigLoaderService.js +0 -535
- package/dist/config/services/ConfigMergeService.d.ts +0 -208
- package/dist/config/services/ConfigMergeService.js +0 -308
- package/dist/config/services/ConfigValidationService.d.ts +0 -214
- package/dist/config/services/ConfigValidationService.js +0 -310
- package/dist/config/services/SessionAuthService.d.ts +0 -225
- package/dist/config/services/SessionAuthService.js +0 -456
- package/dist/config/services/__tests__/ConfigMergeService.test.d.ts +0 -1
- package/dist/config/services/__tests__/ConfigMergeService.test.js +0 -271
- package/dist/config/services/index.d.ts +0 -13
- package/dist/config/services/index.js +0 -10
- package/dist/config/yamlConfig.d.ts +0 -722
- package/dist/config/yamlConfig.js +0 -702
- package/dist/databases/methods.d.ts +0 -6
- package/dist/databases/methods.js +0 -35
- package/dist/databases/setup.d.ts +0 -5
- package/dist/databases/setup.js +0 -45
- package/dist/examples/yamlTerminologyExample.d.ts +0 -42
- package/dist/examples/yamlTerminologyExample.js +0 -272
- package/dist/functions/deployments.d.ts +0 -4
- package/dist/functions/deployments.js +0 -146
- package/dist/functions/fnConfigDiscovery.d.ts +0 -3
- package/dist/functions/fnConfigDiscovery.js +0 -108
- package/dist/functions/methods.d.ts +0 -16
- package/dist/functions/methods.js +0 -174
- package/dist/functions/pathResolution.d.ts +0 -37
- package/dist/functions/pathResolution.js +0 -185
- package/dist/functions/templates/count-docs-in-collection/README.md +0 -54
- package/dist/functions/templates/count-docs-in-collection/package.json +0 -25
- package/dist/functions/templates/count-docs-in-collection/src/main.ts +0 -159
- package/dist/functions/templates/count-docs-in-collection/src/request.ts +0 -9
- package/dist/functions/templates/count-docs-in-collection/tsconfig.json +0 -28
- package/dist/functions/templates/hono-typescript/README.md +0 -286
- package/dist/functions/templates/hono-typescript/package.json +0 -26
- package/dist/functions/templates/hono-typescript/src/adapters/request.ts +0 -74
- package/dist/functions/templates/hono-typescript/src/adapters/response.ts +0 -106
- package/dist/functions/templates/hono-typescript/src/app.ts +0 -180
- package/dist/functions/templates/hono-typescript/src/context.ts +0 -103
- package/dist/functions/templates/hono-typescript/src/index.ts +0 -54
- package/dist/functions/templates/hono-typescript/src/middleware/appwrite.ts +0 -119
- package/dist/functions/templates/hono-typescript/tsconfig.json +0 -20
- package/dist/functions/templates/typescript-node/README.md +0 -32
- package/dist/functions/templates/typescript-node/package.json +0 -25
- package/dist/functions/templates/typescript-node/src/context.ts +0 -103
- package/dist/functions/templates/typescript-node/src/index.ts +0 -29
- package/dist/functions/templates/typescript-node/tsconfig.json +0 -28
- package/dist/functions/templates/uv/README.md +0 -31
- package/dist/functions/templates/uv/pyproject.toml +0 -30
- package/dist/functions/templates/uv/src/__init__.py +0 -0
- package/dist/functions/templates/uv/src/context.py +0 -125
- package/dist/functions/templates/uv/src/index.py +0 -46
- package/dist/init.d.ts +0 -2
- package/dist/init.js +0 -57
- package/dist/interactiveCLI.d.ts +0 -31
- package/dist/interactiveCLI.js +0 -898
- package/dist/main.d.ts +0 -2
- package/dist/main.js +0 -1180
- package/dist/migrations/afterImportActions.d.ts +0 -17
- package/dist/migrations/afterImportActions.js +0 -306
- package/dist/migrations/appwriteToX.d.ts +0 -211
- package/dist/migrations/appwriteToX.js +0 -491
- package/dist/migrations/comprehensiveTransfer.d.ts +0 -147
- package/dist/migrations/comprehensiveTransfer.js +0 -1317
- package/dist/migrations/dataLoader.d.ts +0 -753
- package/dist/migrations/dataLoader.js +0 -1250
- package/dist/migrations/importController.d.ts +0 -23
- package/dist/migrations/importController.js +0 -268
- package/dist/migrations/importDataActions.d.ts +0 -50
- package/dist/migrations/importDataActions.js +0 -230
- package/dist/migrations/relationships.d.ts +0 -29
- package/dist/migrations/relationships.js +0 -204
- package/dist/migrations/services/DataTransformationService.d.ts +0 -55
- package/dist/migrations/services/DataTransformationService.js +0 -158
- package/dist/migrations/services/FileHandlerService.d.ts +0 -75
- package/dist/migrations/services/FileHandlerService.js +0 -236
- package/dist/migrations/services/ImportOrchestrator.d.ts +0 -97
- package/dist/migrations/services/ImportOrchestrator.js +0 -485
- package/dist/migrations/services/RateLimitManager.d.ts +0 -138
- package/dist/migrations/services/RateLimitManager.js +0 -279
- package/dist/migrations/services/RelationshipResolver.d.ts +0 -120
- package/dist/migrations/services/RelationshipResolver.js +0 -332
- package/dist/migrations/services/UserMappingService.d.ts +0 -109
- package/dist/migrations/services/UserMappingService.js +0 -277
- package/dist/migrations/services/ValidationService.d.ts +0 -74
- package/dist/migrations/services/ValidationService.js +0 -260
- package/dist/migrations/transfer.d.ts +0 -26
- package/dist/migrations/transfer.js +0 -608
- package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +0 -131
- package/dist/migrations/yaml/YamlImportConfigLoader.js +0 -383
- package/dist/migrations/yaml/YamlImportIntegration.d.ts +0 -93
- package/dist/migrations/yaml/YamlImportIntegration.js +0 -341
- package/dist/migrations/yaml/generateImportSchemas.d.ts +0 -30
- package/dist/migrations/yaml/generateImportSchemas.js +0 -1327
- package/dist/schemas/authUser.d.ts +0 -24
- package/dist/schemas/authUser.js +0 -17
- package/dist/setup.d.ts +0 -2
- package/dist/setup.js +0 -5
- package/dist/setupCommands.d.ts +0 -58
- package/dist/setupCommands.js +0 -490
- package/dist/setupController.d.ts +0 -9
- package/dist/setupController.js +0 -34
- package/dist/shared/attributeMapper.d.ts +0 -20
- package/dist/shared/attributeMapper.js +0 -203
- package/dist/shared/backupMetadataSchema.d.ts +0 -94
- package/dist/shared/backupMetadataSchema.js +0 -38
- package/dist/shared/backupTracking.d.ts +0 -18
- package/dist/shared/backupTracking.js +0 -176
- package/dist/shared/confirmationDialogs.d.ts +0 -75
- package/dist/shared/confirmationDialogs.js +0 -236
- package/dist/shared/errorUtils.d.ts +0 -54
- package/dist/shared/errorUtils.js +0 -95
- package/dist/shared/functionManager.d.ts +0 -48
- package/dist/shared/functionManager.js +0 -348
- package/dist/shared/jsonSchemaGenerator.d.ts +0 -50
- package/dist/shared/jsonSchemaGenerator.js +0 -290
- package/dist/shared/logging.d.ts +0 -61
- package/dist/shared/logging.js +0 -116
- package/dist/shared/messageFormatter.d.ts +0 -39
- package/dist/shared/messageFormatter.js +0 -162
- package/dist/shared/migrationHelpers.d.ts +0 -61
- package/dist/shared/migrationHelpers.js +0 -145
- package/dist/shared/operationLogger.d.ts +0 -10
- package/dist/shared/operationLogger.js +0 -12
- package/dist/shared/operationQueue.d.ts +0 -40
- package/dist/shared/operationQueue.js +0 -311
- package/dist/shared/operationsTable.d.ts +0 -26
- package/dist/shared/operationsTable.js +0 -286
- package/dist/shared/operationsTableSchema.d.ts +0 -48
- package/dist/shared/operationsTableSchema.js +0 -35
- package/dist/shared/progressManager.d.ts +0 -62
- package/dist/shared/progressManager.js +0 -215
- package/dist/shared/pydanticModelGenerator.d.ts +0 -17
- package/dist/shared/pydanticModelGenerator.js +0 -615
- package/dist/shared/relationshipExtractor.d.ts +0 -56
- package/dist/shared/relationshipExtractor.js +0 -138
- package/dist/shared/schemaGenerator.d.ts +0 -40
- package/dist/shared/schemaGenerator.js +0 -556
- package/dist/shared/selectionDialogs.d.ts +0 -214
- package/dist/shared/selectionDialogs.js +0 -544
- package/dist/storage/backupCompression.d.ts +0 -20
- package/dist/storage/backupCompression.js +0 -67
- package/dist/storage/methods.d.ts +0 -32
- package/dist/storage/methods.js +0 -472
- package/dist/storage/schemas.d.ts +0 -842
- package/dist/storage/schemas.js +0 -175
- package/dist/tables/indexManager.d.ts +0 -65
- package/dist/tables/indexManager.js +0 -294
- package/dist/types.d.ts +0 -4
- package/dist/types.js +0 -3
- package/dist/users/methods.d.ts +0 -16
- package/dist/users/methods.js +0 -277
- package/dist/utils/ClientFactory.d.ts +0 -87
- package/dist/utils/ClientFactory.js +0 -212
- package/dist/utils/configDiscovery.d.ts +0 -78
- package/dist/utils/configDiscovery.js +0 -472
- package/dist/utils/configMigration.d.ts +0 -1
- package/dist/utils/configMigration.js +0 -261
- package/dist/utils/constantsGenerator.d.ts +0 -31
- package/dist/utils/constantsGenerator.js +0 -321
- package/dist/utils/dataConverters.d.ts +0 -46
- package/dist/utils/dataConverters.js +0 -139
- package/dist/utils/directoryUtils.d.ts +0 -22
- package/dist/utils/directoryUtils.js +0 -59
- package/dist/utils/getClientFromConfig.d.ts +0 -39
- package/dist/utils/getClientFromConfig.js +0 -199
- package/dist/utils/helperFunctions.d.ts +0 -63
- package/dist/utils/helperFunctions.js +0 -156
- package/dist/utils/index.d.ts +0 -2
- package/dist/utils/index.js +0 -2
- package/dist/utils/loadConfigs.d.ts +0 -50
- package/dist/utils/loadConfigs.js +0 -358
- package/dist/utils/pathResolvers.d.ts +0 -53
- package/dist/utils/pathResolvers.js +0 -72
- package/dist/utils/projectConfig.d.ts +0 -122
- package/dist/utils/projectConfig.js +0 -206
- package/dist/utils/retryFailedPromises.d.ts +0 -2
- package/dist/utils/retryFailedPromises.js +0 -23
- package/dist/utils/sessionAuth.d.ts +0 -48
- package/dist/utils/sessionAuth.js +0 -164
- package/dist/utils/setupFiles.d.ts +0 -4
- package/dist/utils/setupFiles.js +0 -1192
- package/dist/utils/typeGuards.d.ts +0 -35
- package/dist/utils/typeGuards.js +0 -57
- package/dist/utils/validationRules.d.ts +0 -43
- package/dist/utils/validationRules.js +0 -42
- package/dist/utils/versionDetection.d.ts +0 -58
- package/dist/utils/versionDetection.js +0 -251
- package/dist/utils/yamlConverter.d.ts +0 -100
- package/dist/utils/yamlConverter.js +0 -428
- package/dist/utils/yamlLoader.d.ts +0 -70
- package/dist/utils/yamlLoader.js +0 -267
- package/dist/utilsController.d.ts +0 -107
- package/dist/utilsController.js +0 -873
- package/src/adapters/AdapterFactory.ts +0 -529
- package/src/adapters/DatabaseAdapter.ts +0 -319
- package/src/adapters/LegacyAdapter.ts +0 -844
- package/src/adapters/TablesDBAdapter.ts +0 -823
- package/src/config/ConfigManager.ts +0 -849
- package/src/config/README.md +0 -274
- package/src/config/configMigration.ts +0 -575
- package/src/config/configValidation.ts +0 -445
- package/src/config/index.ts +0 -10
- package/src/config/services/ConfigDiscoveryService.ts +0 -410
- package/src/config/services/ConfigLoaderService.ts +0 -732
- package/src/config/services/ConfigMergeService.ts +0 -388
- package/src/config/services/ConfigValidationService.ts +0 -394
- package/src/config/services/SessionAuthService.ts +0 -565
- package/src/config/services/__tests__/ConfigMergeService.test.ts +0 -351
- package/src/config/services/index.ts +0 -29
- package/src/config/yamlConfig.ts +0 -761
- package/src/functions/pathResolution.ts +0 -227
- package/src/functions/templates/count-docs-in-collection/package.json +0 -25
- package/src/functions/templates/count-docs-in-collection/tsconfig.json +0 -28
- package/src/functions/templates/hono-typescript/package.json +0 -26
- package/src/functions/templates/hono-typescript/tsconfig.json +0 -20
- package/src/functions/templates/typescript-node/package.json +0 -25
- package/src/functions/templates/typescript-node/tsconfig.json +0 -28
- package/src/shared/attributeMapper.ts +0 -229
- package/src/shared/errorUtils.ts +0 -110
- package/src/shared/functionManager.ts +0 -537
- package/src/shared/jsonSchemaGenerator.ts +0 -383
- package/src/shared/logging.ts +0 -149
- package/src/shared/messageFormatter.ts +0 -208
- package/src/shared/pydanticModelGenerator.ts +0 -618
- package/src/shared/schemaGenerator.ts +0 -644
- package/src/utils/ClientFactory.ts +0 -240
- package/src/utils/configDiscovery.ts +0 -557
- package/src/utils/constantsGenerator.ts +0 -369
- package/src/utils/dataConverters.ts +0 -159
- package/src/utils/directoryUtils.ts +0 -61
- package/src/utils/getClientFromConfig.ts +0 -257
- package/src/utils/helperFunctions.ts +0 -228
- package/src/utils/pathResolvers.ts +0 -81
- package/src/utils/projectConfig.ts +0 -340
- package/src/utils/retryFailedPromises.ts +0 -29
- package/src/utils/sessionAuth.ts +0 -230
- package/src/utils/typeGuards.ts +0 -65
- package/src/utils/validationRules.ts +0 -88
- package/src/utils/versionDetection.ts +0 -292
- package/src/utils/yamlConverter.ts +0 -542
- package/src/utils/yamlLoader.ts +0 -371
- package/tmp-sync-test/.appwrite/collections/TestCollection.yaml +0 -7
|
@@ -4,278 +4,278 @@ import type {
|
|
|
4
4
|
CollectionCreate,
|
|
5
5
|
} from "appwrite-utils";
|
|
6
6
|
import type { ImportDataActions } from "../importDataActions.js";
|
|
7
|
-
import { logger } from
|
|
7
|
+
import { logger } from 'appwrite-utils-helpers';
|
|
8
8
|
import fs from "fs";
|
|
9
9
|
import path from "path";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Service responsible for validation during import operations.
|
|
13
|
-
* Provides centralized validation logic extracted from ImportDataActions and DataLoader.
|
|
14
|
-
*/
|
|
15
|
-
export class ValidationService {
|
|
16
|
-
private importDataActions: ImportDataActions;
|
|
17
|
-
|
|
18
|
-
constructor(importDataActions: ImportDataActions) {
|
|
19
|
-
this.importDataActions = importDataActions;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Validates a single data item based on defined validation rules.
|
|
24
|
-
* Preserves existing validation logic from ImportDataActions.
|
|
25
|
-
*
|
|
26
|
-
* @param item - The data item to validate
|
|
27
|
-
* @param attributeMappings - The attribute mappings for the data item
|
|
28
|
-
* @param context - The context for resolving templated parameters in validation rules
|
|
29
|
-
* @returns True if the item is valid, false otherwise
|
|
30
|
-
*/
|
|
31
|
-
validateDataItem(
|
|
32
|
-
item: any,
|
|
33
|
-
attributeMappings: AttributeMappings,
|
|
34
|
-
context: { [key: string]: any }
|
|
35
|
-
): boolean {
|
|
36
|
-
try {
|
|
37
|
-
return this.importDataActions.validateItem(item, attributeMappings, context);
|
|
38
|
-
} catch (error) {
|
|
39
|
-
logger.error(`Validation error for item: ${JSON.stringify(item, null, 2)}`, error);
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Validates an import definition before processing begins.
|
|
46
|
-
* Provides early validation to catch configuration issues.
|
|
47
|
-
*
|
|
48
|
-
* @param importDef - The import definition to validate
|
|
49
|
-
* @returns Array of validation errors (empty if valid)
|
|
50
|
-
*/
|
|
51
|
-
validateImportDefinition(importDef: ImportDef): string[] {
|
|
52
|
-
const errors: string[] = [];
|
|
53
|
-
|
|
54
|
-
// Validate required fields
|
|
55
|
-
if (!importDef.filePath) {
|
|
56
|
-
errors.push("filePath is required");
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (!importDef.attributeMappings || importDef.attributeMappings.length === 0) {
|
|
60
|
-
errors.push("attributeMappings are required");
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Validate attribute mappings
|
|
64
|
-
if (importDef.attributeMappings) {
|
|
65
|
-
for (let i = 0; i < importDef.attributeMappings.length; i++) {
|
|
66
|
-
const mapping = importDef.attributeMappings[i];
|
|
67
|
-
|
|
68
|
-
if (!mapping.targetKey) {
|
|
69
|
-
errors.push(`attributeMappings[${i}]: targetKey is required`);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (!mapping.oldKey && !mapping.oldKeys && mapping.valueToSet === undefined) {
|
|
73
|
-
errors.push(
|
|
74
|
-
`attributeMappings[${i}]: must have either oldKey, oldKeys, or valueToSet`
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Validate file data if present
|
|
79
|
-
if (mapping.fileData) {
|
|
80
|
-
if (!mapping.fileData.path) {
|
|
81
|
-
errors.push(`attributeMappings[${i}].fileData: path is required`);
|
|
82
|
-
}
|
|
83
|
-
if (!mapping.fileData.name) {
|
|
84
|
-
errors.push(`attributeMappings[${i}].fileData: name is required`);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Validate converters if present
|
|
89
|
-
if (mapping.converters && !Array.isArray(mapping.converters)) {
|
|
90
|
-
errors.push(`attributeMappings[${i}].converters: must be an array`);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Validate validation actions if present
|
|
94
|
-
if (mapping.validationActions) {
|
|
95
|
-
if (!Array.isArray(mapping.validationActions)) {
|
|
96
|
-
errors.push(`attributeMappings[${i}].validationActions: must be an array`);
|
|
97
|
-
} else {
|
|
98
|
-
for (let j = 0; j < mapping.validationActions.length; j++) {
|
|
99
|
-
const action = mapping.validationActions[j];
|
|
100
|
-
if (!action.action) {
|
|
101
|
-
errors.push(
|
|
102
|
-
`attributeMappings[${i}].validationActions[${j}]: action is required`
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
if (!Array.isArray(action.params)) {
|
|
106
|
-
errors.push(
|
|
107
|
-
`attributeMappings[${i}].validationActions[${j}]: params must be an array`
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Validate post-import actions if present
|
|
115
|
-
if (mapping.postImportActions) {
|
|
116
|
-
if (!Array.isArray(mapping.postImportActions)) {
|
|
117
|
-
errors.push(`attributeMappings[${i}].postImportActions: must be an array`);
|
|
118
|
-
} else {
|
|
119
|
-
for (let j = 0; j < mapping.postImportActions.length; j++) {
|
|
120
|
-
const action = mapping.postImportActions[j];
|
|
121
|
-
if (!action.action) {
|
|
122
|
-
errors.push(
|
|
123
|
-
`attributeMappings[${i}].postImportActions[${j}]: action is required`
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
if (!Array.isArray(action.params)) {
|
|
127
|
-
errors.push(
|
|
128
|
-
`attributeMappings[${i}].postImportActions[${j}]: params must be an array`
|
|
129
|
-
);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Validate ID mappings if present
|
|
138
|
-
if (importDef.idMappings) {
|
|
139
|
-
for (let i = 0; i < importDef.idMappings.length; i++) {
|
|
140
|
-
const idMapping = importDef.idMappings[i];
|
|
141
|
-
|
|
142
|
-
if (!idMapping.sourceField) {
|
|
143
|
-
errors.push(`idMappings[${i}]: sourceField is required`);
|
|
144
|
-
}
|
|
145
|
-
if (!idMapping.targetField) {
|
|
146
|
-
errors.push(`idMappings[${i}]: targetField is required`);
|
|
147
|
-
}
|
|
148
|
-
if (!idMapping.targetCollection) {
|
|
149
|
-
errors.push(`idMappings[${i}]: targetCollection is required`);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Validate update mapping if present
|
|
155
|
-
if (importDef.updateMapping) {
|
|
156
|
-
if (!importDef.updateMapping.originalIdField) {
|
|
157
|
-
errors.push("updateMapping: originalIdField is required");
|
|
158
|
-
}
|
|
159
|
-
if (!importDef.updateMapping.targetField) {
|
|
160
|
-
errors.push("updateMapping: targetField is required");
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
return errors;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Validates a collection configuration for import compatibility.
|
|
169
|
-
* Ensures the collection has the necessary attributes for import operations.
|
|
170
|
-
*
|
|
171
|
-
* @param collection - The collection to validate
|
|
172
|
-
* @param importDefs - The import definitions that will be used with this collection
|
|
173
|
-
* @returns Array of validation errors (empty if valid)
|
|
174
|
-
*/
|
|
175
|
-
validateCollectionForImport(
|
|
176
|
-
collection: CollectionCreate,
|
|
177
|
-
importDefs: ImportDef[]
|
|
178
|
-
): string[] {
|
|
179
|
-
const errors: string[] = [];
|
|
180
|
-
|
|
181
|
-
if (!collection.name) {
|
|
182
|
-
errors.push("Collection name is required");
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
if (!collection.attributes || collection.attributes.length === 0) {
|
|
186
|
-
errors.push("Collection must have attributes defined");
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// Validate that target keys in import definitions exist as attributes
|
|
190
|
-
for (const importDef of importDefs) {
|
|
191
|
-
for (const mapping of importDef.attributeMappings) {
|
|
192
|
-
const attributeExists = collection.attributes?.some(
|
|
193
|
-
attr => attr.key === mapping.targetKey
|
|
194
|
-
);
|
|
195
|
-
|
|
196
|
-
if (!attributeExists) {
|
|
197
|
-
errors.push(
|
|
198
|
-
`Attribute '${mapping.targetKey}' referenced in import mapping not found in collection`
|
|
199
|
-
);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
return errors;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Validates data consistency across multiple collections.
|
|
209
|
-
* Checks for relationship integrity and data consistency.
|
|
210
|
-
*
|
|
211
|
-
* @param collections - Array of collections to validate
|
|
212
|
-
* @returns Array of validation errors (empty if valid)
|
|
213
|
-
*/
|
|
214
|
-
validateCrossCollectionConsistency(
|
|
215
|
-
collections: CollectionCreate[]
|
|
216
|
-
): string[] {
|
|
217
|
-
const errors: string[] = [];
|
|
218
|
-
const collectionNames = new Set(collections.map(c => c.name));
|
|
219
|
-
|
|
220
|
-
for (const collection of collections) {
|
|
221
|
-
if (!collection.importDefs) continue;
|
|
222
|
-
|
|
223
|
-
for (const importDef of collection.importDefs) {
|
|
224
|
-
if (!importDef.idMappings) continue;
|
|
225
|
-
|
|
226
|
-
for (const idMapping of importDef.idMappings) {
|
|
227
|
-
// Check if target collection exists
|
|
228
|
-
if (!collectionNames.has(idMapping.targetCollection)) {
|
|
229
|
-
errors.push(
|
|
230
|
-
`Collection '${collection.name}' references non-existent target collection '${idMapping.targetCollection}' in ID mapping`
|
|
231
|
-
);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
return errors;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Performs comprehensive pre-import validation.
|
|
242
|
-
* Validates all aspects of the import configuration before starting.
|
|
243
|
-
*
|
|
244
|
-
* @param collections - Collections that will be imported
|
|
245
|
-
* @param appwriteFolderPath - Path to the appwrite folder for file validation
|
|
246
|
-
* @returns Validation result with errors and warnings
|
|
247
|
-
*/
|
|
248
|
-
performPreImportValidation(
|
|
249
|
-
collections: CollectionCreate[],
|
|
250
|
-
appwriteFolderPath: string
|
|
251
|
-
): {
|
|
252
|
-
errors: string[];
|
|
253
|
-
warnings: string[];
|
|
254
|
-
isValid: boolean;
|
|
255
|
-
} {
|
|
256
|
-
const errors: string[] = [];
|
|
257
|
-
const warnings: string[] = [];
|
|
258
|
-
|
|
259
|
-
// Validate each collection
|
|
260
|
-
for (const collection of collections) {
|
|
261
|
-
const collectionErrors = this.validateCollectionForImport(
|
|
262
|
-
collection,
|
|
263
|
-
collection.importDefs || []
|
|
264
|
-
);
|
|
265
|
-
errors.push(...collectionErrors.map(err => `${collection.name}: ${err}`));
|
|
266
|
-
|
|
267
|
-
// Validate each import definition
|
|
268
|
-
if (collection.importDefs) {
|
|
269
|
-
for (let i = 0; i < collection.importDefs.length; i++) {
|
|
270
|
-
const importDef = collection.importDefs[i];
|
|
271
|
-
const importDefErrors = this.validateImportDefinition(importDef);
|
|
272
|
-
errors.push(
|
|
273
|
-
...importDefErrors.map(
|
|
274
|
-
err => `${collection.name}.importDefs[${i}]: ${err}`
|
|
275
|
-
)
|
|
276
|
-
);
|
|
277
|
-
|
|
278
|
-
// Check if import file exists
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Service responsible for validation during import operations.
|
|
13
|
+
* Provides centralized validation logic extracted from ImportDataActions and DataLoader.
|
|
14
|
+
*/
|
|
15
|
+
export class ValidationService {
|
|
16
|
+
private importDataActions: ImportDataActions;
|
|
17
|
+
|
|
18
|
+
constructor(importDataActions: ImportDataActions) {
|
|
19
|
+
this.importDataActions = importDataActions;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Validates a single data item based on defined validation rules.
|
|
24
|
+
* Preserves existing validation logic from ImportDataActions.
|
|
25
|
+
*
|
|
26
|
+
* @param item - The data item to validate
|
|
27
|
+
* @param attributeMappings - The attribute mappings for the data item
|
|
28
|
+
* @param context - The context for resolving templated parameters in validation rules
|
|
29
|
+
* @returns True if the item is valid, false otherwise
|
|
30
|
+
*/
|
|
31
|
+
validateDataItem(
|
|
32
|
+
item: any,
|
|
33
|
+
attributeMappings: AttributeMappings,
|
|
34
|
+
context: { [key: string]: any }
|
|
35
|
+
): boolean {
|
|
36
|
+
try {
|
|
37
|
+
return this.importDataActions.validateItem(item, attributeMappings, context);
|
|
38
|
+
} catch (error) {
|
|
39
|
+
logger.error(`Validation error for item: ${JSON.stringify(item, null, 2)}`, error);
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Validates an import definition before processing begins.
|
|
46
|
+
* Provides early validation to catch configuration issues.
|
|
47
|
+
*
|
|
48
|
+
* @param importDef - The import definition to validate
|
|
49
|
+
* @returns Array of validation errors (empty if valid)
|
|
50
|
+
*/
|
|
51
|
+
validateImportDefinition(importDef: ImportDef): string[] {
|
|
52
|
+
const errors: string[] = [];
|
|
53
|
+
|
|
54
|
+
// Validate required fields
|
|
55
|
+
if (!importDef.filePath) {
|
|
56
|
+
errors.push("filePath is required");
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (!importDef.attributeMappings || importDef.attributeMappings.length === 0) {
|
|
60
|
+
errors.push("attributeMappings are required");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Validate attribute mappings
|
|
64
|
+
if (importDef.attributeMappings) {
|
|
65
|
+
for (let i = 0; i < importDef.attributeMappings.length; i++) {
|
|
66
|
+
const mapping = importDef.attributeMappings[i];
|
|
67
|
+
|
|
68
|
+
if (!mapping.targetKey) {
|
|
69
|
+
errors.push(`attributeMappings[${i}]: targetKey is required`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (!mapping.oldKey && !mapping.oldKeys && mapping.valueToSet === undefined) {
|
|
73
|
+
errors.push(
|
|
74
|
+
`attributeMappings[${i}]: must have either oldKey, oldKeys, or valueToSet`
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Validate file data if present
|
|
79
|
+
if (mapping.fileData) {
|
|
80
|
+
if (!mapping.fileData.path) {
|
|
81
|
+
errors.push(`attributeMappings[${i}].fileData: path is required`);
|
|
82
|
+
}
|
|
83
|
+
if (!mapping.fileData.name) {
|
|
84
|
+
errors.push(`attributeMappings[${i}].fileData: name is required`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Validate converters if present
|
|
89
|
+
if (mapping.converters && !Array.isArray(mapping.converters)) {
|
|
90
|
+
errors.push(`attributeMappings[${i}].converters: must be an array`);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Validate validation actions if present
|
|
94
|
+
if (mapping.validationActions) {
|
|
95
|
+
if (!Array.isArray(mapping.validationActions)) {
|
|
96
|
+
errors.push(`attributeMappings[${i}].validationActions: must be an array`);
|
|
97
|
+
} else {
|
|
98
|
+
for (let j = 0; j < mapping.validationActions.length; j++) {
|
|
99
|
+
const action = mapping.validationActions[j];
|
|
100
|
+
if (!action.action) {
|
|
101
|
+
errors.push(
|
|
102
|
+
`attributeMappings[${i}].validationActions[${j}]: action is required`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
if (!Array.isArray(action.params)) {
|
|
106
|
+
errors.push(
|
|
107
|
+
`attributeMappings[${i}].validationActions[${j}]: params must be an array`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Validate post-import actions if present
|
|
115
|
+
if (mapping.postImportActions) {
|
|
116
|
+
if (!Array.isArray(mapping.postImportActions)) {
|
|
117
|
+
errors.push(`attributeMappings[${i}].postImportActions: must be an array`);
|
|
118
|
+
} else {
|
|
119
|
+
for (let j = 0; j < mapping.postImportActions.length; j++) {
|
|
120
|
+
const action = mapping.postImportActions[j];
|
|
121
|
+
if (!action.action) {
|
|
122
|
+
errors.push(
|
|
123
|
+
`attributeMappings[${i}].postImportActions[${j}]: action is required`
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
if (!Array.isArray(action.params)) {
|
|
127
|
+
errors.push(
|
|
128
|
+
`attributeMappings[${i}].postImportActions[${j}]: params must be an array`
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Validate ID mappings if present
|
|
138
|
+
if (importDef.idMappings) {
|
|
139
|
+
for (let i = 0; i < importDef.idMappings.length; i++) {
|
|
140
|
+
const idMapping = importDef.idMappings[i];
|
|
141
|
+
|
|
142
|
+
if (!idMapping.sourceField) {
|
|
143
|
+
errors.push(`idMappings[${i}]: sourceField is required`);
|
|
144
|
+
}
|
|
145
|
+
if (!idMapping.targetField) {
|
|
146
|
+
errors.push(`idMappings[${i}]: targetField is required`);
|
|
147
|
+
}
|
|
148
|
+
if (!idMapping.targetCollection) {
|
|
149
|
+
errors.push(`idMappings[${i}]: targetCollection is required`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Validate update mapping if present
|
|
155
|
+
if (importDef.updateMapping) {
|
|
156
|
+
if (!importDef.updateMapping.originalIdField) {
|
|
157
|
+
errors.push("updateMapping: originalIdField is required");
|
|
158
|
+
}
|
|
159
|
+
if (!importDef.updateMapping.targetField) {
|
|
160
|
+
errors.push("updateMapping: targetField is required");
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return errors;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Validates a collection configuration for import compatibility.
|
|
169
|
+
* Ensures the collection has the necessary attributes for import operations.
|
|
170
|
+
*
|
|
171
|
+
* @param collection - The collection to validate
|
|
172
|
+
* @param importDefs - The import definitions that will be used with this collection
|
|
173
|
+
* @returns Array of validation errors (empty if valid)
|
|
174
|
+
*/
|
|
175
|
+
validateCollectionForImport(
|
|
176
|
+
collection: CollectionCreate,
|
|
177
|
+
importDefs: ImportDef[]
|
|
178
|
+
): string[] {
|
|
179
|
+
const errors: string[] = [];
|
|
180
|
+
|
|
181
|
+
if (!collection.name) {
|
|
182
|
+
errors.push("Collection name is required");
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (!collection.attributes || collection.attributes.length === 0) {
|
|
186
|
+
errors.push("Collection must have attributes defined");
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Validate that target keys in import definitions exist as attributes
|
|
190
|
+
for (const importDef of importDefs) {
|
|
191
|
+
for (const mapping of importDef.attributeMappings) {
|
|
192
|
+
const attributeExists = collection.attributes?.some(
|
|
193
|
+
attr => attr.key === mapping.targetKey
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
if (!attributeExists) {
|
|
197
|
+
errors.push(
|
|
198
|
+
`Attribute '${mapping.targetKey}' referenced in import mapping not found in collection`
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return errors;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Validates data consistency across multiple collections.
|
|
209
|
+
* Checks for relationship integrity and data consistency.
|
|
210
|
+
*
|
|
211
|
+
* @param collections - Array of collections to validate
|
|
212
|
+
* @returns Array of validation errors (empty if valid)
|
|
213
|
+
*/
|
|
214
|
+
validateCrossCollectionConsistency(
|
|
215
|
+
collections: CollectionCreate[]
|
|
216
|
+
): string[] {
|
|
217
|
+
const errors: string[] = [];
|
|
218
|
+
const collectionNames = new Set(collections.map(c => c.name));
|
|
219
|
+
|
|
220
|
+
for (const collection of collections) {
|
|
221
|
+
if (!collection.importDefs) continue;
|
|
222
|
+
|
|
223
|
+
for (const importDef of collection.importDefs) {
|
|
224
|
+
if (!importDef.idMappings) continue;
|
|
225
|
+
|
|
226
|
+
for (const idMapping of importDef.idMappings) {
|
|
227
|
+
// Check if target collection exists
|
|
228
|
+
if (!collectionNames.has(idMapping.targetCollection)) {
|
|
229
|
+
errors.push(
|
|
230
|
+
`Collection '${collection.name}' references non-existent target collection '${idMapping.targetCollection}' in ID mapping`
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return errors;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Performs comprehensive pre-import validation.
|
|
242
|
+
* Validates all aspects of the import configuration before starting.
|
|
243
|
+
*
|
|
244
|
+
* @param collections - Collections that will be imported
|
|
245
|
+
* @param appwriteFolderPath - Path to the appwrite folder for file validation
|
|
246
|
+
* @returns Validation result with errors and warnings
|
|
247
|
+
*/
|
|
248
|
+
performPreImportValidation(
|
|
249
|
+
collections: CollectionCreate[],
|
|
250
|
+
appwriteFolderPath: string
|
|
251
|
+
): {
|
|
252
|
+
errors: string[];
|
|
253
|
+
warnings: string[];
|
|
254
|
+
isValid: boolean;
|
|
255
|
+
} {
|
|
256
|
+
const errors: string[] = [];
|
|
257
|
+
const warnings: string[] = [];
|
|
258
|
+
|
|
259
|
+
// Validate each collection
|
|
260
|
+
for (const collection of collections) {
|
|
261
|
+
const collectionErrors = this.validateCollectionForImport(
|
|
262
|
+
collection,
|
|
263
|
+
collection.importDefs || []
|
|
264
|
+
);
|
|
265
|
+
errors.push(...collectionErrors.map(err => `${collection.name}: ${err}`));
|
|
266
|
+
|
|
267
|
+
// Validate each import definition
|
|
268
|
+
if (collection.importDefs) {
|
|
269
|
+
for (let i = 0; i < collection.importDefs.length; i++) {
|
|
270
|
+
const importDef = collection.importDefs[i];
|
|
271
|
+
const importDefErrors = this.validateImportDefinition(importDef);
|
|
272
|
+
errors.push(
|
|
273
|
+
...importDefErrors.map(
|
|
274
|
+
err => `${collection.name}.importDefs[${i}]: ${err}`
|
|
275
|
+
)
|
|
276
|
+
);
|
|
277
|
+
|
|
278
|
+
// Check if import file exists
|
|
279
279
|
try {
|
|
280
280
|
const filePath = path.resolve(appwriteFolderPath, importDef.filePath);
|
|
281
281
|
if (!fs.existsSync(filePath)) {
|
|
@@ -283,67 +283,67 @@ export class ValidationService {
|
|
|
283
283
|
`${collection.name}.importDefs[${i}]: Import file not found: ${filePath}`
|
|
284
284
|
);
|
|
285
285
|
}
|
|
286
|
-
} catch (error) {
|
|
287
|
-
warnings.push(
|
|
288
|
-
`${collection.name}.importDefs[${i}]: Could not validate file existence: ${error}`
|
|
289
|
-
);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
// Validate cross-collection consistency
|
|
296
|
-
const crossCollectionErrors = this.validateCrossCollectionConsistency(collections);
|
|
297
|
-
errors.push(...crossCollectionErrors);
|
|
298
|
-
|
|
299
|
-
return {
|
|
300
|
-
errors,
|
|
301
|
-
warnings,
|
|
302
|
-
isValid: errors.length === 0,
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
/**
|
|
307
|
-
* Validates import progress and data integrity during import.
|
|
308
|
-
* Can be used for periodic validation during long-running imports.
|
|
309
|
-
*
|
|
310
|
-
* @param processedItems - Number of items processed so far
|
|
311
|
-
* @param totalItems - Total number of items to process
|
|
312
|
-
* @param errorCount - Number of errors encountered
|
|
313
|
-
* @returns Validation status with recommendations
|
|
314
|
-
*/
|
|
315
|
-
validateImportProgress(
|
|
316
|
-
processedItems: number,
|
|
317
|
-
totalItems: number,
|
|
318
|
-
errorCount: number
|
|
319
|
-
): {
|
|
320
|
-
status: "healthy" | "warning" | "critical";
|
|
321
|
-
message: string;
|
|
322
|
-
shouldContinue: boolean;
|
|
323
|
-
} {
|
|
324
|
-
const errorRate = errorCount / Math.max(processedItems, 1);
|
|
325
|
-
const progress = processedItems / totalItems;
|
|
326
|
-
|
|
327
|
-
if (errorRate > 0.5) {
|
|
328
|
-
return {
|
|
329
|
-
status: "critical",
|
|
330
|
-
message: `Error rate too high: ${(errorRate * 100).toFixed(1)}%. Consider stopping import.`,
|
|
331
|
-
shouldContinue: false,
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
if (errorRate > 0.1) {
|
|
336
|
-
return {
|
|
337
|
-
status: "warning",
|
|
338
|
-
message: `Elevated error rate: ${(errorRate * 100).toFixed(1)}%. Monitor closely.`,
|
|
339
|
-
shouldContinue: true,
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
return {
|
|
344
|
-
status: "healthy",
|
|
345
|
-
message: `Import progressing normally: ${(progress * 100).toFixed(1)}% complete, ${(errorRate * 100).toFixed(1)}% error rate.`,
|
|
346
|
-
shouldContinue: true,
|
|
347
|
-
};
|
|
348
|
-
}
|
|
286
|
+
} catch (error) {
|
|
287
|
+
warnings.push(
|
|
288
|
+
`${collection.name}.importDefs[${i}]: Could not validate file existence: ${error}`
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// Validate cross-collection consistency
|
|
296
|
+
const crossCollectionErrors = this.validateCrossCollectionConsistency(collections);
|
|
297
|
+
errors.push(...crossCollectionErrors);
|
|
298
|
+
|
|
299
|
+
return {
|
|
300
|
+
errors,
|
|
301
|
+
warnings,
|
|
302
|
+
isValid: errors.length === 0,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Validates import progress and data integrity during import.
|
|
308
|
+
* Can be used for periodic validation during long-running imports.
|
|
309
|
+
*
|
|
310
|
+
* @param processedItems - Number of items processed so far
|
|
311
|
+
* @param totalItems - Total number of items to process
|
|
312
|
+
* @param errorCount - Number of errors encountered
|
|
313
|
+
* @returns Validation status with recommendations
|
|
314
|
+
*/
|
|
315
|
+
validateImportProgress(
|
|
316
|
+
processedItems: number,
|
|
317
|
+
totalItems: number,
|
|
318
|
+
errorCount: number
|
|
319
|
+
): {
|
|
320
|
+
status: "healthy" | "warning" | "critical";
|
|
321
|
+
message: string;
|
|
322
|
+
shouldContinue: boolean;
|
|
323
|
+
} {
|
|
324
|
+
const errorRate = errorCount / Math.max(processedItems, 1);
|
|
325
|
+
const progress = processedItems / totalItems;
|
|
326
|
+
|
|
327
|
+
if (errorRate > 0.5) {
|
|
328
|
+
return {
|
|
329
|
+
status: "critical",
|
|
330
|
+
message: `Error rate too high: ${(errorRate * 100).toFixed(1)}%. Consider stopping import.`,
|
|
331
|
+
shouldContinue: false,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
if (errorRate > 0.1) {
|
|
336
|
+
return {
|
|
337
|
+
status: "warning",
|
|
338
|
+
message: `Elevated error rate: ${(errorRate * 100).toFixed(1)}%. Monitor closely.`,
|
|
339
|
+
shouldContinue: true,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
return {
|
|
344
|
+
status: "healthy",
|
|
345
|
+
message: `Import progressing normally: ${(progress * 100).toFixed(1)}% complete, ${(errorRate * 100).toFixed(1)}% error rate.`,
|
|
346
|
+
shouldContinue: true,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
349
|
}
|