PluginProbe
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder / 6.2.3
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder v6.2.3
6.2.14 6.2.13 6.2.12 6.2.10 6.2.11 6.2.9 6.2.8 6.2.7 6.2.6 6.2.5 6.2.4 6.2.3 6.2.2 3.6.22 3.6.31 3.6.40 3.6.41 3.6.42 3.6.50 3.6.51 3.6.60 3.6.61 3.6.62 3.6.64 3.6.65 All 196 releases
fluentform / app / Services / Manager / ManagerService.php

ManagerService.php in Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder 6.2.3, at app/Services/Manager/ManagerService.php

219 lines 7.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentForm\App\Services\Manager;
4
5 use FluentForm\App\Helpers\Helper;
6 use FluentForm\App\Modules\Acl\Acl;
7 use FluentForm\Framework\Support\Arr;
8 use FluentForm\Framework\Validator\ValidationException;
9 use FluentForm\Framework\Validator\Validator;
10
11 class ManagerService
12 {
13 public function getManagers($attributes = [])
14 {
15 $limit = Arr::get($attributes, 'per_page', 10);
16 $page = Arr::get($attributes, 'page', 1);
17 $offset = $page == 1 ? 0 : ($page - 1) * $limit;
18
19 $query = new \WP_User_Query([
20 'meta_key' => '_fluent_forms_has_role',
21 'meta_value' => 1,
22 'meta_compare' => '=',
23 'number' => $limit,
24 'offset' => $offset,
25 ]);
26
27 $managers = [];
28
29 foreach ($query->get_results() as $user) {
30 $allowedForms = FormManagerService::getUserAllowedFormsScope($user->ID);
31 $hasSpecificFormsPermission = false !== $allowedForms;
32 $managers[] = [
33 'id' => $user->ID,
34 'first_name' => $user->first_name,
35 'last_name' => $user->last_name,
36 'email' => $user->user_email,
37 'permissions' => Acl::getUserPermissions($user),
38 'forms' => false !== $allowedForms ? array_values($allowedForms) : false,
39 'roles' => $this->getUserRoles($user->roles),
40 'has_specific_forms_permission'=> $hasSpecificFormsPermission ? 'yes' : 'no',
41 ];
42 }
43
44 $total = $query->get_total();
45
46 $forms = Helper::getForms();
47 if ($forms) {
48 Arr::forget($forms, 0);
49 }
50
51 return ([
52 'managers' => $managers,
53 'total' => $total,
54 'permissions' => Acl::getReadablePermissions(),
55 'forms' => $forms,
56 ]);
57 }
58
59 public function addManager($attributes = [])
60 {
61 $manager = Arr::get($attributes, 'manager');
62
63 $this->validate($manager);
64
65 $permissions = Arr::get($manager, 'permissions', []);
66
67 $user = get_user_by('email', $manager['email']);
68
69 if (!$user) {
70 throw new ValidationException('', 0, null, ['message' => 'Please Provide Valid Email']);
71 }
72
73 Acl::attachPermissions($user, $permissions);
74
75 update_user_meta($user->ID, '_fluent_forms_has_role', 1);
76
77 $hasSpecificFormsPermission = 'yes' === Arr::get($manager, 'has_specific_forms_permission');
78 $allowedForms = array_values(array_filter(array_map('intval', (array) Arr::get($manager, 'forms', []))));
79
80 // Keep an empty selection unrestricted so the manager UI's
81 // "leave blank for all forms" behavior matches the saved ACL state.
82 if ($hasSpecificFormsPermission && $allowedForms) {
83 FormManagerService::updateHasSpecificFormsPermission($user->ID, 'yes');
84 FormManagerService::addUserAllowedForms($allowedForms, $user->ID);
85 } else {
86 FormManagerService::updateHasSpecificFormsPermission($user->ID, 'no');
87 FormManagerService::deleteUserAllowedForms($user->ID);
88 }
89
90 $updatedUser = [
91 'id' => $user->ID,
92 'first_name' => $user->first_name,
93 'last_name' => $user->last_name,
94 'email' => $user->user_email,
95 'permissions' => Acl::getUserPermissions($user)
96 ];
97
98 return ([
99 'message' => __('Manager has been saved.', 'fluentform'),
100 'manager' => $updatedUser
101 ]);
102 }
103
104 public function removeManager($attributes = [])
105 {
106 $userID = intval(Arr::get($attributes, 'id'));
107 $user = get_user_by('ID', $userID);
108
109 if (!$user) {
110 return ([
111 'message' => __('Associate user could not be found', 'fluentform'),
112 ]);
113 }
114
115 Acl::attachPermissions($user, []);
116
117 delete_user_meta($user->ID, '_fluent_forms_has_role');
118
119 $deletedUser = [
120 'id' => $user->ID,
121 'first_name' => $user->first_name,
122 'last_name' => $user->last_name,
123 'email' => $user->user_email,
124 'permissions' => Acl::getUserPermissions($user)
125 ];
126
127 return ([
128 'message' => __('Manager has been removed.', 'fluentform'),
129 'manager' => $deletedUser
130 ]);
131 }
132
133 private function validate($manager)
134 {
135 $rules = [
136 'permissions' => 'required',
137 'email' => 'required|email',
138 ];
139
140 $validatorInstance = new Validator();
141 $validator = $validatorInstance->make($manager, $rules);
142
143 $errors = null;
144
145 if ($validator->validate()->fails()) {
146 $errors = $validator->errors();
147 }
148
149 if (!isset($errors['email'])) {
150 $user = get_user_by('email', $manager['email']);
151
152 if (!$user) {
153 $errors['email'] = [
154 'no_user' => __('We could not found any user with this email.', 'fluentform'),
155 ];
156 }
157 }
158
159 if (!isset($errors['permissions'])) {
160 $message = $this->dependencyValidate($manager['permissions']);
161
162 if ($message) {
163 $errors['permissions'] = [
164 'dependency' => $message,
165 ];
166 }
167 }
168
169 if ($errors) {
170 // Escape all error messages before throwing
171 $escapedErrors = array_map(function($errorMessages) {
172 if (is_array($errorMessages)) {
173 return array_map('esc_html', $errorMessages);
174 }
175 return esc_html($errorMessages);
176 }, $errors);
177
178 throw new ValidationException('', 0, null, [
179 // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- Error messages are escaped above
180 'errors' => $escapedErrors,
181 ]);
182 }
183 }
184
185 private function dependencyValidate($permissions)
186 {
187 $allPermissions = Acl::getReadablePermissions();
188
189 foreach ($permissions as $permission) {
190 $depends = Arr::get($allPermissions, $permission . '.depends', []);
191
192 if ($depends && $more = array_values(array_diff($depends, $permissions))) {
193 $message = $allPermissions[$permission]['title'] . ' requires permission: ';
194
195 foreach ($more as $i => $p) {
196 $joiner = $i ? ', ' : '';
197 $message = $message . $joiner . $allPermissions[$p]['title'];
198 }
199
200 return $message;
201 }
202 }
203 }
204
205 private function getUserRoles($roles)
206 {
207 $roleStr = '';
208 if (count($roles) > 1) {
209 foreach ($roles as $role) {
210 $roleStr .= $role . ', ';
211 }
212 } else {
213 $roleStr = Arr::get($roles, '0');
214 }
215
216 return $roleStr;
217 }
218 }
219