MDL-12886 untested external groups API

This commit is contained in:
Petr Skoda
2009-10-26 23:05:11 +00:00
parent 4f0c6ad110
commit 0f4e72dee7
2 changed files with 141 additions and 50 deletions
+131 -47
View File
@@ -63,6 +63,7 @@ class moodle_group_external extends external_api {
// ideally create all groups or none at all, unfortunately myisam engine does not support transactions :-(
$DB->begin_sql();
try {
//TODO: there is a potential problem with events propagating actions to external systems :-(
$groups = array();
foreach ($params['groups'] as $group) {
@@ -218,8 +219,16 @@ class moodle_group_external extends external_api {
);
}
/**
* Returns description of method parameters
* @return external_function_parameters
*/
public static function delete_groups_parameters() {
//TODO
return new external_function_parameters(
array(
'groupids' => new external_multiple_structure(new external_value(PARAM_INT, 'Group ID')),
)
);
}
/**
@@ -233,32 +242,51 @@ class moodle_group_external extends external_api {
$params = self::validate_parameters(self::delete_groups_parameters(), array('groupids'=>$groupids));
$groups = array();
$DB->begin_sql();
try {
// TODO: this is problematic because the DB rollback does not handle deleting of images!!
// there is also potential problem with events propagating action to external systems :-(
foreach ($params['groupids'] as $groupid) {
// validate params
$groupid = validate_param($groupid, PARAM_INTEGER);
if (!$group = groups_get_group($groupid, 'id, courseid', IGNORE_MISSING)) {
// silently ignore attempts to delete nonexisting groups
continue;
}
foreach ($params['groupids'] as $groupid) {
// validate params
$groupid = validate_param($groupid, PARAM_INTEGER);
if (!$group = groups_get_group($groupid, 'id, courseid', IGNORE_MISSING)) {
// silently ignore attempts to delete nonexisting groups
continue;
// now security checks
$context = get_context_instance(CONTEXT_COURSE, $group->courseid);
self::validate_context($context);
require_capability('moodle/course:managegroups', $context);
groups_delete_group($group);
}
// now security checks
$context = get_context_instance(CONTEXT_COURSE, $group->courseid);
self::validate_context($context);
require_capability('moodle/course:managegroups', $context);
groups_delete_group($group);
} catch (Exception $ex) {
$DB->rollback_sql();
throw $ex;
}
$DB->commit_sql();
}
/**
* Returns description of method result value
* @return external_description
*/
public static function delete_groups_returns() {
//TODO
return null;
}
/**
* Returns description of method parameters
* @return external_function_parameters
*/
public static function get_groupmembers_parameters() {
//TODO
return new external_function_parameters(
array(
'groupids' => new external_multiple_structure(new external_value(PARAM_INT, 'Group ID')),
)
);
}
/**
@@ -267,7 +295,7 @@ class moodle_group_external extends external_api {
* @return array with group id keys containing arrays of user ids
*/
public static function get_groupmembers($groupids) {
$groups = array();
$members = array();
$params = self::validate_parameters(self::get_groupmembers_parameters(), array('groupids'=>$groupids));
@@ -281,19 +309,41 @@ class moodle_group_external extends external_api {
$groupmembers = groups_get_members($group->id, 'u.id', 'lastname ASC, firstname ASC');
$groups[$group->id] = array_keys($groupmembers);
$members[] = array('groupid'=>$groupid, 'userids'=>array_keys($groupmembers));
}
return $groups;
return $members;
}
/**
* Returns description of method result value
* @return external_description
*/
public static function get_groupmembers_returns() {
//TODO
return new external_multiple_structure(
new external_single_structure(
array(
'groupid' => new external_value(PARAM_INT, 'group record id'),
'userids' => new external_multiple_structure(new external_value(PARAM_INT, 'user id')),
)
)
);
}
/**
* Returns description of method parameters
* @return external_function_parameters
*/
public static function add_groupmembers_parameters() {
//TODO
return new external_multiple_structure(
new external_single_structure(
array(
'groupid' => new external_value(PARAM_INT, 'group record id'),
'userid' => new external_value(PARAM_INT, 'user id'),
)
)
);
}
/**
@@ -307,31 +357,53 @@ class moodle_group_external extends external_api {
$params = self::validate_parameters(self::add_groupmembers_parameters(), array('members'=>$members));
foreach ($params['members'] as $member) {
// validate params
$groupid = $member['groupid'];
$userid = $member['userid'];
$DB->begin_sql();
try {
// TODO: there is a potential problem with events propagating action to external systems :-(
foreach ($params['members'] as $member) {
// validate params
$groupid = $member['groupid'];
$userid = $member['userid'];
$group = groups_get_group($groupid, 'id, courseid', MUST_EXIST);
$user = $DB->get_record('user', array('id'=>$userid, 'deleted'=>0, 'mnethostid'=>$CFG->mnet_localhost_id), '*', MUST_EXIST);
$group = groups_get_group($groupid, 'id, courseid', MUST_EXIST);
$user = $DB->get_record('user', array('id'=>$userid, 'deleted'=>0, 'mnethostid'=>$CFG->mnet_localhost_id), '*', MUST_EXIST);
// now security checks
$context = get_context_instance(CONTEXT_COURSE, $group->courseid);
self::validate_context($context);
require_capability('moodle/course:managegroups', $context);
require_capability('moodle/course:view', $context, $user->id, false); // only enrolled users may be members of group!!!
// now security checks
$context = get_context_instance(CONTEXT_COURSE, $group->courseid);
self::validate_context($context);
require_capability('moodle/course:managegroups', $context);
groups_add_member($group, $user);
groups_add_member($group, $user);
}
} catch (Exception $ex) {
$DB->rollback_sql();
throw $ex;
}
$DB->commit_sql();
}
/**
* Returns description of method result value
* @return external_description
*/
public static function add_groupmembers_returns() {
//TODO
return null;
}
/**
* Returns description of method parameters
* @return external_function_parameters
*/
public static function delete_groupmembers_parameters() {
//TODO
return new external_multiple_structure(
new external_single_structure(
array(
'groupid' => new external_value(PARAM_INT, 'group record id'),
'userid' => new external_value(PARAM_INT, 'user id'),
)
)
);
}
/**
@@ -345,25 +417,37 @@ class moodle_group_external extends external_api {
$params = self::validate_parameters(self::delete_groupmembers_parameters(), array($members=>'members'));
$DB->begin_sql();
try {
// TODO: there is a potential problem with events propagating action to external systems :-(
foreach ($params['members'] as $member) {
// validate params
$groupid = $member['groupid'];
$userid = $member['userid'];
// validate params
$groupid = $member['groupid'];
$userid = $member['userid'];
$group = groups_get_group($groupid, 'id, courseid', MUST_EXIST);
$user = $DB->get_record('user', array('id'=>$userid, 'deleted'=>0, 'mnethostid'=>$CFG->mnet_localhost_id), '*', MUST_EXIST);
$group = groups_get_group($groupid, 'id, courseid', MUST_EXIST);
$user = $DB->get_record('user', array('id'=>$userid, 'deleted'=>0, 'mnethostid'=>$CFG->mnet_localhost_id), '*', MUST_EXIST);
// now security checks
$context = get_context_instance(CONTEXT_COURSE, $group->courseid);
self::validate_context($context);
require_capability('moodle/course:managegroups', $context);
// now security checks
$context = get_context_instance(CONTEXT_COURSE, $group->courseid);
self::validate_context($context);
require_capability('moodle/course:managegroups', $context);
groups_remove_member($group, $user);
groups_remove_member($group, $user);
}
} catch (Exception $ex) {
$DB->rollback_sql();
throw $ex;
}
$DB->commit_sql();
}
/**
* Returns description of method result value
* @return external_description
*/
public static function delete_groupmembers_returns() {
//TODO
return null;
}
}
+10 -3
View File
@@ -51,34 +51,41 @@ $functions = array(
'description' => 'Returns all groups in specified course.',
'type' => 'read',
),
/*
'moodle_group_delete_groups' => array(
'classname' => 'moodle_group_external',
'methodname' => 'delete_groups',
'classpath' => 'group/externallib.php',
'description' => 'Deletes all specified groups.',
'type' => 'delete',
),
'moodle_group_get_groupmembers' => array(
'classname' => 'moodle_group_external',
'methodname' => 'get_groupmembers',
'classpath' => 'group/externallib.php',
'description' => 'Returns group members.',
'type' => 'read',
),
'moodle_group_add_groupmembers' => array(
'classname' => 'moodle_group_external',
'methodname' => 'add_groupmembers',
'classpath' => 'group/externallib.php',
'description' => 'Adds group members.',
'type' => 'write',
),
'moodle_group_delete_groupmembers' => array(
'classname' => 'moodle_group_external',
'methodname' => 'delete_groupmembers',
'classpath' => 'group/externallib.php',
'description' => 'Deletes group members.',
'type' => 'delete',
),
*/
// === user related functions ===
/*
'moodle_user_create_users' => array(
'classname' => 'moodle_user_external',
'methodname' => 'create_users',