aboutsummaryrefslogtreecommitdiffstats
path: root/core/Controller/WhatsNewController.php
diff options
context:
space:
mode:
Diffstat (limited to 'core/Controller/WhatsNewController.php')
-rw-r--r--core/Controller/WhatsNewController.php111
1 files changed, 111 insertions, 0 deletions
diff --git a/core/Controller/WhatsNewController.php b/core/Controller/WhatsNewController.php
new file mode 100644
index 00000000000..af8c3d4853b
--- /dev/null
+++ b/core/Controller/WhatsNewController.php
@@ -0,0 +1,111 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OC\Core\Controller;
+
+use OC\CapabilitiesManager;
+use OC\Security\IdentityProof\Manager;
+use OC\Updater\ChangesCheck;
+use OCP\AppFramework\Db\DoesNotExistException;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\Attribute\ApiRoute;
+use OCP\AppFramework\Http\Attribute\NoAdminRequired;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\Defaults;
+use OCP\IConfig;
+use OCP\IRequest;
+use OCP\IUserManager;
+use OCP\IUserSession;
+use OCP\L10N\IFactory;
+use OCP\PreConditionNotMetException;
+use OCP\ServerVersion;
+
+class WhatsNewController extends OCSController {
+ public function __construct(
+ string $appName,
+ IRequest $request,
+ CapabilitiesManager $capabilitiesManager,
+ private IUserSession $userSession,
+ IUserManager $userManager,
+ Manager $keyManager,
+ ServerVersion $serverVersion,
+ private IConfig $config,
+ private ChangesCheck $whatsNewService,
+ private IFactory $langFactory,
+ private Defaults $defaults,
+ ) {
+ parent::__construct($appName, $request, $capabilitiesManager, $userSession, $userManager, $keyManager, $serverVersion);
+ }
+
+ /**
+ * Get the changes
+ *
+ * @return DataResponse<Http::STATUS_OK, array{changelogURL: string, product: string, version: string, whatsNew?: array{regular: list<string>, admin: list<string>}}, array{}>|DataResponse<Http::STATUS_NO_CONTENT, list<empty>, array{}>
+ *
+ * 200: Changes returned
+ * 204: No changes
+ */
+ #[NoAdminRequired]
+ #[ApiRoute(verb: 'GET', url: '/whatsnew', root: '/core')]
+ public function get():DataResponse {
+ $user = $this->userSession->getUser();
+ if ($user === null) {
+ throw new \RuntimeException('Acting user cannot be resolved');
+ }
+ $lastRead = $this->config->getUserValue($user->getUID(), 'core', 'whatsNewLastRead', 0);
+ $currentVersion = $this->whatsNewService->normalizeVersion($this->config->getSystemValue('version'));
+
+ if (version_compare($lastRead, $currentVersion, '>=')) {
+ return new DataResponse([], Http::STATUS_NO_CONTENT);
+ }
+
+ try {
+ $iterator = $this->langFactory->getLanguageIterator();
+ $whatsNew = $this->whatsNewService->getChangesForVersion($currentVersion);
+ $resultData = [
+ 'changelogURL' => $whatsNew['changelogURL'],
+ 'product' => $this->defaults->getProductName(),
+ 'version' => $currentVersion,
+ ];
+ do {
+ $lang = $iterator->current();
+ if (isset($whatsNew['whatsNew'][$lang])) {
+ $resultData['whatsNew'] = $whatsNew['whatsNew'][$lang];
+ break;
+ }
+ $iterator->next();
+ } while ($lang !== 'en' && $iterator->valid());
+ return new DataResponse($resultData);
+ } catch (DoesNotExistException $e) {
+ return new DataResponse([], Http::STATUS_NO_CONTENT);
+ }
+ }
+
+ /**
+ * Dismiss the changes
+ *
+ * @param string $version Version to dismiss the changes for
+ *
+ * @return DataResponse<Http::STATUS_OK, list<empty>, array{}>
+ * @throws PreConditionNotMetException
+ * @throws DoesNotExistException
+ *
+ * 200: Changes dismissed
+ */
+ #[NoAdminRequired]
+ #[ApiRoute(verb: 'POST', url: '/whatsnew', root: '/core')]
+ public function dismiss(string $version):DataResponse {
+ $user = $this->userSession->getUser();
+ if ($user === null) {
+ throw new \RuntimeException('Acting user cannot be resolved');
+ }
+ $version = $this->whatsNewService->normalizeVersion($version);
+ // checks whether it's a valid version, throws an Exception otherwise
+ $this->whatsNewService->getChangesForVersion($version);
+ $this->config->setUserValue($user->getUID(), 'core', 'whatsNewLastRead', $version);
+ return new DataResponse();
+ }
+}