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

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

594 lines 22.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\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 ];
222
223 return apply_filters('fluent_community/push_settings_api_response', $data, $request->all());
224 }
225
226 public function savePushSettings(Request $request)
227 {
228 $prevSettings = Utility::getPushNotificationSettings();
229
230 $settings = Arr::only((array)$request->get('settings', []), array_keys($prevSettings));
231 $settings = wp_parse_args($settings, $prevSettings);
232
233 foreach ($settings as $key => $value) {
234 if ($key === 'prompt_placements') {
235 $settings[$key] = array_values(array_intersect(
236 array_map('sanitize_text_field', (array)$value),
237 PushNotificationModule::PROMPT_PLACEMENTS
238 ));
239 } else {
240 $settings[$key] = $value === 'yes' ? 'yes' : 'no';
241 }
242 }
243
244 Utility::updateOption('global_push_settings', $settings);
245
246 return [
247 'push_settings' => $settings,
248 'message' => __('Push notification settings have been updated', 'fluent-community')
249 ];
250 }
251
252 public function getStorageSettings(Request $request)
253 {
254 if (!defined('FLUENT_COMMUNITY_PRO')) {
255 $config = [
256 'driver' => 'local'
257 ];
258 } else {
259 $config = \FluentCommunityPro\App\Modules\CloudStorage\StorageHelper::getConfig('view');
260 }
261
262 return apply_filters('fluent_community/storage_settings_response', [
263 'config' => $config
264 ], $request->all());
265 }
266
267 public function updateStorageSettings(Request $request)
268 {
269 if (!defined('FLUENT_COMMUNITY_PRO')) {
270 return $this->sendError([
271 'message' => __('Sorry, you cannot update this config. Please activate pro', 'fluent-community')
272 ]);
273 }
274
275 if (defined('FLUENT_COMMUNITY_CLOUD_STORAGE') && FLUENT_COMMUNITY_CLOUD_STORAGE) {
276 return $this->sendError([
277 'message' => __('You cannot update the storage settings as it is defined in the config file', 'fluent-community')
278 ]);
279 }
280
281 $config = (array)$request->get('config', []);
282
283 $driver = Arr::get($config, 'driver', 'local');
284
285 $validation = [
286 'driver' => 'required'
287 ];
288
289 $isRemote = in_array($driver, ['amazon_s3', 'bunny_cdn', 'cloudflare_r2']);
290
291 if ($driver == 'cloudflare_r2') {
292 $validation = [
293 'driver' => 'required',
294 'access_key' => 'required',
295 'secret_key' => 'required',
296 'public_url' => 'required|url',
297 'endpoint_url' => 'required|url',
298 ];
299 } else if ($driver == 'amazon_s3') {
300 $validation = [
301 'driver' => 'required',
302 'access_key' => 'required',
303 'secret_key' => 'required',
304 'bucket' => 'required'
305 ];
306 } else if ($driver == 'bunny_cdn') {
307 $validation = [
308 'driver' => 'required',
309 'access_key' => 'required',
310 's3_endpoint' => 'required',
311 'bucket' => 'required',
312 'public_url' => 'required|url'
313 ];
314 }
315
316 $this->validate($config, $validation);
317
318 if ($isRemote) {
319 $previousConfig = \FluentCommunityPro\App\Modules\CloudStorage\StorageHelper::getConfig();
320 if ($config['access_key'] == 'FCOM_ENCRYPTED_DATA_KEY') {
321 $config['access_key'] = Arr::get($previousConfig, 'access_key');
322 }
323
324 if ($config['secret_key'] == 'FCOM_ENCRYPTED_DATA_KEY') {
325 $config['secret_key'] = Arr::get($previousConfig, 'secret_key');
326 }
327
328 $driver = (new \FluentCommunityPro\App\Modules\CloudStorage\CloudStorageModule)->getConnectionDriver($config);
329
330 if (!$driver) {
331 return $this->sendError([
332 'message' => __('Could not connect to the remote storage service. Please check your credentials', 'fluent-community')
333 ]);
334 }
335
336 $test = $driver->testConnection();
337 if (!$test || is_wp_error($test)) {
338 $errorMessage = is_wp_error($test) ? $test->get_error_message() : 'Unknown Error';
339 return $this->sendError([
340 'message' => __('Could not connect to the remote storage service. Error: ', 'fluent-community') . $errorMessage
341 ]);
342 }
343 }
344
345 $config = Arr::only($config, [
346 'driver',
347 'access_key',
348 'secret_key',
349 'bucket',
350 'public_url',
351 'endpoint_url',
352 'account_id',
353 'sub_folder',
354 's3_endpoint'
355 ]);
356
357 if ($config['driver'] == 'local') {
358 $config = [
359 'driver' => 'local'
360 ];
361
362 $featureConfig = Utility::getFeaturesConfig();
363 $featureConfig['cloud_storage'] = 'no';
364 Utility::updateOption('fluent_community_features', $featureConfig);
365 } else {
366 $featureConfig = Utility::getFeaturesConfig();
367 $featureConfig['cloud_storage'] = 'yes';
368 Utility::updateOption('fluent_community_features', $featureConfig);
369 }
370
371 $config = array_filter($config);
372 \FluentCommunityPro\App\Modules\CloudStorage\StorageHelper::updateConfig($config);
373
374 return [
375 'message' => __('Storage settings have been updated successfully', 'fluent-community')
376 ];
377 }
378
379 public function getWelcomeBannerSettings(Request $request)
380 {
381 $settings = apply_filters('fluent_community/get_welcome_banner_settings', Helper::getWelcomeBannerSettings(), $request->all());
382
383 return [
384 'settings' => $settings
385 ];
386 }
387
388 public function updateWelcomeBannerSettings(Request $request)
389 {
390 $settings = $request->get('settings', []);
391
392 $settings = CustomSanitizer::sanitizeWelcomeBannerSettings($settings);
393
394 if (Arr::get($settings, 'login.enabled') == 'yes') {
395 $settings['login']['description_rendered'] = wp_kses_post(FeedsHelper::mdToHtml(Arr::get($settings, 'login.description')));
396 }
397
398 if (Arr::get($settings, 'logout.enabled') == 'yes') {
399 $settings['logout']['description_rendered'] = wp_kses_post(FeedsHelper::mdToHtml(Arr::get($settings, 'logout.description')));
400 if (Arr::get($settings, 'logout.buttonLabel') && Arr::get($settings, 'logout.useCustomUrl') != 'yes') {
401 $settings['logout']['buttonLink'] = Helper::getAuthUrl();
402 }
403 }
404
405 $settings = apply_filters('fluent_community/update_welcome_banner_settings', $settings);
406
407 Utility::updateOption('welcome_banner_settings', $settings);
408
409 Utility::setCache('welcome_banner_settings', $settings, WEEK_IN_SECONDS);
410
411 return [
412 'message' => __('Welcome banner settings have been updated successfully', 'fluent-community'),
413 'settings' => $settings
414 ];
415 }
416
417 public function getAuthSettings()
418 {
419 $settings = AuthenticationService::getAuthSettings();
420
421 $settings['login']['form']['fields'] = AuthHelper::getLoginFormFields();
422 $settings['signup']['form']['fields'] = AuthHelper::getFormFields();
423
424 $settings = apply_filters('fluent_community/get_auth_settings', $settings);
425
426 return [
427 'settings' => $settings
428 ];
429 }
430
431 public function getOnBoardingSettings()
432 {
433 $settings = Helper::generalSettings();
434
435 $currentUser = get_user_by('ID', get_current_user_id());
436
437 $settings['has_fluentcrm'] = defined('FLUENTCRM') ? 'yes' : 'no';
438 $settings['has_fluentsmtp'] = defined('FLUENTMAIL_PLUGIN_FILE') ? 'yes' : 'no';
439 $settings['has_fluentcart'] = defined('FLUENTCART_VERSION') ? 'yes' : 'no';
440 $settings['template'] = '';
441 $settings['install_fluentcrm'] = 'yes';
442 $settings['install_fluentsmtp'] = 'yes';
443 $settings['install_fluentcart'] = 'yes';
444 $settings['subscribe_to_newsletter'] = 'yes';
445 $settings['share_data'] = 'no';
446 if ($currentUser) {
447 $settings['user_full_name'] = $currentUser->first_name ? $currentUser->first_name . ' ' . $currentUser->last_name : $currentUser->display_name;
448 $settings['user_email_address'] = $currentUser->user_email;
449 } else {
450 $settings['user_full_name'] = '';
451 $settings['user_email_address'] = '';
452 }
453
454 $data = [
455 'settings' => $settings
456 ];
457 return apply_filters('fluent_community/onboarding_settings_api_response', $data, $this->request->all());
458 }
459
460
461 public function saveOnBoardingSettings(Request $request)
462 {
463 $inputs = $request->get('settings', []);
464 $settings = Helper::generalSettings();
465
466 if (Arr::get($inputs, 'site_title')) {
467 $settings['site_title'] = sanitize_text_field(Arr::get($inputs, 'site_title'));
468 }
469
470 $logo = Arr::get($inputs, 'logo');
471
472 if ($logo) {
473 $media = Helper::getMediaFromUrl($logo);
474 if ($media) {
475 $settings['logo'] = $media->public_url;
476 $media->update([
477 'is_active' => true,
478 'user_id' => get_current_user_id(),
479 'object_source' => 'onboarding'
480 ]);
481 }
482 }
483
484 if (Arr::get($inputs, 'slug') && empty($settings['is_slug_defined'])) {
485 $settings['slug'] = sanitize_title(Arr::get($inputs, 'slug'));
486 }
487 update_option('fluent_community_settings', $settings, true);
488
489 // Email Subscription Settings
490 $subscriptionSettings = array_filter([
491 'user_id' => get_current_user_id(),
492 'subscribe_to_newsletter' => sanitize_text_field(Arr::get($inputs, 'subscribe_to_newsletter', 'no')),
493 'share_data' => sanitize_text_field(Arr::get($inputs, 'share_data', 'no')),
494 'user_full_name' => sanitize_text_field(Arr::get($inputs, 'user_full_name', '')),
495 'user_email_address' => sanitize_email(Arr::get($inputs, 'user_email_address', ''))
496 ]);
497
498 Utility::updateOption('onboarding_sub_settings', $subscriptionSettings);
499 OnboardingService::maybeCreateSpaceTemplates(Arr::get($inputs, 'template'));
500
501 $installableAddons = array_keys(array_filter([
502 'fluent-crm' => Arr::get($inputs, 'install_fluentcrm', 'no') == 'yes',
503 'fluent-smtp' => Arr::get($inputs, 'install_fluentsmtp', 'no') == 'yes',
504 'fluent-cart' => Arr::get($inputs, 'install_fluentcart', 'no') == 'yes',
505 ]));
506
507 // Install Plugins which are checked
508 OnboardingService::installAddons($installableAddons);
509
510 // Maybe Optin User to Newsletter
511 OnboardingService::maybeOptinUserToNewsletter($subscriptionSettings);
512
513 // flash the permalinks
514 flush_rewrite_rules(true);
515
516 return [
517 'message' => __('Onboarding settings have been updated.', 'fluent-community')
518 ];
519 }
520
521 public function changePortalSlug(Request $request)
522 {
523 $newSlug = sanitize_title($request->get('new_slug', ''));
524
525 if (!$newSlug) {
526 return $this->sendError([
527 'message' => __('Slug cannot be empty', 'fluent-community')
528 ]);
529 }
530
531 if (defined('FLUENT_COMMUNITY_PORTAL_SLUG')) {
532 return $this->sendError([
533 'message' => __('You cannot change the slug as it is defined in the config file', 'fluent-community')
534 ]);
535 }
536
537 $settings = Helper::generalSettings();
538
539 if ($settings['slug'] != $newSlug) {
540 $settings['slug'] = $newSlug;
541
542 update_option('fluent_community_settings', $settings);
543 flush_rewrite_rules(true);
544
545 $slug = $settings['slug'];
546 add_rewrite_rule('^' . $slug . '/?$', 'index.php?fcom_route=portal_home', 'top'); // For /hooks
547 add_rewrite_rule('^' . $slug . '/(.+)/?', 'index.php?fcom_route=$matches[1]', 'top');
548 // flush rewrite rules
549 flush_rewrite_rules(true);
550
551 delete_option('rewrite_rules');
552 }
553
554 return [
555 'message' => __('Slug has been changed successfully', 'fluent-community')
556 ];
557 }
558
559 public function getProfileLinkProviders(Request $request)
560 {
561 $data = [
562 'providers' => ProfileHelper::socialLinkProviders()
563 ];
564 return apply_filters('fluent_community/profile_link_providers_api_response', $data, $request->all());
565 }
566
567 public function updateProfileLinkProviders(Request $request)
568 {
569 $providerKeys = array_keys(ProfileHelper::socialLinkProviders());
570 $config = $request->get('configs', []);
571
572 $config = array_filter($config, function ($value) use ($providerKeys) {
573 return in_array($value, $providerKeys);
574 });
575
576 do_action('fluent_community/update_profile_link_providers', $config);
577
578 return [
579 'message' => __('Profile link providers have been updated successfully', 'fluent-community'),
580 ];
581 }
582
583 public function getAllSpaceCourses(Request $request)
584 {
585 $data = [
586 'all_spaces' => BaseSpace::query()->withoutGlobalScopes()
587 ->whereIn('type', ['community', 'course'])
588 ->orderBy('serial', 'ASC')->get()
589 ];
590 return apply_filters('fluent_community/all_space_courses_api_response', $data, $request->all());
591 }
592
593 }
594