Completed
Push — master ( caf222...deba87 )
by Jeroen
72:32 queued 44:47
created

engine/classes/Elgg/Database/Seeds/Groups.php (1 issue)

1
<?php
2
3
namespace Elgg\Database\Seeds;
4
5
/**
6
 * Seed users
7
 *
8
 * @access private
9
 */
10
class Groups extends Seed {
11
12
	private $visibility = [
13
		ACCESS_PUBLIC,
14
		ACCESS_LOGGED_IN,
15
		ACCESS_PRIVATE,
16
	];
17
18
	private $content_access_modes = [
19
		\ElggGroup::CONTENT_ACCESS_MODE_MEMBERS_ONLY,
20
		\ElggGroup::CONTENT_ACCESS_MODE_UNRESTRICTED,
21
	];
22
23
	private $membership = [
24
		ACCESS_PUBLIC,
25
		ACCESS_PRIVATE,
26
	];
27
28
	/**
29
	 * {@inheritdoc}
30
	 */
31
	public function seed() {
32
33
		$count_groups = function () {
34
			return elgg_get_entities_from_metadata([
35
				'types' => 'group',
36
				'metadata_names' => '__faker',
37
				'count' => true,
38
			]);
39
		};
40
41 View Code Duplication
		$count_members = function ($group) {
42
			return elgg_get_entities_from_relationship([
43
				'types' => 'user',
44
				'relationship' => 'member',
45
				'relationship_guid' => $group->getGUID(),
46
				'inverse_relationship' => true,
47
				'metadata_names' => '__faker',
48
				'count' => true,
49
			]);
50
		};
51
52
		$exclude = [];
53
54
		while ($count_groups() < $this->limit) {
55
			$group = $this->getRandomGroup($exclude);
56
			if (!$group) {
57
				$group = $this->createGroup([
58
					'access_id' => $this->getRandomVisibility(),
59
				], [
60
					'content_access_mode' => $this->getRandomContentAccessMode(),
61
					'membership' => $this->getRandomMembership(),
62
				], [
63
					'profile_fields' => (array) elgg_get_config('group'),
64
					'group_tool_options' => (array) elgg_get_config('group_tool_options'),
65
				]);
66
				if (!$group) {
67
					continue;
68
				}
69
			}
70
71
			$this->createIcon($group);
72
73
			$exclude[] = $group->guid;
74
75
			if ($count_members($group) > 1) {
76
				// exclude owner from count
77
				continue;
78
			}
79
80
			$members_limit = $this->faker()->numberBetween(1, 5);
81
82
			$members_exclude = [];
83
84
			while ($count_members($group) - 1 < $members_limit) {
85
				$member = $this->getRandomUser($members_exclude);
86
				if (!$member) {
87
					$member = $this->createUser();
88
					if (!$member) {
89
						continue;
90
					}
91
				}
92
93
				$members_exclude[] = $member->guid;
94
95
				if ($group->join($member)) {
96
					$this->log("User $member->name [guid: $member->guid] joined group $group->name [guid: $group->guid]");
97
				}
98
99
				if (!$group->isPublicMembership()) {
100
					$invitee = $this->getRandomUser($members_exclude);
101
					if (!$invitee) {
102
						$invitee = $this->createUser();
103
					}
104
					if ($invitee) {
105
						$members_exclude[] = $invitee->guid;
106
						if (!check_entity_relationship($invitee->guid, 'member', $group->guid)) {
107
							add_entity_relationship($group->guid, 'invited', $invitee->guid);
108
							$this->log("User $invitee->name [guid: $invitee->guid] was invited to $group->name [guid: $group->guid]");
109
						}
110
					}
111
112
					$requestor = $this->getRandomUser($members_exclude);
113
					if (!$requestor) {
114
						$requestor = $this->createUser();
115
					}
116
					if ($requestor) {
117
						$members_exclude[] = $requestor->guid;
118
						if (!check_entity_relationship($group->guid, 'invited', $requestor->guid)
119
							&& !check_entity_relationship($requestor->guid, 'member', $group->guid)
120
						) {
121
							add_entity_relationship($requestor->guid, 'membership_request', $group->guid);
122
							$this->log("User $invitee->name [guid: $invitee->guid] requested to join $group->name [guid: $group->guid]");
123
						}
124
					}
125
				}
126
			}
127
		}
128
129
	}
130
131
	/**
132
	 * {@inheritdoc}
133
	 */
134 View Code Duplication
	public function unseed() {
0 ignored issues
show
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
135
136
		$groups = elgg_get_entities_from_metadata([
137
			'types' => 'group',
138
			'metadata_names' => '__faker',
139
			'limit' => 0,
140
			'batch' => true,
141
		]);
142
143
		/* @var $groups \ElggBatch */
144
145
		$groups->setIncrementOffset(false);
146
147
		foreach ($groups as $group) {
148
			if ($group->delete()) {
149
				$this->log("Deleted group $group->guid");
150
			} else {
151
				$this->log("Failed to delete group $group->guid");
152
			}
153
		}
154
	}
155
156
	/**
157
	 * Returns random visibility value
158
	 * @return int
159
	 */
160
	public function getRandomVisibility() {
161
		$key = array_rand($this->visibility, 1);
162
163
		return $this->visibility[$key];
164
	}
165
166
	/**
167
	 * Returns random content access mode value
168
	 * @return string
169
	 */
170
	public function getRandomContentAccessMode() {
171
		$key = array_rand($this->content_access_modes, 1);
172
173
		return $this->content_access_modes[$key];
174
	}
175
176
	/**
177
	 * Returns random membership mode
178
	 * @return mixed
179
	 */
180
	public function getRandomMembership() {
181
		$key = array_rand($this->membership, 1);
182
183
		return $this->membership[$key];
184
	}
185
}
186