appwrite-utils-cli 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/{src/adapters/index.ts → dist/adapters/index.d.ts} +0 -1
  2. package/dist/adapters/index.js +10 -0
  3. package/dist/backups/operations/bucketBackup.d.ts +19 -0
  4. package/dist/backups/operations/bucketBackup.js +197 -0
  5. package/dist/backups/operations/collectionBackup.d.ts +30 -0
  6. package/dist/backups/operations/collectionBackup.js +201 -0
  7. package/dist/backups/operations/comprehensiveBackup.d.ts +25 -0
  8. package/dist/backups/operations/comprehensiveBackup.js +238 -0
  9. package/dist/backups/schemas/bucketManifest.d.ts +93 -0
  10. package/dist/backups/schemas/bucketManifest.js +33 -0
  11. package/dist/backups/schemas/comprehensiveManifest.d.ts +108 -0
  12. package/dist/backups/schemas/comprehensiveManifest.js +32 -0
  13. package/dist/backups/tracking/centralizedTracking.d.ts +34 -0
  14. package/dist/backups/tracking/centralizedTracking.js +274 -0
  15. package/dist/cli/commands/configCommands.d.ts +8 -0
  16. package/dist/cli/commands/configCommands.js +210 -0
  17. package/dist/cli/commands/databaseCommands.d.ts +14 -0
  18. package/dist/cli/commands/databaseCommands.js +696 -0
  19. package/dist/cli/commands/functionCommands.d.ts +7 -0
  20. package/dist/cli/commands/functionCommands.js +330 -0
  21. package/dist/cli/commands/importFileCommands.d.ts +7 -0
  22. package/dist/cli/commands/importFileCommands.js +674 -0
  23. package/dist/cli/commands/schemaCommands.d.ts +7 -0
  24. package/dist/cli/commands/schemaCommands.js +169 -0
  25. package/dist/cli/commands/storageCommands.d.ts +5 -0
  26. package/dist/cli/commands/storageCommands.js +142 -0
  27. package/dist/cli/commands/transferCommands.d.ts +5 -0
  28. package/dist/cli/commands/transferCommands.js +382 -0
  29. package/dist/collections/columns.d.ts +13 -0
  30. package/dist/collections/columns.js +1339 -0
  31. package/dist/collections/indexes.d.ts +12 -0
  32. package/dist/collections/indexes.js +215 -0
  33. package/dist/collections/methods.d.ts +19 -0
  34. package/dist/collections/methods.js +605 -0
  35. package/dist/collections/tableOperations.d.ts +87 -0
  36. package/dist/collections/tableOperations.js +466 -0
  37. package/dist/collections/transferOperations.d.ts +8 -0
  38. package/dist/collections/transferOperations.js +411 -0
  39. package/dist/collections/wipeOperations.d.ts +17 -0
  40. package/dist/collections/wipeOperations.js +306 -0
  41. package/dist/databases/methods.d.ts +6 -0
  42. package/dist/databases/methods.js +35 -0
  43. package/dist/databases/setup.d.ts +5 -0
  44. package/dist/databases/setup.js +45 -0
  45. package/dist/examples/yamlTerminologyExample.d.ts +42 -0
  46. package/dist/examples/yamlTerminologyExample.js +272 -0
  47. package/dist/functions/deployments.d.ts +4 -0
  48. package/dist/functions/deployments.js +146 -0
  49. package/dist/functions/fnConfigDiscovery.d.ts +3 -0
  50. package/dist/functions/fnConfigDiscovery.js +108 -0
  51. package/dist/functions/methods.d.ts +16 -0
  52. package/dist/functions/methods.js +174 -0
  53. package/dist/init.d.ts +2 -0
  54. package/dist/init.js +57 -0
  55. package/dist/interactiveCLI.d.ts +36 -0
  56. package/dist/interactiveCLI.js +952 -0
  57. package/dist/main.d.ts +2 -0
  58. package/dist/main.js +1125 -0
  59. package/dist/migrations/afterImportActions.d.ts +17 -0
  60. package/dist/migrations/afterImportActions.js +305 -0
  61. package/dist/migrations/appwriteToX.d.ts +211 -0
  62. package/dist/migrations/appwriteToX.js +493 -0
  63. package/dist/migrations/comprehensiveTransfer.d.ts +147 -0
  64. package/dist/migrations/comprehensiveTransfer.js +1315 -0
  65. package/dist/migrations/dataLoader.d.ts +755 -0
  66. package/dist/migrations/dataLoader.js +1272 -0
  67. package/dist/migrations/importController.d.ts +25 -0
  68. package/dist/migrations/importController.js +283 -0
  69. package/dist/migrations/importDataActions.d.ts +50 -0
  70. package/dist/migrations/importDataActions.js +230 -0
  71. package/dist/migrations/relationships.d.ts +29 -0
  72. package/dist/migrations/relationships.js +203 -0
  73. package/dist/migrations/services/DataTransformationService.d.ts +55 -0
  74. package/dist/migrations/services/DataTransformationService.js +158 -0
  75. package/dist/migrations/services/FileHandlerService.d.ts +75 -0
  76. package/dist/migrations/services/FileHandlerService.js +236 -0
  77. package/dist/migrations/services/ImportOrchestrator.d.ts +99 -0
  78. package/dist/migrations/services/ImportOrchestrator.js +493 -0
  79. package/dist/migrations/services/RateLimitManager.d.ts +138 -0
  80. package/dist/migrations/services/RateLimitManager.js +279 -0
  81. package/dist/migrations/services/RelationshipResolver.d.ts +120 -0
  82. package/dist/migrations/services/RelationshipResolver.js +332 -0
  83. package/dist/migrations/services/UserMappingService.d.ts +109 -0
  84. package/dist/migrations/services/UserMappingService.js +277 -0
  85. package/dist/migrations/services/ValidationService.d.ts +74 -0
  86. package/dist/migrations/services/ValidationService.js +260 -0
  87. package/dist/migrations/transfer.d.ts +30 -0
  88. package/dist/migrations/transfer.js +661 -0
  89. package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +131 -0
  90. package/dist/migrations/yaml/YamlImportConfigLoader.js +383 -0
  91. package/dist/migrations/yaml/YamlImportIntegration.d.ts +93 -0
  92. package/dist/migrations/yaml/YamlImportIntegration.js +341 -0
  93. package/dist/migrations/yaml/generateImportSchemas.d.ts +30 -0
  94. package/dist/migrations/yaml/generateImportSchemas.js +1327 -0
  95. package/dist/schemas/authUser.d.ts +24 -0
  96. package/dist/schemas/authUser.js +17 -0
  97. package/dist/setup.d.ts +2 -0
  98. package/{src/setup.ts → dist/setup.js} +0 -3
  99. package/dist/setupCommands.d.ts +58 -0
  100. package/dist/setupCommands.js +489 -0
  101. package/dist/setupController.d.ts +9 -0
  102. package/dist/setupController.js +34 -0
  103. package/dist/shared/backupMetadataSchema.d.ts +94 -0
  104. package/dist/shared/backupMetadataSchema.js +38 -0
  105. package/dist/shared/backupTracking.d.ts +18 -0
  106. package/dist/shared/backupTracking.js +176 -0
  107. package/dist/shared/confirmationDialogs.d.ts +75 -0
  108. package/dist/shared/confirmationDialogs.js +236 -0
  109. package/dist/shared/migrationHelpers.d.ts +61 -0
  110. package/dist/shared/migrationHelpers.js +145 -0
  111. package/{src/shared/operationLogger.ts → dist/shared/operationLogger.d.ts} +1 -11
  112. package/dist/shared/operationLogger.js +12 -0
  113. package/dist/shared/operationQueue.d.ts +40 -0
  114. package/dist/shared/operationQueue.js +310 -0
  115. package/dist/shared/operationsTable.d.ts +26 -0
  116. package/dist/shared/operationsTable.js +287 -0
  117. package/dist/shared/operationsTableSchema.d.ts +48 -0
  118. package/dist/shared/operationsTableSchema.js +35 -0
  119. package/dist/shared/progressManager.d.ts +62 -0
  120. package/dist/shared/progressManager.js +215 -0
  121. package/dist/shared/relationshipExtractor.d.ts +56 -0
  122. package/dist/shared/relationshipExtractor.js +138 -0
  123. package/dist/shared/selectionDialogs.d.ts +220 -0
  124. package/dist/shared/selectionDialogs.js +588 -0
  125. package/dist/storage/backupCompression.d.ts +20 -0
  126. package/dist/storage/backupCompression.js +67 -0
  127. package/dist/storage/methods.d.ts +44 -0
  128. package/dist/storage/methods.js +475 -0
  129. package/dist/storage/schemas.d.ts +842 -0
  130. package/dist/storage/schemas.js +175 -0
  131. package/dist/tables/indexManager.d.ts +65 -0
  132. package/dist/tables/indexManager.js +294 -0
  133. package/{src/types.ts → dist/types.d.ts} +1 -6
  134. package/dist/types.js +3 -0
  135. package/dist/users/methods.d.ts +16 -0
  136. package/dist/users/methods.js +276 -0
  137. package/dist/utils/configMigration.d.ts +1 -0
  138. package/dist/utils/configMigration.js +261 -0
  139. package/dist/utils/index.js +2 -0
  140. package/dist/utils/loadConfigs.d.ts +50 -0
  141. package/dist/utils/loadConfigs.js +357 -0
  142. package/dist/utils/setupFiles.d.ts +4 -0
  143. package/dist/utils/setupFiles.js +1190 -0
  144. package/dist/utilsController.d.ts +114 -0
  145. package/dist/utilsController.js +898 -0
  146. package/package.json +6 -3
  147. package/CHANGELOG.md +0 -35
  148. package/CONFIG_TODO.md +0 -1189
  149. package/SELECTION_DIALOGS.md +0 -146
  150. package/SERVICE_IMPLEMENTATION_REPORT.md +0 -462
  151. package/scripts/copy-templates.ts +0 -23
  152. package/src/backups/operations/bucketBackup.ts +0 -277
  153. package/src/backups/operations/collectionBackup.ts +0 -310
  154. package/src/backups/operations/comprehensiveBackup.ts +0 -342
  155. package/src/backups/schemas/bucketManifest.ts +0 -78
  156. package/src/backups/schemas/comprehensiveManifest.ts +0 -76
  157. package/src/backups/tracking/centralizedTracking.ts +0 -352
  158. package/src/cli/commands/configCommands.ts +0 -265
  159. package/src/cli/commands/databaseCommands.ts +0 -931
  160. package/src/cli/commands/functionCommands.ts +0 -419
  161. package/src/cli/commands/importFileCommands.ts +0 -815
  162. package/src/cli/commands/schemaCommands.ts +0 -200
  163. package/src/cli/commands/storageCommands.ts +0 -151
  164. package/src/cli/commands/transferCommands.ts +0 -454
  165. package/src/collections/attributes.ts.backup +0 -1555
  166. package/src/collections/columns.ts +0 -2025
  167. package/src/collections/indexes.ts +0 -350
  168. package/src/collections/methods.ts +0 -714
  169. package/src/collections/tableOperations.ts +0 -542
  170. package/src/collections/transferOperations.ts +0 -589
  171. package/src/collections/wipeOperations.ts +0 -449
  172. package/src/databases/methods.ts +0 -49
  173. package/src/databases/setup.ts +0 -77
  174. package/src/examples/yamlTerminologyExample.ts +0 -346
  175. package/src/functions/deployments.ts +0 -221
  176. package/src/functions/fnConfigDiscovery.ts +0 -103
  177. package/src/functions/methods.ts +0 -284
  178. package/src/init.ts +0 -62
  179. package/src/interactiveCLI.ts +0 -1201
  180. package/src/main.ts +0 -1517
  181. package/src/migrations/afterImportActions.ts +0 -579
  182. package/src/migrations/appwriteToX.ts +0 -668
  183. package/src/migrations/comprehensiveTransfer.ts +0 -2285
  184. package/src/migrations/dataLoader.ts +0 -1729
  185. package/src/migrations/importController.ts +0 -440
  186. package/src/migrations/importDataActions.ts +0 -315
  187. package/src/migrations/relationships.ts +0 -333
  188. package/src/migrations/services/DataTransformationService.ts +0 -196
  189. package/src/migrations/services/FileHandlerService.ts +0 -311
  190. package/src/migrations/services/ImportOrchestrator.ts +0 -675
  191. package/src/migrations/services/RateLimitManager.ts +0 -363
  192. package/src/migrations/services/RelationshipResolver.ts +0 -461
  193. package/src/migrations/services/UserMappingService.ts +0 -345
  194. package/src/migrations/services/ValidationService.ts +0 -349
  195. package/src/migrations/transfer.ts +0 -1113
  196. package/src/migrations/yaml/YamlImportConfigLoader.ts +0 -439
  197. package/src/migrations/yaml/YamlImportIntegration.ts +0 -446
  198. package/src/migrations/yaml/generateImportSchemas.ts +0 -1354
  199. package/src/schemas/authUser.ts +0 -23
  200. package/src/setupCommands.ts +0 -602
  201. package/src/setupController.ts +0 -43
  202. package/src/shared/backupMetadataSchema.ts +0 -93
  203. package/src/shared/backupTracking.ts +0 -211
  204. package/src/shared/confirmationDialogs.ts +0 -327
  205. package/src/shared/migrationHelpers.ts +0 -232
  206. package/src/shared/operationQueue.ts +0 -376
  207. package/src/shared/operationsTable.ts +0 -338
  208. package/src/shared/operationsTableSchema.ts +0 -60
  209. package/src/shared/progressManager.ts +0 -278
  210. package/src/shared/relationshipExtractor.ts +0 -214
  211. package/src/shared/selectionDialogs.ts +0 -802
  212. package/src/storage/backupCompression.ts +0 -88
  213. package/src/storage/methods.ts +0 -711
  214. package/src/storage/schemas.ts +0 -205
  215. package/src/tables/indexManager.ts +0 -409
  216. package/src/types/node-appwrite-tablesdb.d.ts +0 -44
  217. package/src/users/methods.ts +0 -358
  218. package/src/utils/configMigration.ts +0 -348
  219. package/src/utils/loadConfigs.ts +0 -457
  220. package/src/utils/setupFiles.ts +0 -1236
  221. package/src/utilsController.ts +0 -1263
  222. package/tests/README.md +0 -497
  223. package/tests/adapters/AdapterFactory.test.ts +0 -277
  224. package/tests/integration/syncOperations.test.ts +0 -463
  225. package/tests/jest.config.js +0 -25
  226. package/tests/migration/configMigration.test.ts +0 -546
  227. package/tests/setup.ts +0 -62
  228. package/tests/testUtils.ts +0 -340
  229. package/tests/utils/loadConfigs.test.ts +0 -350
  230. package/tests/validation/configValidation.test.ts +0 -412
  231. package/tsconfig.json +0 -44
  232. /package/{src → dist}/functions/templates/count-docs-in-collection/README.md +0 -0
  233. /package/{src → dist}/functions/templates/count-docs-in-collection/src/main.ts +0 -0
  234. /package/{src → dist}/functions/templates/count-docs-in-collection/src/request.ts +0 -0
  235. /package/{src → dist}/functions/templates/hono-typescript/README.md +0 -0
  236. /package/{src → dist}/functions/templates/hono-typescript/src/adapters/request.ts +0 -0
  237. /package/{src → dist}/functions/templates/hono-typescript/src/adapters/response.ts +0 -0
  238. /package/{src → dist}/functions/templates/hono-typescript/src/app.ts +0 -0
  239. /package/{src → dist}/functions/templates/hono-typescript/src/context.ts +0 -0
  240. /package/{src → dist}/functions/templates/hono-typescript/src/main.ts +0 -0
  241. /package/{src → dist}/functions/templates/hono-typescript/src/middleware/appwrite.ts +0 -0
  242. /package/{src → dist}/functions/templates/typescript-node/README.md +0 -0
  243. /package/{src → dist}/functions/templates/typescript-node/src/context.ts +0 -0
  244. /package/{src → dist}/functions/templates/typescript-node/src/main.ts +0 -0
  245. /package/{src → dist}/functions/templates/uv/README.md +0 -0
  246. /package/{src → dist}/functions/templates/uv/pyproject.toml +0 -0
  247. /package/{src → dist}/functions/templates/uv/src/__init__.py +0 -0
  248. /package/{src → dist}/functions/templates/uv/src/context.py +0 -0
  249. /package/{src → dist}/functions/templates/uv/src/main.py +0 -0
  250. /package/{src/utils/index.ts → dist/utils/index.d.ts} +0 -0
