27 changed files with 578 additions and 325 deletions
			
			
		@ -1 +1 @@
					 | 
				
			||||
Subproject commit 7190056dd64da2f2c4b2fd3fd8d40d26cb768937 | 
				
			||||
Subproject commit 65bb0849179cf93c161387a730f4abc79a782f77 | 
				
			||||
@ -1 +1 @@
					 | 
				
			||||
Subproject commit 3aabb381b9e7ffc5b13f951b8fb89494fe903a2c | 
				
			||||
Subproject commit 20ea9a25353129b56d46951fe7d23939665ab2b2 | 
				
			||||
@ -1,42 +0,0 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
declare(strict_types=1); | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @copyright Copyright (c) 2020, Georg Ehrke | 
				
			||||
 * | 
				
			||||
 * @author Georg Ehrke <oc.list@georgehrke.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/>. | 
				
			||||
 * | 
				
			||||
 */ | 
				
			||||
return [ | 
				
			||||
    'ocs' => [ | 
				
			||||
        // Routes for querying statuses | 
				
			||||
        ['name' => 'Statuses#findAll', 'url' => '/api/v1/statuses', 'verb' => 'GET'], | 
				
			||||
        ['name' => 'Statuses#find', 'url' => '/api/v1/statuses/{userId}', 'verb' => 'GET'], | 
				
			||||
        // Routes for manipulating your own status | 
				
			||||
        ['name' => 'UserStatus#getStatus', 'url' => '/api/v1/user_status', 'verb' => 'GET'], | 
				
			||||
        ['name' => 'UserStatus#setStatus', 'url' => '/api/v1/user_status/status', 'verb' => 'PUT'], | 
				
			||||
        ['name' => 'UserStatus#setPredefinedMessage', 'url' => '/api/v1/user_status/message/predefined', 'verb' => 'PUT'], | 
				
			||||
        ['name' => 'UserStatus#setCustomMessage', 'url' => '/api/v1/user_status/message/custom', 'verb' => 'PUT'], | 
				
			||||
        ['name' => 'UserStatus#clearMessage', 'url' => '/api/v1/user_status/message', 'verb' => 'DELETE'], | 
				
			||||
        // Routes for listing default routes | 
				
			||||
        ['name' => 'PredefinedStatus#findAll', 'url' => '/api/v1/predefined_statuses/', 'verb' => 'GET'], | 
				
			||||
        // Route for doing heartbeats | 
				
			||||
        ['name' => 'Heartbeat#heartbeat', 'url' => '/api/v1/heartbeat', 'verb' => 'PUT'], | 
				
			||||
    ], | 
				
			||||
]; | 
				
			||||
@ -1,114 +0,0 @@
					 | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
declare(strict_types=1); | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @copyright Copyright (c) 2020, Georg Ehrke | 
				
			||||
 * | 
				
			||||
 * @author Georg Ehrke <oc.list@georgehrke.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 OCA\UserStatus\Controller; | 
				
			||||
 | 
				
			||||
use OCA\UserStatus\Db\UserStatus; | 
				
			||||
use OCA\UserStatus\Service\StatusService; | 
				
			||||
use OCP\AppFramework\Controller; | 
				
			||||
use OCP\AppFramework\Db\DoesNotExistException; | 
				
			||||
use OCP\AppFramework\Http; | 
				
			||||
use OCP\AppFramework\Http\JSONResponse; | 
				
			||||
use OCP\AppFramework\OCSController; | 
				
			||||
use OCP\AppFramework\Utility\ITimeFactory; | 
				
			||||
use OCP\EventDispatcher\IEventDispatcher; | 
				
			||||
use OCP\IRequest; | 
				
			||||
use OCP\IUserSession; | 
				
			||||
use OCP\User\Events\UserLiveStatusEvent; | 
				
			||||
use OCP\UserStatus\IUserStatus; | 
				
			||||
 | 
				
			||||
class HeartbeatController extends OCSController { | 
				
			||||
 | 
				
			||||
    /** @var IEventDispatcher */ | 
				
			||||
    private $eventDispatcher; | 
				
			||||
 | 
				
			||||
    /** @var IUserSession */ | 
				
			||||
    private $userSession; | 
				
			||||
 | 
				
			||||
    /** @var ITimeFactory */ | 
				
			||||
    private $timeFactory; | 
				
			||||
 | 
				
			||||
    /** @var StatusService */ | 
				
			||||
    private $service; | 
				
			||||
 | 
				
			||||
    public function __construct(string $appName, | 
				
			||||
                                IRequest $request, | 
				
			||||
                                IEventDispatcher $eventDispatcher, | 
				
			||||
                                IUserSession $userSession, | 
				
			||||
                                ITimeFactory $timeFactory, | 
				
			||||
                                StatusService $service) { | 
				
			||||
        parent::__construct($appName, $request); | 
				
			||||
        $this->eventDispatcher = $eventDispatcher; | 
				
			||||
        $this->userSession = $userSession; | 
				
			||||
        $this->timeFactory = $timeFactory; | 
				
			||||
        $this->service = $service; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @NoAdminRequired | 
				
			||||
     * | 
				
			||||
     * @param string $status | 
				
			||||
     * @return JSONResponse | 
				
			||||
     */ | 
				
			||||
    public function heartbeat(string $status): JSONResponse { | 
				
			||||
        if (!\in_array($status, [IUserStatus::ONLINE, IUserStatus::AWAY], true)) { | 
				
			||||
            return new JSONResponse([], Http::STATUS_BAD_REQUEST); | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        $user = $this->userSession->getUser(); | 
				
			||||
        if ($user === null) { | 
				
			||||
            return new JSONResponse([], Http::STATUS_INTERNAL_SERVER_ERROR); | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        $event = new UserLiveStatusEvent( | 
				
			||||
            $user, | 
				
			||||
            $status, | 
				
			||||
            $this->timeFactory->getTime() | 
				
			||||
        ); | 
				
			||||
 | 
				
			||||
        $this->eventDispatcher->dispatchTyped($event); | 
				
			||||
 | 
				
			||||
        $userStatus = $event->getUserStatus(); | 
				
			||||
        if (!$userStatus) { | 
				
			||||
            return new JSONResponse([], Http::STATUS_NO_CONTENT); | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        /** @psalm-suppress UndefinedInterfaceMethod */ | 
				
			||||
        return new JSONResponse($this->formatStatus($userStatus->getInternal())); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    private function formatStatus(UserStatus $status): array { | 
				
			||||
        return [ | 
				
			||||
            'userId' => $status->getUserId(), | 
				
			||||
            'message' => $status->getCustomMessage(), | 
				
			||||
            'messageId' => $status->getMessageId(), | 
				
			||||
            'messageIsPredefined' => $status->getMessageId() !== null, | 
				
			||||
            'icon' => $status->getCustomIcon(), | 
				
			||||
            'clearAt' => $status->getClearAt(), | 
				
			||||
            'status' => $status->getStatus(), | 
				
			||||
            'statusIsUserDefined' => $status->getIsUserDefined(), | 
				
			||||
        ]; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue