summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/Controller/WhatsNewController.php117
-rw-r--r--core/js/core.json1
-rw-r--r--core/js/merged-template-prepend.json1
-rw-r--r--core/js/public/whatsnew.js54
-rw-r--r--core/routes.php2
5 files changed, 175 insertions, 0 deletions
diff --git a/core/Controller/WhatsNewController.php b/core/Controller/WhatsNewController.php
new file mode 100644
index 00000000000..d3331651693
--- /dev/null
+++ b/core/Controller/WhatsNewController.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+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\DataResponse;
+use OCP\IConfig;
+use OCP\IRequest;
+use OCP\IUserManager;
+use OCP\IUserSession;
+use OCP\L10N\IFactory;
+
+class WhatsNewController extends OCSController {
+
+ /** @var IConfig */
+ protected $config;
+ /** @var IUserSession */
+ private $userSession;
+ /** @var ChangesCheck */
+ private $whatsNewService;
+ /** @var IFactory */
+ private $langFactory;
+
+ public function __construct(
+ string $appName,
+ IRequest $request,
+ CapabilitiesManager $capabilitiesManager,
+ IUserSession $userSession,
+ IUserManager $userManager,
+ Manager $keyManager,
+ IConfig $config,
+ ChangesCheck $whatsNewService,
+ IFactory $langFactory
+ ) {
+ parent::__construct($appName, $request, $capabilitiesManager, $userSession, $userManager, $keyManager);
+ $this->config = $config;
+ $this->userSession = $userSession;
+ $this->whatsNewService = $whatsNewService;
+ $this->langFactory = $langFactory;
+ }
+
+ /**
+ * @NoAdminRequired
+ */
+ 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']];
+ 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);
+ }
+ }
+
+ /**
+ * @NoAdminRequired
+ *
+ * @throws \OCP\PreConditionNotMetException
+ * @throws DoesNotExistException
+ */
+ 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();
+ }
+}
diff --git a/core/js/core.json b/core/js/core.json
index 41b927147b6..502e3a57976 100644
--- a/core/js/core.json
+++ b/core/js/core.json
@@ -48,6 +48,7 @@
"public/appconfig.js",
"public/comments.js",
"public/publicpage.js",
+ "public/whatsnew.js",
"multiselect.js",
"oc-requesttoken.js",
"setupchecks.js",
diff --git a/core/js/merged-template-prepend.json b/core/js/merged-template-prepend.json
index f4ef511bc78..c274201d97e 100644
--- a/core/js/merged-template-prepend.json
+++ b/core/js/merged-template-prepend.json
@@ -7,6 +7,7 @@
"eventsource.js",
"public/appconfig.js",
"public/comments.js",
+ "public/whatsnew.js",
"config.js",
"oc-requesttoken.js",
"apps.js",
diff --git a/core/js/public/whatsnew.js b/core/js/public/whatsnew.js
new file mode 100644
index 00000000000..dc5862e8572
--- /dev/null
+++ b/core/js/public/whatsnew.js
@@ -0,0 +1,54 @@
+/**
+ * @copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ */
+
+(function(OCP) {
+ "use strict";
+
+ OCP.WhatsNew = {
+
+ query: function(options) {
+ options = options || {};
+ $.ajax({
+ type: 'GET',
+ url: options.url || OC.linkToOCS('core', 2) + 'whatsnew?format=json',
+ success: options.success || this._onQuerySuccess,
+ error: options.error || this._onQueryError
+ });
+ },
+
+ dismiss: function(version, options) {
+ options = options || {};
+ $.ajax({
+ type: 'POST',
+ url: options.url || OC.linkToOCS('core', 2) + 'whatsnew',
+ data: {version: encodeURIComponent(version)},
+ success: options.success || this._onDismissSuccess,
+ error: options.error || this._onDismissError
+ });
+ },
+
+ _onQuerySuccess: function(data, statusText) {
+ console.debug('querying Whats New data was successful: ' + data || statusText);
+ console.debug(data);
+ },
+
+ _onQueryError: function (o, t, e) {
+ console.debug(o);
+ console.debug('querying Whats New Data resulted in an error: ' + t +e);
+ },
+
+ _onDismissSuccess: function(data) {
+ console.debug('dismissing Whats New data was successful: ' + data);
+ },
+
+ _onDismissError: function (data) {
+ console.debug('dismissing Whats New data resulted in an error: ' + data);
+ }
+ };
+})(OCP);
diff --git a/core/routes.php b/core/routes.php
index 90282c5ebf7..c5df3a362f5 100644
--- a/core/routes.php
+++ b/core/routes.php
@@ -76,6 +76,8 @@ $application->registerRoutes($this, [
['root' => '/core', 'name' => 'Navigation#getAppsNavigation', 'url' => '/navigation/apps', 'verb' => 'GET'],
['root' => '/core', 'name' => 'Navigation#getSettingsNavigation', 'url' => '/navigation/settings', 'verb' => 'GET'],
['root' => '/core', 'name' => 'AutoComplete#get', 'url' => '/autocomplete/get', 'verb' => 'GET'],
+ ['root' => '/core', 'name' => 'WhatsNew#get', 'url' => '/whatsnew', 'verb' => 'GET'],
+ ['root' => '/core', 'name' => 'WhatsNew#dismiss', 'url' => '/whatsnew', 'verb' => 'POST'],
],
]);