From f8664e09c5922c6d802782282631e1ef790d2d54 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Desboeufs?= <jerome@livingdata.co>
Date: Mon, 9 Dec 2024 11:11:30 +0100
Subject: [PATCH] Ensure outputFile is cleaned on processing reset

---
 batch/model/project.js | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/batch/model/project.js b/batch/model/project.js
index b4a0919..5bb669b 100644
--- a/batch/model/project.js
+++ b/batch/model/project.js
@@ -159,6 +159,21 @@ export async function setOutputFile(id, filename, inputStream, {redis, storage})
     .exec()
 }
 
+export async function deleteOutputFile(id, {redis, storage}) {
+  const objectKey = await redis.get(`project:${id}:output-obj-key`)
+
+  if (objectKey) {
+    storage.deleteFile(objectKey).catch(error => {
+      logger.error(`Unable to delete object ${objectKey} from storage: ${error.message}`)
+    })
+  }
+
+  await redis.pipeline()
+    .hdel(`project:${id}:meta`, 'outputFile')
+    .del(`project:${id}:output-obj-key`)
+    .exec()
+}
+
 export async function getOutputFileDownloadStream(id, {redis, storage}) {
   const objectKey = await redis.get(`project:${id}:output-obj-key`)
   return storage.createDownloadStream(objectKey)
@@ -212,9 +227,11 @@ export async function updateProcessing(id, changes, {redis}) {
   await redis.hset(`project:${id}:processing`, prepareObject({...changes, heartbeat: new Date()}))
 }
 
-export async function resetProcessing(id, {redis}) {
+export async function resetProcessing(id, {redis, storage}) {
   await ensureProjectStatus(id, ['processing', 'waiting'], {redis})
 
+  await deleteOutputFile(id, {redis, storage})
+
   await redis
     .pipeline()
     .del(`project:${id}:processing-asked`)
-- 
GitLab