123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- <?php
- declare(strict_types=1);
- namespace OCA\Theming\Controller;
- use OCA\Theming\AppInfo\Application;
- use OCA\Theming\ITheme;
- use OCA\Theming\ResponseDefinitions;
- use OCA\Theming\Service\BackgroundService;
- use OCA\Theming\Service\ThemesService;
- use OCA\Theming\ThemingDefaults;
- use OCP\AppFramework\Http;
- use OCP\AppFramework\Http\Attribute\NoAdminRequired;
- use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
- use OCP\AppFramework\Http\DataResponse;
- use OCP\AppFramework\Http\FileDisplayResponse;
- use OCP\AppFramework\Http\JSONResponse;
- use OCP\AppFramework\Http\NotFoundResponse;
- use OCP\AppFramework\Http\Response;
- use OCP\AppFramework\OCS\OCSBadRequestException;
- use OCP\AppFramework\OCS\OCSForbiddenException;
- use OCP\AppFramework\OCSController;
- use OCP\IConfig;
- use OCP\IRequest;
- use OCP\IUserSession;
- use OCP\PreConditionNotMetException;
- class UserThemeController extends OCSController {
- protected ?string $userId = null;
- public function __construct(
- string $appName,
- IRequest $request,
- private IConfig $config,
- IUserSession $userSession,
- private ThemesService $themesService,
- private ThemingDefaults $themingDefaults,
- private BackgroundService $backgroundService,
- ) {
- parent::__construct($appName, $request);
- $user = $userSession->getUser();
- if ($user !== null) {
- $this->userId = $user->getUID();
- }
- }
-
-
- public function enableTheme(string $themeId): DataResponse {
- $theme = $this->validateTheme($themeId);
-
- $this->themesService->enableTheme($theme);
- return new DataResponse();
- }
-
-
- public function disableTheme(string $themeId): DataResponse {
- $theme = $this->validateTheme($themeId);
-
- $this->themesService->disableTheme($theme);
- return new DataResponse();
- }
-
- private function validateTheme(string $themeId): ITheme {
- if ($themeId === '' || !$themeId) {
- throw new OCSBadRequestException('Invalid theme id: ' . $themeId);
- }
- $themes = $this->themesService->getThemes();
- if (!isset($themes[$themeId])) {
- throw new OCSBadRequestException('Invalid theme id: ' . $themeId);
- }
-
- if ($this->config->getSystemValueString('enforce_theme', '') !== ''
- && $themes[$themeId]->getType() === ITheme::TYPE_THEME) {
- throw new OCSForbiddenException('Theme switching is disabled');
- }
- return $themes[$themeId];
- }
-
-
-
- public function getBackground(): Response {
- $file = $this->backgroundService->getBackground();
- if ($file !== null) {
- $response = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => $file->getMimeType()]);
- $response->cacheFor(24 * 60 * 60, false, true);
- return $response;
- }
- return new NotFoundResponse();
- }
-
-
- public function deleteBackground(): JSONResponse {
- $currentVersion = (int)$this->config->getUserValue($this->userId, Application::APP_ID, 'userCacheBuster', '0');
- $this->backgroundService->deleteBackgroundImage();
- return new JSONResponse([
- 'backgroundImage' => null,
- 'backgroundColor' => $this->themingDefaults->getColorBackground(),
- 'primaryColor' => $this->themingDefaults->getColorPrimary(),
- 'version' => $currentVersion,
- ]);
- }
-
-
- public function setBackground(string $type = BackgroundService::BACKGROUND_DEFAULT, string $value = '', ?string $color = null): JSONResponse {
- $currentVersion = (int)$this->config->getUserValue($this->userId, Application::APP_ID, 'userCacheBuster', '0');
-
- if ($color) {
- $this->backgroundService->setColorBackground($color);
- }
-
- try {
- switch ($type) {
- case BackgroundService::BACKGROUND_SHIPPED:
- $this->backgroundService->setShippedBackground($value);
- break;
- case BackgroundService::BACKGROUND_CUSTOM:
- $this->backgroundService->setFileBackground($value);
- break;
- case BackgroundService::BACKGROUND_DEFAULT:
-
- $this->backgroundService->setDefaultBackground();
- break;
- default:
- if (!$color) {
- return new JSONResponse(['error' => 'Invalid type provided'], Http::STATUS_BAD_REQUEST);
- }
- }
- } catch (\InvalidArgumentException $e) {
- return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_BAD_REQUEST);
- } catch (\Throwable $e) {
- return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR);
- }
- $currentVersion++;
- $this->config->setUserValue($this->userId, Application::APP_ID, 'userCacheBuster', (string)$currentVersion);
- return new JSONResponse([
- 'backgroundImage' => $this->config->getUserValue($this->userId, Application::APP_ID, 'background_image', BackgroundService::BACKGROUND_DEFAULT),
- 'backgroundColor' => $this->themingDefaults->getColorBackground(),
- 'primaryColor' => $this->themingDefaults->getColorPrimary(),
- 'version' => $currentVersion,
- ]);
- }
- }
|