summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorVitor Mattos <vitor@php.rio>2023-01-05 14:13:28 -0300
committerVitor Mattos <vitor@php.rio>2023-01-14 10:02:16 -0300
commit2382c9a33e7b096af633e055b7823915ab58dada (patch)
treeb1a0657e8702062b8081257b2f79a77d570502fe /lib
parenta116ab9e297a28879c9b627c1b49f76607d9899e (diff)
Notify recording stored
Signed-off-by: Vitor Mattos <vitor@php.rio>
Diffstat (limited to 'lib')
-rw-r--r--lib/Service/RecordingService.php78
1 files changed, 76 insertions, 2 deletions
diff --git a/lib/Service/RecordingService.php b/lib/Service/RecordingService.php
index a8d7b666f..38fbf5319 100644
--- a/lib/Service/RecordingService.php
+++ b/lib/Service/RecordingService.php
@@ -29,12 +29,18 @@ use InvalidArgumentException;
use OC\User\NoUserException;
use OCA\Talk\Config;
use OCA\Talk\Exceptions\ParticipantNotFoundException;
+use OCA\Talk\Participant;
use OCA\Talk\Room;
+use OCP\Files\File;
use OCP\Files\Folder;
use OCP\Files\IMimeTypeDetector;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
+use OCP\IL10N;
+use OCP\IURLGenerator;
+use OCP\Notification\IAction;
+use OCP\Notification\IManager;
class RecordingService {
public const DEFAULT_ALLOWED_RECORDING_FORMATS = [
@@ -47,6 +53,9 @@ class RecordingService {
private IMimeTypeDetector $mimeTypeDetector,
private ParticipantService $participantService,
private IRootFolder $rootFolder,
+ private IManager $notificationManager,
+ private IL10N $l,
+ private IURLGenerator $urlGenerator,
private Config $config,
private RoomService $roomService
) {
@@ -80,14 +89,15 @@ class RecordingService {
$this->validateFileFormat($fileName, $content);
try {
- $this->participantService->getParticipant($room, $owner);
+ $participant = $this->participantService->getParticipant($room, $owner);
} catch (ParticipantNotFoundException $e) {
throw new InvalidArgumentException('owner_participant');
}
try {
$recordingFolder = $this->getRecordingFolder($owner, $room->getToken());
- $recordingFolder->newFile($fileName, $content);
+ $file = $recordingFolder->newFile($fileName, $content);
+ $this->notifyStoredRecording($room, $participant, $file);
} catch (NoUserException $e) {
throw new InvalidArgumentException('owner_invalid');
} catch (NotPermittedException $e) {
@@ -142,4 +152,68 @@ class RecordingService {
}
return $recordingFolder;
}
+
+ public function notifyStoredRecording(Room $room, Participant $participant, File $file): void {
+ $attendee = $participant->getAttendee();
+ $notificationLevel = $attendee->getNotificationLevel();
+ if ($notificationLevel === Participant::NOTIFY_NEVER) {
+ return;
+ }
+
+ $notification = $this->notificationManager->createNotification();
+
+ $shareAction = $notification->createAction()
+ ->setParsedLabel($this->l->t('Share to chat'))
+ ->setPrimary(true)
+ ->setLink(
+ $this->urlGenerator->linkToRouteAbsolute(
+ 'spreed.Chat.shareObjectToChat',
+ [
+ 'token' => $room->getToken()
+ ]
+ ),
+ IAction::TYPE_POST
+ );
+
+ $notification
+ ->setApp('spreed')
+ ->setDateTime(new \DateTime())
+ ->setObject('chat', $room->getToken())
+ ->setUser($attendee->getActorId())
+ ->setSubject('file', [
+ 'objectType' => 'file',
+ 'objectId' => $file->getId(),
+ 'actorDisplayName' => $attendee->getDisplayName(),
+ ])
+ ->setRichSubject(
+ $this->l->t('Record file of {call}'),
+ [
+ 'call' => [
+ 'type' => 'call',
+ 'id' => $room->getId(),
+ 'name' => $room->getDisplayName((string) $attendee->getId()),
+ 'call-type' => $this->getRoomType($room),
+ ],
+ ])
+ ->addParsedAction($shareAction);
+ $this->notificationManager->notify($notification);
+ }
+
+ /**
+ * @param Room $room
+ * @return string
+ * @throws \InvalidArgumentException
+ */
+ protected function getRoomType(Room $room): string {
+ switch ($room->getType()) {
+ case Room::TYPE_ONE_TO_ONE:
+ return 'one2one';
+ case Room::TYPE_GROUP:
+ return 'group';
+ case Room::TYPE_PUBLIC:
+ return 'public';
+ default:
+ throw new \InvalidArgumentException('Unknown room type');
+ }
+ }
}