From 4b3c62c9eb5de87a823d2e22663583634b288694 Mon Sep 17 00:00:00 2001 From: Vasily Zubarev Date: Mon, 19 May 2025 17:03:01 +0200 Subject: [PATCH] fix: use seconds to update progress --- app/(app)/export/transactions/route.ts | 13 ++++++++----- app/(app)/settings/backups/data/route.ts | 15 ++++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/app/(app)/export/transactions/route.ts b/app/(app)/export/transactions/route.ts index 07106fd..134c702 100644 --- a/app/(app)/export/transactions/route.ts +++ b/app/(app)/export/transactions/route.ts @@ -3,7 +3,7 @@ import { fileExists, fullPathForFile } from "@/lib/files" import { EXPORT_AND_IMPORT_FIELD_MAP, ExportFields, ExportFilters } from "@/models/export_and_import" import { getFields } from "@/models/fields" import { getFilesByTransactionId } from "@/models/files" -import { incrementProgress, updateProgress } from "@/models/progress" +import { updateProgress } from "@/models/progress" import { getTransactions } from "@/models/transactions" import { format } from "@fast-csv/format" import { formatDate } from "date-fns" @@ -15,7 +15,7 @@ import { Readable } from "stream" const TRANSACTIONS_CHUNK_SIZE = 300 const FILES_CHUNK_SIZE = 50 -const PROGRESS_UPDATE_INTERVAL = 10 // files +const PROGRESS_UPDATE_INTERVAL_MS = 2000 // 2 seconds export async function GET(request: Request) { const url = new URL(request.url) @@ -98,6 +98,7 @@ export async function GET(request: Request) { let totalFilesProcessed = 0 let totalFilesToProcess = 0 + let lastProgressUpdate = Date.now() // First count total files to process for (const transaction of transactions) { @@ -145,9 +146,11 @@ export async function GET(request: Request) { fileData ) - // Update progress every PROGRESS_UPDATE_INTERVAL files - if (progressId && totalFilesProcessed % PROGRESS_UPDATE_INTERVAL === 0) { - await incrementProgress(user.id, progressId) + // Update progress every PROGRESS_UPDATE_INTERVAL_MS milliseconds + const now = Date.now() + if (progressId && now - lastProgressUpdate >= PROGRESS_UPDATE_INTERVAL_MS) { + await updateProgress(user.id, progressId, { current: totalFilesProcessed }) + lastProgressUpdate = now } } else { console.log(`Skipping missing file: ${file.filename} for transaction ${transaction.id}`) diff --git a/app/(app)/settings/backups/data/route.ts b/app/(app)/settings/backups/data/route.ts index e055bf0..f782c56 100644 --- a/app/(app)/settings/backups/data/route.ts +++ b/app/(app)/settings/backups/data/route.ts @@ -1,7 +1,7 @@ import { getCurrentUser } from "@/lib/auth" import { fileExists, getUserUploadsDirectory } from "@/lib/files" import { MODEL_BACKUP, modelToJSON } from "@/models/backups" -import { incrementProgress, updateProgress } from "@/models/progress" +import { updateProgress } from "@/models/progress" import fs from "fs/promises" import JSZip from "jszip" import { NextResponse } from "next/server" @@ -9,7 +9,7 @@ import path from "path" const MAX_FILE_SIZE = 64 * 1024 * 1024 // 64MB const BACKUP_VERSION = "1.0" -const PROGRESS_UPDATE_INTERVAL = 10 // files +const PROGRESS_UPDATE_INTERVAL_MS = 2000 // 2 seconds export async function GET(request: Request) { const user = await getCurrentUser() @@ -63,6 +63,8 @@ export async function GET(request: Request) { } let processedFiles = 0 + let lastProgressUpdate = Date.now() + for (const file of uploadedFiles) { try { // Check file size before reading @@ -80,9 +82,12 @@ export async function GET(request: Request) { uploadsFolder.file(file.replace(userUploadsDirectory, ""), fileContent) processedFiles++ - // Update progress every PROGRESS_UPDATE_INTERVAL files - if (progressId && processedFiles % PROGRESS_UPDATE_INTERVAL === 0) { - await incrementProgress(user.id, progressId) + + // Update progress every PROGRESS_UPDATE_INTERVAL_MS milliseconds + const now = Date.now() + if (progressId && now - lastProgressUpdate >= PROGRESS_UPDATE_INTERVAL_MS) { + await updateProgress(user.id, progressId, { current: processedFiles }) + lastProgressUpdate = now } } catch (error) { console.error(`Error reading file ${file}:`, error)