2 // This file is part of Moodle - http://moodle.org/
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
23 * @copyright 2009 Petr Skodak
24 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
27 require_once("$CFG->libdir/externallib.php");
30 * Group external functions
34 * @copyright 2011 Jerome Mouneyrac
35 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38 class core_group_external
extends external_api
{
41 * Returns description of method parameters
43 * @return external_function_parameters
46 public static function create_groups_parameters() {
47 return new external_function_parameters(
49 'groups' => new external_multiple_structure(
50 new external_single_structure(
52 'courseid' => new external_value(PARAM_INT
, 'id of course'),
53 'name' => new external_value(PARAM_TEXT
, 'multilang compatible name, course unique'),
54 'description' => new external_value(PARAM_RAW
, 'group description text'),
55 'enrolmentkey' => new external_value(PARAM_RAW
, 'group enrol secret phrase'),
57 ), 'List of group object. A group has a courseid, a name, a description and an enrolment key.'
66 * @param array $groups array of group description arrays (with keys groupname and courseid)
67 * @return array of newly created groups
70 public static function create_groups($groups) {
72 require_once("$CFG->dirroot/group/lib.php");
74 $params = self
::validate_parameters(self
::create_groups_parameters(), array('groups'=>$groups));
76 $transaction = $DB->start_delegated_transaction();
80 foreach ($params['groups'] as $group) {
81 $group = (object)$group;
83 if (trim($group->name
) == '') {
84 throw new invalid_parameter_exception('Invalid group name');
86 if ($DB->get_record('groups', array('courseid'=>$group->courseid
, 'name'=>$group->name
))) {
87 throw new invalid_parameter_exception('Group with the same name already exists in the course');
90 // now security checks
91 $context = get_context_instance(CONTEXT_COURSE
, $group->courseid
);
93 self
::validate_context($context);
94 } catch (Exception
$e) {
95 $exceptionparam = new stdClass();
96 $exceptionparam->message
= $e->getMessage();
97 $exceptionparam->courseid
= $group->courseid
;
98 throw new moodle_exception(
99 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
101 require_capability('moodle/course:managegroups', $context);
103 // finally create the group
104 $group->id
= groups_create_group($group, false);
105 $groups[] = (array)$group;
108 $transaction->allow_commit();
114 * Returns description of method result value
116 * @return external_description
119 public static function create_groups_returns() {
120 return new external_multiple_structure(
121 new external_single_structure(
123 'id' => new external_value(PARAM_INT
, 'group record id'),
124 'courseid' => new external_value(PARAM_INT
, 'id of course'),
125 'name' => new external_value(PARAM_TEXT
, 'multilang compatible name, course unique'),
126 'description' => new external_value(PARAM_RAW
, 'group description text'),
127 'enrolmentkey' => new external_value(PARAM_RAW
, 'group enrol secret phrase'),
129 ), 'List of group object. A group has an id, a courseid, a name, a description and an enrolment key.'
134 * Returns description of method parameters
136 * @return external_function_parameters
139 public static function get_groups_parameters() {
140 return new external_function_parameters(
142 'groupids' => new external_multiple_structure(new external_value(PARAM_INT
, 'Group ID')
143 ,'List of group id. A group id is an integer.'),
149 * Get groups definition specified by ids
151 * @param array $groupids arrays of group ids
152 * @return array of group objects (id, courseid, name, enrolmentkey)
155 public static function get_groups($groupids) {
156 $params = self
::validate_parameters(self
::get_groups_parameters(), array('groupids'=>$groupids));
159 foreach ($params['groupids'] as $groupid) {
161 $group = groups_get_group($groupid, 'id, courseid, name, description, enrolmentkey', MUST_EXIST
);
163 // now security checks
164 $context = get_context_instance(CONTEXT_COURSE
, $group->courseid
);
166 self
::validate_context($context);
167 } catch (Exception
$e) {
168 $exceptionparam = new stdClass();
169 $exceptionparam->message
= $e->getMessage();
170 $exceptionparam->courseid
= $group->courseid
;
171 throw new moodle_exception(
172 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
174 require_capability('moodle/course:managegroups', $context);
176 $groups[] = (array)$group;
183 * Returns description of method result value
185 * @return external_description
188 public static function get_groups_returns() {
189 return new external_multiple_structure(
190 new external_single_structure(
192 'id' => new external_value(PARAM_INT
, 'group record id'),
193 'courseid' => new external_value(PARAM_INT
, 'id of course'),
194 'name' => new external_value(PARAM_TEXT
, 'multilang compatible name, course unique'),
195 'description' => new external_value(PARAM_RAW
, 'group description text'),
196 'enrolmentkey' => new external_value(PARAM_RAW
, 'group enrol secret phrase'),
203 * Returns description of method parameters
205 * @return external_function_parameters
208 public static function get_course_groups_parameters() {
209 return new external_function_parameters(
211 'courseid' => new external_value(PARAM_INT
, 'id of course'),
217 * Get all groups in the specified course
219 * @param int $courseid id of course
220 * @return array of group objects (id, courseid, name, enrolmentkey)
223 public static function get_course_groups($courseid) {
224 $params = self
::validate_parameters(self
::get_course_groups_parameters(), array('courseid'=>$courseid));
226 // now security checks
227 $context = get_context_instance(CONTEXT_COURSE
, $params['courseid']);
229 self
::validate_context($context);
230 } catch (Exception
$e) {
231 $exceptionparam = new stdClass();
232 $exceptionparam->message
= $e->getMessage();
233 $exceptionparam->courseid
= $params['courseid'];
234 throw new moodle_exception(
235 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
237 require_capability('moodle/course:managegroups', $context);
239 $gs = groups_get_all_groups($params['courseid'], 0, 0, 'g.id, g.courseid, g.name, g.description, g.enrolmentkey');
242 foreach ($gs as $group) {
243 $groups[] = (array)$group;
250 * Returns description of method result value
252 * @return external_description
255 public static function get_course_groups_returns() {
256 return new external_multiple_structure(
257 new external_single_structure(
259 'id' => new external_value(PARAM_INT
, 'group record id'),
260 'courseid' => new external_value(PARAM_INT
, 'id of course'),
261 'name' => new external_value(PARAM_TEXT
, 'multilang compatible name, course unique'),
262 'description' => new external_value(PARAM_RAW
, 'group description text'),
263 'enrolmentkey' => new external_value(PARAM_RAW
, 'group enrol secret phrase'),
270 * Returns description of method parameters
272 * @return external_function_parameters
275 public static function delete_groups_parameters() {
276 return new external_function_parameters(
278 'groupids' => new external_multiple_structure(new external_value(PARAM_INT
, 'Group ID')),
286 * @param array $groupids array of group ids
289 public static function delete_groups($groupids) {
291 require_once("$CFG->dirroot/group/lib.php");
293 $params = self
::validate_parameters(self
::delete_groups_parameters(), array('groupids'=>$groupids));
295 $transaction = $DB->start_delegated_transaction();
297 foreach ($params['groupids'] as $groupid) {
299 $groupid = validate_param($groupid, PARAM_INTEGER
);
300 if (!$group = groups_get_group($groupid, 'id, courseid', IGNORE_MISSING
)) {
301 // silently ignore attempts to delete nonexisting groups
305 // now security checks
306 $context = get_context_instance(CONTEXT_COURSE
, $group->courseid
);
308 self
::validate_context($context);
309 } catch (Exception
$e) {
310 $exceptionparam = new stdClass();
311 $exceptionparam->message
= $e->getMessage();
312 $exceptionparam->courseid
= $group->courseid
;
313 throw new moodle_exception(
314 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
316 require_capability('moodle/course:managegroups', $context);
318 groups_delete_group($group);
321 $transaction->allow_commit();
325 * Returns description of method result value
330 public static function delete_groups_returns() {
336 * Returns description of method parameters
338 * @return external_function_parameters
341 public static function get_group_members_parameters() {
342 return new external_function_parameters(
344 'groupids' => new external_multiple_structure(new external_value(PARAM_INT
, 'Group ID')),
350 * Return all members for a group
352 * @param array $groupids array of group ids
353 * @return array with group id keys containing arrays of user ids
356 public static function get_group_members($groupids) {
359 $params = self
::validate_parameters(self
::get_group_members_parameters(), array('groupids'=>$groupids));
361 foreach ($params['groupids'] as $groupid) {
363 $group = groups_get_group($groupid, 'id, courseid, name, enrolmentkey', MUST_EXIST
);
364 // now security checks
365 $context = get_context_instance(CONTEXT_COURSE
, $group->courseid
);
367 self
::validate_context($context);
368 } catch (Exception
$e) {
369 $exceptionparam = new stdClass();
370 $exceptionparam->message
= $e->getMessage();
371 $exceptionparam->courseid
= $group->courseid
;
372 throw new moodle_exception(
373 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
375 require_capability('moodle/course:managegroups', $context);
377 $groupmembers = groups_get_members($group->id
, 'u.id', 'lastname ASC, firstname ASC');
379 $members[] = array('groupid'=>$groupid, 'userids'=>array_keys($groupmembers));
386 * Returns description of method result value
388 * @return external_description
391 public static function get_group_members_returns() {
392 return new external_multiple_structure(
393 new external_single_structure(
395 'groupid' => new external_value(PARAM_INT
, 'group record id'),
396 'userids' => new external_multiple_structure(new external_value(PARAM_INT
, 'user id')),
404 * Returns description of method parameters
406 * @return external_function_parameters
409 public static function add_group_members_parameters() {
410 return new external_function_parameters(
412 'members'=> new external_multiple_structure(
413 new external_single_structure(
415 'groupid' => new external_value(PARAM_INT
, 'group record id'),
416 'userid' => new external_value(PARAM_INT
, 'user id'),
427 * @param array $members of arrays with keys userid, groupid
430 public static function add_group_members($members) {
432 require_once("$CFG->dirroot/group/lib.php");
434 $params = self
::validate_parameters(self
::add_group_members_parameters(), array('members'=>$members));
436 $transaction = $DB->start_delegated_transaction();
437 foreach ($params['members'] as $member) {
439 $groupid = $member['groupid'];
440 $userid = $member['userid'];
442 $group = groups_get_group($groupid, 'id, courseid', MUST_EXIST
);
443 $user = $DB->get_record('user', array('id'=>$userid, 'deleted'=>0, 'mnethostid'=>$CFG->mnet_localhost_id
), '*', MUST_EXIST
);
445 // now security checks
446 $context = get_context_instance(CONTEXT_COURSE
, $group->courseid
);
448 self
::validate_context($context);
449 } catch (Exception
$e) {
450 $exceptionparam = new stdClass();
451 $exceptionparam->message
= $e->getMessage();
452 $exceptionparam->courseid
= $group->courseid
;
453 throw new moodle_exception(
454 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
456 require_capability('moodle/course:managegroups', $context);
458 // now make sure user is enrolled in course - this is mandatory requirement,
459 // unfortunately this is slow
460 if (!is_enrolled($context, $userid)) {
461 throw new invalid_parameter_exception('Only enrolled users may be members of groups');
464 groups_add_member($group, $user);
467 $transaction->allow_commit();
471 * Returns description of method result value
476 public static function add_group_members_returns() {
482 * Returns description of method parameters
484 * @return external_function_parameters
487 public static function delete_group_members_parameters() {
488 return new external_function_parameters(
490 'members'=> new external_multiple_structure(
491 new external_single_structure(
493 'groupid' => new external_value(PARAM_INT
, 'group record id'),
494 'userid' => new external_value(PARAM_INT
, 'user id'),
503 * Delete group members
505 * @param array $members of arrays with keys userid, groupid
508 public static function delete_group_members($members) {
510 require_once("$CFG->dirroot/group/lib.php");
512 $params = self
::validate_parameters(self
::delete_group_members_parameters(), array('members'=>$members));
514 $transaction = $DB->start_delegated_transaction();
516 foreach ($params['members'] as $member) {
518 $groupid = $member['groupid'];
519 $userid = $member['userid'];
521 $group = groups_get_group($groupid, 'id, courseid', MUST_EXIST
);
522 $user = $DB->get_record('user', array('id'=>$userid, 'deleted'=>0, 'mnethostid'=>$CFG->mnet_localhost_id
), '*', MUST_EXIST
);
524 // now security checks
525 $context = get_context_instance(CONTEXT_COURSE
, $group->courseid
);
527 self
::validate_context($context);
528 } catch (Exception
$e) {
529 $exceptionparam = new stdClass();
530 $exceptionparam->message
= $e->getMessage();
531 $exceptionparam->courseid
= $group->courseid
;
532 throw new moodle_exception(
533 get_string('errorcoursecontextnotvalid' , 'webservice', $exceptionparam));
535 require_capability('moodle/course:managegroups', $context);
537 groups_remove_member($group, $user);
540 $transaction->allow_commit();
544 * Returns description of method result value
549 public static function delete_group_members_returns() {
556 * Deprecated group external functions
558 * @package core_group
559 * @copyright 2009 Petr Skodak
560 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
562 * @deprecated Moodle 2.2 MDL-29106 - Please do not use this class any more.
563 * @todo MDL-31194 This will be deleted in Moodle 2.5.
564 * @see core_group_external
566 class moodle_group_external
extends external_api
{
569 * Returns description of method parameters
571 * @return external_function_parameters
573 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
574 * @todo MDL-31194 This will be deleted in Moodle 2.5.
575 * @see core_group_external::create_groups_parameters()
577 public static function create_groups_parameters() {
578 return core_group_external
::create_groups_parameters();
584 * @param array $groups array of group description arrays (with keys groupname and courseid)
585 * @return array of newly created groups
587 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
588 * @todo MDL-31194 This will be deleted in Moodle 2.5.
589 * @see use core_group_external::create_groups()
591 public static function create_groups($groups) {
592 return core_group_external
::create_groups($groups);
596 * Returns description of method result value
598 * @return external_description
600 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
601 * @todo MDL-31194 This will be deleted in Moodle 2.5.
602 * @see core_group_external::create_groups_returns()
604 public static function create_groups_returns() {
605 return core_group_external
::create_groups_returns();
609 * Returns description of method parameters
611 * @return external_function_parameters
613 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
614 * @todo MDL-31194 This will be deleted in Moodle 2.5.
615 * @see core_group_external::get_groups_parameters()
617 public static function get_groups_parameters() {
618 return core_group_external
::get_groups_parameters();
622 * Get groups definition specified by ids
624 * @param array $groupids arrays of group ids
625 * @return array of group objects (id, courseid, name, enrolmentkey)
627 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
628 * @todo MDL-31194 This will be deleted in Moodle 2.5.
629 * @see core_group_external::get_groups()
631 public static function get_groups($groupids) {
632 return core_group_external
::get_groups($groupids);
636 * Returns description of method result value
638 * @return external_description
640 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
641 * @todo MDL-31194 This will be deleted in Moodle 2.5.
642 * @see core_group_external::get_groups_returns()
644 public static function get_groups_returns() {
645 return core_group_external
::get_groups_returns();
649 * Returns description of method parameters
651 * @return external_function_parameters
653 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
654 * @todo MDL-31194 This will be deleted in Moodle 2.5.
655 * @see core_group_external::get_course_groups_parameters()
657 public static function get_course_groups_parameters() {
658 return core_group_external
::get_course_groups_parameters();
662 * Get all groups in the specified course
664 * @param int $courseid id of course
665 * @return array of group objects (id, courseid, name, enrolmentkey)
667 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
668 * @todo MDL-31194 This will be deleted in Moodle 2.5.
669 * @see core_group_external::get_course_groups()
671 public static function get_course_groups($courseid) {
672 return core_group_external
::get_course_groups($courseid);
676 * Returns description of method result value
678 * @return external_description
680 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
681 * @todo MDL-31194 This will be deleted in Moodle 2.5.
682 * @see core_group_external::get_course_groups_returns()
684 public static function get_course_groups_returns() {
685 return core_group_external
::get_course_groups_returns();
689 * Returns description of method parameters
691 * @return external_function_parameters
693 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
694 * @todo MDL-31194 This will be deleted in Moodle 2.5.
695 * @see core_group_external::delete_group_members_parameters()
697 public static function delete_groups_parameters() {
698 return core_group_external
::delete_group_members_parameters();
704 * @param array $groupids array of group ids
706 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
707 * @todo MDL-31194 This will be deleted in Moodle 2.5.
708 * @see core_group_external::delete_groups()
710 public static function delete_groups($groupids) {
711 return core_group_external
::delete_groups($groupids);
715 * Returns description of method result value
719 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
720 * @todo MDL-31194 This will be deleted in Moodle 2.5.
721 * @see core_group_external::delete_group_members_returns()
723 public static function delete_groups_returns() {
724 return core_group_external
::delete_group_members_returns();
729 * Returns description of method parameters
731 * @return external_function_parameters
733 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
734 * @todo MDL-31194 This will be deleted in Moodle 2.5.
735 * @see core_group_external::get_group_members_parameters()
737 public static function get_groupmembers_parameters() {
738 return core_group_external
::get_group_members_parameters();
742 * Return all members for a group
744 * @param array $groupids array of group ids
745 * @return array with group id keys containing arrays of user ids
747 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
748 * @todo MDL-31194 This will be deleted in Moodle 2.5.
749 * @see core_group_external::get_group_members()
751 public static function get_groupmembers($groupids) {
752 return core_group_external
::get_group_members($groupids);
756 * Returns description of method result value
758 * @return external_description
760 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
761 * @todo MDL-31194 This will be deleted in Moodle 2.5.
762 * @see core_group_external::get_group_members_returns()
764 public static function get_groupmembers_returns() {
765 return core_group_external
::get_group_members_returns();
770 * Returns description of method parameters
772 * @return external_function_parameters
774 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
775 * @todo MDL-31194 This will be deleted in Moodle 2.5.
776 * @see core_group_external::add_group_members_parameters()
778 public static function add_groupmembers_parameters() {
779 return core_group_external
::add_group_members_parameters();
785 * @param array $members of arrays with keys userid, groupid
787 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
788 * @todo MDL-31194 This will be deleted in Moodle 2.5.
789 * @see use core_group_external::add_group_members()
791 public static function add_groupmembers($members) {
792 return core_group_external
::add_group_members($members);
796 * Returns description of method result value
798 * @return external_description
800 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
801 * @todo MDL-31194 This will be deleted in Moodle 2.5.
802 * @see core_group_external::add_group_members_returns()
804 public static function add_groupmembers_returns() {
805 return core_group_external
::add_group_members_returns();
810 * Returns description of method parameters
812 * @return external_function_parameters
814 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
815 * @todo MDL-31194 This will be deleted in Moodle 2.5.
816 * @see core_group_external::delete_group_members_parameters()
818 public static function delete_groupmembers_parameters() {
819 return core_group_external
::delete_group_members_parameters();
823 * Delete group members
825 * @param array $members of arrays with keys userid, groupid
827 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
828 * @todo MDL-31194 This will be deleted in Moodle 2.5.
829 * @see core_group_external::delete_group_members()
831 public static function delete_groupmembers($members) {
832 return core_group_external
::delete_group_members($members);
836 * Returns description of method result value
838 * @return external_description
840 * @deprecated Moodle 2.2 MDL-29106 - Please do not call this function any more.
841 * @todo MDL-31194 This will be deleted in Moodle 2.5.
842 * @see core_group_external::delete_group_members_returns()
844 public static function delete_groupmembers_returns() {
845 return core_group_external
::delete_group_members_returns();