Message: Refactor message deletion and status update logic with entity listeners - refs BT#21887

pull/5710/head
christianbeeznst 1 year ago
parent 3bd26a5151
commit 068917be89
  1. 9
      assets/vue/services/message.js
  2. 1
      assets/vue/store/messageRelUserStore.js
  3. 2
      assets/vue/views/message/MessageList.vue
  4. 45
      assets/vue/views/message/MessageShow.vue
  5. 34
      src/CoreBundle/Entity/Listener/MessageStatusListener.php
  6. 7
      src/CoreBundle/Entity/Message.php
  7. 2
      src/CoreBundle/Entity/MessageRelUser.php
  8. 5
      src/CoreBundle/Resources/config/listeners.yml
  9. 20
      src/CoreBundle/State/MessageProcessor.php

@ -33,17 +33,8 @@ async function deleteMessageForUser(messageId, userId) {
})
}
async function checkAndUpdateMessageStatus(messageId) {
return await axios.patch(`/api/messages/${messageId}/check-and-update-status`, {}, {
headers: {
'Content-Type': 'application/json'
}
})
}
export const messageService = {
create,
countUnreadMessages,
deleteMessageForUser,
checkAndUpdateMessageStatus,
};

@ -16,6 +16,7 @@ export const useMessageRelUserStore = defineStore("messageRelUser", {
"order[sendDate]": "desc",
"receivers.read": false,
"receivers.receiver": securityStore.user["@id"],
"receivers.receiverType": 1,
itemsPerPage: 1,
msgType: MESSAGE_TYPE_INBOX,
status: 0,

@ -474,8 +474,6 @@ async function deleteMessage(message) {
}
}
await messageService.checkAndUpdateMessageStatus(messageId)
notification.showSuccessNotification(t("Message deleted"))
await messageRelUserStore.findUnreadCount()
loadMessages()

@ -154,6 +154,8 @@ import BaseCard from "../../components/basecomponents/BaseCard.vue"
import MessageCommunicationParty from "./MessageCommunicationParty.vue"
import BaseIcon from "../../components/basecomponents/BaseIcon.vue"
import SectionHeader from "../../components/layout/SectionHeader.vue"
import { messageService } from "../../services/message"
import { useNotification } from "../../composables/notification"
const confirm = useConfirm()
const { t } = useI18n()
@ -161,7 +163,6 @@ const { t } = useI18n()
const isLoadingSelect = ref(false)
const store = useStore()
const securityStore = useSecurityStore()
//const find = store.getters["message/find"];
const route = useRoute()
const router = useRouter()
const messageRelUserStore = useMessageRelUserStore()
@ -177,13 +178,12 @@ const isLoading = computed(() => store.state.message.isLoading)
const item = ref(null)
const myReceiver = ref(null)
const notification = useNotification()
store.dispatch("message/load", id).then((responseItem) => {
item.value = responseItem
myReceiver.value = [...responseItem.receiversTo, ...responseItem.receiversCc].find(
({ receiver }) => receiver["@id"] === securityStore.user["@id"],
)
myReceiver.value = findMyReceiver(responseItem, securityStore.user["@id"])
// Change to read.
if (myReceiver.value && false === myReceiver.value.read) {
@ -193,16 +193,43 @@ store.dispatch("message/load", id).then((responseItem) => {
}
})
function extractUserId(apiId) {
return apiId.split("/").pop()
}
function findMyReceiver(message, userId) {
const receivers = [...message.receiversTo, ...message.receiversCc]
return receivers.find(({ receiver }) => receiver["@id"] === userId)
}
async function deleteMessage(message) {
try {
const userId = extractUserId(securityStore.user["@id"])
const messageId = extractUserId(message["@id"])
if (message.sender["@id"] === securityStore.user["@id"]) {
await messageService.deleteMessageForUser(messageId, userId)
} else {
const myReceiver = findMyReceiver(message, securityStore.user["@id"])
if (myReceiver) {
await store.dispatch("messagereluser/del", myReceiver)
}
}
notification.showSuccessNotification(t("Message deleted"))
await messageRelUserStore.findUnreadCount()
await router.push({ name: "MessageList" })
} catch (e) {
notification.showErrorNotification(t("Error deleting message"))
}
}
function confirmDelete() {
confirm.require({
header: t("Confirmation"),
message: t(`Are you sure you want to delete "${item.value.title}"?`),
accept: async () => {
await store.dispatch("message/del", item)
await router.push({
name: "MessageList",
})
await deleteMessage(item.value)
},
})
}

@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Entity\Listener;
use Chamilo\CoreBundle\Entity\Message;
use Chamilo\CoreBundle\Entity\MessageRelUser;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\LifecycleEventArgs;
class MessageStatusListener
{
private EntityManagerInterface $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public function postRemove(MessageRelUser $messageRelUser, LifecycleEventArgs $args): void
{
$message = $messageRelUser->getMessage();
$remainingReceivers = $this->entityManager->getRepository(MessageRelUser::class)
->count(['message' => $message]);
if ($remainingReceivers === 0) {
$message->setStatus(Message::MESSAGE_STATUS_DELETED);
$this->entityManager->flush();
}
}
}

@ -59,13 +59,6 @@ use Symfony\Component\Validator\Constraints as Assert;
output: false,
processor: MessageProcessor::class,
),
new Patch(
uriTemplate: '/messages/{id}/check-and-update-status',
inputFormats: ['json' => ['application/json']],
security: "is_granted('ROLE_USER')",
output: false,
processor: MessageProcessor::class,
),
],
normalizationContext: [
'groups' => ['message:read'],

@ -9,6 +9,7 @@ namespace Chamilo\CoreBundle\Entity;
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Metadata\ApiFilter;
use ApiPlatform\Metadata\ApiResource;
use Chamilo\CoreBundle\Entity\Listener\MessageStatusListener;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
@ -32,6 +33,7 @@ use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Table(name: 'message_rel_user')]
#[ORM\UniqueConstraint(name: 'message_receiver', columns: ['message_id', 'user_id'])]
#[ORM\Entity]
#[ORM\EntityListeners([MessageStatusListener::class])]
#[ApiFilter(
filterClass: SearchFilter::class,
properties: [

@ -101,3 +101,8 @@ services:
- '@translator'
tags:
- {name: doctrine.orm.entity_listener, entity_manager: default, lazy: true}
Chamilo\CoreBundle\Entity\Listener\MessageStatusListener:
arguments: [ '@doctrine.orm.entity_manager' ]
tags:
- { name: doctrine.orm.entity_listener, entity_manager: default, lazy: true }

@ -44,10 +44,6 @@ final class MessageProcessor implements ProcessorInterface
return $this->processDeleteForUser($data);
}
if ($operation instanceof Patch && str_contains($operation->getUriTemplate(), 'check-and-update-status')) {
return $this->checkAndUpdateMessageStatus($data);
}
/** @var Message $message */
$message = $this->persistProcessor->process($data, $operation, $uriVariables, $context);
@ -121,22 +117,6 @@ final class MessageProcessor implements ProcessorInterface
return $message;
}
private function checkAndUpdateMessageStatus($data): Message
{
/** @var Message $message */
$message = $data;
$messageRelUserRepository = $this->entityManager->getRepository(MessageRelUser::class);
$remainingReceivers = $messageRelUserRepository->count(['message' => $message]);
if (0 === $remainingReceivers) {
$message->setStatus(Message::MESSAGE_STATUS_DELETED);
$this->entityManager->flush();
}
return $message;
}
private function saveNotificationForInboxMessage(Message $message): void
{
$sender_info = api_get_user_info(

Loading…
Cancel
Save