Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions assets/vue/services/message.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
1 change: 1 addition & 0 deletions assets/vue/store/messageRelUserStore.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 0 additions & 2 deletions assets/vue/views/message/MessageList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -474,8 +474,6 @@ async function deleteMessage(message) {
}
}

await messageService.checkAndUpdateMessageStatus(messageId)

notification.showSuccessNotification(t("Message deleted"))
await messageRelUserStore.findUnreadCount()
loadMessages()
Expand Down
45 changes: 36 additions & 9 deletions assets/vue/views/message/MessageShow.vue
Original file line number Diff line number Diff line change
Expand Up @@ -154,14 +154,15 @@ 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()

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()
Expand All @@ -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) {
Expand All @@ -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)
},
})
}
Expand Down
34 changes: 34 additions & 0 deletions src/CoreBundle/Entity/Listener/MessageStatusListener.php
Original file line number Diff line number Diff line change
@@ -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();
}
}
}
7 changes: 0 additions & 7 deletions src/CoreBundle/Entity/Message.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,6 @@
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'],
Expand Down
2 changes: 2 additions & 0 deletions src/CoreBundle/Entity/MessageRelUser.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
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;
Expand All @@ -32,6 +33,7 @@
#[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: [
Expand Down
5 changes: 5 additions & 0 deletions src/CoreBundle/Resources/config/listeners.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
20 changes: 0 additions & 20 deletions src/CoreBundle/State/MessageProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,6 @@ public function process($data, Operation $operation, array $uriVariables = [], a
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);

Expand Down Expand Up @@ -121,22 +117,6 @@ private function processDeleteForUser($data): Message
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(
Expand Down
Loading