]> BookStack Code Mirror - bookstack/blob - app/Settings/AppSettingsStore.php
Integrated favicon handler with correct files & actions
[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             $this->faviconHandler->restoreOriginal();
56         }
57     }
58
59     protected function updateAppLogo(Request $request): void
60     {
61         // Update logo image if set
62         if ($request->hasFile('app_logo')) {
63             $logoFile = $request->file('app_logo');
64             $this->destroyExistingSettingImage('app-logo');
65             $image = $this->imageRepo->saveNew($logoFile, 'system', 0, null, 86);
66             setting()->put('app-logo', $image->url);
67         }
68
69         // Clear logo image if requested
70         if ($request->get('app_logo_reset')) {
71             $this->destroyExistingSettingImage('app-logo');
72             setting()->remove('app-logo');
73         }
74     }
75
76     protected function storeSimpleSettings(Request $request): void
77     {
78         foreach ($request->all() as $name => $value) {
79             if (strpos($name, 'setting-') !== 0) {
80                 continue;
81             }
82
83             $key = str_replace('setting-', '', trim($name));
84             setting()->put($key, $value);
85         }
86     }
87
88     protected function destroyExistingSettingImage(string $settingKey)
89     {
90         $existingVal = setting()->get($settingKey);
91         if ($existingVal) {
92             $this->imageRepo->destroyByUrlAndType($existingVal, 'system');
93         }
94     }
95 }