From 18a690c644bd74aa401cc6d074189aa3c99852dd Mon Sep 17 00:00:00 2001
From: Jan Zickermann <jan.zickermann@dataport.de>
Date: Mon, 17 Feb 2025 15:01:09 +0100
Subject: [PATCH] OZG-4097 send-attachment: Cleanup

---
 .../osiv2/model/BinaryFileUpload.java         |  8 ---
 .../osiv2/model/FileChunkResource.java        | 28 ----------
 .../storage/Osi2AttachmentFileService.java    |  1 -
 .../osiv2/OsiPostfachRemoteServiceITCase.java | 53 ++++++++++++++++++-
 .../VorgangManagerServerExtension.java        |  7 +--
 .../PostfachApiFacadeServiceTest.java         |  4 +-
 6 files changed, 55 insertions(+), 46 deletions(-)
 delete mode 100644 src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/model/BinaryFileUpload.java
 delete mode 100644 src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/model/FileChunkResource.java

diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/model/BinaryFileUpload.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/model/BinaryFileUpload.java
deleted file mode 100644
index dbd3081..0000000
--- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/model/BinaryFileUpload.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package de.ozgcloud.nachrichten.postfach.osiv2.model;
-
-public record BinaryFileUpload(
-		String name,
-		String contentType,
-		long size
-) {
-}
diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/model/FileChunkResource.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/model/FileChunkResource.java
deleted file mode 100644
index 59078e5..0000000
--- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/model/FileChunkResource.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package de.ozgcloud.nachrichten.postfach.osiv2.model;
-
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-
-import org.springframework.core.io.AbstractResource;
-
-import com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream;
-
-import lombok.Builder;
-import lombok.RequiredArgsConstructor;
-
-@Builder
-@RequiredArgsConstructor
-public class FileChunkResource extends AbstractResource {
-	private final Integer chunkSize;
-	private final ByteBuffer content;
-
-	@Override
-	public String getDescription() {
-		return "Chunk of a file";
-	}
-
-	@Override
-	public InputStream getInputStream() {
-		return new ByteBufferBackedInputStream(content);
-	}
-}
diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/storage/Osi2AttachmentFileService.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/storage/Osi2AttachmentFileService.java
index 0eab427..24596f9 100644
--- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/storage/Osi2AttachmentFileService.java
+++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/storage/Osi2AttachmentFileService.java
@@ -49,7 +49,6 @@ public class Osi2AttachmentFileService {
 	}
 
 	public String uploadFileAndReturnId(AttachmentFile attachmentFile, Supplier<InputStream> fileInputStream) {
-		// TODO KOP-3008 use revised (nachrichten-manager) AttachmentFileService
 		var attachmentFileId = ozgCloudFileService.uploadFile(
 				attachmentFileMapper.toOzgCloudUploadFile(attachmentFile),
 				fileInputStream.get()
diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java
index 04bef85..0e793a1 100644
--- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java
+++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java
@@ -74,7 +74,6 @@ class OsiPostfachRemoteServiceITCase {
 	@SneakyThrows
 	public void setup() {
 		postfachFacadeMockServer = OSI_MOCK_SERVER_EXTENSION.getPostfachFacadeMockServer();
-
 	}
 
 	@DisplayName("should send request with jwt")
@@ -138,6 +137,58 @@ class OsiPostfachRemoteServiceITCase {
 		);
 	}
 
+	@DisplayName("should delete attachments on upload exception")
+	@Test
+	void shouldDeleteAttachmentsOnUploadException() {
+		var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService);
+		postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked"))
+				.willReturn(okJsonObj(QuarantineFileResult.builder()
+						.success(false)
+						.error("Upload failure")
+						.build()))
+		);
+		postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
+				.willReturn(ok())
+		);
+		var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder()
+				.attachments(List.of(textFileId))
+				.build();
+
+		osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment);
+
+		postfachFacadeMockServer.verify(
+				exactly(1),
+				deleteRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
+		);
+	}
+
+	@DisplayName("should delete attachments on scan exception")
+	@Test
+	void shouldDeleteAttachmentsOnScanException() {
+		var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService);
+		postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked"))
+				.willReturn(okJsonObj(QuarantineFileResult.builder()
+						.success(true)
+						.build()))
+		);
+		postfachFacadeMockServer.stubFor(get(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
+				.willReturn(okJsonObj(QuarantineStatus.UNSAFE))
+		);
+		postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
+				.willReturn(ok())
+		);
+		var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder()
+				.attachments(List.of(textFileId))
+				.build();
+
+		osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment);
+
+		postfachFacadeMockServer.verify(
+				exactly(1),
+				deleteRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}"))
+		);
+	}
+
 	private void mockSendResponse() {
 		// Stub message send response (MessageExchangeApi::sendMessage)
 		postfachFacadeMockServer.stubFor(post(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}"))
diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/VorgangManagerServerExtension.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/VorgangManagerServerExtension.java
index 494577a..872ebbc 100644
--- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/VorgangManagerServerExtension.java
+++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/VorgangManagerServerExtension.java
@@ -5,7 +5,6 @@ import java.util.Map;
 import java.util.Optional;
 
 import org.junit.jupiter.api.extension.AfterAllCallback;
-import org.junit.jupiter.api.extension.AfterEachCallback;
 import org.junit.jupiter.api.extension.BeforeAllCallback;
 import org.junit.jupiter.api.extension.ExtensionContext;
 import org.testcontainers.containers.MongoDBContainer;
@@ -21,7 +20,7 @@ import lombok.extern.log4j.Log4j2;
 @Log4j2
 @Getter
 @RequiredArgsConstructor
-public class VorgangManagerServerExtension implements BeforeAllCallback, AfterAllCallback, AfterEachCallback {
+public class VorgangManagerServerExtension implements BeforeAllCallback, AfterAllCallback {
 
 	static final String VORGANG_MANAGER_NETWORK_ALIAS = "vorgang-manager";
 	static final String MONGODB_NETWORK_ALIAS = "mongodb";
@@ -77,8 +76,4 @@ public class VorgangManagerServerExtension implements BeforeAllCallback, AfterAl
 				.orElse("missing");
 	}
 
-	@Override
-	public void afterEach(ExtensionContext context) {
-		// Consider clearing mongodb (uploaded files)
-	}
 }
diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java
index a0e6ba9..6117bc3 100644
--- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java
+++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java
@@ -16,6 +16,7 @@ import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
+import org.springframework.core.io.AbstractResource;
 
 import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
 import de.ozgcloud.nachrichten.postfach.osiv2.config.Osi2PostfachProperties;
@@ -32,7 +33,6 @@ import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.OutSendMessageRequestV2;
 import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.QuarantineStatus;
 import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.V1ReplyMessage;
 import de.ozgcloud.nachrichten.postfach.osiv2.model.FileChunkInfo;
-import de.ozgcloud.nachrichten.postfach.osiv2.model.FileChunkResource;
 import de.ozgcloud.nachrichten.postfach.osiv2.model.Osi2FileUpload;
 import lombok.SneakyThrows;
 
@@ -214,7 +214,7 @@ class PostfachApiFacadeServiceTest {
 	@Nested
 	class TestUploadChunk {
 		@Mock
-		FileChunkResource chunkResource;
+		AbstractResource chunkResource;
 
 		@Mock
 		DomainChunkMetaData domainChunkMetaData;
-- 
GitLab