appwrite-utils-cli
Version:
Appwrite Utility Functions to help with database management, data conversion, data import, migrations, and much more. Meant to be used as a CLI tool, I do not recommend installing this in frontend environments.
68 lines (67 loc) • 2.47 kB
JavaScript
import JSZip from "jszip";
/**
* Creates a compressed ZIP backup from backup data
*
* Structure:
* - metadata.json (backup metadata)
* - database.json (database config)
* - collections/*.json (one file per collection)
* - documents/*.json (one file per collection's documents)
* - files/ (optional, if includeFiles is true)
*/
export async function createBackupZip(backupData, options = {}) {
const zip = new JSZip();
const compressionLevel = options.compressionLevel ?? 6;
// Add metadata.json
const metadata = {
version: "1.0",
createdAt: new Date().toISOString(),
databaseId: JSON.parse(backupData.database).$id,
format: "zip",
includesFiles: options.includeFiles ?? false
};
zip.file("metadata.json", JSON.stringify(metadata, null, 2));
// Add database.json
zip.file("database.json", backupData.database);
// Add collections/*.json
const collectionsFolder = zip.folder("collections");
if (collectionsFolder) {
backupData.collections.forEach((collectionStr, index) => {
const collection = JSON.parse(collectionStr);
collectionsFolder.file(`${collection.$id || `collection_${index}`}.json`, collectionStr);
});
}
// Add documents/*.json
const documentsFolder = zip.folder("documents");
if (documentsFolder) {
backupData.documents.forEach((docBatch) => {
const collectionId = docBatch.collectionId;
documentsFolder.file(`${collectionId}.json`, docBatch.data);
});
}
// TODO: Add files support in future task (C3.5)
if (options.includeFiles) {
// Placeholder for file backup support
const filesFolder = zip.folder("files");
if (filesFolder) {
filesFolder.file("file-manifest.json", JSON.stringify({
note: "File backup not yet implemented"
}, null, 2));
}
}
// Generate ZIP buffer
const buffer = await zip.generateAsync({
type: "nodebuffer",
compression: "DEFLATE",
compressionOptions: { level: compressionLevel }
});
return buffer;
}
/**
* Estimates compression ratio for backup data
*/
export function estimateCompressedSize(uncompressedSize, format = "json") {
// JSON typically compresses to 20-30% of original size with gzip
const compressionRatio = format === "json" ? 0.25 : 0.5;
return Math.ceil(uncompressedSize * compressionRatio);
}