From 9912b0a97528d566ff69f0fe54bb1a89173f881f Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Wed, 9 Oct 2024 19:04:11 +0200
Subject: [PATCH] ENH: Add delete method and rename base deletion

---
 api/src/main/resources/api.yaml               |  2 +-
 .../fdo/manager/service/fdo/FDOApiImpl.java   | 31 +++++++++++++++++--
 2 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/api/src/main/resources/api.yaml b/api/src/main/resources/api.yaml
index de194c5..afb2a75 100644
--- a/api/src/main/resources/api.yaml
+++ b/api/src/main/resources/api.yaml
@@ -248,7 +248,7 @@ paths:
       tags:
         - FDOs
       description: "Delete an FDO."
-      operationId: baseDelete
+      operationId: delete
       parameters:
         - $ref: '#/components/parameters/Prefix'
         - $ref: '#/components/parameters/Suffix'
diff --git a/application/src/main/java/com/indiscale/fdo/manager/service/fdo/FDOApiImpl.java b/application/src/main/java/com/indiscale/fdo/manager/service/fdo/FDOApiImpl.java
index 4bb36de..ccae30b 100644
--- a/application/src/main/java/com/indiscale/fdo/manager/service/fdo/FDOApiImpl.java
+++ b/application/src/main/java/com/indiscale/fdo/manager/service/fdo/FDOApiImpl.java
@@ -108,12 +108,39 @@ public class FDOApiImpl extends BaseController implements FdoApi {
   }
 
   @Override
-  public ResponseEntity<Void> baseDelete(
+  public ResponseEntity<Void> delete(
       String prefix, String suffix, Boolean purge, Boolean deleteMD) {
     if (purge) {
       return purgeFDO(prefix, suffix);
     }
-    throw new ResponseStatusException(HttpStatus.NOT_IMPLEMENTED);
+    return deleteFDO(prefix, suffix, deleteMD);
+  }
+
+  public ResponseEntity<Void> deleteFDO(String prefix, String suffix, boolean deleteMD) {
+    try (Manager manager = getManager()) {
+      String pid = prefix + "/" + suffix;
+      DigitalObject fdo = manager.resolvePID(pid);
+      String repoId = manager.deleteFDO(pid, deleteMD);
+      if (repoId != null && !repoId.isEmpty()) {
+        RepositoryConnection repository =
+            manager.getRepositoryRegistry().createRepositoryConnection(repoId);
+        getLogger().deleteFDO(fdo, repository);
+        return ResponseEntity.noContent().build();
+      } else {
+        throw new ResponseStatusException(
+            HttpStatus.INTERNAL_SERVER_ERROR, "Could not delete PID " + pid + " due to inability to connect to repository.");
+      }
+    } catch (PidUnresolvableException e) {
+      throw new ResponseStatusException(
+          HttpStatus.NOT_FOUND, "Not found. Could not resolve PID " + e.getPid());
+    } catch (UnknownRepositoryException e) {
+      e.printStackTrace();
+      throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found. Repository unknown.");
+    } catch (UnsuccessfulOperationException e) {
+      e.printStackTrace();
+      throw new ResponseStatusException(
+          HttpStatus.INTERNAL_SERVER_ERROR, "Deletion unsuccessful: " + e.getMessage());
+    }
   }
 
   public ResponseEntity<Void> purgeFDO(String prefix, String suffix) {
-- 
GitLab