Added function get an event's list
Signed-off-by: Valentin Popov <info@valentineus.link>
This commit is contained in:
		@@ -26,11 +26,15 @@ global $CFG;
 | 
				
			|||||||
require_once($CFG->dirroot . '/local/webhooks/classes/local/record.php');
 | 
					require_once($CFG->dirroot . '/local/webhooks/classes/local/record.php');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use coding_exception;
 | 
					use coding_exception;
 | 
				
			||||||
 | 
					use core_component;
 | 
				
			||||||
 | 
					use ReflectionClass;
 | 
				
			||||||
use function define;
 | 
					use function define;
 | 
				
			||||||
use function defined;
 | 
					use function defined;
 | 
				
			||||||
use function is_array;
 | 
					use function is_array;
 | 
				
			||||||
use function is_int;
 | 
					use function is_int;
 | 
				
			||||||
use function is_object;
 | 
					use function is_object;
 | 
				
			||||||
 | 
					use function is_string;
 | 
				
			||||||
 | 
					use function strlen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * The main class for the plugin.
 | 
					 * The main class for the plugin.
 | 
				
			||||||
@@ -83,6 +87,16 @@ final class api {
 | 
				
			|||||||
        return $DB->delete_records(LW_TABLE_SERVICES, ['id' => $id]);
 | 
					        return $DB->delete_records(LW_TABLE_SERVICES, ['id' => $id]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get an event's list.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return array
 | 
				
			||||||
 | 
					     * @throws \ReflectionException
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static function get_events(): array {
 | 
				
			||||||
 | 
					        return array_merge(self::get_core_events_list(), self::get_non_core_event_list());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Get an existing record from the database.
 | 
					     * Get an existing record from the database.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
@@ -195,4 +209,133 @@ final class api {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return $result;
 | 
					        return $result;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get a system's events list.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return array
 | 
				
			||||||
 | 
					     * @throws \ReflectionException
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static function get_core_events_list(): array {
 | 
				
			||||||
 | 
					        global $CFG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $debugdeveloper = $CFG->debugdeveloper;
 | 
				
			||||||
 | 
					        $debugdisplay = $CFG->debugdisplay;
 | 
				
			||||||
 | 
					        $debuglevel = $CFG->debug;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $CFG->debug = 0;
 | 
				
			||||||
 | 
					        $CFG->debugdeveloper = false;
 | 
				
			||||||
 | 
					        $CFG->debugdisplay = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $directory = $CFG->libdir . '/classes/event';
 | 
				
			||||||
 | 
					        $files = self::get_file_list($directory);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (isset($files['unknown_logged'])) {
 | 
				
			||||||
 | 
					            unset($files['unknown_logged']);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $events = [];
 | 
				
			||||||
 | 
					        foreach ($files as $file => $location) {
 | 
				
			||||||
 | 
					            $name = '\\core\\event\\' . $file;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (method_exists($name, 'get_static_info')) {
 | 
				
			||||||
 | 
					                $class = new ReflectionClass($name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if ($file !== 'manager' && !$class->isAbstract()) {
 | 
				
			||||||
 | 
					                    $events[$name] = $name::get_static_info();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $CFG->debug = $debuglevel;
 | 
				
			||||||
 | 
					        $CFG->debugdeveloper = $debugdeveloper;
 | 
				
			||||||
 | 
					        $CFG->debugdisplay = $debugdisplay;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $events;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get a file's list in the directory.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $directory
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return array
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static function get_file_list(string $directory): array {
 | 
				
			||||||
 | 
					        global $CFG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $root = $CFG->dirroot;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $files = [];
 | 
				
			||||||
 | 
					        if (is_dir($directory) && is_readable($directory)) {
 | 
				
			||||||
 | 
					            $handle = opendir($directory);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if ($handle) {
 | 
				
			||||||
 | 
					                foreach (scandir($directory, SCANDIR_SORT_NONE) as $file) {
 | 
				
			||||||
 | 
					                    if (!is_string($file)) {
 | 
				
			||||||
 | 
					                        continue;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if ($file !== '.' && $file !== '..' && strrpos($directory, $root) !== false) {
 | 
				
			||||||
 | 
					                        $location = substr($directory, strlen($root));
 | 
				
			||||||
 | 
					                        $eventname = substr($file, 0, -4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (is_string($eventname)) {
 | 
				
			||||||
 | 
					                            $files[$eventname] = $location . '/' . $file;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $files;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get a plugins' events list.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return array
 | 
				
			||||||
 | 
					     * @throws \ReflectionException
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static function get_non_core_event_list(): array {
 | 
				
			||||||
 | 
					        global $CFG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $debugdeveloper = $CFG->debugdeveloper;
 | 
				
			||||||
 | 
					        $debugdisplay = $CFG->debugdisplay;
 | 
				
			||||||
 | 
					        $debuglevel = $CFG->debug;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $CFG->debug = 0;
 | 
				
			||||||
 | 
					        $CFG->debugdeveloper = false;
 | 
				
			||||||
 | 
					        $CFG->debugdisplay = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $events = [];
 | 
				
			||||||
 | 
					        foreach (core_component::get_plugin_types() as $type => $unused) {
 | 
				
			||||||
 | 
					            foreach (core_component::get_plugin_list($type) as $plugin => $directory) {
 | 
				
			||||||
 | 
					                $directory .= '/classes/event';
 | 
				
			||||||
 | 
					                $files = self::get_file_list($directory);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (isset($files['unknown_logged'])) {
 | 
				
			||||||
 | 
					                    unset($files['unknown_logged']);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                foreach ($files as $file => $location) {
 | 
				
			||||||
 | 
					                    $name = '\\' . $type . '_' . $plugin . '\\event\\' . $file;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (method_exists($name, 'get_static_info')) {
 | 
				
			||||||
 | 
					                        $class = new ReflectionClass($name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if ($type . '_' . $plugin !== 'logstore_legacy' && !$class->isAbstract()) {
 | 
				
			||||||
 | 
					                            $events[$name] = $name::get_static_info();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $CFG->debug = $debuglevel;
 | 
				
			||||||
 | 
					        $CFG->debugdeveloper = $debugdeveloper;
 | 
				
			||||||
 | 
					        $CFG->debugdisplay = $debugdisplay;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $events;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -110,9 +110,34 @@ final class local_webhooks_api_testcase extends advanced_testcase {
 | 
				
			|||||||
        self::assertCount(0, $DB->get_records(LW_TABLE_SERVICES));
 | 
					        self::assertCount(0, $DB->get_records(LW_TABLE_SERVICES));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Testing get an event's list.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @group local_webhooks
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @throws \ReflectionException
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function test_get_events() {
 | 
				
			||||||
 | 
					        $this->resetAfterTest();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $events = api::get_events();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self::assertNotCount(0, $events);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        foreach ($events as $name => $event) {
 | 
				
			||||||
 | 
					            self::assertInternalType('array', $event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            self::assertEquals([
 | 
				
			||||||
 | 
					                'eventname', 'component', 'target', 'action', 'crud', 'edulevel', 'objecttable',
 | 
				
			||||||
 | 
					            ], array_keys($event));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Testing get to a service.
 | 
					     * Testing get to a service.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 | 
					     * @group local_webhooks
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
     * @throws \dml_exception
 | 
					     * @throws \dml_exception
 | 
				
			||||||
     * @throws \moodle_exception
 | 
					     * @throws \moodle_exception
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
@@ -152,6 +177,8 @@ final class local_webhooks_api_testcase extends advanced_testcase {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Testing get to the list services.
 | 
					     * Testing get to the list services.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 | 
					     * @group local_webhooks
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
     * @throws \dml_exception
 | 
					     * @throws \dml_exception
 | 
				
			||||||
     * @throws \moodle_exception
 | 
					     * @throws \moodle_exception
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
@@ -199,6 +226,8 @@ final class local_webhooks_api_testcase extends advanced_testcase {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Testing get to the list services by event name.
 | 
					     * Testing get to the list services by event name.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 | 
					     * @group local_webhooks
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
     * @throws \dml_exception
 | 
					     * @throws \dml_exception
 | 
				
			||||||
     * @throws \moodle_exception
 | 
					     * @throws \moodle_exception
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
@@ -236,6 +265,8 @@ final class local_webhooks_api_testcase extends advanced_testcase {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Testing get to the list services with conditions.
 | 
					     * Testing get to the list services with conditions.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 | 
					     * @group local_webhooks
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
     * @throws \dml_exception
 | 
					     * @throws \dml_exception
 | 
				
			||||||
     * @throws \moodle_exception
 | 
					     * @throws \moodle_exception
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user