Merge branch 'MDL-30165-master-1' of git://git.luns.net.uk/moodle
[moodle.git] / group / externallib.php
blob160dcbf1b1923857d25d51390c8132d51a5643cb
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
18 /**
19 * External groups API
21 * @package moodlecore
22 * @subpackage webservice
23 * @copyright 2009 Moodle Pty Ltd (http://moodle.com)
24 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
27 require_once("$CFG->libdir/externallib.php");
29 /**
30 * Group functions
32 class core_group_external extends external_api {
34 /**
35 * Returns description of method parameters
36 * @return external_function_parameters
38 public static function create_groups_parameters() {
39 return new external_function_parameters(
40 array(
41 'groups' => new external_multiple_structure(
42 new external_single_structure(
43 array(
44 'courseid' => new external_value(PARAM_INT, 'id of course'),
45 'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
46 'description' => new external_value(PARAM_RAW, 'group description text'),
47 'enrolmentkey' => new external_value(PARAM_RAW, 'group enrol secret phrase'),
49 ), 'List of group object. A group has a courseid, a name, a description and an enrolment key.'
55 /**
56 * Create groups
57 * @param array $groups array of group description arrays (with keys groupname and courseid)
58 * @return array of newly created groups
60 public static function create_groups($groups) {
61 global $CFG, $DB;
62 require_once("$CFG->dirroot/group/lib.php");
64 $params = self::validate_parameters(self::create_groups_parameters(), array('groups'=>$groups));
66 $transaction = $DB->start_delegated_transaction();
68 $groups = array();
70 foreach ($params['groups'] as $group) {
71 $group = (object)$group;
73 if (trim($group->name) == '') {
74 throw new invalid_parameter_exception('Invalid group name');
76 if ($DB->get_record('groups', array('courseid'=>$group->courseid, 'name'=>$group->name))) {
77 throw new invalid_parameter_exception('Group with the same name already exists in the course');
80 // now security checks
81 $context = get_context_instance(CONTEXT_COURSE, $group->courseid);
82 try {
83 self::validate_context($context);
84 } catch (Exception $e) {
85 $exceptionparam = new stdClass();
86 $exceptionparam->message = $e->getMessage();
87 $exceptionparam->courseid = $group->courseid;
88 throw new moodle_exception(
89 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
91 require_capability('moodle/course:managegroups', $context);
93 // finally create the group
94 $group->id = groups_create_group($group, false);
95 $groups[] = (array)$group;
98 $transaction->allow_commit();
100 return $groups;
104 * Returns description of method result value
105 * @return external_description
107 public static function create_groups_returns() {
108 return new external_multiple_structure(
109 new external_single_structure(
110 array(
111 'id' => new external_value(PARAM_INT, 'group record id'),
112 'courseid' => new external_value(PARAM_INT, 'id of course'),
113 'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
114 'description' => new external_value(PARAM_RAW, 'group description text'),
115 'enrolmentkey' => new external_value(PARAM_RAW, 'group enrol secret phrase'),
117 ), 'List of group object. A group has an id, a courseid, a name, a description and an enrolment key.'
122 * Returns description of method parameters
123 * @return external_function_parameters
125 public static function get_groups_parameters() {
126 return new external_function_parameters(
127 array(
128 'groupids' => new external_multiple_structure(new external_value(PARAM_INT, 'Group ID')
129 ,'List of group id. A group id is an integer.'),
135 * Get groups definition specified by ids
136 * @param array $groupids arrays of group ids
137 * @return array of group objects (id, courseid, name, enrolmentkey)
139 public static function get_groups($groupids) {
140 $params = self::validate_parameters(self::get_groups_parameters(), array('groupids'=>$groupids));
142 $groups = array();
143 foreach ($params['groupids'] as $groupid) {
144 // validate params
145 $group = groups_get_group($groupid, 'id, courseid, name, description, enrolmentkey', MUST_EXIST);
147 // now security checks
148 $context = get_context_instance(CONTEXT_COURSE, $group->courseid);
149 try {
150 self::validate_context($context);
151 } catch (Exception $e) {
152 $exceptionparam = new stdClass();
153 $exceptionparam->message = $e->getMessage();
154 $exceptionparam->courseid = $group->courseid;
155 throw new moodle_exception(
156 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
158 require_capability('moodle/course:managegroups', $context);
160 $groups[] = (array)$group;
163 return $groups;
167 * Returns description of method result value
168 * @return external_description
170 public static function get_groups_returns() {
171 return new external_multiple_structure(
172 new external_single_structure(
173 array(
174 'id' => new external_value(PARAM_INT, 'group record id'),
175 'courseid' => new external_value(PARAM_INT, 'id of course'),
176 'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
177 'description' => new external_value(PARAM_RAW, 'group description text'),
178 'enrolmentkey' => new external_value(PARAM_RAW, 'group enrol secret phrase'),
185 * Returns description of method parameters
186 * @return external_function_parameters
188 public static function get_course_groups_parameters() {
189 return new external_function_parameters(
190 array(
191 'courseid' => new external_value(PARAM_INT, 'id of course'),
197 * Get all groups in the specified course
198 * @param int $courseid id of course
199 * @return array of group objects (id, courseid, name, enrolmentkey)
201 public static function get_course_groups($courseid) {
202 $params = self::validate_parameters(self::get_course_groups_parameters(), array('courseid'=>$courseid));
204 // now security checks
205 $context = get_context_instance(CONTEXT_COURSE, $params['courseid']);
206 try {
207 self::validate_context($context);
208 } catch (Exception $e) {
209 $exceptionparam = new stdClass();
210 $exceptionparam->message = $e->getMessage();
211 $exceptionparam->courseid = $params['courseid'];
212 throw new moodle_exception(
213 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
215 require_capability('moodle/course:managegroups', $context);
217 $gs = groups_get_all_groups($params['courseid'], 0, 0, 'g.id, g.courseid, g.name, g.description, g.enrolmentkey');
219 $groups = array();
220 foreach ($gs as $group) {
221 $groups[] = (array)$group;
224 return $groups;
228 * Returns description of method result value
229 * @return external_description
231 public static function get_course_groups_returns() {
232 return new external_multiple_structure(
233 new external_single_structure(
234 array(
235 'id' => new external_value(PARAM_INT, 'group record id'),
236 'courseid' => new external_value(PARAM_INT, 'id of course'),
237 'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
238 'description' => new external_value(PARAM_RAW, 'group description text'),
239 'enrolmentkey' => new external_value(PARAM_RAW, 'group enrol secret phrase'),
246 * Returns description of method parameters
247 * @return external_function_parameters
249 public static function delete_groups_parameters() {
250 return new external_function_parameters(
251 array(
252 'groupids' => new external_multiple_structure(new external_value(PARAM_INT, 'Group ID')),
258 * Delete groups
259 * @param array $groupids array of group ids
260 * @return void
262 public static function delete_groups($groupids) {
263 global $CFG, $DB;
264 require_once("$CFG->dirroot/group/lib.php");
266 $params = self::validate_parameters(self::delete_groups_parameters(), array('groupids'=>$groupids));
268 $transaction = $DB->start_delegated_transaction();
270 // TODO: this is problematic because the DB rollback does not handle deleting of group images!
271 foreach ($params['groupids'] as $groupid) {
272 // validate params
273 $groupid = validate_param($groupid, PARAM_INTEGER);
274 if (!$group = groups_get_group($groupid, 'id, courseid', IGNORE_MISSING)) {
275 // silently ignore attempts to delete nonexisting groups
276 continue;
279 // now security checks
280 $context = get_context_instance(CONTEXT_COURSE, $group->courseid);
281 try {
282 self::validate_context($context);
283 } catch (Exception $e) {
284 $exceptionparam = new stdClass();
285 $exceptionparam->message = $e->getMessage();
286 $exceptionparam->courseid = $group->courseid;
287 throw new moodle_exception(
288 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
290 require_capability('moodle/course:managegroups', $context);
292 groups_delete_group($group);
295 $transaction->allow_commit();
299 * Returns description of method result value
300 * @return external_description
302 public static function delete_groups_returns() {
303 return null;
308 * Returns description of method parameters
309 * @return external_function_parameters
311 public static function get_group_members_parameters() {
312 return new external_function_parameters(
313 array(
314 'groupids' => new external_multiple_structure(new external_value(PARAM_INT, 'Group ID')),
320 * Return all members for a group
321 * @param array $groupids array of group ids
322 * @return array with group id keys containing arrays of user ids
324 public static function get_group_members($groupids) {
325 $members = array();
327 $params = self::validate_parameters(self::get_group_members_parameters(), array('groupids'=>$groupids));
329 foreach ($params['groupids'] as $groupid) {
330 // validate params
331 $group = groups_get_group($groupid, 'id, courseid, name, enrolmentkey', MUST_EXIST);
332 // now security checks
333 $context = get_context_instance(CONTEXT_COURSE, $group->courseid);
334 try {
335 self::validate_context($context);
336 } catch (Exception $e) {
337 $exceptionparam = new stdClass();
338 $exceptionparam->message = $e->getMessage();
339 $exceptionparam->courseid = $group->courseid;
340 throw new moodle_exception(
341 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
343 require_capability('moodle/course:managegroups', $context);
345 $groupmembers = groups_get_members($group->id, 'u.id', 'lastname ASC, firstname ASC');
347 $members[] = array('groupid'=>$groupid, 'userids'=>array_keys($groupmembers));
350 return $members;
354 * Returns description of method result value
355 * @return external_description
357 public static function get_group_members_returns() {
358 return new external_multiple_structure(
359 new external_single_structure(
360 array(
361 'groupid' => new external_value(PARAM_INT, 'group record id'),
362 'userids' => new external_multiple_structure(new external_value(PARAM_INT, 'user id')),
370 * Returns description of method parameters
371 * @return external_function_parameters
373 public static function add_group_members_parameters() {
374 return new external_function_parameters(
375 array(
376 'members'=> new external_multiple_structure(
377 new external_single_structure(
378 array(
379 'groupid' => new external_value(PARAM_INT, 'group record id'),
380 'userid' => new external_value(PARAM_INT, 'user id'),
389 * Add group members
390 * @param array $members of arrays with keys userid, groupid
391 * @return void
393 public static function add_group_members($members) {
394 global $CFG, $DB;
395 require_once("$CFG->dirroot/group/lib.php");
397 $params = self::validate_parameters(self::add_group_members_parameters(), array('members'=>$members));
399 $transaction = $DB->start_delegated_transaction();
400 foreach ($params['members'] as $member) {
401 // validate params
402 $groupid = $member['groupid'];
403 $userid = $member['userid'];
405 $group = groups_get_group($groupid, 'id, courseid', MUST_EXIST);
406 $user = $DB->get_record('user', array('id'=>$userid, 'deleted'=>0, 'mnethostid'=>$CFG->mnet_localhost_id), '*', MUST_EXIST);
408 // now security checks
409 $context = get_context_instance(CONTEXT_COURSE, $group->courseid);
410 try {
411 self::validate_context($context);
412 } catch (Exception $e) {
413 $exceptionparam = new stdClass();
414 $exceptionparam->message = $e->getMessage();
415 $exceptionparam->courseid = $group->courseid;
416 throw new moodle_exception(
417 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
419 require_capability('moodle/course:managegroups', $context);
421 // now make sure user is enrolled in course - this is mandatory requirement,
422 // unfortunately this is slow
423 if (!is_enrolled($context, $userid)) {
424 throw new invalid_parameter_exception('Only enrolled users may be members of groups');
427 groups_add_member($group, $user);
430 $transaction->allow_commit();
434 * Returns description of method result value
435 * @return null
437 public static function add_group_members_returns() {
438 return null;
443 * Returns description of method parameters
444 * @return external_function_parameters
446 public static function delete_group_members_parameters() {
447 return new external_function_parameters(
448 array(
449 'members'=> new external_multiple_structure(
450 new external_single_structure(
451 array(
452 'groupid' => new external_value(PARAM_INT, 'group record id'),
453 'userid' => new external_value(PARAM_INT, 'user id'),
462 * Delete group members
463 * @param array $members of arrays with keys userid, groupid
464 * @return void
466 public static function delete_group_members($members) {
467 global $CFG, $DB;
468 require_once("$CFG->dirroot/group/lib.php");
470 $params = self::validate_parameters(self::delete_group_members_parameters(), array('members'=>$members));
472 $transaction = $DB->start_delegated_transaction();
474 foreach ($params['members'] as $member) {
475 // validate params
476 $groupid = $member['groupid'];
477 $userid = $member['userid'];
479 $group = groups_get_group($groupid, 'id, courseid', MUST_EXIST);
480 $user = $DB->get_record('user', array('id'=>$userid, 'deleted'=>0, 'mnethostid'=>$CFG->mnet_localhost_id), '*', MUST_EXIST);
482 // now security checks
483 $context = get_context_instance(CONTEXT_COURSE, $group->courseid);
484 try {
485 self::validate_context($context);
486 } catch (Exception $e) {
487 $exceptionparam = new stdClass();
488 $exceptionparam->message = $e->getMessage();
489 $exceptionparam->courseid = $group->courseid;
490 throw new moodle_exception(
491 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
493 require_capability('moodle/course:managegroups', $context);
495 groups_remove_member($group, $user);
498 $transaction->allow_commit();
502 * Returns description of method result value
503 * @return null
505 public static function delete_group_members_returns() {
506 return null;
512 * Deprecated group functions
513 * @deprecated since Moodle 2.2 please use core_group_external instead
515 class moodle_group_external extends external_api {
518 * Returns description of method parameters
519 * @deprecated since Moodle 2.2 please use core_group_external::create_groups_parameters instead
520 * @return external_function_parameters
522 public static function create_groups_parameters() {
523 return core_group_external::create_groups_parameters();
527 * Create groups
528 * @deprecated since Moodle 2.2 please use core_group_external::create_groups instead
529 * @param array $groups array of group description arrays (with keys groupname and courseid)
530 * @return array of newly created groups
532 public static function create_groups($groups) {
533 return core_group_external::create_groups($groups);
537 * Returns description of method result value
538 * @deprecated since Moodle 2.2 please use core_group_external::create_groups_returns instead
539 * @return external_description
541 public static function create_groups_returns() {
542 return core_group_external::create_groups_returns();
546 * Returns description of method parameters
547 * @deprecated since Moodle 2.2 please use core_group_external::get_groups_parameters instead
548 * @return external_function_parameters
550 public static function get_groups_parameters() {
551 return core_group_external::get_groups_parameters();
555 * Get groups definition specified by ids
556 * @deprecated since Moodle 2.2 please use core_group_external::get_groups instead
557 * @param array $groupids arrays of group ids
558 * @return array of group objects (id, courseid, name, enrolmentkey)
560 public static function get_groups($groupids) {
561 return core_group_external::get_groups($groupids);
565 * Returns description of method result value
566 * @deprecated since Moodle 2.2 please use core_group_external::get_groups_returns instead
567 * @return external_description
569 public static function get_groups_returns() {
570 return core_group_external::get_groups_returns();
574 * Returns description of method parameters
575 * @deprecated since Moodle 2.2 please use core_group_external::get_course_groups_parameters instead
576 * @return external_function_parameters
578 public static function get_course_groups_parameters() {
579 return core_group_external::get_course_groups_parameters();
583 * Get all groups in the specified course
584 * @deprecated since Moodle 2.2 please use core_group_external::get_course_groups instead
585 * @param int $courseid id of course
586 * @return array of group objects (id, courseid, name, enrolmentkey)
588 public static function get_course_groups($courseid) {
589 return core_group_external::get_course_groups($courseid);
593 * Returns description of method result value
594 * @deprecated since Moodle 2.2 please use core_group_external::get_course_groups_returns instead
595 * @return external_description
597 public static function get_course_groups_returns() {
598 return core_group_external::get_course_groups_returns();
602 * Returns description of method parameters
603 * @deprecated since Moodle 2.2 please use core_group_external::delete_group_members_parameters instead
604 * @return external_function_parameters
606 public static function delete_groups_parameters() {
607 return core_group_external::delete_group_members_parameters();
611 * Delete groups
612 * @deprecated since Moodle 2.2 please use core_group_external::delete_groups instead
613 * @param array $groupids array of group ids
614 * @return void
616 public static function delete_groups($groupids) {
617 return core_group_external::delete_groups($groupids);
621 * Returns description of method result value
622 * @deprecated since Moodle 2.2 please use core_group_external::delete_group_members_returns instead
623 * @return external_description
625 public static function delete_groups_returns() {
626 return core_group_external::delete_group_members_returns();
631 * Returns description of method parameters
632 * @deprecated since Moodle 2.2 please use core_group_external::get_group_members_parameters instead
633 * @return external_function_parameters
635 public static function get_groupmembers_parameters() {
636 return core_group_external::get_group_members_parameters();
640 * Return all members for a group
641 * @deprecated since Moodle 2.2 please use core_group_external::get_group_members instead
642 * @param array $groupids array of group ids
643 * @return array with group id keys containing arrays of user ids
645 public static function get_groupmembers($groupids) {
646 return core_group_external::get_group_members($groupids);
650 * Returns description of method result value
651 * @deprecated since Moodle 2.2 please use core_group_external::get_group_members_returns instead
652 * @return external_description
654 public static function get_groupmembers_returns() {
655 return core_group_external::get_group_members_returns();
660 * Returns description of method parameters
661 * @deprecated since Moodle 2.2 please use core_group_external::add_group_members_parameters instead
662 * @return external_function_parameters
664 public static function add_groupmembers_parameters() {
665 return core_group_external::add_group_members_parameters();
669 * Add group members
670 * @deprecated since Moodle 2.2 please use core_group_external::add_group_members instead
671 * @param array $members of arrays with keys userid, groupid
672 * @return void
674 public static function add_groupmembers($members) {
675 return core_group_external::add_group_members($members);
679 * Returns description of method result value
680 * @deprecated since Moodle 2.2 please use core_group_external::add_group_members_returns instead
681 * @return external_description
683 public static function add_groupmembers_returns() {
684 return core_group_external::add_group_members_returns();
689 * Returns description of method parameters
690 * @deprecated since Moodle 2.2 please use core_group_external::delete_group_members_parameters instead
691 * @return external_function_parameters
693 public static function delete_groupmembers_parameters() {
694 return core_group_external::delete_group_members_parameters();
698 * Delete group members
699 * @deprecated since Moodle 2.2 please use core_group_external::delete_group_members instead
700 * @param array $members of arrays with keys userid, groupid
701 * @return void
703 public static function delete_groupmembers($members) {
704 return core_group_external::delete_group_members($members);
708 * Returns description of method result value
709 * @deprecated since Moodle 2.2 please use core_group_external::delete_group_members_returns instead
710 * @return external_description
712 public static function delete_groupmembers_returns() {
713 return core_group_external::delete_group_members_returns();