1<?php
2/**
3 * Join a group
4 *
5 * Three states:
6 * open group so user joins
7 * closed group so request sent to group owner
8 * closed group with invite so user joins
9 */
10
11$user_guid = (int) get_input('user_guid', elgg_get_logged_in_user_guid());
12$group_guid = (int) get_input('group_guid');
13
14$user = get_user($user_guid);
15
16// access bypass for getting invisible group
17$group = elgg_call(ELGG_IGNORE_ACCESS, function() use ($group_guid) {
18	return get_entity($group_guid);
19});
20
21if (!$user || !$group instanceof \ElggGroup) {
22	return elgg_error_response(elgg_echo('groups:cantjoin'));
23}
24
25if (!$user->canEdit() && !$group->canEdit()) {
26	return elgg_error_response(elgg_echo('actionunauthorized'));
27}
28
29// join or request
30$join = false;
31if ($group->isPublicMembership() || $group->canEdit($user->guid)) {
32	// anyone can join public groups and admins can join any group
33	$join = true;
34} else {
35	if (check_entity_relationship($group->guid, 'invited', $user->guid)) {
36		// user has invite to closed group
37		$join = true;
38	}
39}
40
41if ($join) {
42	if (!$group->join($user, ['create_river_item' => true])) {
43		return elgg_error_response(elgg_echo('groups:cantjoin'));
44	}
45
46	return elgg_ok_response('', elgg_echo('groups:joined'), $group->getURL());
47}
48
49if (check_entity_relationship($user->guid, 'membership_request', $group->guid)) {
50	return elgg_error_response(elgg_echo('groups:joinrequest:exists'));
51}
52
53
54if (!add_entity_relationship($user->guid, 'membership_request', $group->guid)) {
55	return elgg_error_response(elgg_echo('groups:joinrequestnotmade'));
56}
57
58$owner = $group->getOwnerEntity();
59
60$url = elgg_normalize_url("groups/requests/{$group->guid}");
61
62$subject = elgg_echo('groups:request:subject', [
63	$user->getDisplayName(),
64	$group->getDisplayName(),
65], $owner->language);
66
67$body = elgg_echo('groups:request:body', [
68	$group->getOwnerEntity()->getDisplayName(),
69	$user->getDisplayName(),
70	$group->getDisplayName(),
71	$user->getURL(),
72	$url,
73], $owner->language);
74
75$params = [
76	'action' => 'membership_request',
77	'object' => $group,
78	'url' => $url,
79];
80
81// Notify group owner
82notify_user($owner->guid, $user->getGUID(), $subject, $body, $params);
83
84return elgg_ok_response('', elgg_echo('groups:joinrequestmade'));
85