From ae22b55130354fc5c4400fb3fa3d2217ff050d97 Mon Sep 17 00:00:00 2001
From: agoer <alexander.goerlitz@student.reutlingen-university.de>
Date: Sat, 15 Jun 2024 12:33:43 +0200
Subject: [PATCH] implemented update for OPStaff.

---
 opp/core/src/main/java/OPStaff.java           |  9 ++++++-
 .../src/main/java/OPStaffServiceImpl.java     | 17 ++++++++++++-
 .../src/main/java/JDBCRepository.java         | 24 +++++++++++++++----
 opp/jdbc-repo-impl/src/test/java/Tests.java   | 15 +++++++++++-
 4 files changed, 57 insertions(+), 8 deletions(-)

diff --git a/opp/core/src/main/java/OPStaff.java b/opp/core/src/main/java/OPStaff.java
index 352781c..c7d0851 100644
--- a/opp/core/src/main/java/OPStaff.java
+++ b/opp/core/src/main/java/OPStaff.java
@@ -1,6 +1,7 @@
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalTime;
+import java.util.Optional;
 
 public record OPStaff(
         Id<OPStaff> id,
@@ -12,7 +13,7 @@ public record OPStaff(
     /**
      * OPStaff commands
      */
-    public static sealed interface Command permits OPStaff.CreateOPStaff { } //, OPStaff.UpdateOPStaff, OPStaff.DeleteOPStaff
+    public static sealed interface Command permits OPStaff.CreateOPStaff, OPStaff.UpdateOPStaff { } //OPStaff.DeleteOPStaff
 
     /**
      * Create command to create a new Operation
@@ -24,5 +25,11 @@ public record OPStaff(
             Specialty specialty
     ) implements Command {}
 
+    public static record UpdateOPStaff(
+            Id<OPStaff> id,
+            Optional<Role> role,
+            Optional<Specialty> specialty
+    ) implements Command {}
+
 
 }
diff --git a/opp/core/src/main/java/OPStaffServiceImpl.java b/opp/core/src/main/java/OPStaffServiceImpl.java
index b204542..51d90a5 100644
--- a/opp/core/src/main/java/OPStaffServiceImpl.java
+++ b/opp/core/src/main/java/OPStaffServiceImpl.java
@@ -14,7 +14,7 @@ public class OPStaffServiceImpl implements OPStaffService{
     public OPStaff process(OPStaff.Command cmd) throws Exception {
         return switch (cmd){
             case OPStaff.CreateOPStaff cr -> createOPStaffimpl(cr);
-            //case OPStaff.Update up -> update(up);
+            case OPStaff.UpdateOPStaff up -> updateOPStaffimpl(up);
             //case OPStaff.Delete del -> delete(del);
         };
     }
@@ -32,6 +32,21 @@ public class OPStaffServiceImpl implements OPStaffService{
         return opStaff;
     }
 
+    public OPStaff updateOPStaffimpl(OPStaff.UpdateOPStaff up) throws Exception{
+        OPStaff currentOPStaff = repo.findOPStaff(up.id()).get();
+
+        OPStaff opStaff =
+                new OPStaff(
+                        currentOPStaff.id(),
+                        up.role().orElse(currentOPStaff.role()),
+                        up.specialty().orElse((currentOPStaff.specialty())),
+                        Instant.now()
+                );
+        repo.saveOPStaff(opStaff);
+
+        return opStaff;
+    }
+
 
     public Optional<OPStaff> getOPStaff(Id<OPStaff> id) {
         return repo.findOPStaff(id);
diff --git a/opp/jdbc-repo-impl/src/main/java/JDBCRepository.java b/opp/jdbc-repo-impl/src/main/java/JDBCRepository.java
index c567680..0253e0f 100644
--- a/opp/jdbc-repo-impl/src/main/java/JDBCRepository.java
+++ b/opp/jdbc-repo-impl/src/main/java/JDBCRepository.java
@@ -431,11 +431,11 @@ class JDBCRepository implements Repository
             var stmt = conn.createStatement()
     ){
       //TODO
-       /*var sql =
-              findOperation(operation.id()).isPresent() ?
-                      updateSQL(operation) :
-                      insertSQL(operation);*/
-      var sql = insertOPStaffSQL(opStaff);
+       var sql =
+              findOPStaff(opStaff.id()).isPresent() ?
+                      updateOPStaffSQL(opStaff) :
+                      insertOPStaffSQL(opStaff);
+      //var sql = insertOPStaffSQL(opStaff);
 
       stmt.executeUpdate(sql);
 
@@ -522,6 +522,20 @@ class JDBCRepository implements Repository
     );
   }
 
+  /**
+   * Creates the update statement of the given OPStaff for SQL.
+   * @param opStaff the opStaff to turn into an update SQL statement
+   * @return the SQL statement
+   */
+  private static String updateOPStaffSQL(OPStaff opStaff){
+    return
+            "UPDATE opstaff SET " +
+                    "role = " + sqlValue(opStaff.role()) + "," +
+                    "specialty = " + sqlValue(opStaff.specialty()) + "," +
+                    "lastUpdate = " + sqlValue(opStaff.lastUpdate()) + " " +
+                    "WHERE id = " + sqlValue(opStaff.id().value()) + ";";
+  }
+
 }
 
 
diff --git a/opp/jdbc-repo-impl/src/test/java/Tests.java b/opp/jdbc-repo-impl/src/test/java/Tests.java
index 48b190b..651a2a8 100644
--- a/opp/jdbc-repo-impl/src/test/java/Tests.java
+++ b/opp/jdbc-repo-impl/src/test/java/Tests.java
@@ -226,7 +226,7 @@ public final class Tests
     //assertEquals(operation.date(), testDate);
   }
 
-  @Test
+  //@Test
   public void testGetOPStaffs() {
 
     try{
@@ -241,6 +241,19 @@ public final class Tests
     }
     //assertEquals(operation.date(), testDate);
   }
+
+  @Test
+  public void testUpdateOPStaff() throws Exception{
+
+    OPStaff.UpdateOPStaff updateCommand = new OPStaff.UpdateOPStaff(
+            testOPStaff.id(),
+            Optional.empty(),
+            Optional.of(Specialty.Orthopedics)
+    );
+
+    OPStaff updateOPStaff = opStaffService.process(updateCommand);
+
+  }
 }
 
 
-- 
GitLab