From 0b70a9c499ddd7def44bf33fd265133ced09ba12 Mon Sep 17 00:00:00 2001
From: agoer <alexander.goerlitz@student.reutlingen-university.de>
Date: Tue, 18 Jun 2024 11:39:06 +0200
Subject: [PATCH] Implemented OperationTeam create and delete

---
 opp/core/src/main/java/OperationTeam.java     | 13 +++-
 opp/core/src/main/java/OperationTeamImpl.java | 53 +++++++++++++
 .../src/main/java/OperationTeamService.java   | 14 ++++
 opp/core/src/main/java/Repository.java        | 10 ++-
 .../src/main/java/JDBCRepository.java         | 74 +++++++++++++++++++
 opp/jdbc-repo-impl/src/test/java/Tests.java   | 38 ++++++++++
 6 files changed, 200 insertions(+), 2 deletions(-)
 create mode 100644 opp/core/src/main/java/OperationTeamImpl.java
 create mode 100644 opp/core/src/main/java/OperationTeamService.java

diff --git a/opp/core/src/main/java/OperationTeam.java b/opp/core/src/main/java/OperationTeam.java
index ce149f7..dcc7970 100644
--- a/opp/core/src/main/java/OperationTeam.java
+++ b/opp/core/src/main/java/OperationTeam.java
@@ -3,7 +3,18 @@ import java.util.List;
 
 public record OperationTeam(
         Id<OperationTeam> operationTeamId,
-        List<OPStaff> opStaffList,
+        String teamName,
         Instant lastUpdate
 ) {
+
+    public static sealed interface Command permits OperationTeam.CreateTeam, OperationTeam.DeleteTeam {}
+
+    public static record CreateTeam(
+            String teamName
+    ) implements OperationTeam.Command {}
+
+    public static record DeleteTeam(
+            Id<OperationTeam> operationTeamId
+    ) implements OperationTeam.Command {}
+
 }
diff --git a/opp/core/src/main/java/OperationTeamImpl.java b/opp/core/src/main/java/OperationTeamImpl.java
new file mode 100644
index 0000000..101be27
--- /dev/null
+++ b/opp/core/src/main/java/OperationTeamImpl.java
@@ -0,0 +1,53 @@
+import java.sql.SQLException;
+import java.time.Instant;
+import java.util.Optional;
+
+public class OperationTeamImpl implements OperationTeamService{
+
+    private final Repository repo;
+
+    public OperationTeamImpl(Repository repo) {
+        this.repo = repo;
+    }
+
+
+    @Override
+    public OperationTeam process(OperationTeam.Command cmd) throws Exception {
+        return switch(cmd){
+            case OperationTeam.CreateTeam cr -> createOperationTeamimpl(cr);
+            case OperationTeam.DeleteTeam del -> deleteOperationTeamimpl(del);
+        };
+    }
+
+    @Override
+    public Optional<OperationTeam> getOperationTeam(Id<OperationTeam> operationTeamId) {
+        return null; //repo.findOperationTeam(operationTeamId);
+    }
+
+    private OperationTeam deleteOperationTeamimpl(OperationTeam.DeleteTeam del)  throws SQLException {
+
+        OperationTeam operationTeam = repo.deleteOperationTeam(del.operationTeamId());
+
+        return operationTeam;
+    }
+
+    private OperationTeam createOperationTeamimpl(OperationTeam.CreateTeam cr) {
+        OperationTeam operationTeam =
+                new OperationTeam(
+                        repo.operationTeamId(),
+                        cr.teamName(),
+                        Instant.now()
+                );
+        return operationTeam;
+    }
+
+    @Override
+    public Optional<OperationTeam> getOperationTeams() {
+        return Optional.empty();
+    }
+
+    @Override
+    public Optional<OPStaff> getOperationTeamOPStaff(Id<OperationTeam> operationTeamId) {
+        return Optional.empty();
+    }
+}
diff --git a/opp/core/src/main/java/OperationTeamService.java b/opp/core/src/main/java/OperationTeamService.java
new file mode 100644
index 0000000..b4c3b30
--- /dev/null
+++ b/opp/core/src/main/java/OperationTeamService.java
@@ -0,0 +1,14 @@
+import java.util.Optional;
+
+public interface OperationTeamService {
+
+    public OperationTeam process(OperationTeam.Command cmd) throws Exception;
+
+    public Optional<OperationTeam> getOperationTeam(Id<OperationTeam> operationTeamId);
+
+    public Optional<OperationTeam> getOperationTeams();
+
+    public Optional<OPStaff> getOperationTeamOPStaff(Id<OperationTeam> operationTeamId);
+
+
+}
diff --git a/opp/core/src/main/java/Repository.java b/opp/core/src/main/java/Repository.java
index 6b91ac7..85053f7 100644
--- a/opp/core/src/main/java/Repository.java
+++ b/opp/core/src/main/java/Repository.java
@@ -1,4 +1,3 @@
-import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.List;
 import java.util.Optional;
@@ -75,4 +74,13 @@ public interface Repository {
 
 
     void deleteOPStaff(Id<OPStaff> id) throws SQLException;
+
+
+
+
+    Id<OperationTeam> operationTeamId();
+
+    void saveOperationTeam(OperationTeam operationTeam) throws Exception;
+
+    OperationTeam deleteOperationTeam(Id<OperationTeam> id) throws SQLException;
 }
