From 9f3df5cfd2903839cdd431053d35ffb57e4fb5b8 Mon Sep 17 00:00:00 2001 From: Milton Reder Date: Fri, 25 Oct 2024 10:33:58 -0400 Subject: [PATCH] group member added/removed (#31) --- .../events/core/group_member_added.php | 66 +++++++++++++++++ .../events/core/group_member_removed.php | 66 +++++++++++++++++ src/transformer/get_event_function_map.php | 2 + .../new_group_member_added/data.json | 20 ++++++ .../new_group_member_added/event.json | 10 +++ .../new_group_member_added_test.php | 70 +++++++++++++++++++ .../new_group_member_added/statements.json | 68 ++++++++++++++++++ .../existing_group_member_removed/data.json | 20 ++++++ .../existing_group_member_removed/event.json | 10 +++ .../existing_group_member_removed_test.php | 70 +++++++++++++++++++ .../statements.json | 68 ++++++++++++++++++ 11 files changed, 470 insertions(+) create mode 100644 src/transformer/events/core/group_member_added.php create mode 100644 src/transformer/events/core/group_member_removed.php create mode 100644 tests/core/group_member_added/new_group_member_added/data.json create mode 100644 tests/core/group_member_added/new_group_member_added/event.json create mode 100644 tests/core/group_member_added/new_group_member_added/new_group_member_added_test.php create mode 100644 tests/core/group_member_added/new_group_member_added/statements.json create mode 100644 tests/core/group_member_removed/existing_group_member_removed/data.json create mode 100644 tests/core/group_member_removed/existing_group_member_removed/event.json create mode 100644 tests/core/group_member_removed/existing_group_member_removed/existing_group_member_removed_test.php create mode 100644 tests/core/group_member_removed/existing_group_member_removed/statements.json diff --git a/src/transformer/events/core/group_member_added.php b/src/transformer/events/core/group_member_added.php new file mode 100644 index 000000000..78f99efaf --- /dev/null +++ b/src/transformer/events/core/group_member_added.php @@ -0,0 +1,66 @@ +. + +/** + * Transform for the group member added event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\events\core; + +use src\transformer\utils as utils; + +/** + * Transform for the group member added event. + * + * @param array $config The transformer config settings. + * @param \stdClass $event The event to be transformed. + * @return array + */ +function group_member_added(array $config, \stdClass $event) { + $repo = $config['repo']; + $user = $repo->read_record_by_id('user', $event->userid); + $member = $repo->read_record_by_id('user', $event->relateduserid); + $course = $repo->read_record_by_id('course', $event->courseid); + $lang = utils\get_course_lang($course); + $group = $repo->read_record_by_id($event->objecttable, $event->objectid); + + return [[ + 'actor' => utils\get_user($config, $member), + 'verb' => [ + 'id' => 'http://activitystrea.ms/join', + 'display' => [ + $lang => 'Joined' + ], + ], + 'object' => utils\get_activity\course_group($config, $course, $group), + 'context' => [ + 'instructor' => utils\get_user($config, $user), + 'extensions' => utils\extensions\base($config, $event, null), + 'contextActivities' => [ + 'parent' => [ + utils\get_activity\course($config, $course), + ], + 'category' => [ + utils\get_activity\site($config), + ], + ], + ] + ]]; +} diff --git a/src/transformer/events/core/group_member_removed.php b/src/transformer/events/core/group_member_removed.php new file mode 100644 index 000000000..e60381d8c --- /dev/null +++ b/src/transformer/events/core/group_member_removed.php @@ -0,0 +1,66 @@ +. + +/** + * Transform for the group member removed event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\events\core; + +use src\transformer\utils as utils; + +/** + * Transform for the group member removed event. + * + * @param array $config The transformer config settings. + * @param \stdClass $event The event to be transformed. + * @return array + */ +function group_member_removed(array $config, \stdClass $event) { + $repo = $config['repo']; + $user = $repo->read_record_by_id('user', $event->userid); + $member = $repo->read_record_by_id('user', $event->relateduserid); + $course = $repo->read_record_by_id('course', $event->courseid); + $lang = utils\get_course_lang($course); + $group = $repo->read_record_by_id($event->objecttable, $event->objectid); + + return [[ + 'actor' => utils\get_user($config, $member), + 'verb' => [ + 'id' => 'http://activitystrea.ms/leave', + 'display' => [ + $lang => 'Left' + ], + ], + 'object' => utils\get_activity\course_group($config, $course, $group), + 'context' => [ + 'instructor' => utils\get_user($config, $user), + 'extensions' => utils\extensions\base($config, $event, null), + 'contextActivities' => [ + 'parent' => [ + utils\get_activity\course($config, $course), + ], + 'category' => [ + utils\get_activity\site($config), + ], + ], + ] + ]]; +} diff --git a/src/transformer/get_event_function_map.php b/src/transformer/get_event_function_map.php index 6ef9b2660..a75baf8d7 100644 --- a/src/transformer/get_event_function_map.php +++ b/src/transformer/get_event_function_map.php @@ -48,6 +48,8 @@ function get_event_function_map() { '\core\event\course_resources_list_viewed' => 'core\course_resources_list_viewed', '\core\event\group_created' => 'core\group_created', '\core\event\group_deleted' => 'core\group_deleted', + '\core\event\group_member_added' => 'core\group_member_added', + '\core\event\group_member_removed' => 'core\group_member_removed', '\core\event\user_created' => 'core\user_created', '\core\event\user_enrolment_created' => 'core\user_enrolment_created', '\core\event\user_loggedin' => 'core\user_loggedin', diff --git a/tests/core/group_member_added/new_group_member_added/data.json b/tests/core/group_member_added/new_group_member_added/data.json new file mode 100644 index 000000000..a58cca882 --- /dev/null +++ b/tests/core/group_member_added/new_group_member_added/data.json @@ -0,0 +1,20 @@ +{ + "user": [ + { + "id": 1, + "firstname": "test_fullname1", + "email": "test1@test.com" + }, + { + "id": 2, + "firstname": "test_fullname2", + "email": "test2@test.com" + } + ], + "groups": [ + { + "id": 1, + "name": "test_name" + } + ] +} diff --git a/tests/core/group_member_added/new_group_member_added/event.json b/tests/core/group_member_added/new_group_member_added/event.json new file mode 100644 index 000000000..b0d97e497 --- /dev/null +++ b/tests/core/group_member_added/new_group_member_added/event.json @@ -0,0 +1,10 @@ +{ + "id": 1, + "objecttable": "groups", + "timecreated": 1433946701, + "objectid": 1, + "courseid": 1, + "eventname": "\\core\\event\\group_member_added", + "userid": 1, + "relateduserid": 2 +} diff --git a/tests/core/group_member_added/new_group_member_added/new_group_member_added_test.php b/tests/core/group_member_added/new_group_member_added/new_group_member_added_test.php new file mode 100644 index 000000000..3ab1a44fb --- /dev/null +++ b/tests/core/group_member_added/new_group_member_added/new_group_member_added_test.php @@ -0,0 +1,70 @@ +. + +namespace logstore_xapi\core\group_member_added\new_group_member_added_test; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for group member added event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class new_group_member_added_test extends \logstore_xapi\xapi_test_case { + + /** + * Retrieve the directory of the unit test. + * + * @return string + */ + protected function get_test_dir() { + return __DIR__; + } + + /** + * Retrieve the plugin type being tested. + * + * @return string + */ + protected function get_plugin_type() { + return "core"; + } + + /** + * Retrieve the plugin name being tested. + * + * @return string + */ + protected function get_plugin_name() { + return "course"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::attempt_submitted + * @return void + */ + public function test_init() { + + } +} diff --git a/tests/core/group_member_added/new_group_member_added/statements.json b/tests/core/group_member_added/new_group_member_added/statements.json new file mode 100644 index 000000000..3ab0f906f --- /dev/null +++ b/tests/core/group_member_added/new_group_member_added/statements.json @@ -0,0 +1,68 @@ +[ + { + "actor": { + "account": { + "homePage": "http://www.example.org", + "name": "2" + }, + "name": "test_fullname2" + }, + "verb": { + "id": "http://activitystrea.ms/join", + "display": { + "en": "Joined" + } + }, + "object": { + "id": "http://www.example.org/group/index.php?id=1", + "objectType": "Activity", + "definition": { + "type": "https://xapi.edlm/profiles/edlm-lms/concepts/activity-types/group", + "name": { + "en": "test_name" + } + } + }, + "context": { + "instructor": { + "account": { + "homePage": "http://www.example.org", + "name": "1" + }, + "name": "test_fullname1" + }, + "contextActivities": { + "parent": [ + { + "id": "http://www.example.org/course/view.php?id=1", + "definition": { + "type": "https://w3id.org/xapi/cmi5/activitytype/course", + "name": { + "en": "test_name" + } + } + } + ], + "category": [ + { + "id": "http://www.example.org", + "definition": { + "type": "http://id.tincanapi.com/activitytype/lms", + "name": { + "en": "test_name" + } + } + } + ] + }, + "extensions": { + "http://lrs.learninglocker.net/define/extensions/info": { + "http://moodle.org": "1.0.0", + "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development", + "event_name": "\\core\\event\\group_member_added", + "event_function": "\\src\\transformer\\events\\core\\group_member_added" + } + } + } + } +] diff --git a/tests/core/group_member_removed/existing_group_member_removed/data.json b/tests/core/group_member_removed/existing_group_member_removed/data.json new file mode 100644 index 000000000..a58cca882 --- /dev/null +++ b/tests/core/group_member_removed/existing_group_member_removed/data.json @@ -0,0 +1,20 @@ +{ + "user": [ + { + "id": 1, + "firstname": "test_fullname1", + "email": "test1@test.com" + }, + { + "id": 2, + "firstname": "test_fullname2", + "email": "test2@test.com" + } + ], + "groups": [ + { + "id": 1, + "name": "test_name" + } + ] +} diff --git a/tests/core/group_member_removed/existing_group_member_removed/event.json b/tests/core/group_member_removed/existing_group_member_removed/event.json new file mode 100644 index 000000000..4ac35312c --- /dev/null +++ b/tests/core/group_member_removed/existing_group_member_removed/event.json @@ -0,0 +1,10 @@ +{ + "id": 1, + "objecttable": "groups", + "timecreated": 1433946701, + "objectid": 1, + "courseid": 1, + "eventname": "\\core\\event\\group_member_removed", + "userid": 1, + "relateduserid": 2 +} diff --git a/tests/core/group_member_removed/existing_group_member_removed/existing_group_member_removed_test.php b/tests/core/group_member_removed/existing_group_member_removed/existing_group_member_removed_test.php new file mode 100644 index 000000000..942464ab3 --- /dev/null +++ b/tests/core/group_member_removed/existing_group_member_removed/existing_group_member_removed_test.php @@ -0,0 +1,70 @@ +. + +namespace logstore_xapi\core\group_member_removed\existing_group_member_removed_test; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for group member removed event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class existing_group_member_removed_test extends \logstore_xapi\xapi_test_case { + + /** + * Retrieve the directory of the unit test. + * + * @return string + */ + protected function get_test_dir() { + return __DIR__; + } + + /** + * Retrieve the plugin type being tested. + * + * @return string + */ + protected function get_plugin_type() { + return "core"; + } + + /** + * Retrieve the plugin name being tested. + * + * @return string + */ + protected function get_plugin_name() { + return "course"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::attempt_submitted + * @return void + */ + public function test_init() { + + } +} diff --git a/tests/core/group_member_removed/existing_group_member_removed/statements.json b/tests/core/group_member_removed/existing_group_member_removed/statements.json new file mode 100644 index 000000000..ae714fdcc --- /dev/null +++ b/tests/core/group_member_removed/existing_group_member_removed/statements.json @@ -0,0 +1,68 @@ +[ + { + "actor": { + "account": { + "homePage": "http://www.example.org", + "name": "2" + }, + "name": "test_fullname2" + }, + "verb": { + "id": "http://activitystrea.ms/leave", + "display": { + "en": "Left" + } + }, + "object": { + "id": "http://www.example.org/group/index.php?id=1", + "objectType": "Activity", + "definition": { + "type": "https://xapi.edlm/profiles/edlm-lms/concepts/activity-types/group", + "name": { + "en": "test_name" + } + } + }, + "context": { + "instructor": { + "account": { + "homePage": "http://www.example.org", + "name": "1" + }, + "name": "test_fullname1" + }, + "contextActivities": { + "parent": [ + { + "id": "http://www.example.org/course/view.php?id=1", + "definition": { + "type": "https://w3id.org/xapi/cmi5/activitytype/course", + "name": { + "en": "test_name" + } + } + } + ], + "category": [ + { + "id": "http://www.example.org", + "definition": { + "type": "http://id.tincanapi.com/activitytype/lms", + "name": { + "en": "test_name" + } + } + } + ] + }, + "extensions": { + "http://lrs.learninglocker.net/define/extensions/info": { + "http://moodle.org": "1.0.0", + "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development", + "event_name": "\\core\\event\\group_member_removed", + "event_function": "\\src\\transformer\\events\\core\\group_member_removed" + } + } + } + } +]