From 4f842b8876c7326dee1a603fd1f044809151f1e6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Julius=20H=C3=A4rtl?= <jus@bitgrid.net>
Date: Tue, 23 Oct 2018 15:39:06 +0200
Subject: [PATCH] Fix account controller
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Julius Härtl <jus@bitgrid.net>
---
 lib/Controller/AccountController.php | 57 +++++++++++++++++++++++++++-
 webpack.dev.js                       |  2 +-
 2 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/lib/Controller/AccountController.php b/lib/Controller/AccountController.php
index 2488116d..b97e6e82 100644
--- a/lib/Controller/AccountController.php
+++ b/lib/Controller/AccountController.php
@@ -35,9 +35,14 @@ use OCA\Social\AppInfo\Application;
 use OCA\Social\Service\ActorService;
 use OCA\Social\Service\ConfigService;
 use OCA\Social\Service\MiscService;
+use OCP\Accounts\IAccountManager;
+use OCP\Accounts\IAccountProperty;
 use OCP\AppFramework\Controller;
 use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\Http\NotFoundResponse;
+use OCP\AppFramework\Http\Response;
 use OCP\IRequest;
+use OCP\IUserManager;
 
 
 class AccountController extends Controller {
@@ -56,6 +61,9 @@ class AccountController extends Controller {
 	/** @var MiscService */
 	private $miscService;
 
+	/** @var IAccountManager */
+	private $accountManager;
+
 
 	/**
 	 * AccountController constructor.
@@ -67,8 +75,9 @@ class AccountController extends Controller {
 	 * @param MiscService $miscService
 	 */
 	public function __construct(
-		IRequest $request, string $userId, ConfigService $configService,
-		ActorService $actorService, MiscService $miscService
+		IRequest $request, ConfigService $configService,
+		ActorService $actorService, MiscService $miscService,
+		IAccountManager $accountManager, IUserManager $userManager, string $userId = null
 	) {
 		parent::__construct(Application::APP_NAME, $request);
 
@@ -76,6 +85,8 @@ class AccountController extends Controller {
 		$this->configService = $configService;
 		$this->actorService = $actorService;
 		$this->miscService = $miscService;
+		$this->accountManager = $accountManager;
+		$this->userManager = $userManager;
 	}
 
 
@@ -83,6 +94,9 @@ class AccountController extends Controller {
 	 * Called by the frontend to create a new Social account
 	 *
 	 * @NoAdminRequired
+	 * @NoCSRFRequired
+	 * @NoAdminRequired
+	 * @NoSubAdminRequired
 	 *
 	 * @param string $username
 	 *
@@ -98,6 +112,45 @@ class AccountController extends Controller {
 		}
 	}
 
+	/**
+	 * @PublicPage
+	 * @NoAdminRequired
+	 * @NoCSRFRequired
+	 * @NoAdminRequired
+	 * @NoSubAdminRequired
+	 * @param string $username
+	 * @return DataResponse
+	 */
+	public function info(string $username): Response {
+		$user = $this->userManager->get($username);
+		if ($user === null) {
+			// TODO: Proper handling of external accounts
+			$props = [];
+			$props['cloudId'] = $username;
+			$props['displayname'] = ['value' => 'External account'];
+			$props['posts'] = 1;
+			$props['following'] = 2;
+			$props['followers'] = 3;
+			return new DataResponse($props);
+		}
+		$account = $this->accountManager->getAccount($user);
+		/** @var IAccountProperty[] $props */
+		$props = $account->getFilteredProperties(IAccountManager::VISIBILITY_PUBLIC, null);
+		if ($this->userId !== null) {
+			$props = array_merge($props, $account->getFilteredProperties(IAccountManager::VISIBILITY_CONTACTS_ONLY, null));
+		}
+		if (\array_key_exists('avatar', $props)) {
+			$props['avatar']->setValue(\OC::$server->getURLGenerator()->linkToRouteAbsolute('core.avatar.getAvatar', ['userId' => $username, 'size' => 128]));
+		}
+
+		// Add counters
+		$props['cloudId'] = $user->getCloudId();
+		$props['posts'] = 1;
+		$props['following'] = 2;
+		$props['followers'] = 3;
+		return new DataResponse($props);
+	}
+
 
 }
 
diff --git a/webpack.dev.js b/webpack.dev.js
index 88409bbb..49291d77 100644
--- a/webpack.dev.js
+++ b/webpack.dev.js
@@ -8,5 +8,5 @@ module.exports = merge(common, {
     noInfo: true,
     overlay: true
   },
-  devtool: '#eval-source-map',
+  devtool: 'source-map',
 })