From c9a0d29d8dac6f084aaa360d5338ae8c3e139639 Mon Sep 17 00:00:00 2001 From: Wade Womersley <155439365+wadedvsa@users.noreply.github.com> Date: Mon, 25 Mar 2024 11:07:18 +0000 Subject: [PATCH] feat: Enhanced conversation snapshot (#120) * feat: Enhanced conversation snapshot * fix: Move CW signature above read history --- module/Api/config/command-map.config.php | 1 + .../validation-map/messaging.config.php | 2 +- .../Conversation/StoreEnhancedSnapshot.php | 13 ++++ .../Messaging/Conversation/Close.php | 3 + .../Conversation/StoreEnhancedSnapshot.php | 29 +++++++++ module/Snapshot/config/module.config.php | 1 + .../Snapshots/Messaging/EnhancedGenerator.php | 58 ++++++++++++++++++ .../Messaging/EnhancedGeneratorFactory.php | 21 +++++++ .../Snapshot/view/layout/conversation.phtml | 3 +- .../read-only/printable-message.phtml | 36 +++++++++-- .../Messaging/Conversation/Close.php | 60 ++++++++++++++----- .../StoreEnhancedSnapshotTest.php | 29 +++++++++ 12 files changed, 234 insertions(+), 22 deletions(-) create mode 100644 module/Api/src/Domain/Command/Messaging/Conversation/StoreEnhancedSnapshot.php create mode 100644 module/Api/src/Domain/CommandHandler/Messaging/Conversation/StoreEnhancedSnapshot.php create mode 100644 module/Snapshot/src/Service/Snapshots/Messaging/EnhancedGenerator.php create mode 100644 module/Snapshot/src/Service/Snapshots/Messaging/EnhancedGeneratorFactory.php create mode 100644 test/module/Api/src/Domain/CommandHandler/Messaging/Conversation/StoreEnhancedSnapshotTest.php diff --git a/module/Api/config/command-map.config.php b/module/Api/config/command-map.config.php index c11b1e4aa8..a3e3041e6b 100644 --- a/module/Api/config/command-map.config.php +++ b/module/Api/config/command-map.config.php @@ -1297,6 +1297,7 @@ CommandCli\InterimEndDateEnforcement::class => CommandHandlerCli\InterimEndDateEnforcement::class, Command\Messaging\Conversation\StoreSnapshot::class => CommandHandler\Messaging\Conversation\StoreSnapshot::class, + Command\Messaging\Conversation\StoreEnhancedSnapshot::class => CommandHandler\Messaging\Conversation\StoreEnhancedSnapshot::class, TransferCommand\Messaging\Message\Create::class => CommandHandler\Messaging\Message\Create::class, TransferCommand\Messaging\Conversation\Create::class => CommandHandler\Messaging\Conversation\Create::class, ]; diff --git a/module/Api/config/validation-map/messaging.config.php b/module/Api/config/validation-map/messaging.config.php index f77dfb2137..9af17fbab5 100644 --- a/module/Api/config/validation-map/messaging.config.php +++ b/module/Api/config/validation-map/messaging.config.php @@ -12,7 +12,6 @@ use Dvsa\Olcs\Api\Domain\Validation\Handlers\Misc\IsInternalUser; use Dvsa\Olcs\Api\Domain\Validation\Handlers\Misc\IsSideEffect; use Dvsa\Olcs\Api\Domain\Validation\Handlers\Misc\NotIsAnonymousUser; -use Dvsa\Olcs\Api\Domain\Validation\Handlers\Misc\NoValidationRequired; use Dvsa\Olcs\Api\Domain\Validation\Handlers\Messaging\CanAccessConversationMessagesWithConversationId; use Dvsa\Olcs\Api\Domain\Validation\Handlers\Messaging\CanListConversationsByOrganisation; @@ -33,6 +32,7 @@ CommandHandler\Messaging\DisableFileUpload::class => IsInternalUser::class, CommandHandler\Messaging\Message\Create::class => CanCreateMessageWithConversation::class, CommandHandler\Messaging\Conversation\StoreSnapshot::class => IsSideEffect::class, + CommandHandler\Messaging\Conversation\StoreEnhancedSnapshot::class => IsSideEffect::class, QueryHandler\Messaging\Conversations\ByOrganisation::class => CanListConversationsByOrganisation::class, QueryHandler\Messaging\Subjects\All::class => NotIsAnonymousUser::class, CommandHandler\Messaging\Conversation\Create::class => CanCreateConversationForOrganisation::class, diff --git a/module/Api/src/Domain/Command/Messaging/Conversation/StoreEnhancedSnapshot.php b/module/Api/src/Domain/Command/Messaging/Conversation/StoreEnhancedSnapshot.php new file mode 100644 index 0000000000..515e96fcc1 --- /dev/null +++ b/module/Api/src/Domain/Command/Messaging/Conversation/StoreEnhancedSnapshot.php @@ -0,0 +1,13 @@ +handleSideEffect(StoreSnapshot::create(['id' => $conversation->getId()])); $result->merge($documentResult); + $enhancedDocumentResult = $this->handleSideEffect(StoreEnhancedSnapshot::create(['id' => $conversation->getId()])); + $result->merge($enhancedDocumentResult); $taskResult = $this->handleSideEffect(CloseTasks::create(['ids' => [$conversation->getTask()->getId()]])); $result->merge($taskResult); diff --git a/module/Api/src/Domain/CommandHandler/Messaging/Conversation/StoreEnhancedSnapshot.php b/module/Api/src/Domain/CommandHandler/Messaging/Conversation/StoreEnhancedSnapshot.php new file mode 100644 index 0000000000..8d31e83e8c --- /dev/null +++ b/module/Api/src/Domain/CommandHandler/Messaging/Conversation/StoreEnhancedSnapshot.php @@ -0,0 +1,29 @@ +documentDescription; + } +} diff --git a/module/Snapshot/config/module.config.php b/module/Snapshot/config/module.config.php index 21d1eb7b5a..34fb6f46dc 100644 --- a/module/Snapshot/config/module.config.php +++ b/module/Snapshot/config/module.config.php @@ -29,6 +29,7 @@ 'ContinuationReview' => Snapshots\ContinuationReview\GeneratorFactory::class, 'ReviewSnapshot' => Snapshots\ApplicationReview\GeneratorFactory::class, Snapshots\Messaging\Generator::class => Snapshots\Messaging\GeneratorFactory::class, + Snapshots\Messaging\EnhancedGenerator::class => Snapshots\Messaging\EnhancedGeneratorFactory::class, Review\VariationTypeOfLicenceReviewService::class => Review\GenericFactory::class, Review\VariationBusinessTypeReviewService::class => Review\GenericFactory::class, Review\VariationFinancialEvidenceReviewService::class => Review\VariationFinancialEvidenceReviewServiceFactory::class, diff --git a/module/Snapshot/src/Service/Snapshots/Messaging/EnhancedGenerator.php b/module/Snapshot/src/Service/Snapshots/Messaging/EnhancedGenerator.php new file mode 100644 index 0000000000..096cf7c20d --- /dev/null +++ b/module/Snapshot/src/Service/Snapshots/Messaging/EnhancedGenerator.php @@ -0,0 +1,58 @@ +messageRepository = $messageRepository; + } + + public function setData($data): void + { + $this->conversation = $data['entity']; + } + + public function generate(): string + { + $query = $this->messageRepository->getBaseMessageListWithContentQuery( + ByConversation::create( + [ + 'page' => 1, + 'limit' => 1000, + ], + ), + ); + $query = $this->messageRepository->filterByConversationId($query, $this->conversation->getId()); + /** @var MessagingMessage[] $messages */ + $messages = $this->messageRepository->fetchPaginatedList($query, AbstractQuery::HYDRATE_OBJECT); + + return $this->generateReadonly( + [ + 'conversation' => $this->conversation, + 'messages' => $messages, + 'enhanced' => true, + ], + 'conversation', + ); + } +} diff --git a/module/Snapshot/src/Service/Snapshots/Messaging/EnhancedGeneratorFactory.php b/module/Snapshot/src/Service/Snapshots/Messaging/EnhancedGeneratorFactory.php new file mode 100644 index 0000000000..546b537a02 --- /dev/null +++ b/module/Snapshot/src/Service/Snapshots/Messaging/EnhancedGeneratorFactory.php @@ -0,0 +1,21 @@ +get(AbstractGeneratorServices::class), + $container->get('RepositoryServiceManager')->get(MessageRepository::class), + ); + } +} diff --git a/module/Snapshot/view/layout/conversation.phtml b/module/Snapshot/view/layout/conversation.phtml index 069ca635d8..000e5967af 100644 --- a/module/Snapshot/view/layout/conversation.phtml +++ b/module/Snapshot/view/layout/conversation.phtml @@ -1,6 +1,7 @@ partial('partials/review-header', ['pageTitle' => 'Conversation Archive']); ?> @@ -16,7 +17,7 @@ - partial('partials/read-only/printable-message', ['message' => $message]); ?> + partial('partials/read-only/printable-message', ['message' => $message, 'enhanced' => $enhanced]); ?> diff --git a/module/Snapshot/view/partials/read-only/printable-message.phtml b/module/Snapshot/view/partials/read-only/printable-message.phtml index 12ede081f5..6bb595514d 100644 --- a/module/Snapshot/view/partials/read-only/printable-message.phtml +++ b/module/Snapshot/view/partials/read-only/printable-message.phtml @@ -1,4 +1,5 @@ +
@@ -19,11 +20,36 @@

getMessagingContent()->getText()); ?> - getCreatedBy()->getTeam() !== null) { - echo '

'.$sender.'
Caseworker Team

'; - } - ?> + getCreatedBy()->getTeam() !== null): ?> +

+ +
+ Caseworker Team +

+ + +
+ getUserMessageReads() as $messageRead): /** @var \Dvsa\Olcs\Api\Entity\Messaging\MessagingUserMessageRead $messageRead */ ?> +

