From 57774b1c3260102176fbf5dc9076e13f0cfb399f Mon Sep 17 00:00:00 2001
From: Tom Zhao <tom.zhao@dsv.su.se>
Date: Wed, 2 Apr 2025 13:18:06 +0200
Subject: [PATCH] 87: Save cloned RoughDraftApproval

---
 .../java/se/su/dsv/scipro/CoreConfig.java     |  5 ++--
 .../SplitOrRestartProjectServiceImpl.java     | 30 +++++++++++++------
 .../reviewing/RoughDraftApprovalService.java  |  4 ++-
 .../RoughDraftApprovalServiceImpl.java        |  6 ++++
 4 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/core/src/main/java/se/su/dsv/scipro/CoreConfig.java b/core/src/main/java/se/su/dsv/scipro/CoreConfig.java
index b0f924f458..16a400668c 100644
--- a/core/src/main/java/se/su/dsv/scipro/CoreConfig.java
+++ b/core/src/main/java/se/su/dsv/scipro/CoreConfig.java
@@ -817,9 +817,10 @@ public class CoreConfig {
     public SplitOrRestartProjectServiceImpl SplitOrRestartProjectService(
         ProjectService projectService,
         FinalSeminarService finalSeminarService,
-        RoughDraftApprovalService roughDraftApprovalService
+        RoughDraftApprovalService roughDraftApprovalService,
+        EventBus eventBus
     ) {
-        return new SplitOrRestartProjectServiceImpl(projectService, finalSeminarService, roughDraftApprovalService);
+        return new SplitOrRestartProjectServiceImpl(projectService, finalSeminarService, roughDraftApprovalService, eventBus);
     }
 
     @Bean
diff --git a/core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceImpl.java
index 5f52b113c3..877274f46e 100644
--- a/core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceImpl.java
+++ b/core/src/main/java/se/su/dsv/scipro/project/split/SplitOrRestartProjectServiceImpl.java
@@ -1,35 +1,41 @@
 package se.su.dsv.scipro.project.split;
 
-import com.querydsl.core.types.dsl.BooleanExpression;
+import com.google.common.eventbus.EventBus;
 import jakarta.inject.Inject;
 import jakarta.transaction.Transactional;
-import java.util.List;
-import java.util.Optional;
 import se.su.dsv.scipro.finalseminar.FinalSeminarService;
 import se.su.dsv.scipro.project.Project;
 import se.su.dsv.scipro.project.ProjectService;
 import se.su.dsv.scipro.project.ProjectStatus;
 import se.su.dsv.scipro.project.QProject;
 import se.su.dsv.scipro.reviewing.RoughDraftApproval;
+import se.su.dsv.scipro.reviewing.RoughDraftApprovalApprovedEvent;
 import se.su.dsv.scipro.reviewing.RoughDraftApprovalService;
 import se.su.dsv.scipro.system.User;
-import se.su.dsv.scipro.util.Pair;
+
+import java.time.Instant;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
 
 public class SplitOrRestartProjectServiceImpl implements SplitOrRestartProjectService {
 
     private final ProjectService projectService;
     private final FinalSeminarService finalSeminarService;
     private final RoughDraftApprovalService roughDraftApprovalService;
+    private final EventBus eventBus;
 
     @Inject
     public SplitOrRestartProjectServiceImpl(
         ProjectService projectService,
         FinalSeminarService finalSeminarService,
-        RoughDraftApprovalService roughDraftApprovalService
+        RoughDraftApprovalService roughDraftApprovalService,
+        EventBus eventBus
     ) {
         this.projectService = projectService;
         this.finalSeminarService = finalSeminarService;
         this.roughDraftApprovalService = roughDraftApprovalService;
+        this.eventBus = eventBus;
     }
 
     @Override
@@ -95,12 +101,18 @@ public class SplitOrRestartProjectServiceImpl implements SplitOrRestartProjectSe
             childProject.setRootProjectId(
                 project.getRootProjectId() != null ? project.getRootProjectId() : project.getId()
             );
-
-            // Todo: add RoughDraftApproval if it's 'APPROVED'
-            if (result.roughDraftApproval() != null) {}
+            childProject.setCloneTimestamp(Date.from(Instant.now()));
 
             childProject = projectService.save(childProject);
-            // Todo: Send event to eventBus to synchronize eventual Phase Two Approval with MileStone
+
+            // Add cloned RoughDraftApproval if it's 'APPROVED'
+            RoughDraftApproval rda = result.roughDraftApproval();
+            if (rda != null && rda.isApproved()) {
+                RoughDraftApproval clonedRda = roughDraftApprovalService.saveCloned(rda.cloneToProject(childProject));
+
+                // Send event to eventBus to synchronize eventual Phase Two Approval with MileStone
+                eventBus.post(new RoughDraftApprovalApprovedEvent(clonedRda));
+            }
         }
 
         // Parent project will set as inactive
diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApprovalService.java b/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApprovalService.java
index a4e41dfa40..308ff71d00 100644
--- a/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApprovalService.java
+++ b/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApprovalService.java
@@ -1,3 +1,5 @@
 package se.su.dsv.scipro.reviewing;
 
-public interface RoughDraftApprovalService extends ReviewerApprovalService<RoughDraftApproval> {}
+public interface RoughDraftApprovalService extends ReviewerApprovalService<RoughDraftApproval> {
+    RoughDraftApproval saveCloned(RoughDraftApproval approval);
+}
diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApprovalServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApprovalServiceImpl.java
index e0bb356aad..413444cd07 100644
--- a/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApprovalServiceImpl.java
+++ b/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApprovalServiceImpl.java
@@ -71,4 +71,10 @@ public class RoughDraftApprovalServiceImpl
     public Optional<RoughDraftApproval> findBy(Project project) {
         return Optional.ofNullable(findOne(QRoughDraftApproval.roughDraftApproval.project.eq(project)));
     }
+
+    @Override
+    @Transactional
+    public RoughDraftApproval saveCloned(RoughDraftApproval approval) {
+        return save(approval);
+    }
 }