]> BookStack Code Mirror - bookstack/blob - app/Settings/AppSettingsStore.php
d830df639c604de305893f14cc0c6ba9d89a507d
[bookstack] / app / Settings / AppSettingsStore.php
1 <?php
2
3 namespace BookStack\Settings;
4
5 use BookStack\Uploads\FaviconHandler;
6 use BookStack\Uploads\ImageRepo;
7 use Illuminate\Http\Request;
8
9 class AppSettingsStore
10 {
11     public function __construct(
12         protected ImageRepo $imageRepo,
13         protected FaviconHandler $faviconHandler,
14     ) {
15     }
16
17     public function storeFromUpdateRequest(Request $request, string $category)
18     {
19         $this->storeSimpleSettings($request);
20         if ($category === 'customization') {
21             $this->updateAppLogo($request);
22             $this->updateAppIcon($request);
23         }
24     }
25
26     protected function updateAppIcon(Request $request): void
27     {
28         $sizes = [180, 128, 64, 32];
29
30         // Update icon image if set
31         if ($request->hasFile('app_icon')) {
32             $iconFile = $request->file('app_icon');
33             $this->destroyExistingSettingImage('app-icon');
34             $image = $this->imageRepo->saveNew($iconFile, 'system', 0, 256, 256);
35             setting()->put('app-icon', $image->url);
36
37             foreach ($sizes as $size) {
38                 $this->destroyExistingSettingImage('app-icon-' . $size);
39                 $icon = $this->imageRepo->saveNew($iconFile, 'system', 0, $size, $size);
40                 setting()->put('app-icon-' . $size, $icon->url);
41             }
42
43             $this->faviconHandler->saveForUploadedImage($iconFile);
44         }
45
46         // Clear icon image if requested
47         if ($request->get('app_icon_reset')) {
48             $this->destroyExistingSettingImage('app-icon');
49             setting()->remove('app-icon');
50             foreach ($sizes as $size) {
51                 $this->destroyExistingSettingImage('app-icon-' . $size);
52                 setting()->remove('app-icon-' . $size);
53             }
54         }
55     }
56
57     protected function updateAppLogo(Request $request): void
58     {
59         // Update logo image if set
60         if ($request->hasFile('app_logo')) {
61             $logoFile = $request->file('app_logo');
62             $this->destroyExistingSettingImage('app-logo');
63             $image = $this->imageRepo->saveNew($logoFile, 'system', 0, null, 86);
64             setting()->put('app-logo', $image->url);
65         }
66
67         // Clear logo image if requested
68         if ($request->get('app_logo_reset')) {
69             $this->destroyExistingSettingImage('app-logo');
70             setting()->remove('app-logo');
71         }
72     }
73
74     protected function storeSimpleSettings(Request $request): void
75     {
76         foreach ($request->all() as $name => $value) {
77             if (strpos($name, 'setting-') !== 0) {
78                 continue;
79             }
80
81             $key = str_replace('setting-', '', trim($name));
82             setting()->put($key, $value);
83         }
84     }
85
86     protected function destroyExistingSettingImage(string $settingKey)
87     {
88         $existingVal = setting()->get($settingKey);
89         if ($existingVal) {
90             $this->imageRepo->destroyByUrlAndType($existingVal, 'system');
91         }
92     }
93 }