2021-08-21 14:17:14 +00:00
|
|
|
<?php
|
|
|
|
|
2021-08-21 14:25:23 +00:00
|
|
|
namespace OCA\UPschooling\Service;
|
2021-08-21 14:17:14 +00:00
|
|
|
|
2021-09-19 14:55:30 +00:00
|
|
|
use Aryess\PhpMatrixSdk\Exceptions\MatrixException;
|
|
|
|
use Aryess\PhpMatrixSdk\Exceptions\MatrixHttpLibException;
|
|
|
|
use Aryess\PhpMatrixSdk\Exceptions\MatrixRequestException;
|
2021-08-21 14:17:14 +00:00
|
|
|
use Exception;
|
2021-09-18 17:28:10 +00:00
|
|
|
use OCA\UPschooling\Db\MatrixTicket;
|
2021-09-19 14:55:30 +00:00
|
|
|
use OCA\UPschooling\Db\MatrixUser;
|
2021-09-18 17:28:10 +00:00
|
|
|
use OCA\UPschooling\Db\TicketMapper;
|
2021-09-19 14:55:30 +00:00
|
|
|
use OCA\UPschooling\Db\UserMapper;
|
|
|
|
use OCA\UPschooling\Exceptions\RoomNotFoundException;
|
2021-08-21 14:17:14 +00:00
|
|
|
use OCP\AppFramework\Db\DoesNotExistException;
|
|
|
|
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
|
|
|
|
|
2021-08-22 15:03:19 +00:00
|
|
|
class TicketService {
|
2021-08-21 14:17:14 +00:00
|
|
|
|
2021-09-19 14:55:30 +00:00
|
|
|
/** @var MatrixService */
|
|
|
|
private $matrix;
|
|
|
|
|
2021-08-22 15:03:19 +00:00
|
|
|
/** @var TicketMapper */
|
2021-09-19 14:55:30 +00:00
|
|
|
private $ticketMapper;
|
2021-08-21 14:17:14 +00:00
|
|
|
|
2021-09-19 14:55:30 +00:00
|
|
|
/** @var UserMapper */
|
|
|
|
private $userMapper;
|
2021-09-18 17:28:10 +00:00
|
|
|
|
2021-09-19 14:55:30 +00:00
|
|
|
public function __construct(MatrixService $matrix, TicketMapper $ticketMapper, UserMapper $userMapper) {
|
2021-09-18 17:28:10 +00:00
|
|
|
$this->matrix = $matrix;
|
2021-09-19 14:55:30 +00:00
|
|
|
$this->ticketMapper = $ticketMapper;
|
|
|
|
$this->userMapper = $userMapper;
|
2021-08-21 14:17:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public function findAll(string $userId): array {
|
2021-09-19 14:55:30 +00:00
|
|
|
$dbTickets = $this->ticketMapper->findAll($this->getOrCreateUser($userId));
|
|
|
|
return array_map(function ($ticket) { return $this->resolveTicket($ticket); }, $dbTickets);
|
2021-08-21 14:17:14 +00:00
|
|
|
}
|
|
|
|
|
2021-09-19 14:55:30 +00:00
|
|
|
public function find($id, $userId): array {
|
|
|
|
return $this->resolveTicket($this->ticketMapper->find($id, $this->getOrCreateUser($userId)));
|
2021-08-21 14:17:14 +00:00
|
|
|
}
|
|
|
|
|
2021-09-19 14:55:30 +00:00
|
|
|
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,
|
|
|
|
));
|
|
|
|
$ticket = new MatrixTicket();
|
|
|
|
$ticket->setMatrixRoom($roomId);
|
|
|
|
$ticket->setMatrixAssistedUser($matrixUser->getMatrixUser());
|
|
|
|
$ticket->setStatus("open");
|
|
|
|
$ticket->setVersion(1);
|
|
|
|
return $this->resolveTicket($this->ticketMapper->insert($ticket));
|
|
|
|
}
|
2021-08-21 14:17:14 +00:00
|
|
|
|
2021-09-19 14:55:30 +00:00
|
|
|
public function update($id, $title, $content, $userId) {
|
|
|
|
throw new Exception("Not implemented");
|
2021-08-21 14:17:14 +00:00
|
|
|
}
|
|
|
|
|
2021-09-19 14:55:30 +00:00
|
|
|
public function delete($id, $userId) {
|
|
|
|
throw new Exception("Not implemented");
|
2021-08-21 14:17:14 +00:00
|
|
|
}
|
|
|
|
|
2021-09-19 14:55:30 +00:00
|
|
|
/**
|
|
|
|
* @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
|
|
|
|
{
|
2021-08-21 14:17:14 +00:00
|
|
|
try {
|
2021-09-19 14:55:30 +00:00
|
|
|
$matrixTicketContent = $this->matrix->getProperty($ticket->getMatrixRoom(), "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->getMatrixRoom());
|
|
|
|
return array(
|
|
|
|
'ticketId' => $ticketId,
|
|
|
|
'status' => $ticket->getStatus(),
|
|
|
|
'lastModified' => $lastModified,
|
|
|
|
'title' => $title,
|
|
|
|
'description' => $description,
|
|
|
|
);
|
|
|
|
} catch (MatrixException | RoomNotFoundException $e) {
|
|
|
|
return array(
|
|
|
|
'ticketId' => $ticket->getId(),
|
|
|
|
'status' => 'error',
|
|
|
|
);
|
2021-08-21 14:17:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-19 14:55:30 +00:00
|
|
|
/**
|
|
|
|
* @param $userId string Nextcloud user id
|
|
|
|
* @throws MatrixException
|
|
|
|
* @throws MatrixHttpLibException
|
|
|
|
* @throws MatrixRequestException
|
|
|
|
* @throws MultipleObjectsReturnedException
|
|
|
|
* @throws \OCP\DB\Exception
|
|
|
|
*/
|
|
|
|
private function getOrCreateUser(string $userId): MatrixUser
|
|
|
|
{
|
2021-08-21 14:17:14 +00:00
|
|
|
try {
|
2021-09-19 14:55:30 +00:00
|
|
|
return $this->userMapper->find($userId);
|
|
|
|
} catch (DoesNotExistException $e) {
|
|
|
|
$matrixUser = $this->matrix->registerNewUser();
|
|
|
|
$matrixUser->setUserId($userId);
|
|
|
|
$this->userMapper->insert($matrixUser);
|
|
|
|
return $matrixUser;
|
2021-08-21 14:17:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|