summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Molenaar <sean@seanmolenaar.eu>2020-11-10 13:18:13 +0100
committerBenjamin Brahmer <info@b-brahmer.de>2020-11-10 16:47:42 +0100
commit7effe4654b8243e0ca4dd9c4fa13ac53203c28b2 (patch)
tree1020b36cbd81c225bfeab8c758fa4be6eb6c298c
parent5bdc2df7f484f6618919a63247045027d43b78f7 (diff)
Unremove but deprecate User API
Signed-off-by: Sean Molenaar <sean@seanmolenaar.eu>
-rw-r--r--CHANGELOG.md1
-rw-r--r--appinfo/routes.php2
-rw-r--r--docs/externalapi/Legacy.md2
-rw-r--r--lib/Controller/UserApiController.php54
-rw-r--r--tests/Integration/IntegrationTest.php6
-rw-r--r--tests/Unit/Controller/UserApiControllerTest.php149
6 files changed, 208 insertions, 6 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 06467b26e..6ca5b1cb2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file.
- Remove deprecated YouTube playlist API
- Locale-aware sorting for folders and feeds
- Fix empty unread item count
+- Deprecate User API: https://github.com/nextcloud/news/blob/master/docs/externalapi/Legacy.md#user
## 15.1.0-rc1
diff --git a/appinfo/routes.php b/appinfo/routes.php
index 36ed97b10..7bf843cb2 100644
--- a/appinfo/routes.php
+++ b/appinfo/routes.php
@@ -59,6 +59,8 @@ return ['routes' => [
['name' => 'api#index', 'url' => '/api', 'verb' => 'GET'],
// API 1.2
+['name' => 'user_api#index', 'url' => '/api/v1-2/user', 'verb' => 'GET'],
+['name' => 'user_api#avatar', 'url' => '/api/v1-2/user/avatar', 'verb' => 'GET'],
['name' => 'utility_api#version', 'url' => '/api/v1-2/version', 'verb' => 'GET'],
['name' => 'utility_api#status', 'url' => '/api/v1-2/status', 'verb' => 'GET'],
['name' => 'utility_api#before_update', 'url' => '/api/v1-2/cleanup/before-update', 'verb' => 'GET'],
diff --git a/docs/externalapi/Legacy.md b/docs/externalapi/Legacy.md
index e5df7a8e1..839502d99 100644
--- a/docs/externalapi/Legacy.md
+++ b/docs/externalapi/Legacy.md
@@ -759,6 +759,8 @@ If **incorrectDbCharset** is true you should display a warning that database cha
This API can be used to retrieve metadata about the current user.
DEPRECATED: This API is deprecated, use the Nextcloud APIs instead.
+- https://docs.nextcloud.com/server/latest/developer_manual/client_apis/OCS/ocs-api-overview.html#user-metadata for user data
+- `https://nc.url/avatar/{userid}/{size}?v={1|2}` for the avatar
## Get the status
diff --git a/lib/Controller/UserApiController.php b/lib/Controller/UserApiController.php
new file mode 100644
index 000000000..f5137992d
--- /dev/null
+++ b/lib/Controller/UserApiController.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Nextcloud - News
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ *
+ * @author Alessandro Cosentino <cosenal@gmail.com>
+ * @author Bernhard Posselt <dev@bernhard-posselt.com>
+ * @author David Guillot <david@guillot.me>
+ * @copyright 2012 Alessandro Cosentino
+ * @copyright 2012-2014 Bernhard Posselt
+ * @copyright 2018 David Guillot
+ */
+
+namespace OCA\News\Controller;
+
+use \OCP\IRequest;
+use \OCP\IUserSession;
+use \OCP\IURLGenerator;
+use \OCP\Files\IRootFolder;
+use \OCP\AppFramework\Http;
+
+class UserApiController extends ApiController
+{
+ public function __construct(
+ string $appName,
+ IRequest $request,
+ IUserSession $userSession
+ ) {
+ parent::__construct($appName, $request, $userSession);
+ }
+
+ /**
+ * @NoAdminRequired
+ * @NoCSRFRequired
+ * @CORS
+ *
+ * @deprecated Should use https://docs.nextcloud.com/server/latest/developer_manual/client_apis/OCS/ocs-api-overview.html#user-metadata
+ * and avatar is `https://nc.url/avatar/{userid}/{size}?v={1|2}`
+ */
+ public function index(): array
+ {
+ $user = $this->getUser();
+ $avatar = null;
+
+ return [
+ 'userId' => $user->getUID(),
+ 'displayName' => $user->getDisplayName(),
+ 'lastLoginTimestamp' => $user->getLastLogin(),
+ 'avatar' => $avatar
+ ];
+ }
+}
diff --git a/tests/Integration/IntegrationTest.php b/tests/Integration/IntegrationTest.php
index f943e2940..6ecc3404c 100644
--- a/tests/Integration/IntegrationTest.php
+++ b/tests/Integration/IntegrationTest.php
@@ -12,15 +12,11 @@
namespace OCA\News\Tests\Integration;
-use PHPUnit\Framework\TestCase;
-
-use OCA\News\Db\Feed;
use OCA\News\Db\Item;
use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\IAppContainer;
use OCP\IDBConnection;
-use OCP\IUserSession;
use OCP\IUserManager;
use OCA\News\AppInfo\Application;
@@ -30,8 +26,6 @@ use OCA\News\Tests\Integration\Fixtures\FolderFixture;
use OCA\News\Db\FeedMapper;
use OCA\News\Db\ItemMapper;
use OCA\News\Db\FolderMapper;
-use Psr\Container\ContainerInterface;
-
abstract class IntegrationTest extends \Test\TestCase
{
diff --git a/tests/Unit/Controller/UserApiControllerTest.php b/tests/Unit/Controller/UserApiControllerTest.php
new file mode 100644
index 000000000..49010627b
--- /dev/null
+++ b/tests/Unit/Controller/UserApiControllerTest.php
@@ -0,0 +1,149 @@
+<?php
+/**
+ * Nextcloud - News
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ *
+ * @author Alessandro Cosentino <cosenal@gmail.com>
+ * @author Bernhard Posselt <dev@bernhard-posselt.com>
+ * @copyright 2012 Alessandro Cosentino
+ * @copyright 2012-2014 Bernhard Posselt
+ */
+
+namespace OCA\News\Tests\Unit\Controller;
+
+use OCA\News\Controller\UserApiController;
+use OCP\Files\File;
+use OCP\Files\IRootFolder;
+use OCP\IRequest;
+use OCP\IUser;
+use OCP\IUserSession;
+
+use PHPUnit\Framework\TestCase;
+
+class UserApiControllerTest extends TestCase
+{
+
+ private $request;
+ private $appName;
+ private $rootFolder;
+ private $userSession;
+ private $controller;
+ private $user;
+ private $file;
+
+ protected function setUp(): void
+ {
+ $this->appName = 'news';
+ $this->request = $this->getMockBuilder(IRequest::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->rootFolder = $this->getMockBuilder(IRootFolder::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->file = $this->getMockBuilder(File::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->userSession = $this->getMockBuilder(IUserSession::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->user = $this->getMockBuilder(IUser::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->controller = new UserApiController(
+ $this->appName, $this->request, $this->userSession,
+ $this->rootFolder
+ );
+
+
+ }
+
+ private function expectUser($uid, $displayName, $lastLogin)
+ {
+ $this->userSession->expects($this->any())
+ ->method('getUser')
+ ->will($this->returnValue($this->user));
+ $this->user->expects($this->any())
+ ->method('getUID')
+ ->will($this->returnValue($uid));
+ $this->user->expects($this->any())
+ ->method('getLastLogin')
+ ->will($this->returnValue($lastLogin));
+ $this->user->expects($this->any())
+ ->method('getDisplayName')
+ ->will($this->returnValue($displayName));
+ }
+
+ private function expectImg($isJpg, $isPng, $user, $exists, $data)
+ {
+ $jpg = '/' . $user . '/' . 'avatar.jpg';
+ $png = '/' . $user . '/' . 'avatar.png';
+
+ $this->rootFolder->expects($this->any())
+ ->method('nodeExists')
+ ->will(
+ $this->returnValueMap(
+ [
+ [$jpg, $isJpg],
+ [$png, $isPng]
+ ]
+ )
+ );
+ $this->rootFolder->expects($this->any())
+ ->method('get')
+ ->will($this->returnValue($this->file));
+ $this->file->expects($this->any())
+ ->method('getContent')
+ ->will($this->returnValue($data));
+ }
+
+ public function testGetJpeg()
+ {
+ $this->expectUser('john', 'John', 123);
+ $this->expectImg(true, false, 'john', true, 'hi');
+
+ $result = $this->controller->index();
+ $expected = [
+ 'userId' => 'john',
+ 'displayName' => 'John',
+ 'lastLoginTimestamp' => 123,
+ 'avatar' => null
+ ];
+
+ $this->assertEquals($expected, $result);
+ }
+
+ public function testGetPng()
+ {
+ $this->expectUser('john', 'John', 123);
+ $this->expectImg(false, true, 'john', false, 'hi');
+
+ $result = $this->controller->index();
+ $expected = [
+ 'userId' => 'john',
+ 'displayName' => 'John',
+ 'lastLoginTimestamp' => 123,
+ 'avatar' => null
+ ];
+
+ $this->assertEquals($expected, $result);
+ }
+
+ public function testNoAvatar()
+ {
+ $this->expectUser('john', 'John', 123);
+ $this->expectImg(false, false, 'john', false, 'hi');
+
+ $result = $this->controller->index();
+ $expected = [
+ 'userId' => 'john',
+ 'displayName' => 'John',
+ 'lastLoginTimestamp' => 123,
+ 'avatar' => null
+ ];
+
+ $this->assertEquals($expected, $result);
+ }
+
+}