@@ -1,342 +0,0 @@
1
- import type { Storage, Databases, Models } from "node-appwrite";
2
- import { ID } from "node-appwrite";
3
- import { InputFile } from "node-appwrite/file";
4
- import { ulid } from "ulidx";
5
- import { MessageFormatter } from 'appwrite-utils-helpers';
6
- import { logger } from 'appwrite-utils-helpers';
7
- import type { DatabaseAdapter } from 'appwrite-utils-helpers';
8
- import { backupDatabase } from "../../storage/methods.js";
9
- import { backupBucket } from "./bucketBackup.js";
10
- import {
11
- recordCentralizedBackup,
12
- createCentralizedBackupTrackingTable
13
- } from "../tracking/centralizedTracking.js";
14
- import type {
15
- ComprehensiveManifest,
16
- DatabaseBackupReference,
17
- BucketBackupReference
18
- } from "../schemas/comprehensiveManifest.js";
19
- import type { AppwriteConfig } from "appwrite-utils";
20
- import { fetchAllDatabases } from "../../databases/methods.js";
21
-
22
- export interface ComprehensiveBackupOptions {
23
- trackingDatabaseId: string; // Database to store backup tracking
24
- backupFormat?: 'json' | 'zip';
25
- skipDatabases?: boolean;
26
- skipBuckets?: boolean;
27
- parallelDownloads?: number;
28
- onProgress?: (message: string) => void;
29
- }
30
-
31
- export interface ComprehensiveBackupResult {
32
- backupId: string;
33
- manifestFileId: string;
34
- databaseBackups: DatabaseBackupReference[];
35
- bucketBackups: BucketBackupReference[];
36
- totalSizeBytes: number;
37
- status: 'completed' | 'partial' | 'failed';
38
- errors: string[];
39
- }
40
-
41
- /**
42
- * Orchestrates comprehensive backup of ALL databases and ALL storage buckets
43
- */
44
- export async function comprehensiveBackup(
45
- config: AppwriteConfig,
46
- databases: Databases,
47
- storage: Storage,
48
- adapter: DatabaseAdapter,
49
- options: ComprehensiveBackupOptions
50
- ): Promise<ComprehensiveBackupResult> {
51
- const startTime = Date.now();
52
- const backupId = ulid();
53
- const errors: string[] = [];
54
- const databaseBackups: DatabaseBackupReference[] = [];
55
- const bucketBackups: BucketBackupReference[] = [];
56
- let totalSizeBytes = 0;
57
-
58
- try {
59
- // Ensure tracking table exists
60
- await createCentralizedBackupTrackingTable(adapter, options.trackingDatabaseId);
61
-
62
- // Initialize backup bucket
63
- const backupBucketId = "appwrite-backups";
64
- MessageFormatter.info(`Starting comprehensive backup ${backupId}`, { prefix: "Backup" });
65
-
66
- // Phase 1: Backup ALL databases
67
- if (!options.skipDatabases) {
68
- MessageFormatter.info("Phase 1: Backing up ALL databases", { prefix: "Backup" });
69
-
70
- const allDatabases = await fetchAllDatabases(databases);
71
-
72
- // Validate each database exists before attempting backup
73
- const validDatabases: Models.Database[] = [];
74
- const skippedDatabases: string[] = [];
75
-
76
- MessageFormatter.info(`Validating ${allDatabases.length} databases...`, { prefix: "Backup" });
77
-
78
- for (const db of allDatabases) {
79
- try {
80
- await databases.get(db.$id); // Validate existence
81
- validDatabases.push(db);
82
- } catch (error) {
83
- skippedDatabases.push(`${db.name} (${db.$id})`);
84
- MessageFormatter.warning(
85
- `Database ${db.name} not found - skipping`,
86
- { prefix: "Backup" }
87
- );
88
- logger.warn('Database validation failed', {
89
- databaseId: db.$id,
90
- databaseName: db.name,
91
- error: error instanceof Error ? error.message : String(error)
92
- });
93
- }
94
- }
95
-
96
- if (skippedDatabases.length > 0) {
97
- MessageFormatter.info(
98
- `Skipped ${skippedDatabases.length} invalid databases: ${skippedDatabases.join(', ')}`,
99
- { prefix: "Backup" }
100
- );
101
- }
102
-
103
- MessageFormatter.info(`Found ${validDatabases.length} valid databases to backup`, { prefix: "Backup" });
104
-
105
- for (const db of validDatabases) {
106
- try {
107
- if (options.onProgress) {
108
- options.onProgress(`Backing up database: ${db.name}`);
109
- }
110
-
111
- MessageFormatter.info(`Backing up database: ${db.name} (${db.$id})`, { prefix: "Backup" });
112
-
113
- // Use existing backupDatabase function
114
- const dbBackupResult = await backupDatabase(
115
- config,
116
- databases,
117
- db.$id,
118
- storage,
119
- options.backupFormat || 'zip'
120
- );
121
-
122
- // Create database manifest with complete data
123
- const manifestData = {
124
- version: "1.0",
125
- databaseId: dbBackupResult.databaseId,
126
- databaseName: dbBackupResult.databaseName,
127
- format: dbBackupResult.format,
128
- collectionCount: dbBackupResult.collectionCount,
129
- documentCount: dbBackupResult.documentCount,
130
- backupFileId: dbBackupResult.backupFileId,
131
- createdAt: new Date().toISOString()
132
- };
133
-
134
- const manifestBuffer = Buffer.from(JSON.stringify(manifestData, null, 2), 'utf-8');
135
- const manifestFile = await storage.createFile(
136
- backupBucketId,
137
- ID.unique(),
138
- InputFile.fromBuffer(new Uint8Array(manifestBuffer), `${db.$id}-manifest.json`)
139
- );
140
-
141
- databaseBackups.push({
142
- databaseId: dbBackupResult.databaseId,
143
- databaseName: dbBackupResult.databaseName,
144
- backupFileId: dbBackupResult.backupFileId,
145
- manifestFileId: manifestFile.$id,
146
- collectionCount: dbBackupResult.collectionCount,
147
- documentCount: dbBackupResult.documentCount,
148
- sizeBytes: dbBackupResult.backupSizeBytes,
149
- status: 'completed'
150
- });
151
-
152
- totalSizeBytes += dbBackupResult.backupSizeBytes;
153
-
154
- // Record individual database backup in tracking
155
- await recordCentralizedBackup(adapter, options.trackingDatabaseId, {
156
- backupType: 'database',
157
- backupId: dbBackupResult.backupFileId,
158
- manifestFileId: manifestFile.$id,
159
- format: dbBackupResult.format,
160
- sizeBytes: dbBackupResult.backupSizeBytes,
161
- databaseId: dbBackupResult.databaseId,
162
- collections: dbBackupResult.collectionCount,
163
- documents: dbBackupResult.documentCount,
164
- status: 'completed',
165
- restorationStatus: 'not_restored'
166
- });
167
-
168
- MessageFormatter.success(`Database ${db.name} backed up successfully`, { prefix: "Backup" });
169
- } catch (error) {
170
- const errorMsg = `Failed to backup database ${db.name}: ${error instanceof Error ? error.message : String(error)}`;
171
- errors.push(errorMsg);
172
- logger.error(errorMsg);
173
-
174
- databaseBackups.push({
175
- databaseId: db.$id,
176
- databaseName: db.name,
177
- backupFileId: '',
178
- manifestFileId: '',
179
- collectionCount: 0,
180
- documentCount: 0,
181
- sizeBytes: 0,
182
- status: 'failed',
183
- error: errorMsg
184
- });
185
- }
186
- }
187
- }
188
-
189
- // Phase 2: Backup ALL storage buckets
190
- if (!options.skipBuckets) {
191
- MessageFormatter.info("Phase 2: Backing up ALL storage buckets", { prefix: "Backup" });
192
-
193
- const allBuckets = await storage.listBuckets();
194
- const bucketsToBackup = allBuckets.buckets.filter(b => b.$id !== backupBucketId);
195
-
196
- MessageFormatter.info(`Found ${bucketsToBackup.length} buckets to backup`, { prefix: "Backup" });
197
-
198
- for (const bucket of bucketsToBackup) {
199
- try {
200
- if (options.onProgress) {
201
- options.onProgress(`Backing up bucket: ${bucket.name}`);
202
- }
203
-
204
- MessageFormatter.info(`Backing up bucket: ${bucket.name} (${bucket.$id})`, { prefix: "Backup" });
205
-
206
- const bucketBackupResult = await backupBucket(
207
- storage,
208
- bucket.$id,
209
- backupBucketId,
210
- {
211
- parallelDownloads: options.parallelDownloads || 10,
212
- onProgress: (current, total, fileName) => {
213
- if (options.onProgress) {
214
- options.onProgress(`Downloading ${fileName} (${current}/${total})`);
215
- }
216
- }
217
- }
218
- );
219
-
220
- bucketBackups.push({
221
- bucketId: bucket.$id,
222
- bucketName: bucket.name,
223
- backupFileId: bucketBackupResult.backupFileId,
224
- manifestFileId: bucketBackupResult.manifestFileId,
225
- fileCount: bucketBackupResult.fileCount,
226
- sizeBytes: bucketBackupResult.totalSizeBytes,
227
- status: bucketBackupResult.status,
228
- error: bucketBackupResult.errors?.join('; ')
229
- });
230
-
231
- totalSizeBytes += bucketBackupResult.zipSizeBytes;
232
-
233
- // Record individual bucket backup in tracking
234
- await recordCentralizedBackup(adapter, options.trackingDatabaseId, {
235
- backupType: 'bucket',
236
- backupId: bucketBackupResult.backupFileId,
237
- manifestFileId: bucketBackupResult.manifestFileId,
238
- format: 'zip',
239
- sizeBytes: bucketBackupResult.zipSizeBytes,
240
- bucketId: bucket.$id,
241
- fileCount: bucketBackupResult.fileCount,
242
- status: bucketBackupResult.status,
243
- error: bucketBackupResult.errors?.join('; '),
244
- restorationStatus: 'not_restored'
245
- });
246
-
247
- MessageFormatter.success(`Bucket ${bucket.name} backed up successfully`, { prefix: "Backup" });
248
- } catch (error) {
249
- const errorMsg = `Failed to backup bucket ${bucket.name}: ${error instanceof Error ? error.message : String(error)}`;
250
- errors.push(errorMsg);
251
- logger.error(errorMsg);
252
-
253
- bucketBackups.push({
254
- bucketId: bucket.$id,
255
- bucketName: bucket.name,
256
- backupFileId: '',
257
- manifestFileId: '',
258
- fileCount: 0,
259
- sizeBytes: 0,
260
- status: 'failed',
261
- error: errorMsg
262
- });
263
- }
264
- }
265
- }
266
-
267
- // Phase 3: Create comprehensive manifest
268
- MessageFormatter.info("Creating comprehensive backup manifest", { prefix: "Backup" });
269
-
270
- const comprehensiveStatus: 'completed' | 'partial' | 'failed' =
271
- errors.length === 0 ? 'completed' :
272
- (databaseBackups.length > 0 || bucketBackups.length > 0) ? 'partial' :
273
- 'failed';
274
-
275
- const manifest: ComprehensiveManifest = {
276
- version: "1.0",
277
- backupId,
278
- createdAt: new Date().toISOString(),
279
- databases: databaseBackups,
280
- buckets: bucketBackups,
281
- totalSizeBytes,
282
- status: comprehensiveStatus,
283
- errors: errors.length > 0 ? errors : undefined
284
- };
285
-
286
- // Upload comprehensive manifest
287
- const manifestFileName = `comprehensive-${backupId}.json`;
288
- const manifestBuffer = Buffer.from(JSON.stringify(manifest, null, 2), 'utf-8');
289
- const manifestFile = await storage.createFile(
290
- backupBucketId,
291
- ID.unique(),
292
- InputFile.fromBuffer(new Uint8Array(manifestBuffer), manifestFileName)
293
- );
294
-
295
- // Record comprehensive backup in tracking
296
- await recordCentralizedBackup(adapter, options.trackingDatabaseId, {
297
- backupType: 'comprehensive',
298
- backupId,
299
- manifestFileId: manifestFile.$id,
300
- format: 'zip',
301
- sizeBytes: totalSizeBytes,
302
- comprehensiveBackupId: backupId,
303
- status: comprehensiveStatus,
304
- error: errors.length > 0 ? errors.join('; ') : undefined,
305
- restorationStatus: 'not_restored'
306
- });
307
-
308
- const duration = Date.now() - startTime;
309
- MessageFormatter.success(
310
- `Comprehensive backup ${comprehensiveStatus} in ${(duration / 1000).toFixed(2)}s`,
311
- { prefix: "Backup" }
312
- );
313
-
314
- MessageFormatter.info(
315
- `Backed up ${databaseBackups.length} databases and ${bucketBackups.length} buckets (${MessageFormatter.formatBytes(totalSizeBytes)})`,
316
- { prefix: "Backup" }
317
- );
318
-
319
- return {
320
- backupId,
321
- manifestFileId: manifestFile.$id,
322
- databaseBackups,
323
- bucketBackups,
324
- totalSizeBytes,
325
- status: comprehensiveStatus,
326
- errors
327
- };
328
- } catch (error) {
329
- const errorMsg = `Comprehensive backup failed: ${error instanceof Error ? error.message : String(error)}`;
330
- MessageFormatter.error(errorMsg, error instanceof Error ? error : new Error(errorMsg), { prefix: "Backup" });
331
-
332
- return {
333
- backupId,
334
- manifestFileId: '',
335
- databaseBackups,
336
- bucketBackups,
337
- totalSizeBytes,
338
- status: 'failed',
339
- errors: [errorMsg, ...errors]
340
- };
341
- }
342
- }
@@ -1,78 +0,0 @@
1
- import { z } from "zod";
2
-
3
- /**
4
- * Schema for bucket backup manifest
5
- *
6
- * This manifest is stored alongside bucket backup ZIPs to describe
7
- * the bucket configuration and files that were backed up.
8
- */
9
-
10
- export interface BucketFileMetadata {
11
- $id: string;
12
- name: string;
13
- size: number;
14
- mimeType: string;
15
- $permissions: string[];
16
- chunksCount: number;
17
- signature: string;
18
- $createdAt: string;
19
- $updatedAt: string;
20
- }
21
-
22
- export interface BucketConfiguration {
23
- $permissions: string[];
24
- fileSecurity: boolean;
25
- enabled: boolean;
26
- maximumFileSize: number;
27
- allowedFileExtensions: string[];
28
- compression: string;
29
- encryption: boolean;
30
- antivirus: boolean;
31
- }
32
-
33
- export interface BucketManifest {
34
- version: string;
35
- bucketId: string;
36
- bucketName: string;
37
- createdAt: string;
38
- fileCount: number;
39
- totalSizeBytes: number;
40
- compression: 'gzip' | 'none';
41
- files: BucketFileMetadata[];
42
- bucketConfiguration: BucketConfiguration;
43
- }
44
-
45
- export const BucketFileMetadataSchema = z.object({
46
- $id: z.string(),
47
- name: z.string(),
48
- size: z.number(),
49
- mimeType: z.string(),
50
- $permissions: z.array(z.string()),
51
- chunksCount: z.number(),
52
- signature: z.string(),
53
- $createdAt: z.string(),
54
- $updatedAt: z.string()
55
- });
56
-
57
- export const BucketConfigurationSchema = z.object({
58
- $permissions: z.array(z.string()),
59
- fileSecurity: z.boolean(),
60
- enabled: z.boolean(),
61
- maximumFileSize: z.number(),
62
- allowedFileExtensions: z.array(z.string()),
63
- compression: z.string(),
64
- encryption: z.boolean(),
65
- antivirus: z.boolean()
66
- });
67
-
68
- export const BucketManifestSchema = z.object({
69
- version: z.string().default("1.0"),
70
- bucketId: z.string(),
71
- bucketName: z.string(),
72
- createdAt: z.string(),
73
- fileCount: z.number(),
74
- totalSizeBytes: z.number(),
75
- compression: z.enum(['gzip', 'none']),
76
- files: z.array(BucketFileMetadataSchema),
77
- bucketConfiguration: BucketConfigurationSchema
78
- });
@@ -1,76 +0,0 @@
1
- import { z } from "zod";
2
-
3
- /**
4
- * Schema for comprehensive backup manifest
5
- *
6
- * This manifest tracks all databases and buckets included in a comprehensive backup,
7
- * allowing for complete system restoration.
8
- */
9
-
10
- export interface DatabaseBackupReference {
11
- databaseId: string;
12
- databaseName: string;
13
- backupFileId: string; // Storage file ID for the database backup ZIP/JSON
14
- manifestFileId: string; // Storage file ID for the database manifest JSON
15
- collectionCount: number;
16
- documentCount: number;
17
- sizeBytes: number;
18
- status: 'completed' | 'partial' | 'failed';
19
- error?: string;
20
- }
21
-
22
- export interface BucketBackupReference {
23
- bucketId: string;
24
- bucketName: string;
25
- backupFileId: string; // Storage file ID for the bucket backup ZIP
26
- manifestFileId: string; // Storage file ID for the bucket manifest JSON
27
- fileCount: number;
28
- sizeBytes: number;
29
- status: 'completed' | 'partial' | 'failed';
30
- error?: string;
31
- }
32
-
33
- export interface ComprehensiveManifest {
34
- version: string;
35
- backupId: string; // Unique ID for this comprehensive backup
36
- createdAt: string; // ISO timestamp
37
- databases: DatabaseBackupReference[];
38
- buckets: BucketBackupReference[];
39
- totalSizeBytes: number;
40
- status: 'completed' | 'partial' | 'failed';
41
- errors?: string[];
42
- }
43
-
44
- export const DatabaseBackupReferenceSchema = z.object({
45
- databaseId: z.string(),
46
- databaseName: z.string(),
47
- backupFileId: z.string(),
48
- manifestFileId: z.string(),
49
- collectionCount: z.number(),
50
- documentCount: z.number(),
51
- sizeBytes: z.number(),
52
- status: z.enum(['completed', 'partial', 'failed']),
53
- error: z.string().optional()
54
- });
55
-
56
- export const BucketBackupReferenceSchema = z.object({
57
- bucketId: z.string(),
58
- bucketName: z.string(),
59
- backupFileId: z.string(),
60
- manifestFileId: z.string(),
61
- fileCount: z.number(),
62
- sizeBytes: z.number(),
63
- status: z.enum(['completed', 'partial', 'failed']),
64
- error: z.string().optional()
65
- });
66
-
67
- export const ComprehensiveManifestSchema = z.object({
68
- version: z.string().default("1.0"),
69
- backupId: z.string(),
70
- createdAt: z.string(),
71
- databases: z.array(DatabaseBackupReferenceSchema),
72
- buckets: z.array(BucketBackupReferenceSchema),
73
- totalSizeBytes: z.number(),
74
- status: z.enum(['completed', 'partial', 'failed']),
75
- errors: z.array(z.string()).optional()
76
- });