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
|
@@ -1,338 +1,338 @@
|
|
|
1
|
-
import type { DatabaseAdapter } from "
|
|
2
|
-
import { logger } from
|
|
3
|
-
import { tryAwaitWithRetry } from "
|
|
4
|
-
import { Query, ID } from "node-appwrite";
|
|
5
|
-
import {
|
|
6
|
-
OPERATIONS_TABLE_ID,
|
|
7
|
-
OPERATIONS_TABLE_NAME,
|
|
8
|
-
type OperationRecord,
|
|
9
|
-
type OperationStatus,
|
|
10
|
-
OperationRecordSchema,
|
|
11
|
-
} from "./operationsTableSchema.js";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Operations Table Manager
|
|
15
|
-
*
|
|
16
|
-
* Manages dynamic operations tracking tables in each database.
|
|
17
|
-
* Creates _appwrite_operations table on-demand for tracking imports, exports, transfers, etc.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Checks if operations table exists in database
|
|
22
|
-
*/
|
|
23
|
-
async function tableExists(
|
|
24
|
-
db: DatabaseAdapter,
|
|
25
|
-
databaseId: string,
|
|
26
|
-
): Promise<boolean> {
|
|
27
|
-
try {
|
|
28
|
-
await db.getTable({ databaseId, tableId: OPERATIONS_TABLE_ID });
|
|
29
|
-
return true;
|
|
30
|
-
} catch (error) {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Creates the operations tracking table in the specified database
|
|
37
|
-
* Table is created with underscore prefix to indicate it's a system table
|
|
38
|
-
*/
|
|
39
|
-
export async function createOperationsTable(
|
|
40
|
-
db: DatabaseAdapter,
|
|
41
|
-
databaseId: string,
|
|
42
|
-
): Promise<void> {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (exists) {
|
|
46
|
-
logger.
|
|
47
|
-
databaseId,
|
|
48
|
-
tableId: OPERATIONS_TABLE_ID,
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
key: "
|
|
83
|
-
type: "
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
required:
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
logger.info("Operations tracking table
|
|
125
|
-
databaseId,
|
|
126
|
-
tableId: OPERATIONS_TABLE_ID,
|
|
127
|
-
attributes: attributes.length,
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Finds an existing operation or creates a new one
|
|
133
|
-
* Useful for resuming interrupted operations
|
|
134
|
-
*/
|
|
135
|
-
export async function findOrCreateOperation(
|
|
136
|
-
db: DatabaseAdapter,
|
|
137
|
-
databaseId: string,
|
|
138
|
-
operationType: string,
|
|
139
|
-
params?: Partial<OperationRecord>,
|
|
140
|
-
): Promise<OperationRecord> {
|
|
141
|
-
// Ensure operations table exists
|
|
142
|
-
await createOperationsTable(db, databaseId);
|
|
143
|
-
|
|
144
|
-
// Try to find existing pending operation
|
|
145
|
-
try {
|
|
146
|
-
const queries = [
|
|
147
|
-
Query.equal("operationType", operationType),
|
|
148
|
-
Query.equal("status", "pending"),
|
|
149
|
-
];
|
|
150
|
-
|
|
151
|
-
if (params?.
|
|
152
|
-
queries.push(Query.equal("
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
const response = await db.listRows({
|
|
156
|
-
databaseId,
|
|
157
|
-
tableId: OPERATIONS_TABLE_ID,
|
|
158
|
-
queries,
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
if (response.rows && response.rows.length > 0) {
|
|
162
|
-
logger.debug("Found existing operation", {
|
|
163
|
-
operationId: response.rows[0].$id,
|
|
164
|
-
operationType,
|
|
165
|
-
});
|
|
166
|
-
return response.rows[0] as OperationRecord;
|
|
167
|
-
}
|
|
168
|
-
} catch (error) {
|
|
169
|
-
logger.debug("No existing operation found, creating new one", {
|
|
170
|
-
operationType,
|
|
171
|
-
error: error instanceof Error ? error.message : String(error),
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// Create new operation
|
|
176
|
-
const newOperation = {
|
|
177
|
-
operationType,
|
|
178
|
-
|
|
179
|
-
status: "pending" as OperationStatus,
|
|
180
|
-
progress: params?.progress ?? 0,
|
|
181
|
-
total: params?.total ?? 0,
|
|
182
|
-
data: params?.data ? JSON.stringify(params.data) : undefined,
|
|
183
|
-
error: params?.error,
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
const result = await db.createRow({
|
|
187
|
-
databaseId,
|
|
188
|
-
tableId: OPERATIONS_TABLE_ID,
|
|
189
|
-
id: ID.unique(),
|
|
190
|
-
data: newOperation,
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
logger.info("Created new operation", {
|
|
194
|
-
operationId: result.data?.$id,
|
|
195
|
-
operationType,
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
return result.data as OperationRecord;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Updates an existing operation record
|
|
203
|
-
*/
|
|
204
|
-
export async function updateOperation(
|
|
205
|
-
db: DatabaseAdapter,
|
|
206
|
-
databaseId: string,
|
|
207
|
-
operationId: string,
|
|
208
|
-
updates: Partial<OperationRecord>,
|
|
209
|
-
): Promise<OperationRecord> {
|
|
210
|
-
// Prepare update data (exclude system fields like $id, $createdAt, $updatedAt)
|
|
211
|
-
const updateData: Record<string, any> = {};
|
|
212
|
-
|
|
213
|
-
if (updates.operationType !== undefined)
|
|
214
|
-
updateData.operationType = updates.operationType;
|
|
215
|
-
if (updates.
|
|
216
|
-
updateData.
|
|
217
|
-
if (updates.status !== undefined) updateData.status = updates.status;
|
|
218
|
-
if (updates.progress !== undefined) updateData.progress = updates.progress;
|
|
219
|
-
if (updates.total !== undefined) updateData.total = updates.total;
|
|
220
|
-
if (updates.error !== undefined) updateData.error = updates.error;
|
|
221
|
-
if (updates.data !== undefined) {
|
|
222
|
-
updateData.data =
|
|
223
|
-
typeof updates.data === "string"
|
|
224
|
-
? updates.data
|
|
225
|
-
: JSON.stringify(updates.data);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
try {
|
|
229
|
-
const result = await db.updateRow({
|
|
230
|
-
databaseId,
|
|
231
|
-
tableId: OPERATIONS_TABLE_ID,
|
|
232
|
-
id: operationId,
|
|
233
|
-
data: updateData,
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
logger.debug("Updated operation", {
|
|
237
|
-
operationId,
|
|
238
|
-
updates: Object.keys(updateData),
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
return result.data as OperationRecord;
|
|
242
|
-
} catch (error) {
|
|
243
|
-
logger.error("Failed to update operation", {
|
|
244
|
-
operationId,
|
|
245
|
-
error: error instanceof Error ? error.message : String(error),
|
|
246
|
-
});
|
|
247
|
-
throw error;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Gets a single operation by ID
|
|
253
|
-
*/
|
|
254
|
-
export async function getOperation(
|
|
255
|
-
db: DatabaseAdapter,
|
|
256
|
-
databaseId: string,
|
|
257
|
-
operationId: string,
|
|
258
|
-
): Promise<OperationRecord | null> {
|
|
259
|
-
try {
|
|
260
|
-
const result = await db.getRow({
|
|
261
|
-
databaseId,
|
|
262
|
-
tableId: OPERATIONS_TABLE_ID,
|
|
263
|
-
id: operationId,
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
return result.data as OperationRecord;
|
|
267
|
-
} catch (error) {
|
|
268
|
-
logger.debug("Operation not found", {
|
|
269
|
-
operationId,
|
|
270
|
-
error: error instanceof Error ? error.message : String(error),
|
|
271
|
-
});
|
|
272
|
-
return null;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Cleans up old completed operations
|
|
278
|
-
* @param olderThan - Optional date, defaults to operations older than 7 days
|
|
279
|
-
* @returns Number of operations deleted
|
|
280
|
-
*/
|
|
281
|
-
export async function cleanupOperations(
|
|
282
|
-
db: DatabaseAdapter,
|
|
283
|
-
databaseId: string,
|
|
284
|
-
olderThan?: Date,
|
|
285
|
-
): Promise<number> {
|
|
286
|
-
const cutoffDate =
|
|
287
|
-
olderThan || new Date(Date.now() - 7 * 24 * 60 * 60 * 1000); // 7 days ago
|
|
288
|
-
const cutoffIso = cutoffDate.toISOString();
|
|
289
|
-
|
|
290
|
-
try {
|
|
291
|
-
// Query for completed operations older than cutoff
|
|
292
|
-
const response = await db.listRows({
|
|
293
|
-
databaseId,
|
|
294
|
-
tableId: OPERATIONS_TABLE_ID,
|
|
295
|
-
queries: [
|
|
296
|
-
Query.equal("status", ["completed", "failed", "cancelled"]),
|
|
297
|
-
Query.lessThan("$createdAt", cutoffIso),
|
|
298
|
-
],
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
if (!response.rows || response.rows.length === 0) {
|
|
302
|
-
logger.debug("No old operations to clean up", { databaseId });
|
|
303
|
-
return 0;
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
// Delete in batches
|
|
307
|
-
let deletedCount = 0;
|
|
308
|
-
for (const operation of response.rows) {
|
|
309
|
-
try {
|
|
310
|
-
await db.deleteRow({
|
|
311
|
-
databaseId,
|
|
312
|
-
tableId: OPERATIONS_TABLE_ID,
|
|
313
|
-
id: operation.$id,
|
|
314
|
-
});
|
|
315
|
-
deletedCount++;
|
|
316
|
-
} catch (error) {
|
|
317
|
-
logger.warn("Failed to delete operation", {
|
|
318
|
-
operationId: operation.$id,
|
|
319
|
-
error: error instanceof Error ? error.message : String(error),
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
logger.info("Cleaned up old operations", {
|
|
325
|
-
databaseId,
|
|
326
|
-
deletedCount,
|
|
327
|
-
cutoffDate: cutoffIso,
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
return deletedCount;
|
|
331
|
-
} catch (error) {
|
|
332
|
-
logger.error("Failed to cleanup operations", {
|
|
333
|
-
databaseId,
|
|
334
|
-
error: error instanceof Error ? error.message : String(error),
|
|
335
|
-
});
|
|
336
|
-
return 0;
|
|
337
|
-
}
|
|
338
|
-
}
|
|
1
|
+
import type { DatabaseAdapter } from "appwrite-utils-helpers";
|
|
2
|
+
import { logger } from 'appwrite-utils-helpers';
|
|
3
|
+
import { tryAwaitWithRetry } from "appwrite-utils-helpers";
|
|
4
|
+
import { Query, ID } from "node-appwrite";
|
|
5
|
+
import {
|
|
6
|
+
OPERATIONS_TABLE_ID,
|
|
7
|
+
OPERATIONS_TABLE_NAME,
|
|
8
|
+
type OperationRecord,
|
|
9
|
+
type OperationStatus,
|
|
10
|
+
OperationRecordSchema,
|
|
11
|
+
} from "./operationsTableSchema.js";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Operations Table Manager
|
|
15
|
+
*
|
|
16
|
+
* Manages dynamic operations tracking tables in each database.
|
|
17
|
+
* Creates _appwrite_operations table on-demand for tracking imports, exports, transfers, etc.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Checks if operations table exists in database
|
|
22
|
+
*/
|
|
23
|
+
async function tableExists(
|
|
24
|
+
db: DatabaseAdapter,
|
|
25
|
+
databaseId: string,
|
|
26
|
+
): Promise<boolean> {
|
|
27
|
+
try {
|
|
28
|
+
await db.getTable({ databaseId, tableId: OPERATIONS_TABLE_ID });
|
|
29
|
+
return true;
|
|
30
|
+
} catch (error) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Creates the operations tracking table in the specified database
|
|
37
|
+
* Table is created with underscore prefix to indicate it's a system table
|
|
38
|
+
*/
|
|
39
|
+
export async function createOperationsTable(
|
|
40
|
+
db: DatabaseAdapter,
|
|
41
|
+
databaseId: string,
|
|
42
|
+
): Promise<void> {
|
|
43
|
+
const exists = await tableExists(db, databaseId);
|
|
44
|
+
|
|
45
|
+
if (!exists) {
|
|
46
|
+
logger.info("Creating operations tracking table", {
|
|
47
|
+
databaseId,
|
|
48
|
+
tableId: OPERATIONS_TABLE_ID,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
await tryAwaitWithRetry(async () => {
|
|
52
|
+
await db.createTable({
|
|
53
|
+
databaseId,
|
|
54
|
+
id: OPERATIONS_TABLE_ID,
|
|
55
|
+
name: OPERATIONS_TABLE_NAME,
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Always ensure attributes exist (handles partial creation from previous runs)
|
|
61
|
+
const attributes = [
|
|
62
|
+
{
|
|
63
|
+
key: "operationType",
|
|
64
|
+
type: "string",
|
|
65
|
+
size: 255,
|
|
66
|
+
required: true,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
key: "targetTable",
|
|
70
|
+
type: "string",
|
|
71
|
+
size: 255,
|
|
72
|
+
required: false,
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
key: "status",
|
|
76
|
+
type: "enum",
|
|
77
|
+
elements: ["pending", "in_progress", "completed", "failed", "cancelled"],
|
|
78
|
+
required: false,
|
|
79
|
+
default: "pending",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
key: "progress",
|
|
83
|
+
type: "integer",
|
|
84
|
+
required: false,
|
|
85
|
+
default: 0,
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
key: "total",
|
|
89
|
+
type: "integer",
|
|
90
|
+
required: false,
|
|
91
|
+
default: 0,
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
key: "data",
|
|
95
|
+
type: "string",
|
|
96
|
+
size: 1048576, // 1MB for serialized data
|
|
97
|
+
required: false,
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
key: "error",
|
|
101
|
+
type: "string",
|
|
102
|
+
size: 65535,
|
|
103
|
+
required: false,
|
|
104
|
+
},
|
|
105
|
+
];
|
|
106
|
+
|
|
107
|
+
for (const attr of attributes) {
|
|
108
|
+
try {
|
|
109
|
+
await db.createAttribute({
|
|
110
|
+
databaseId,
|
|
111
|
+
tableId: OPERATIONS_TABLE_ID,
|
|
112
|
+
...attr,
|
|
113
|
+
});
|
|
114
|
+
} catch (error) {
|
|
115
|
+
// Attribute may already exist from a previous run — that's fine, skip it
|
|
116
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
117
|
+
if (msg.includes("already exists") || msg.includes("column_already_exists")) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
logger.info("Operations tracking table ready", {
|
|
125
|
+
databaseId,
|
|
126
|
+
tableId: OPERATIONS_TABLE_ID,
|
|
127
|
+
attributes: attributes.length,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Finds an existing operation or creates a new one
|
|
133
|
+
* Useful for resuming interrupted operations
|
|
134
|
+
*/
|
|
135
|
+
export async function findOrCreateOperation(
|
|
136
|
+
db: DatabaseAdapter,
|
|
137
|
+
databaseId: string,
|
|
138
|
+
operationType: string,
|
|
139
|
+
params?: Partial<OperationRecord>,
|
|
140
|
+
): Promise<OperationRecord> {
|
|
141
|
+
// Ensure operations table exists
|
|
142
|
+
await createOperationsTable(db, databaseId);
|
|
143
|
+
|
|
144
|
+
// Try to find existing pending operation
|
|
145
|
+
try {
|
|
146
|
+
const queries = [
|
|
147
|
+
Query.equal("operationType", operationType),
|
|
148
|
+
Query.equal("status", "pending"),
|
|
149
|
+
];
|
|
150
|
+
|
|
151
|
+
if (params?.targetTable) {
|
|
152
|
+
queries.push(Query.equal("targetTable", params.targetTable));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const response = await db.listRows({
|
|
156
|
+
databaseId,
|
|
157
|
+
tableId: OPERATIONS_TABLE_ID,
|
|
158
|
+
queries,
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
if (response.rows && response.rows.length > 0) {
|
|
162
|
+
logger.debug("Found existing operation", {
|
|
163
|
+
operationId: response.rows[0].$id,
|
|
164
|
+
operationType,
|
|
165
|
+
});
|
|
166
|
+
return response.rows[0] as OperationRecord;
|
|
167
|
+
}
|
|
168
|
+
} catch (error) {
|
|
169
|
+
logger.debug("No existing operation found, creating new one", {
|
|
170
|
+
operationType,
|
|
171
|
+
error: error instanceof Error ? error.message : String(error),
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Create new operation
|
|
176
|
+
const newOperation = {
|
|
177
|
+
operationType,
|
|
178
|
+
targetTable: params?.targetTable,
|
|
179
|
+
status: "pending" as OperationStatus,
|
|
180
|
+
progress: params?.progress ?? 0,
|
|
181
|
+
total: params?.total ?? 0,
|
|
182
|
+
data: params?.data ? JSON.stringify(params.data) : undefined,
|
|
183
|
+
error: params?.error,
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
const result = await db.createRow({
|
|
187
|
+
databaseId,
|
|
188
|
+
tableId: OPERATIONS_TABLE_ID,
|
|
189
|
+
id: ID.unique(),
|
|
190
|
+
data: newOperation,
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
logger.info("Created new operation", {
|
|
194
|
+
operationId: result.data?.$id,
|
|
195
|
+
operationType,
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
return result.data as OperationRecord;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Updates an existing operation record
|
|
203
|
+
*/
|
|
204
|
+
export async function updateOperation(
|
|
205
|
+
db: DatabaseAdapter,
|
|
206
|
+
databaseId: string,
|
|
207
|
+
operationId: string,
|
|
208
|
+
updates: Partial<OperationRecord>,
|
|
209
|
+
): Promise<OperationRecord> {
|
|
210
|
+
// Prepare update data (exclude system fields like $id, $createdAt, $updatedAt)
|
|
211
|
+
const updateData: Record<string, any> = {};
|
|
212
|
+
|
|
213
|
+
if (updates.operationType !== undefined)
|
|
214
|
+
updateData.operationType = updates.operationType;
|
|
215
|
+
if (updates.targetTable !== undefined)
|
|
216
|
+
updateData.targetTable = updates.targetTable;
|
|
217
|
+
if (updates.status !== undefined) updateData.status = updates.status;
|
|
218
|
+
if (updates.progress !== undefined) updateData.progress = updates.progress;
|
|
219
|
+
if (updates.total !== undefined) updateData.total = updates.total;
|
|
220
|
+
if (updates.error !== undefined) updateData.error = updates.error;
|
|
221
|
+
if (updates.data !== undefined) {
|
|
222
|
+
updateData.data =
|
|
223
|
+
typeof updates.data === "string"
|
|
224
|
+
? updates.data
|
|
225
|
+
: JSON.stringify(updates.data);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
try {
|
|
229
|
+
const result = await db.updateRow({
|
|
230
|
+
databaseId,
|
|
231
|
+
tableId: OPERATIONS_TABLE_ID,
|
|
232
|
+
id: operationId,
|
|
233
|
+
data: updateData,
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
logger.debug("Updated operation", {
|
|
237
|
+
operationId,
|
|
238
|
+
updates: Object.keys(updateData),
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
return result.data as OperationRecord;
|
|
242
|
+
} catch (error) {
|
|
243
|
+
logger.error("Failed to update operation", {
|
|
244
|
+
operationId,
|
|
245
|
+
error: error instanceof Error ? error.message : String(error),
|
|
246
|
+
});
|
|
247
|
+
throw error;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Gets a single operation by ID
|
|
253
|
+
*/
|
|
254
|
+
export async function getOperation(
|
|
255
|
+
db: DatabaseAdapter,
|
|
256
|
+
databaseId: string,
|
|
257
|
+
operationId: string,
|
|
258
|
+
): Promise<OperationRecord | null> {
|
|
259
|
+
try {
|
|
260
|
+
const result = await db.getRow({
|
|
261
|
+
databaseId,
|
|
262
|
+
tableId: OPERATIONS_TABLE_ID,
|
|
263
|
+
id: operationId,
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
return result.data as OperationRecord;
|
|
267
|
+
} catch (error) {
|
|
268
|
+
logger.debug("Operation not found", {
|
|
269
|
+
operationId,
|
|
270
|
+
error: error instanceof Error ? error.message : String(error),
|
|
271
|
+
});
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Cleans up old completed operations
|
|
278
|
+
* @param olderThan - Optional date, defaults to operations older than 7 days
|
|
279
|
+
* @returns Number of operations deleted
|
|
280
|
+
*/
|
|
281
|
+
export async function cleanupOperations(
|
|
282
|
+
db: DatabaseAdapter,
|
|
283
|
+
databaseId: string,
|
|
284
|
+
olderThan?: Date,
|
|
285
|
+
): Promise<number> {
|
|
286
|
+
const cutoffDate =
|
|
287
|
+
olderThan || new Date(Date.now() - 7 * 24 * 60 * 60 * 1000); // 7 days ago
|
|
288
|
+
const cutoffIso = cutoffDate.toISOString();
|
|
289
|
+
|
|
290
|
+
try {
|
|
291
|
+
// Query for completed operations older than cutoff
|
|
292
|
+
const response = await db.listRows({
|
|
293
|
+
databaseId,
|
|
294
|
+
tableId: OPERATIONS_TABLE_ID,
|
|
295
|
+
queries: [
|
|
296
|
+
Query.equal("status", ["completed", "failed", "cancelled"]),
|
|
297
|
+
Query.lessThan("$createdAt", cutoffIso),
|
|
298
|
+
],
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
if (!response.rows || response.rows.length === 0) {
|
|
302
|
+
logger.debug("No old operations to clean up", { databaseId });
|
|
303
|
+
return 0;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Delete in batches
|
|
307
|
+
let deletedCount = 0;
|
|
308
|
+
for (const operation of response.rows) {
|
|
309
|
+
try {
|
|
310
|
+
await db.deleteRow({
|
|
311
|
+
databaseId,
|
|
312
|
+
tableId: OPERATIONS_TABLE_ID,
|
|
313
|
+
id: operation.$id,
|
|
314
|
+
});
|
|
315
|
+
deletedCount++;
|
|
316
|
+
} catch (error) {
|
|
317
|
+
logger.warn("Failed to delete operation", {
|
|
318
|
+
operationId: operation.$id,
|
|
319
|
+
error: error instanceof Error ? error.message : String(error),
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
logger.info("Cleaned up old operations", {
|
|
325
|
+
databaseId,
|
|
326
|
+
deletedCount,
|
|
327
|
+
cutoffDate: cutoffIso,
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
return deletedCount;
|
|
331
|
+
} catch (error) {
|
|
332
|
+
logger.error("Failed to cleanup operations", {
|
|
333
|
+
databaseId,
|
|
334
|
+
error: error instanceof Error ? error.message : String(error),
|
|
335
|
+
});
|
|
336
|
+
return 0;
|
|
337
|
+
}
|
|
338
|
+
}
|