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

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