diff --git a/opp/jdbc-repo-impl/src/main/java/JDBCRepository.java b/opp/jdbc-repo-impl/src/main/java/JDBCRepository.java
index f4617e7..f5361db 100644
--- a/opp/jdbc-repo-impl/src/main/java/JDBCRepository.java
+++ b/opp/jdbc-repo-impl/src/main/java/JDBCRepository.java
@@ -51,6 +51,7 @@ class JDBCRepository implements Repository
 
       stmt.execute(CREATE_OPERATION_TABLE);
       stmt.execute(CREATE_OPSTAFF_TABLE);
+      stmt.execute(CREATE_OPERATIONTEAM_TABLE);
 
     } catch (SQLException e){
       throw new RuntimeException(e);
@@ -548,6 +549,79 @@ class JDBCRepository implements Repository
     }
   }
 
+
+  /**
+   * Returns a new generated ID in the operationTeam-SQLTable
+   * If the generated ID is already used, generate another one.
+   * @return operationTeamID
+   */
+  @Override
+  public Id<OperationTeam> operationTeamId() {
+
+    var id = new Id<OperationTeam>(randomUUID().toString());
+
+    return id; //TODO
+    // findOperation(id).isEmpty() ? id : operationId();
+  }
+
+  /**
+   * Connects to the database and checks if the ID of the given OperationTeam is already used.
+   * If yes, then update existing entry, else insert new entry.
+   * @param operationTeam the OPStaff to save into the database
+   */
+  @Override
+  public void saveOperationTeam(OperationTeam operationTeam) {
+
+    try (
+            var stmt = conn.createStatement()
+    ){
+      //TODO
+      /*var sql =
+              findOPStaff(opStaff.id()).isPresent() ?
+                      updateOPStaffSQL(opStaff) :
+                      insertOPStaffSQL(opStaff);*/
+      var sql = insertOperationTeamSQL(operationTeam);
+
+      stmt.executeUpdate(sql);
+
+    } catch (SQLException e){
+      throw new RuntimeException(e);
+    }
+  }
+
+  private static String insertOperationTeamSQL(OperationTeam operationTeam){
+    return
+            "INSERT INTO operationteam(" +
+                    "id,teamname,lastUpdate" +
+                    ") VALUES (" +
+                    sqlValue(operationTeam.operationTeamId().value()) + "," +
+                    sqlValue(operationTeam.teamName()) + "," +
+                    sqlValue(operationTeam.lastUpdate()) +
+                    ");";
+  }
+
+
+  @Override
+  public OperationTeam deleteOperationTeam(Id<OperationTeam> id) throws SQLException{
+
+    //var opStaff = findOPStaff(id);
+
+    //if(opStaff.isPresent()) {
+      conn.createStatement().executeUpdate(
+              "DELETE FROM operationteam WHERE id = " + quoted(id.value()) + ";");
+
+    //}
+    return null;
+  }
+
+  private static final String CREATE_OPERATIONTEAM_TABLE = """
+    CREATE TABLE IF NOT EXISTS operationteam(
+      id VARCHAR(50) PRIMARY KEY,
+      teamname VARCHAR(50) NOT NULL,
+      lastUpdate TIMESTAMP NOT NULL
+    );
+  """;
+
 }
 
 
diff --git a/opp/jdbc-repo-impl/src/test/java/Tests.java b/opp/jdbc-repo-impl/src/test/java/Tests.java
index e8dadf8..0a0deae 100644
--- a/opp/jdbc-repo-impl/src/test/java/Tests.java
+++ b/opp/jdbc-repo-impl/src/test/java/Tests.java
@@ -25,6 +25,10 @@ public final class Tests
 
   private static OPStaffService opStaffService;
 
+  private static OperationTeam testOperationTeam = null;
+
+  private static OperationTeamService operationTeamService;
+
   @BeforeClass
   public static void init() throws Exception {
 
@@ -51,6 +55,16 @@ public final class Tests
 
     opStaffService = new OPStaffServiceImpl(repo);
 
+
+    testOperationTeam = new OperationTeam(
+            new Id<>("1212121212121"),
+            ("Cooles Team"),
+            Instant.now()
+    );
+
+    operationTeamService = new OperationTeamImpl(repo) {
+    };
+
   }
 
   //@Test
@@ -268,6 +282,30 @@ public final class Tests
 
   }
 
+  @Test
+  public void testCreateOperationTeam() throws Exception{
+
+    try {
+      repo.saveOperationTeam(testOperationTeam);
+    } catch (Exception e){
+      e.printStackTrace();
+    }
+  }
+
+  @Test
+  public void testDeleteOperationTeam() throws Exception{
+
+    var id = new Id<OperationTeam>("1212");
+
+    OperationTeam.DeleteTeam deleteCommand = new OperationTeam.DeleteTeam(
+            id
+    );
+
+    OperationTeam deleteOperationTeam = operationTeamService.process(deleteCommand);
+
+  }
+
+
 }
 
 
-- 
GitLab