From 30abb3433bfffa5db6d4b8cb125d94d8e20699c3 Mon Sep 17 00:00:00 2001
From: Justus Dieckmann <justusdieckmann@wwu.de>
Date: Mon, 27 Jul 2020 02:00:35 +0200
Subject: [PATCH] Abort and delete processes whose courses got deleted

---
 classes/local/manager/process_manager.php | 16 ++++++++++++
 db/events.php                             | 32 +++++++++++++++++++++++
 step/lib.php                              |  9 +++++++
 3 files changed, 57 insertions(+)
 create mode 100644 db/events.php

diff --git a/classes/local/manager/process_manager.php b/classes/local/manager/process_manager.php
index 48268d6..fbc806f 100644
--- a/classes/local/manager/process_manager.php
+++ b/classes/local/manager/process_manager.php
@@ -23,6 +23,7 @@
  */
 namespace tool_lifecycle\local\manager;
 
+use core\event\course_deleted;
 use tool_lifecycle\local\entity\process;
 use tool_lifecycle\event\process_proceeded;
 use tool_lifecycle\event\process_rollback;
@@ -220,4 +221,19 @@ class process_manager {
             return null;
         }
     }
+
+    /**
+     * Callback for the course deletion observer.
+     * @param course_deleted $event The course deletion event.
+     * @throws \dml_exception
+     */
+    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);
+        }
+    }
 }
diff --git a/db/events.php b/db/events.php
new file mode 100644
index 0000000..fa9c644
--- /dev/null
+++ b/db/events.php
@@ -0,0 +1,32 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Event observer.
+ *
+ * @package   tool_lifecycle
+ * @copyright 2020 Justus Dieckmann WWU
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$observers = array(
+        array(
+                'eventname' => 'core\event\course_deleted',
+                'callback' => 'tool_lifecycle\local\manager\process_manager::course_deletion_observed',
+        )
+);
diff --git a/step/lib.php b/step/lib.php
index 03018d9..f544e9e 100644
--- a/step/lib.php
+++ b/step/lib.php
@@ -24,6 +24,7 @@
  */
 namespace tool_lifecycle\step;
 
+use tool_lifecycle\local\entity\process;
 use tool_lifecycle\local\manager\step_manager;
 use tool_lifecycle\local\response\step_response;
 
@@ -123,6 +124,14 @@ abstract class libbase {
     public function extend_add_instance_form_definition_after_data($mform, $settings) {
     }
 
+    /**
+     * This method can be overridden. It is called when a course and the
+     * corresponding process get deleted.
+     * @param process $process the process that was aborted.
+     */
+    public function abort_course($process) {
+    }
+
 }
 
 /**
-- 
GitLab