PluginProbe
FluentCommunity – Ultra-Fast High-Performance Social Network, Community, LMS & Online Courses / 2.6.01
FluentCommunity – Ultra-Fast High-Performance Social Network, Community, LMS & Online Courses v2.6.01
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 / app / Http / Controllers / AdminController.php

AdminController.php in FluentCommunity – Ultra-Fast High-Performance Social Network, Community, LMS & Online Courses 2.6.01, at app/Http/Controllers/AdminController.php

545 lines 20.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentCommunity\App\Http\Controllers;
4
5 use FluentCommunity\App\Functions\Utility;
6 use FluentCommunity\App\Models\BaseSpace;
7 use FluentCommunity\App\Services\AuthenticationService;
8 use FluentCommunity\App\Services\CustomSanitizer;
9 use FluentCommunity\App\Services\FeedsHelper;
10 use FluentCommunity\App\Services\ProfileHelper;
11 use FluentCommunity\Modules\Auth\AuthHelper;
12 use FluentCommunity\App\Services\Helper;
13 use FluentCommunity\App\Services\OnboardingService;
14 use FluentCommunity\Framework\Http\Request\Request;
15 use FluentCommunity\Framework\Support\Arr;
16
17 class AdminController extends Controller
18 {
19 public function getGeneralSettings(Request $request)
20 {
21 $settings = Helper::generalSettings(false);
22
23 $userRoles = wp_roles()->roles;
24
25 $formatedRoles = [];
26 foreach ($userRoles as $role => $roleData) {
27 $formatedRoles[$role] = $roleData['name'];
28 }
29
30 unset($formatedRoles['administrator']);
31
32 $data = [
33 'settings' => $settings,
34 'user_roles' => $formatedRoles,
35 'users_can_register' => !!get_option('users_can_register'),
36 'user_registration_enable_url' => admin_url('options-general.php')
37 ];
38 return apply_filters('fluent_community/general_settings_api_response', $data, $request->all());
39 }
40
41 public function saveGeneralSettings(Request $request)
42 {
43 $inputs = $request->get('settings', []);
44 $settings = Helper::generalSettings(false);
45 $inputs = Arr::only($inputs, array_keys($settings));
46
47 $settings['logo'] = Arr::get($inputs, 'logo', '');
48 $settings['white_logo'] = Arr::get($inputs, 'white_logo', '');
49 $settings['featured_image'] = Arr::get($inputs, 'featured_image', '');
50
51 if (!empty($settings['logo'])) {
52 $settings['logo'] = sanitize_url($settings['logo']);
53 }
54
55 if (!empty($settings['white_logo'])) {
56 $settings['white_logo'] = sanitize_url($settings['white_logo']);
57 }
58
59 if (!empty($settings['featured_image'])) {
60 $settings['featured_image'] = sanitize_url($settings['featured_image']);
61 }
62
63 if (!empty($settings['site_title'])) {
64 $settings['site_title'] = sanitize_text_field(Arr::get($inputs, 'site_title', ''));
65 }
66
67 $settings['disable_global_posts'] = sanitize_text_field(Arr::get($inputs, 'disable_global_posts', 'no'));
68 $settings['access'] = Arr::get($inputs, 'access', []);
69 $settings['auth_content'] = wp_kses_post(Arr::get($inputs, 'auth_content', ''));
70 $settings['auth_redirect'] = sanitize_url(Arr::get($inputs, 'auth_redirect', ''));
71 $settings['restricted_role_content'] = wp_kses_post(Arr::get($inputs, 'restricted_role_content', ''));
72 $settings['logo_permalink'] = sanitize_url(Arr::get($inputs, 'logo_permalink', ''));
73 $settings['logo_permalink_type'] = sanitize_text_field(Arr::get($inputs, 'logo_permalink_type', 'default'));
74 $settings['auth_url'] = sanitize_url(Arr::get($inputs, 'auth_url', ''));
75 $media = Helper::getMediaFromUrl($settings['logo']);
76 $whiteMedia = Helper::getMediaFromUrl($settings['white_logo']);
77 $featuredMedia = Helper::getMediaFromUrl($settings['featured_image']);
78 $settings['cutsom_auth_url'] = sanitize_url(Arr::get($inputs, 'cutsom_auth_url', ''));
79 $settings['auth_form_type'] = sanitize_text_field(Arr::get($inputs, 'auth_form_type', ''));
80 $settings['explicit_registration'] = sanitize_text_field(Arr::get($inputs, 'explicit_registration', 'no'));
81
82 $isCustomSignupPage = $settings['auth_form_type'] === 'default' && Arr::get($inputs, 'use_custom_signup_page', 'no') == 'yes';
83 if (!$isCustomSignupPage) {
84 $settings['custom_signup_url'] = '';
85 $settings['use_custom_signup_page'] = 'no';
86 } else {
87 $settings['use_custom_signup_page'] = 'yes';
88
89 $url = Arr::get($inputs, 'custom_signup_url', '');
90
91 if (!$url || !filter_var($url, FILTER_VALIDATE_URL)) {
92 return $this->sendError([
93 'message' => __('Please provide a valid signup URL', 'fluent-community')
94 ]);
95 }
96 $settings['custom_signup_url'] = $url;
97 }
98
99 if ($media) {
100 $settings['logo'] = $media->public_url;
101 $media->update([
102 'is_active' => true,
103 'user_id' => get_current_user_id(),
104 'object_source' => 'general'
105 ]);
106 }
107
108 if ($whiteMedia) {
109 $settings['white_logo'] = $whiteMedia->public_url;
110 $whiteMedia->update([
111 'is_active' => true,
112 'user_id' => get_current_user_id(),
113 'object_source' => 'general'
114 ]);
115 }
116
117 if ($featuredMedia) {
118 $settings['featured_image'] = $featuredMedia->public_url;
119 $featuredMedia->update([
120 'is_active' => true,
121 'user_id' => get_current_user_id(),
122 'object_source' => 'general'
123 ]);
124 }
125
126 $slugChanged = false;
127 if ($settings['slug'] != $inputs['slug'] && !defined('FLUENT_COMMUNITY_PORTAL_SLUG')) {
128 $settings['slug'] = $inputs['slug'];
129 $slugChanged = true;
130 }
131
132 update_option('fluent_community_settings', $settings);
133
134 $redirectUrl = '';
135
136 if ($slugChanged) {
137 // flush rewrite rules
138 flush_rewrite_rules(true);
139 Helper::generalSettings(false);
140 $redirectUrl = Helper::baseUrl('admin/settings/general');
141 }
142
143 return [
144 'message' => __('Settings have been saved successfully.', 'fluent-community'),
145 'redirect_url' => $redirectUrl
146 ];
147 }
148
149 public function getEmailSettings(Request $request)
150 {
151 $emailSettings = Utility::getEmailNotificationSettings();
152 $globalSettings = Helper::generalSettings(false);
153 if (empty($emailSettings['logo'])) {
154 $emailSettings['global_logo'] = $globalSettings['logo'];
155 }
156
157 $data = [
158 'email_settings' => $emailSettings
159 ];
160 return apply_filters('fluent_community/email_settings_api_response', $data, $request->all());
161 }
162
163 public function saveEmailSettings(Request $request)
164 {
165 $prevSettings = Utility::getEmailNotificationSettings();
166 $newSettings = $request->get('email_settings', []);
167
168 $logo = Arr::get($newSettings, 'logo', '');
169
170 if ($logo) {
171 $logoMedia = Helper::getMediaFromUrl($logo);
172 if ($logoMedia) {
173 $newSettings['logo'] = $logoMedia->public_url;
174 $logoMedia->update([
175 'is_active' => true,
176 'user_id' => get_current_user_id(),
177 'object_source' => 'general'
178 ]);
179 }
180 }
181
182 $newSettings = wp_parse_args($newSettings, $prevSettings);
183 $newSettings = CustomSanitizer::santizeEmailSettings($newSettings);
184
185 Utility::updateOption('global_email_settings', $newSettings);
186
187 /*
188 * We are unscheduling all digest schedules if the settings has been changed or disabled
189 */
190 $isScheduleChanged = ($newSettings['digest_mail_day'] != $prevSettings['digest_mail_day']) || ($newSettings['daily_digest_time'] != $prevSettings['daily_digest_time']);
191 if ($isScheduleChanged) {
192 if (as_next_scheduled_action('fluent_community_send_daily_digest_init')) {
193 as_unschedule_all_actions('fluent_community_send_daily_digest_init', [], 'fluent-community');
194 }
195 }
196
197 return [
198 'email_settings' => $newSettings,
199 'message' => __('Email notification settings have been updated', 'fluent-community')
200 ];
201 }
202
203 public function getStorageSettings(Request $request)
204 {
205 if (!defined('FLUENT_COMMUNITY_PRO')) {
206 $config = [
207 'driver' => 'local'
208 ];
209 } else {
210 $config = \FluentCommunityPro\App\Modules\CloudStorage\StorageHelper::getConfig('view');
211 }
212
213 return apply_filters('fluent_community/storage_settings_response', [
214 'config' => $config
215 ], $request->all());
216 }
217
218 public function updateStorageSettings(Request $request)
219 {
220 if (!defined('FLUENT_COMMUNITY_PRO')) {
221 return $this->sendError([
222 'message' => __('Sorry, you cannot update this config. Please activate pro', 'fluent-community')
223 ]);
224 }
225
226 if (defined('FLUENT_COMMUNITY_CLOUD_STORAGE') && FLUENT_COMMUNITY_CLOUD_STORAGE) {
227 return $this->sendError([
228 'message' => __('You cannot update the storage settings as it is defined in the config file', 'fluent-community')
229 ]);
230 }
231
232 $config = $request->get('config', []);
233
234 $driver = Arr::get($config, 'driver', 'local');
235
236 $validation = [
237 'driver' => 'required'
238 ];
239
240 $isRemote = in_array($driver, ['amazon_s3', 'bunny_cdn', 'cloudflare_r2']);
241
242 if ($driver == 'cloudflare_r2') {
243 $validation = [
244 'driver' => 'required',
245 'access_key' => 'required',
246 'secret_key' => 'required',
247 'public_url' => 'required|url',
248 'endpoint_url' => 'required|url',
249 ];
250 } else if ($driver == 'amazon_s3') {
251 $validation = [
252 'driver' => 'required',
253 'access_key' => 'required',
254 'secret_key' => 'required',
255 'bucket' => 'required'
256 ];
257 } else if ($driver == 'bunny_cdn') {
258 $validation = [
259 'driver' => 'required',
260 'access_key' => 'required',
261 's3_endpoint' => 'required',
262 'bucket' => 'required',
263 'public_url' => 'required|url'
264 ];
265 }
266
267 $this->validate($config, $validation);
268
269 if ($isRemote) {
270 $previousConfig = \FluentCommunityPro\App\Modules\CloudStorage\StorageHelper::getConfig();
271 if ($config['access_key'] == 'FCOM_ENCRYPTED_DATA_KEY') {
272 $config['access_key'] = Arr::get($previousConfig, 'access_key');
273 }
274
275 if ($config['secret_key'] == 'FCOM_ENCRYPTED_DATA_KEY') {
276 $config['secret_key'] = Arr::get($previousConfig, 'secret_key');
277 }
278
279 $driver = (new \FluentCommunityPro\App\Modules\CloudStorage\CloudStorageModule)->getConnectionDriver($config);
280
281 if (!$driver) {
282 return $this->sendError([
283 'message' => __('Could not connect to the remote storage service. Please check your credentials', 'fluent-community')
284 ]);
285 }
286
287 $test = $driver->testConnection();
288 if (!$test || is_wp_error($test)) {
289 $errorMessage = is_wp_error($test) ? $test->get_error_message() : 'Unknown Error';
290 return $this->sendError([
291 'message' => __('Could not connect to the remote storage service. Error: ', 'fluent-community') . $errorMessage
292 ]);
293 }
294 }
295
296 $config = Arr::only($config, [
297 'driver',
298 'access_key',
299 'secret_key',
300 'bucket',
301 'public_url',
302 'endpoint_url',
303 'account_id',
304 'sub_folder',
305 's3_endpoint'
306 ]);
307
308 if ($config['driver'] == 'local') {
309 $config = [
310 'driver' => 'local'
311 ];
312
313 $featureConfig = Utility::getFeaturesConfig();
314 $featureConfig['cloud_storage'] = 'no';
315 Utility::updateOption('fluent_community_features', $featureConfig);
316 } else {
317 $featureConfig = Utility::getFeaturesConfig();
318 $featureConfig['cloud_storage'] = 'yes';
319 Utility::updateOption('fluent_community_features', $featureConfig);
320 }
321
322 $config = array_filter($config);
323 \FluentCommunityPro\App\Modules\CloudStorage\StorageHelper::updateConfig($config);
324
325 return [
326 'message' => __('Storage settings have been updated successfully', 'fluent-community')
327 ];
328 }
329
330 public function getWelcomeBannerSettings(Request $request)
331 {
332 $settings = apply_filters('fluent_community/get_welcome_banner_settings', Helper::getWelcomeBannerSettings(), $request->all());
333
334 return [
335 'settings' => $settings
336 ];
337 }
338
339 public function updateWelcomeBannerSettings(Request $request)
340 {
341 $settings = $request->get('settings', []);
342
343 $settings = CustomSanitizer::sanitizeWelcomeBannerSettings($settings);
344
345 if (Arr::get($settings, 'login.enabled') == 'yes') {
346 $settings['login']['description_rendered'] = wp_kses_post(FeedsHelper::mdToHtml(Arr::get($settings, 'login.description')));
347 }
348
349 if (Arr::get($settings, 'logout.enabled') == 'yes') {
350 $settings['logout']['description_rendered'] = wp_kses_post(FeedsHelper::mdToHtml(Arr::get($settings, 'logout.description')));
351 if (Arr::get($settings, 'logout.buttonLabel') && Arr::get($settings, 'logout.useCustomUrl') != 'yes') {
352 $settings['logout']['buttonLink'] = Helper::getAuthUrl();
353 }
354 }
355
356 $settings = apply_filters('fluent_community/update_welcome_banner_settings', $settings);
357
358 Utility::updateOption('welcome_banner_settings', $settings);
359
360 Utility::setCache('welcome_banner_settings', $settings, WEEK_IN_SECONDS);
361
362 return [
363 'message' => __('Welcome banner settings have been updated successfully', 'fluent-community'),
364 'settings' => $settings
365 ];
366 }
367
368 public function getAuthSettings()
369 {
370 $settings = AuthenticationService::getAuthSettings();
371
372 $settings['login']['form']['fields'] = AuthHelper::getLoginFormFields();
373 $settings['signup']['form']['fields'] = AuthHelper::getFormFields();
374
375 $settings = apply_filters('fluent_community/get_auth_settings', $settings);
376
377 return [
378 'settings' => $settings
379 ];
380 }
381
382 public function getOnBoardingSettings()
383 {
384 $settings = Helper::generalSettings();
385
386 $currentUser = get_user_by('ID', get_current_user_id());
387
388 $settings['has_fluentcrm'] = defined('FLUENTCRM') ? 'yes' : 'no';
389 $settings['has_fluentsmtp'] = defined('FLUENTMAIL_PLUGIN_FILE') ? 'yes' : 'no';
390 $settings['has_fluentcart'] = defined('FLUENTCART_VERSION') ? 'yes' : 'no';
391 $settings['template'] = '';
392 $settings['install_fluentcrm'] = 'yes';
393 $settings['install_fluentsmtp'] = 'yes';
394 $settings['install_fluentcart'] = 'yes';
395 $settings['subscribe_to_newsletter'] = 'yes';
396 $settings['share_data'] = 'no';
397 if ($currentUser) {
398 $settings['user_full_name'] = $currentUser->first_name ? $currentUser->first_name . ' ' . $currentUser->last_name : $currentUser->display_name;
399 $settings['user_email_address'] = $currentUser->user_email;
400 } else {
401 $settings['user_full_name'] = '';
402 $settings['user_email_address'] = '';
403 }
404
405 $data = [
406 'settings' => $settings
407 ];
408 return apply_filters('fluent_community/onboarding_settings_api_response', $data, $this->request->all());
409 }
410
411
412 public function saveOnBoardingSettings(Request $request)
413 {
414 $inputs = $request->get('settings', []);
415 $settings = Helper::generalSettings();
416
417 if (Arr::get($inputs, 'site_title')) {
418 $settings['site_title'] = sanitize_text_field(Arr::get($inputs, 'site_title'));
419 }
420
421 $logo = Arr::get($inputs, 'logo');
422
423 if ($logo) {
424 $media = Helper::getMediaFromUrl($logo);
425 if ($media) {
426 $settings['logo'] = $media->public_url;
427 $media->update([
428 'is_active' => true,
429 'user_id' => get_current_user_id(),
430 'object_source' => 'onboarding'
431 ]);
432 }
433 }
434
435 if (Arr::get($inputs, 'slug') && empty($settings['is_slug_defined'])) {
436 $settings['slug'] = sanitize_title(Arr::get($inputs, 'slug'));
437 }
438 update_option('fluent_community_settings', $settings, 'yes');
439
440 // Email Subscription Settings
441 $subscriptionSettings = array_filter([
442 'user_id' => get_current_user_id(),
443 'subscribe_to_newsletter' => sanitize_text_field(Arr::get($inputs, 'subscribe_to_newsletter', 'no')),
444 'share_data' => sanitize_text_field(Arr::get($inputs, 'share_data', 'no')),
445 'user_full_name' => sanitize_text_field(Arr::get($inputs, 'user_full_name', '')),
446 'user_email_address' => sanitize_email(Arr::get($inputs, 'user_email_address', ''))
447 ]);
448
449 Utility::updateOption('onboarding_sub_settings', $subscriptionSettings);
450 OnboardingService::maybeCreateSpaceTemplates(Arr::get($inputs, 'template'));
451
452 $installableAddons = array_keys(array_filter([
453 'fluent-crm' => Arr::get($inputs, 'install_fluentcrm', 'no') == 'yes',
454 'fluent-smtp' => Arr::get($inputs, 'install_fluentsmtp', 'no') == 'yes',
455 'fluent-cart' => Arr::get($inputs, 'install_fluentcart', 'no') == 'yes',
456 ]));
457
458 // Install Plugins which are checked
459 OnboardingService::installAddons($installableAddons);
460
461 // Maybe Optin User to Newsletter
462 OnboardingService::maybeOptinUserToNewsletter($subscriptionSettings);
463
464 // flash the permalinks
465 flush_rewrite_rules(true);
466
467 return [
468 'message' => __('Onboarding settings have been updated.', 'fluent-community')
469 ];
470 }
471
472 public function changePortalSlug(Request $request)
473 {
474 $newSlug = sanitize_title($request->get('new_slug', ''));
475
476 if (!$newSlug) {
477 return $this->sendError([
478 'message' => __('Slug cannot be empty', 'fluent-community')
479 ]);
480 }
481
482 if (defined('FLUENT_COMMUNITY_PORTAL_SLUG')) {
483 return $this->sendError([
484 'message' => __('You cannot change the slug as it is defined in the config file', 'fluent-community')
485 ]);
486 }
487
488 $settings = Helper::generalSettings();
489
490 if ($settings['slug'] != $newSlug) {
491 $settings['slug'] = $newSlug;
492
493 update_option('fluent_community_settings', $settings);
494 flush_rewrite_rules(true);
495
496 $slug = $settings['slug'];
497 add_rewrite_rule('^' . $slug . '/?$', 'index.php?fcom_route=portal_home', 'top'); // For /hooks
498 add_rewrite_rule('^' . $slug . '/(.+)/?', 'index.php?fcom_route=$matches[1]', 'top');
499 // flush rewrite rules
500 flush_rewrite_rules(true);
501
502 delete_option('rewrite_rules');
503 }
504
505 return [
506 'message' => __('Slug has been changed successfully', 'fluent-community')
507 ];
508 }
509
510 public function getProfileLinkProviders(Request $request)
511 {
512 $data = [
513 'providers' => ProfileHelper::socialLinkProviders()
514 ];
515 return apply_filters('fluent_community/profile_link_providers_api_response', $data, $request->all());
516 }
517
518 public function updateProfileLinkProviders(Request $request)
519 {
520 $providerKeys = array_keys(ProfileHelper::socialLinkProviders());
521 $config = $request->get('configs', []);
522
523 $config = array_filter($config, function ($value) use ($providerKeys) {
524 return in_array($value, $providerKeys);
525 });
526
527 do_action('fluent_community/update_profile_link_providers', $config);
528
529 return [
530 'message' => __('Profile link providers have been updated successfully', 'fluent-community'),
531 ];
532 }
533
534 public function getAllSpaceCourses(Request $request)
535 {
536 $data = [
537 'all_spaces' => BaseSpace::query()->withoutGlobalScopes()
538 ->whereIn('type', ['community', 'course'])
539 ->orderBy('serial', 'ASC')->get()
540 ];
541 return apply_filters('fluent_community/all_space_courses_api_response', $data, $request->all());
542 }
543
544 }
545