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

555 lines 20.8 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 if (!empty($settings['login']['description'])) {
344 $description = wp_unslash($settings['login']['description']);
345 $settings['login']['description'] = CustomSanitizer::unslashMarkdown($description);
346 }
347
348 if (!empty($settings['logout']['description'])) {
349 $description = wp_unslash($settings['logout']['description']);
350 $settings['logout']['description'] = CustomSanitizer::unslashMarkdown($description);
351 }
352
353 $settings = CustomSanitizer::sanitizeWelcomeBannerSettings($settings);
354
355 if (Arr::get($settings, 'login.enabled') == 'yes') {
356 $settings['login']['description_rendered'] = wp_kses_post(FeedsHelper::mdToHtml(Arr::get($settings, 'login.description')));
357 }
358
359 if (Arr::get($settings, 'logout.enabled') == 'yes') {
360 $settings['logout']['description_rendered'] = wp_kses_post(FeedsHelper::mdToHtml(Arr::get($settings, 'logout.description')));
361 if (Arr::get($settings, 'logout.buttonLabel') && Arr::get($settings, 'logout.useCustomUrl') != 'yes') {
362 $settings['logout']['buttonLink'] = Helper::getAuthUrl();
363 }
364 }
365
366 $settings = apply_filters('fluent_community/update_welcome_banner_settings', $settings);
367
368 Utility::updateOption('welcome_banner_settings', $settings);
369
370 Utility::setCache('welcome_banner_settings', $settings, WEEK_IN_SECONDS);
371
372 return [
373 'message' => __('Welcome banner settings have been updated successfully', 'fluent-community'),
374 'settings' => $settings
375 ];
376 }
377
378 public function getAuthSettings()
379 {
380 $settings = AuthenticationService::getAuthSettings();
381
382 $settings['login']['form']['fields'] = AuthHelper::getLoginFormFields();
383 $settings['signup']['form']['fields'] = AuthHelper::getFormFields();
384
385 $settings = apply_filters('fluent_community/get_auth_settings', $settings);
386
387 return [
388 'settings' => $settings
389 ];
390 }
391
392 public function getOnBoardingSettings()
393 {
394 $settings = Helper::generalSettings();
395
396 $currentUser = get_user_by('ID', get_current_user_id());
397
398 $settings['has_fluentcrm'] = defined('FLUENTCRM') ? 'yes' : 'no';
399 $settings['has_fluentsmtp'] = defined('FLUENTMAIL_PLUGIN_FILE') ? 'yes' : 'no';
400 $settings['has_fluentcart'] = defined('FLUENTCART_VERSION') ? 'yes' : 'no';
401 $settings['template'] = '';
402 $settings['install_fluentcrm'] = 'yes';
403 $settings['install_fluentsmtp'] = 'yes';
404 $settings['install_fluentcart'] = 'yes';
405 $settings['subscribe_to_newsletter'] = 'yes';
406 $settings['share_data'] = 'no';
407 if ($currentUser) {
408 $settings['user_full_name'] = $currentUser->first_name ? $currentUser->first_name . ' ' . $currentUser->last_name : $currentUser->display_name;
409 $settings['user_email_address'] = $currentUser->user_email;
410 } else {
411 $settings['user_full_name'] = '';
412 $settings['user_email_address'] = '';
413 }
414
415 $data = [
416 'settings' => $settings
417 ];
418 return apply_filters('fluent_community/onboarding_settings_api_response', $data, $this->request->all());
419 }
420
421
422 public function saveOnBoardingSettings(Request $request)
423 {
424 $inputs = $request->get('settings', []);
425 $settings = Helper::generalSettings();
426
427 if (Arr::get($inputs, 'site_title')) {
428 $settings['site_title'] = sanitize_text_field(Arr::get($inputs, 'site_title'));
429 }
430
431 $logo = Arr::get($inputs, 'logo');
432
433 if ($logo) {
434 $media = Helper::getMediaFromUrl($logo);
435 if ($media) {
436 $settings['logo'] = $media->public_url;
437 $media->update([
438 'is_active' => true,
439 'user_id' => get_current_user_id(),
440 'object_source' => 'onboarding'
441 ]);
442 }
443 }
444
445 if (Arr::get($inputs, 'slug') && empty($settings['is_slug_defined'])) {
446 $settings['slug'] = sanitize_title(Arr::get($inputs, 'slug'));
447 }
448 update_option('fluent_community_settings', $settings, 'yes');
449
450 // Email Subscription Settings
451 $subscriptionSettings = array_filter([
452 'user_id' => get_current_user_id(),
453 'subscribe_to_newsletter' => sanitize_text_field(Arr::get($inputs, 'subscribe_to_newsletter', 'no')),
454 'share_data' => sanitize_text_field(Arr::get($inputs, 'share_data', 'no')),
455 'user_full_name' => sanitize_text_field(Arr::get($inputs, 'user_full_name', '')),
456 'user_email_address' => sanitize_email(Arr::get($inputs, 'user_email_address', ''))
457 ]);
458
459 Utility::updateOption('onboarding_sub_settings', $subscriptionSettings);
460 OnboardingService::maybeCreateSpaceTemplates(Arr::get($inputs, 'template'));
461
462 $installableAddons = array_keys(array_filter([
463 'fluent-crm' => Arr::get($inputs, 'install_fluentcrm', 'no') == 'yes',
464 'fluent-smtp' => Arr::get($inputs, 'install_fluentsmtp', 'no') == 'yes',
465 'fluent-cart' => Arr::get($inputs, 'install_fluentcart', 'no') == 'yes',
466 ]));
467
468 // Install Plugins which are checked
469 OnboardingService::installAddons($installableAddons);
470
471 // Maybe Optin User to Newsletter
472 OnboardingService::maybeOptinUserToNewsletter($subscriptionSettings);
473
474 // flash the permalinks
475 flush_rewrite_rules(true);
476
477 return [
478 'message' => __('Onboarding settings have been updated.', 'fluent-community')
479 ];
480 }
481
482 public function changePortalSlug(Request $request)
483 {
484 $newSlug = sanitize_title($request->get('new_slug', ''));
485
486 if (!$newSlug) {
487 return $this->sendError([
488 'message' => __('Slug cannot be empty', 'fluent-community')
489 ]);
490 }
491
492 if (defined('FLUENT_COMMUNITY_PORTAL_SLUG')) {
493 return $this->sendError([
494 'message' => __('You cannot change the slug as it is defined in the config file', 'fluent-community')
495 ]);
496 }
497
498 $settings = Helper::generalSettings();
499
500 if ($settings['slug'] != $newSlug) {
501 $settings['slug'] = $newSlug;
502
503 update_option('fluent_community_settings', $settings);
504 flush_rewrite_rules(true);
505
506 $slug = $settings['slug'];
507 add_rewrite_rule('^' . $slug . '/?$', 'index.php?fcom_route=portal_home', 'top'); // For /hooks
508 add_rewrite_rule('^' . $slug . '/(.+)/?', 'index.php?fcom_route=$matches[1]', 'top');
509 // flush rewrite rules
510 flush_rewrite_rules(true);
511
512 delete_option('rewrite_rules');
513 }
514
515 return [
516 'message' => __('Slug has been changed successfully', 'fluent-community')
517 ];
518 }
519
520 public function getProfileLinkProviders(Request $request)
521 {
522 $data = [
523 'providers' => ProfileHelper::socialLinkProviders()
524 ];
525 return apply_filters('fluent_community/profile_link_providers_api_response', $data, $request->all());
526 }
527
528 public function updateProfileLinkProviders(Request $request)
529 {
530 $providerKeys = array_keys(ProfileHelper::socialLinkProviders());
531 $config = $request->get('configs', []);
532
533 $config = array_filter($config, function ($value) use ($providerKeys) {
534 return in_array($value, $providerKeys);
535 });
536
537 do_action('fluent_community/update_profile_link_providers', $config);
538
539 return [
540 'message' => __('Profile link providers have been updated successfully', 'fluent-community'),
541 ];
542 }
543
544 public function getAllSpaceCourses(Request $request)
545 {
546 $data = [
547 'all_spaces' => BaseSpace::query()->withoutGlobalScopes()
548 ->whereIn('type', ['community', 'course'])
549 ->orderBy('serial', 'ASC')->get()
550 ];
551 return apply_filters('fluent_community/all_space_courses_api_response', $data, $request->all());
552 }
553
554 }
555