* * @author Anna Larch * @author Richard Steinmetz * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library 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 library. If not, see . * */ namespace OCA\Gestion\Service; use DateTime; use OCA\Gestion\Constants\BddConstant; use OCA\Gestion\Db\Bdd; use OCA\Gestion\Db\TalkDb; use Psr\Log\LoggerInterface; use Ramsey\Uuid\Uuid; class TalkService { /** @var TalkDb */ private $talkDb; /** @var LoggerInterface */ private $logger; public function __construct( TalkDb $talkDb, LoggerInterface $logger) { $this->logger = $logger; $this->talkDb = $talkDb; } private function getUserDevisTalkRoomNames($target ,$senderUser){ $roomNamesCreatedBytargetUser = '["'.$target.'","'.$senderUser.'"]'; $roomNamesCreatedBySenderUser = '["'.$senderUser.'","'.$target.'"]'; return [ "target" => $roomNamesCreatedBytargetUser, "sender" => $roomNamesCreatedBySenderUser ]; } private function generateTalkRandomToken(){ $length = 8; $characters = 'abcdefghijklmnopqrstuvwxyz0123456789'; $charactersLength = strlen($characters); $randomToken = ''; for ($i = 0; $i < $length; $i++) { $randomToken .= $characters[rand(0, $charactersLength - 1)]; } return $randomToken; } private function getNotificationsSubjectsParameters(string $senderUser){ return '{"userType":"users","userId":"'.$senderUser.'"}'; } private function getNotificationsMessageParameters($commentId){ return '{"commentId":"'.$commentId.'"}'; } public function sendDevisTalkNotifications(string $message,string $targetUser ,string $senderUser){ $senderAndTargetIsTheSameUser = $targetUser == $senderUser; $senderUser = $senderAndTargetIsTheSameUser ? BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD : $senderUser; if( $targetUser === BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD && $senderUser === BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD){ return; } $roomNames = $this->getUserDevisTalkRoomNames($targetUser , $senderUser); $room = $this->talkDb->getDevisTalkRoomByNames($roomNames); if($room == null){ $roomToken = $this->generateTalkRandomToken(); $room = $this->talkDb->createDevisTalkRoomAndReturnDevisTalkRoom($targetUser,$senderUser, $roomToken); $this->talkDb->setDevisTalkRoomInitialMessageAndReturnMessage($room['id'],$targetUser); } else{ $roomToken = $room['token']; } $devisMessage = $this->talkDb->createDevisTalkRoomMessageAndReturnMessage($room['id'],$message,$senderUser); $this->talkDb->updateRoomLastMessage($room['id'],$devisMessage['id']); $this->talkDb->setAttendeeLastReadMessage($room['id'],$devisMessage['id'],$senderUser); //send notifications $notificationsSubjectsParameters = $this->getNotificationsSubjectsParameters($senderUser); $notificationsMessageParameters = $this->getNotificationsMessageParameters($devisMessage['id']); $this->talkDb->sendAttendeeNotifications($targetUser,$roomToken,$notificationsSubjectsParameters,$notificationsMessageParameters); } public function getRoomTokenBeetwenTwoUser( $senderUser , $targetUser){ $senderAndTargetIsTheSameUser = $targetUser == $senderUser; $senderUser = $senderAndTargetIsTheSameUser ? BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD : $senderUser; if( $targetUser === BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD && $senderUser === BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD){ return null; } $roomNames = $this->getUserDevisTalkRoomNames($targetUser , $senderUser); $room = $this->talkDb->getDevisTalkRoomByNames($roomNames); if($room == null){ $roomToken = $this->generateTalkRandomToken(); $room = $this->talkDb->createDevisTalkRoomAndReturnDevisTalkRoom($targetUser,$senderUser, $roomToken); $this->talkDb->setDevisTalkRoomInitialMessageAndReturnMessage($room['id'],$targetUser); } else{ $roomToken = $room['token']; } return $roomToken; } }