Fix tenant archive S3 upload
All checks were successful
Build and Push Docker Images / build-backend (push) Successful in 26s
Build and Push Docker Images / build-frontend (push) Successful in 58s
Build and Push Docker Images / build-website (push) Successful in 13s
Build and Push Docker Images / build-docs (push) Successful in 12s
All checks were successful
Build and Push Docker Images / build-backend (push) Successful in 26s
Build and Push Docker Images / build-frontend (push) Successful in 58s
Build and Push Docker Images / build-website (push) Successful in 13s
Build and Push Docker Images / build-docs (push) Successful in 12s
This commit is contained in:
@@ -1,7 +1,10 @@
|
||||
import { FastifyInstance } from "fastify"
|
||||
import { GetObjectCommand, PutObjectCommand } from "@aws-sdk/client-s3"
|
||||
import archiver from "archiver"
|
||||
import { PassThrough } from "stream"
|
||||
import { createReadStream, createWriteStream } from "fs"
|
||||
import { stat, unlink } from "fs/promises"
|
||||
import os from "os"
|
||||
import path from "path"
|
||||
import { BlobReader, TextWriter, Uint8ArrayWriter, ZipReader } from "@zip.js/zip.js"
|
||||
|
||||
import { pool } from "../../db"
|
||||
@@ -382,23 +385,21 @@ export const createTenantFullExportArchive = async (
|
||||
const storagePath = options.storagePath || `tenant-exports/${tenantId}/${Date.now()}-${filename}`
|
||||
const fileRows = exportData.tables.files || []
|
||||
const archive = archiver("zip", { zlib: { level: 6 } })
|
||||
const output = new PassThrough()
|
||||
let size = 0
|
||||
|
||||
output.on("data", (chunk: Buffer) => {
|
||||
size += chunk.length
|
||||
const tempPath = path.join(os.tmpdir(), `fedeo-tenant-export-${tenantId}-${Date.now()}-${filename}`)
|
||||
const output = createWriteStream(tempPath)
|
||||
const archiveComplete = new Promise<void>((resolve, reject) => {
|
||||
output.on("close", resolve)
|
||||
output.on("error", reject)
|
||||
archive.on("error", reject)
|
||||
archive.on("warning", (err) => {
|
||||
if ((err as NodeJS.ErrnoException).code === "ENOENT") return
|
||||
reject(err)
|
||||
})
|
||||
})
|
||||
|
||||
const uploadPromise = s3.send(new PutObjectCommand({
|
||||
Bucket: secrets.S3_BUCKET,
|
||||
Key: storagePath,
|
||||
Body: output,
|
||||
ContentType: "application/zip",
|
||||
ContentDisposition: `attachment; filename="${filename}"`,
|
||||
}))
|
||||
|
||||
archive.pipe(output)
|
||||
|
||||
try {
|
||||
const tables = Object.entries(exportData.tables)
|
||||
.sort(([a], [b]) => a.localeCompare(b))
|
||||
.map(([table, rows]) => {
|
||||
@@ -456,7 +457,17 @@ export const createTenantFullExportArchive = async (
|
||||
|
||||
archive.append(jsonBuffer(manifest), { name: "manifest.json" })
|
||||
await archive.finalize()
|
||||
await uploadPromise
|
||||
await archiveComplete
|
||||
|
||||
const { size } = await stat(tempPath)
|
||||
await s3.send(new PutObjectCommand({
|
||||
Bucket: secrets.S3_BUCKET,
|
||||
Key: storagePath,
|
||||
Body: createReadStream(tempPath),
|
||||
ContentLength: size,
|
||||
ContentType: "application/zip",
|
||||
ContentDisposition: `attachment; filename="${filename}"`,
|
||||
}))
|
||||
|
||||
return {
|
||||
filename,
|
||||
@@ -466,6 +477,9 @@ export const createTenantFullExportArchive = async (
|
||||
filesTotal,
|
||||
filesDone,
|
||||
}
|
||||
} finally {
|
||||
await unlink(tempPath).catch(() => undefined)
|
||||
}
|
||||
}
|
||||
|
||||
const restoreFiles = async (exportData: TenantFullExport) => {
|
||||
|
||||
Reference in New Issue
Block a user