]> BookStack Code Mirror - bookstack/blob - app/Settings/AppSettingsStore.php
Added ability to control app icon (favicon) via settings
[bookstack] / app / Settings / AppSettingsStore.php
1 <?php
2
3 namespace BookStack\Settings;
4
5 use BookStack\Uploads\ImageRepo;
6 use Illuminate\Http\Request;
7
8 class AppSettingsStore
9 {
10     protected ImageRepo $imageRepo;
11
12     public function __construct(ImageRepo $imageRepo)
13     {
14         $this->imageRepo = $imageRepo;
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 = [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                 $icon = $this->imageRepo->saveNew($iconFile, 'system', 0, $size, $size);
39                 setting()->put('app-icon-' . $size, $icon->url);
40             }
41         }
42
43         // Clear icon image if requested
44         if ($request->get('app_icon_reset')) {
45             $this->destroyExistingSettingImage('app-icon');
46             setting()->remove('app-icon');
47             foreach ($sizes as $size) {
48                 $this->destroyExistingSettingImage('app-icon-' . $size);
49                 setting()->remove('app-icon-' . $size);
50             }
51         }
52     }
53
54     protected function updateAppLogo(Request $request): void
55     {
56         // Update logo image if set
57         if ($request->hasFile('app_logo')) {
58             $logoFile = $request->file('app_logo');
59             $this->destroyExistingSettingImage('app-logo');
60             $image = $this->imageRepo->saveNew($logoFile, 'system', 0, null, 86);
61             setting()->put('app-logo', $image->url);
62         }
63
64         // Clear logo image if requested
65         if ($request->get('app_logo_reset')) {
66             $this->destroyExistingSettingImage('app-logo');
67             setting()->remove('app-logo');
68         }
69     }
70
71     protected function storeSimpleSettings(Request $request): void
72     {
73         foreach ($request->all() as $name => $value) {
74             if (strpos($name, 'setting-') !== 0) {
75                 continue;
76             }
77
78             $key = str_replace('setting-', '', trim($name));
79             setting()->put($key, $value);
80         }
81     }
82
83     protected function destroyExistingSettingImage(string $settingKey)
84     {
85         $existingVal = setting()->get($settingKey);
86         if ($existingVal) {
87             $this->imageRepo->destroyByUrlAndType($existingVal, 'system');
88         }
89     }
90 }