userManager = $userManager; $this->matrix = $matrix; $this->ticketMapper = $ticketMapper; $this->userMapper = $userMapper; } public function findAll(string $userId): array { $dbTickets = $this->ticketMapper->findAllForUser($this->getOrCreateUser($userId)); return array_map(function ($ticket) { return $this->resolveTicket($ticket); }, $dbTickets); } /** * @throws MatrixRequestException * @throws MatrixHttpLibException * @throws MultipleObjectsReturnedException * @throws \OCP\DB\Exception * @throws TicketNotFoundException * @throws MatrixException */ public function find($id, $userId): array { try { return $this->resolveTicket($this->ticketMapper->findForUser($id, $this->getOrCreateUser($userId))); } catch (DoesNotExistException $e) { throw new TicketNotFoundException($id); } } public function create($title, $content, $userId): array { $matrixUser = $this->getOrCreateUser($userId); // FIXME: room must be joined on the remote support-platform Nextcloud $roomId = $this->matrix->createRoom(); $this->matrix->setProperty($roomId, "upschooling.ticket", array( // id is to be set from the remote support-platform Nextcloud "title" => $title, "description" => $content, "status" => "open", "version" => "1", )); $ticket = new MatrixTicket(); $ticket->setMatrixControlRoom($roomId); $ticket->setMatrixAssistedUser($matrixUser->getMatrixUser()); $ticket->setStatus("open"); $ticket->setVersion(1); return $this->resolveTicket($this->ticketMapper->insert($ticket)); } public function assign($id, $userId): array{ $matrixUser = $this->getOrCreateUser($userId); $ticket = $this->ticketMapper->findTicket($id); $roomID = $ticket->getMatrixControlRoom(); $helperName = $this->userManager->get($userId)->getDisplayName(); $this->matrix->setProperty($roomID, "upschooling.ticket", array( "matrixHelperUser" => $matrixUser->getMatrixUser(), "matrixHelperName" => $helperName, )); $ticket->setMatrixHelperUser($matrixUser->getMatrixUser()); return $this->resolveTicket($this->ticketMapper->update($ticket)); } public function update($id, $title, $content, $userId) { throw new Exception("Not implemented"); } public function delete($id, $userId) { throw new Exception("Not implemented"); } /** * matrixTicketContent has all the syncronized data * @param MatrixTicket $ticket the database object. * @return array a JSON serializable representation of the resolved ticket, for the frontend. */ private function resolveTicket(MatrixTicket $ticket): array { try { $matrixTicketContent = $this->matrix->getProperty($ticket->getMatrixControlRoom(), "upschooling.ticket"); $ticketId = array_get($matrixTicketContent, "id", $ticket->getId()); $title = array_get($matrixTicketContent, "title", "Untitled"); $description = array_get($matrixTicketContent, "description", ""); $lastModified = $this->matrix->getLastEventDate($ticket->getMatrixControlRoom()); $matrixHelperUser = array_get($matrixTicketContent, "matrixHelperUser", "nicht zugewiesen"); $matrixHelperName = array_get($matrixTicketContent, "matrixHelperName", $matrixHelperUser); $expirationDate = array_get($matrixTicketContent, "expirationDate", ""); return array( 'ticketId' => $ticketId, 'status' => $ticket->getStatus(), 'lastModified' => $lastModified, 'title' => $title, 'description' => $description, 'matrixHelperName' => $matrixHelperName, 'expirationDate' => $expirationDate ); } catch (MatrixException | RoomNotFoundException $e) { return array( 'ticketId' => $ticket->getId(), 'status' => 'error', ); } } /** * @param $userId string Nextcloud user id * @throws MatrixException * @throws MatrixHttpLibException * @throws MatrixRequestException * @throws MultipleObjectsReturnedException * @throws \OCP\DB\Exception */ private function getOrCreateUser(string $userId): MatrixUser { try { return $this->userMapper->find($userId); } catch (DoesNotExistException $e) { $matrixUser = $this->matrix->registerNewUser(); $matrixUser->setUserId($userId); $this->userMapper->insert($matrixUser); return $matrixUser; } } }