PluginProbe
FluentCommunity – Ultra-Fast High-Performance Social Network, Community, LMS & Online Courses / 2.10.0
FluentCommunity – Ultra-Fast High-Performance Social Network, Community, LMS & Online Courses v2.10.0
2.10.0 2.10.01 2.9.1 2.9.0 2.8.1 2.8.0 2.7.7 2.7.5 2.7.0 2.6.01 2.6.0 2.5.0 2.4.01 trunk 1.0.90 1.0.91 1.0.92 1.0.93 1.0.94 1.0.95 1.0.96 1.0.97 1.0.98 1.0.99 1.1.0 All 77 releases
fluent-community / Modules / Auth / Classes / InvitationController.php

InvitationController.php in FluentCommunity – Ultra-Fast High-Performance Social Network, Community, LMS & Online Courses 2.10.0, at Modules/Auth/Classes/InvitationController.php

219 lines 6.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentCommunity\Modules\Auth\Classes;
4
5 use FluentCommunity\App\Http\Controllers\Controller;
6 use FluentCommunity\App\Models\Space;
7 use FluentCommunity\App\Models\SpaceUserPivot;
8 use FluentCommunity\App\Services\Helper;
9 use FluentCommunity\App\Services\ProfileHelper;
10 use FluentCommunity\Framework\Http\Request\Request;
11 use FluentCommunity\Framework\Support\Arr;
12
13 class InvitationController extends Controller
14 {
15 public function getInvitations(Request $request)
16 {
17 $user = $this->getUser(true);
18 $isMod = $user->isCommunityModerator();
19 $spaceId = intval($request->get('space_id'));
20
21 $space = Space::findOrFail($spaceId);
22 $space->verifyUserPermisson($user, 'community_moderator');
23
24 $status = $request->get('status', 'pending');
25 if ($status == 'all') {
26 $status = '';
27 }
28
29 $inviatations = Invitation::where('user_id', $user->ID)
30 ->when($status, function ($query) use ($status) {
31 $query->where('status', $status);
32 })
33 ->with(['xprofile' => function ($query) {
34 $query->select(ProfileHelper::getXProfilePublicFields());
35 }])
36 ->when(!$isMod, function ($query) use ($user) {
37 $query->where('user_id', $user->ID);
38 })
39 ->when($spaceId, function ($query) use ($spaceId) {
40 $query->where('post_id', $spaceId);
41 })
42 ->orderBy('id', 'desc')
43 ->paginate();
44
45 foreach ($inviatations as $inviatation) {
46 if ($inviatation->isValid()) {
47 $inviatation->access_url = $inviatation->getAccessUrl();
48 }
49 }
50
51 return [
52 'invitations' => $inviatations,
53 'is_mod' => $isMod
54 ];
55 }
56
57 public function delete(Request $request, $invitationId)
58 {
59 $invitationId = intval($invitationId);
60 $inivitation = Invitation::findOrFail($invitationId);
61 $user = $this->getUser(true);
62 $space = Space::findOrFail($inivitation->post_id);
63 $space->verifyUserPermisson($user, 'community_moderator');
64
65 $inivitation->delete();
66
67 return [
68 'message' => __('Invitation deleted successfully', 'fluent-community')
69 ];
70 }
71
72 public function store(Request $request)
73 {
74 $data = $request->all();
75 $this->validate($data, [
76 'email' => 'required|email',
77 'space_id' => 'required'
78 ]);
79
80 $spaceId = (int)Arr::get($data, 'space_id');
81 $user = $this->getUser(true);
82
83 $space = Space::findOrFail($spaceId);
84 $space->verifyUserPermisson($user, 'community_moderator');
85
86 $inviteeEmail = sanitize_email(Arr::get($data, 'email'));
87
88 $indivatationData = array_filter([
89 'email' => $inviteeEmail,
90 'user_id' => $user->ID,
91 'invitee_name' => sanitize_text_field(Arr::get($data, 'invitee_name')),
92 'space_id' => $space->id
93 ]);
94
95 $invitation = InvitationService::invite($indivatationData);
96 if (is_wp_error($invitation)) {
97 return $this->sendError([
98 'message' => $invitation->get_error_message()
99 ]);
100 }
101
102 // Now send the email for the invitation
103 InvitationService::sendInvitationEmail($invitation);
104
105 return [
106 'message' => __('Invitation has been sent successfully', 'fluent-community'),
107 'invitation' => $invitation
108 ];
109 }
110
111 public function createNewLink(Request $request)
112 {
113 $data = $request->all();
114 $this->validate($data, [
115 'title' => 'required',
116 'space_id' => 'required',
117 ]);
118
119 $spaceId = (int)Arr::get($data, 'space_id');
120 $space = Space::findOrFail($spaceId);
121 $user = $this->getUser(true);
122 $space->verifyUserPermisson($user, 'community_moderator');
123
124 $indivatationData = array_filter([
125 'email' => '',
126 'user_id' => $user->ID,
127 'space_id' => $space->id,
128 'title' => sanitize_text_field(Arr::get($data, 'title')),
129 'limit' => sanitize_text_field(Arr::get($data, 'limit', 0)),
130 'expire_date' => sanitize_text_field(Arr::get($data, 'expire_date', '')),
131 ]);
132
133 $invitation = apply_filters('fluent_community/create_invitation_link', null, $indivatationData);
134
135 if(!$invitation) {
136 return $this->sendError([
137 'message' => __('Something went wrong', 'fluent-community')
138 ]);
139 }
140
141 if (is_wp_error($invitation)) {
142 return $this->sendError([
143 'message' => $invitation->get_error_message()
144 ]);
145 }
146
147 $invitation->access_url = $invitation->getAccessUrl();
148
149 return [
150 'message' => __('Invitation link has been created', 'fluent-community'),
151 'invitation' => $invitation
152 ];
153 }
154
155 public function resend(Request $request, $invitationId)
156 {
157 $invitation = Invitation::findOrFail($invitationId);
158 /** @var Invitation $invitation */
159 $user = $this->getUser(true);
160 $space = Space::findOrFail($invitation->post_id);
161 $space->verifyUserPermisson($user, 'community_moderator');
162
163 // Links have no recipient; resending would mail an empty address and burn a redemption.
164 if (!is_email($invitation->message)) {
165 return $this->sendError([
166 'message' => __('Only email invitations can be resent.', 'fluent-community')
167 ]);
168 }
169
170 if ($invitation->reactions_count > 5) {
171 return $this->sendError([
172 'message' => __('You cannot resend this invitation', 'fluent-community')
173 ]);
174 }
175
176 InvitationService::sendInvitationEmail($invitation);
177
178 return [
179 'message' => __('Invitation has been resent successfully', 'fluent-community')
180 ];
181 }
182
183 private function validateExistingWpUser($email, $spaceId = null)
184 {
185 $user = get_user_by('email', $email);
186
187 if ($user) {
188 if ($spaceId && !$this->userExistInSpace($spaceId, $user->ID)) {
189 return true;
190 }
191
192 wp_send_json([
193 'message' => __('You are already a member of this site', 'fluent-community')
194 ], 400);
195 }
196 }
197
198 private function isInviteMembers()
199 {
200 $settings = Helper::getOnboardingSettings();
201
202 return Arr::get($settings, 'is_onboarding_enabled', '') == 'yes';
203 }
204
205 private function isTodayInvitationLimitExceeded($userId)
206 {
207 $todayInvitationCount = Invitation::getTodayInvitationCount($userId);
208
209 return $todayInvitationCount > 10;
210 }
211
212 private function userExistInSpace($spaceId, $userId)
213 {
214 return SpaceUserPivot::where('space_id', $spaceId)
215 ->where('user_id', $userId)
216 ->exists();
217 }
218 }
219