diff options
author | Christopher Ng <chrng8@gmail.com> | 2021-10-14 11:19:40 +0300 |
---|---|---|
committer | Christopher Ng <chrng8@gmail.com> | 2021-10-19 07:59:35 +0300 |
commit | 309354852f12ae88d5eef05d311d6ebcba8ee762 (patch) | |
tree | 640c4e2394ba2a868d8d1cb6b5271fd1271bbdab /core/Controller | |
parent | 7215148a242815a5064ce5d00a387c634dc936f3 (diff) |
Profile backend
Signed-off-by: Christopher Ng <chrng8@gmail.com>
Diffstat (limited to 'core/Controller')
-rw-r--r-- | core/Controller/ProfileApiController.php | 98 | ||||
-rw-r--r-- | core/Controller/ProfilePageController.php | 131 |
2 files changed, 229 insertions, 0 deletions
diff --git a/core/Controller/ProfileApiController.php b/core/Controller/ProfileApiController.php new file mode 100644 index 00000000000..d9e20701eaa --- /dev/null +++ b/core/Controller/ProfileApiController.php @@ -0,0 +1,98 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright 2021 Christopher Ng <chrng8@gmail.com> + * + * @author Christopher Ng <chrng8@gmail.com> + * + * @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\Core\Db\ProfileConfigMapper; +use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\OCS\OCSBadRequestException; +use OCP\AppFramework\OCS\OCSForbiddenException; +use OCP\AppFramework\OCS\OCSNotFoundException; +use OCP\AppFramework\OCSController; +use OCP\IRequest; +use OCP\IUserManager; +use OCP\IUserSession; +use OC\Profile\ProfileManager; + +class ProfileApiController extends OCSController { + + /** @var ProfileConfigMapper */ + private $configMapper; + + /** @var ProfileManager */ + private $profileManager; + + /** @var IUserManager */ + private $userManager; + + /** @var IUserSession */ + private $userSession; + + public function __construct( + IRequest $request, + ProfileConfigMapper $configMapper, + ProfileManager $profileManager, + IUserManager $userManager, + IUserSession $userSession + ) { + parent::__construct('core', $request); + $this->configMapper = $configMapper; + $this->profileManager = $profileManager; + $this->userManager = $userManager; + $this->userSession = $userSession; + } + + /** + * @NoAdminRequired + * @NoSubAdminRequired + * @PasswordConfirmationRequired + */ + public function setVisibility(string $targetUserId, string $paramId, string $visibility): DataResponse { + $requestingUser = $this->userSession->getUser(); + $targetUser = $this->userManager->get($targetUserId); + + if (!$this->userManager->userExists($targetUserId)) { + throw new OCSNotFoundException('User does not exist'); + } + + if ($requestingUser !== $targetUser) { + throw new OCSForbiddenException('Users can only edit their own visibility settings'); + } + + // Ensure that a profile config is created in the database + $this->profileManager->getProfileConfig($targetUser, $targetUser); + $config = $this->configMapper->get($targetUserId); + + if (!in_array($paramId, array_keys($config->getVisibilityMap()), true)) { + throw new OCSBadRequestException('User does not have a profile parameter with ID: ' . $paramId); + } + + $config->setVisibility($paramId, $visibility); + $this->configMapper->update($config); + + return new DataResponse(); + } +} diff --git a/core/Controller/ProfilePageController.php b/core/Controller/ProfilePageController.php new file mode 100644 index 00000000000..a7ceb404fbc --- /dev/null +++ b/core/Controller/ProfilePageController.php @@ -0,0 +1,131 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright 2021 Christopher Ng <chrng8@gmail.com> + * + * @author Christopher Ng <chrng8@gmail.com> + * + * @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 OCP\Accounts\IAccountManager; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Services\IInitialState; +use OCP\IRequest; +use OCP\IUserManager; +use OCP\IUserSession; +use OC\Profile\ProfileManager; +use OCP\UserStatus\IManager as IUserStatusManager; + +class ProfilePageController extends Controller { + use \OC\Profile\TProfileHelper; + + /** @var IInitialState */ + private $initialStateService; + + /** @var IAccountManager */ + private $accountManager; + + /** @var ProfileManager */ + private $profileManager; + + /** @var IUserManager */ + private $userManager; + + /** @var IUserSession */ + private $userSession; + + /** @var IUserStatusManager */ + private $userStatusManager; + + public function __construct( + $appName, + IRequest $request, + IInitialState $initialStateService, + IAccountManager $accountManager, + ProfileManager $profileManager, + IUserManager $userManager, + IUserSession $userSession, + IUserStatusManager $userStatusManager + ) { + parent::__construct($appName, $request); + $this->initialStateService = $initialStateService; + $this->accountManager = $accountManager; + $this->profileManager = $profileManager; + $this->userManager = $userManager; + $this->userSession = $userSession; + $this->userStatusManager = $userStatusManager; + } + + /** + * @PublicPage + * @NoCSRFRequired + * @NoAdminRequired + * @NoSubAdminRequired + */ + public function index(string $targetUserId): TemplateResponse { + if (!$this->userManager->userExists($targetUserId)) { + return new TemplateResponse( + 'core', + '404-profile', + [], + TemplateResponse::RENDER_AS_GUEST, + ); + } + + $visitingUser = $this->userSession->getUser(); + $targetUser = $this->userManager->get($targetUserId); + $targetAccount = $this->accountManager->getAccount($targetUser); + + if (!$this->isProfileEnabled($targetAccount)) { + return new TemplateResponse( + 'core', + '404-profile', + [], + TemplateResponse::RENDER_AS_GUEST, + ); + } + + $userStatuses = $this->userStatusManager->getUserStatuses([$targetUserId]); + $status = array_shift($userStatuses); + if (!empty($status)) { + $this->initialStateService->provideInitialState('status', [ + 'icon' => $status->getIcon(), + 'message' => $status->getMessage(), + ]); + } + + $this->initialStateService->provideInitialState( + 'profileParameters', + $this->profileManager->getProfileParams($targetUser, $visitingUser), + ); + + \OCP\Util::addScript('core', 'dist/profile'); + + return new TemplateResponse( + 'core', + 'profile', + [], + $this->userSession->isLoggedIn() ? TemplateResponse::RENDER_AS_USER : TemplateResponse::RENDER_AS_PUBLIC, + ); + } +} |