From 7dff2888cf9f3eaceaa997e75623f20bce92bd30 Mon Sep 17 00:00:00 2001
From: Justus Dieckmann <45795270+justusdieckmann@users.noreply.github.com>
Date: Fri, 18 Sep 2020 16:03:16 +0200
Subject: [PATCH] Add Upgrade-Step that removes processes with deleted courses

---
 classes/local/manager/process_manager.php | 17 +++++++++++++----
 db/upgrade.php                            | 13 +++++++++++++
 version.php                               |  2 +-
 3 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/classes/local/manager/process_manager.php b/classes/local/manager/process_manager.php
index fbc806f..f8b28c9 100644
--- a/classes/local/manager/process_manager.php
+++ b/classes/local/manager/process_manager.php
@@ -230,10 +230,19 @@ class process_manager {
     public static function course_deletion_observed($event) {
         $process = self::get_process_by_course_id($event->get_data()['courseid']);
         if ($process) {
-            $step = step_manager::get_step_instance_by_workflow_index($process->workflowid, $process->stepindex);
-            $steplib = lib_manager::get_step_lib($step->subpluginname);
-            $steplib->abort_course($process);
-            self::remove_process($process);
+            self::abort_process($process);
         }
     }
+
+    /**
+     * Aborts a running process.
+     * @param process $process The process to abort.
+     * @throws \dml_exception
+     */
+    public static function abort_process($process) {
+        $step = step_manager::get_step_instance_by_workflow_index($process->workflowid, $process->stepindex);
+        $steplib = lib_manager::get_step_lib($step->subpluginname);
+        $steplib->abort_course($process);
+        self::remove_process($process);
+    }
 }
diff --git a/db/upgrade.php b/db/upgrade.php
index 1ee58e3..6de05fb 100644
--- a/db/upgrade.php
+++ b/db/upgrade.php
@@ -433,5 +433,18 @@ function xmldb_tool_lifecycle_upgrade($oldversion) {
         upgrade_plugin_savepoint(true, 2019082300, 'tool', 'lifecycle');
     }
 
+    if ($oldversion < 2020091800) {
+        $sql = "SELECT p.* FROM {tool_lifecycle_process} p " .
+                "LEFT JOIN {course} c ON p.courseid = c.id " .
+                "WHERE c.id IS NULL";
+        $processes = $DB->get_records_sql($sql);
+        foreach ($processes as $procrecord) {
+            $process = \tool_lifecycle\local\entity\process::from_record($procrecord);
+            \tool_lifecycle\local\manager\process_manager::abort_process($process);
+        }
+
+        upgrade_plugin_savepoint(true, 2020091800, 'tool', 'lifecycle');
+    }
+
     return true;
 }
\ No newline at end of file
diff --git a/version.php b/version.php
index aaf1936..947b0b6 100644
--- a/version.php
+++ b/version.php
@@ -25,7 +25,7 @@
 defined('MOODLE_INTERNAL') || die;
 
 $plugin->maturity = MATURITY_BETA;
-$plugin->version  = 2020060500;
+$plugin->version  = 2020091800;
 $plugin->component = 'tool_lifecycle';
 $plugin->requires = 2017111300; // Require Moodle 3.4 (or above).
 $plugin->release = 'v3.9-r1';
-- 
GitLab