+ + getUser()->getContactDetails() && $messageRead->getUser()->getContactDetails()->getPerson()) { + $readBy = $messageRead->getUser()->getContactDetails()->getPerson()->getFullName(); + } elseif ($messageRead->getUser()->getContactDetails() && $messageRead->getUser()->getContactDetails()->getEmailAddress()) { + $readBy = $messageRead->getUser()->getContactDetails()->getEmailAddress(); + } else { + $readBy = $messageRead->getUser()->getLoginId(); + } + + echo sprintf( + 'Read by %s on %s', + $readBy, + $messageRead->getCreatedOn(true)->format('l j F Y \a\t H:ia') + ); ?> + +

+ +

diff --git a/test/module/Api/src/Domain/CommandHandler/Messaging/Conversation/Close.php b/test/module/Api/src/Domain/CommandHandler/Messaging/Conversation/Close.php index 59a82b96e1..db91e6651d 100644 --- a/test/module/Api/src/Domain/CommandHandler/Messaging/Conversation/Close.php +++ b/test/module/Api/src/Domain/CommandHandler/Messaging/Conversation/Close.php @@ -5,11 +5,10 @@ namespace Dvsa\OlcsTest\Api\Domain\CommandHandler\Messaging\Conversation; use Dvsa\Olcs\Api\Domain\Command\Email\CreateCorrespondenceRecord; +use Dvsa\Olcs\Api\Domain\Command\Messaging\Conversation\StoreEnhancedSnapshot; use Dvsa\Olcs\Api\Domain\Command\Messaging\Conversation\StoreSnapshot; use Dvsa\Olcs\Api\Domain\Command\Result; -use Dvsa\Olcs\Api\Domain\Command\Task\CreateTask; use Dvsa\Olcs\Api\Domain\CommandHandler\Messaging\Conversation\Close as CloseConversationHandler; -use Dvsa\Olcs\Api\Domain\Exception\Exception; use Dvsa\Olcs\Api\Domain\Repository; use Dvsa\Olcs\Api\Entity; use Dvsa\Olcs\Transfer\Command\Messaging\Conversation\Close as CloseConversationCommand; @@ -29,24 +28,46 @@ public function setUp(): void AuthorizationService::class => m::mock(AuthorizationService::class), ]; - $defaultMockTask = m::mock(Entity\Task\Task::class)->makePartial()->allows('getId')->getMock(); - $defaultMockConversation = m::mock(Entity\Messaging\MessagingConversation::class)->makePartial()->allows('getTask')->andReturn($defaultMockTask)->getMock()->allows('getRelatedLicence')->getMock(); - $this->repoMap[Repository\Conversation::class]->allows('fetchUsingId')->andReturn($defaultMockConversation)->byDefault(); - $this->repoMap[Repository\Conversation::class]->allows('save')->byDefault(); + $defaultMockTask = m::mock(Entity\Task\Task::class) + ->makePartial() + ->allows('getId') + ->getMock(); + $defaultMockConversation = m::mock(Entity\Messaging\MessagingConversation::class) + ->makePartial() + ->allows('getTask') + ->andReturn($defaultMockTask) + ->getMock() + ->allows('getRelatedLicence') + ->getMock(); + $this->repoMap[Repository\Conversation::class] + ->allows('fetchUsingId') + ->andReturn($defaultMockConversation) + ->byDefault(); + $this->repoMap[Repository\Conversation::class] + ->allows('save') + ->byDefault(); parent::setUp(); - $this->commandHandler->allows('handleCommand')->andReturn(new Result())->byDefault(); + $this->commandHandler->allows('handleCommand') + ->andReturn(new Result()) + ->byDefault(); } public function testHandleMarksConversationAsClosed() { - $command = CloseConversationCommand::create($commandParameters = ['id' => 1]); - - $this->repoMap[Repository\Conversation::class]->expects('save')->with(m::on(function ($conversation) { - $this->assertTrue($conversation->getIsClosed()); - return true; - })); + $command = CloseConversationCommand::create(['id' => 1]); + + $this->repoMap[Repository\Conversation::class] + ->expects('save') + ->with( + m::on( + function ($conversation) { + $this->assertTrue($conversation->getIsClosed()); + return true; + }, + ), + ); $this->sut->handleCommand($command); } @@ -62,16 +83,25 @@ public function testHandleMarksTaskAsClosed() public function testHandleGeneratesAndStoresSnapshot() { - $command = CloseConversationCommand::create($commandParameters = ['id' => 1]); + $command = CloseConversationCommand::create(['id' => 1]); $this->expectedSideEffect(StoreSnapshot::class, [], new Result(), 1); $this->sut->handleCommand($command); } + public function testHandleGeneratesAndStoresEnhancedSnapshot() + { + $command = CloseConversationCommand::create(['id' => 1]); + + $this->expectedSideEffect(StoreEnhancedSnapshot::class, [], new Result(), 1); + + $this->sut->handleCommand($command); + } + public function testHandleCreatesCorrespondenceRecord() { - $command = CloseConversationCommand::create($commandParameters = ['id' => 1]); + $command = CloseConversationCommand::create(['id' => 1]); $this->expectedSideEffect(CreateCorrespondenceRecord::class, [], new Result(), 1); diff --git a/test/module/Api/src/Domain/CommandHandler/Messaging/Conversation/StoreEnhancedSnapshotTest.php b/test/module/Api/src/Domain/CommandHandler/Messaging/Conversation/StoreEnhancedSnapshotTest.php new file mode 100644 index 0000000000..3a05aca984 --- /dev/null +++ b/test/module/Api/src/Domain/CommandHandler/Messaging/Conversation/StoreEnhancedSnapshotTest.php @@ -0,0 +1,29 @@ +