diff --git a/assets/vue/mixins/CreateMixin.js b/assets/vue/mixins/CreateMixin.js index c4b30910e4..2c63da2ad6 100644 --- a/assets/vue/mixins/CreateMixin.js +++ b/assets/vue/mixins/CreateMixin.js @@ -43,7 +43,7 @@ export default { // Send to inbox createForm.v$.item.$model.userSender = '/api/users/' + this.currentUser.id; createForm.v$.item.$model.userReceiver = user['@id']; - createForm.v$.item.$model.msgStatus = 1; + createForm.v$.item.$model.msgType = 1; this.create(createForm.v$.item.$model); }); } diff --git a/assets/vue/views/message/List.vue b/assets/vue/views/message/List.vue index a730332cbb..a833063a26 100644 --- a/assets/vue/views/message/List.vue +++ b/assets/vue/views/message/List.vue @@ -293,13 +293,13 @@ export default { const user = store.getters["security/getUser"] filtersSent.value = { - msgStatus: 2, + msgType: 2, userSender: user.id } // inbox filters.value = { - msgStatus: 1, + msgType: 1, userReceiver: user.id }; diff --git a/public/main/inc/lib/usergroup.lib.php b/public/main/inc/lib/usergroup.lib.php index 878e2cefa7..b1d7355f48 100644 --- a/public/main/inc/lib/usergroup.lib.php +++ b/public/main/inc/lib/usergroup.lib.php @@ -2624,7 +2624,7 @@ class UserGroupModel extends Model $group_id = (int) $group_id; $sql = "UPDATE $table_message SET - msg_status = 3 + msg_type = 3 WHERE group_id = $group_id AND (id = '$topic_id' OR parent_id = $topic_id) diff --git a/src/CoreBundle/DataProvider/Extension/MessageExtension.php b/src/CoreBundle/DataProvider/Extension/MessageExtension.php index 7306ea015a..241d84aced 100644 --- a/src/CoreBundle/DataProvider/Extension/MessageExtension.php +++ b/src/CoreBundle/DataProvider/Extension/MessageExtension.php @@ -63,8 +63,8 @@ final class MessageExtension implements QueryCollectionExtensionInterface //, Qu $alias = $queryBuilder->getRootAliases()[0]; $queryBuilder->andWhere(" - ($alias.userSender = :current AND $alias.msgStatus = :outbox) OR - ($alias.userReceiver = :current AND $alias.msgStatus = :inbox) + ($alias.userSender = :current AND $alias.msgType = :outbox) OR + ($alias.userReceiver = :current AND $alias.msgType = :inbox) "); $queryBuilder->setParameters([ 'current' => $user, diff --git a/src/CoreBundle/Entity/Listener/MessageListener.php b/src/CoreBundle/Entity/Listener/MessageListener.php index c56585b562..c8834379a1 100644 --- a/src/CoreBundle/Entity/Listener/MessageListener.php +++ b/src/CoreBundle/Entity/Listener/MessageListener.php @@ -26,10 +26,12 @@ class MessageListener { if ($message) { // Creates an outbox version, if message is sent in the inbox. - if (Message::MESSAGE_TYPE_INBOX === $message->getMsgStatus()) { + if (Message::MESSAGE_TYPE_INBOX === $message->getMsgType()) { $messageSent = clone $message; - $messageSent->setMsgStatus(Message::MESSAGE_TYPE_OUTBOX); - + $messageSent + ->setMsgType(Message::MESSAGE_TYPE_OUTBOX) + ->setRead(true) + ; $args->getEntityManager()->persist($messageSent); $args->getEntityManager()->flush(); } diff --git a/src/CoreBundle/Entity/Message.php b/src/CoreBundle/Entity/Message.php index cf0970782b..f7923836ac 100644 --- a/src/CoreBundle/Entity/Message.php +++ b/src/CoreBundle/Entity/Message.php @@ -26,10 +26,10 @@ use Symfony\Component\Validator\Constraints as Assert; * @ORM\Index(name="idx_message_user_sender", columns={"user_sender_id"}), * @ORM\Index(name="idx_message_user_receiver", columns={"user_receiver_id"}), * @ORM\Index(name="idx_message_user_sender_user_receiver", columns={"user_sender_id", "user_receiver_id"}), - * @ORM\Index(name="idx_message_user_receiver_status", columns={"user_receiver_id", "msg_status"}), - * @ORM\Index(name="idx_message_receiver_status_send_date", columns={"user_receiver_id", "msg_status", "send_date"}), + * @ORM\Index(name="idx_message_user_receiver_type", columns={"user_receiver_id", "msg_type"}), + * @ORM\Index(name="idx_message_receiver_type_send_date", columns={"user_receiver_id", "msg_type", "send_date"}), * @ORM\Index(name="idx_message_group", columns={"group_id"}), - * @ORM\Index(name="idx_message_status", columns={"msg_status"}) + * @ORM\Index(name="idx_message_type", columns={"msg_type"}) * }) * @ORM\Entity(repositoryClass="Chamilo\CoreBundle\Repository\MessageRepository") * @ORM\EntityListeners({"Chamilo\CoreBundle\Entity\Listener\MessageListener"}) @@ -85,7 +85,8 @@ use Symfony\Component\Validator\Constraints as Assert; )] #[ApiFilter(OrderFilter::class, properties: ['title', 'sendDate'])] #[ApiFilter(SearchFilter::class, properties: [ - 'msgStatus' => 'exact', + 'read' => 'exact', + 'msgType' => 'exact', 'userSender' => 'exact', 'userReceiver' => 'exact', ])] @@ -119,7 +120,7 @@ class Message protected User $userReceiver; /** - * @ORM\Column(name="msg_status", type="smallint", nullable=false) + * @ORM\Column(name="msg_type", type="smallint", nullable=false) */ #[Assert\NotBlank] #[Assert\Choice([ @@ -128,7 +129,14 @@ class Message self::MESSAGE_TYPE_PROMOTED, ])] #[Groups(['message:read', 'message:write'])] - protected int $msgStatus; + protected int $msgType; + + /** + * @ORM\Column(name="msg_read", type="boolean", nullable=false) + */ + #[Assert\NotNull] + #[Groups(['message:read', 'message:write'])] + protected bool $read; /** * @ORM\Column(name="send_date", type="datetime", nullable=false) @@ -202,6 +210,7 @@ class Message $this->children = new ArrayCollection(); $this->likes = new ArrayCollection(); $this->votes = 0; + $this->read = false; } public function setUserSender(User $userSender): self @@ -233,16 +242,16 @@ class Message return $this->userReceiver; } - public function setMsgStatus(int $msgStatus): self + public function setMsgType(int $msgType): self { - $this->msgStatus = $msgStatus; + $this->msgType = $msgType; return $this; } - public function getMsgStatus(): int + public function getMsgType(): int { - return $this->msgStatus; + return $this->msgType; } public function setSendDate(DateTime $sendDate): self @@ -395,4 +404,16 @@ class Message return $this; } + + public function isRead(): bool + { + return $this->read; + } + + public function setRead(bool $read): self + { + $this->read = $read; + + return $this; + } } diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20200821224242.php b/src/CoreBundle/Migrations/Schema/V200/Version20200821224242.php index 91d8089fc4..5d05ecf0f5 100644 --- a/src/CoreBundle/Migrations/Schema/V200/Version20200821224242.php +++ b/src/CoreBundle/Migrations/Schema/V200/Version20200821224242.php @@ -21,6 +21,15 @@ final class Version20200821224242 extends AbstractMigrationChamilo $table = $schema->getTable('message'); $this->addSql('ALTER TABLE message CHANGE parent_id parent_id BIGINT DEFAULT NULL'); + if (!$table->hasColumn('msg_read')) { + $this->addSql('ALTER TABLE message ADD msg_read TINYINT(1) NOT NULL'); + + $this->addSql('UPDATE message SET msg_read = 1 WHERE msg_status = 1'); + $this->addSql('UPDATE message SET msg_read = 0 WHERE msg_status = 0'); + $this->addSql('UPDATE message SET msg_status = 1 WHERE msg_status = 0'); + $this->addSql('ALTER TABLE message CHANGE msg_status msg_type SMALLINT NOT NULL'); + } + if ($table->hasIndex('idx_message_parent')) { $this->addSql('DROP INDEX idx_message_parent ON message'); } @@ -58,26 +67,40 @@ final class Version20200821224242 extends AbstractMigrationChamilo 'ALTER TABLE message ADD CONSTRAINT FK_B6BD307FF6C43E79 FOREIGN KEY (user_sender_id) REFERENCES user (id)' ); } - if (false === $table->hasForeignKey('FK_B6BD307F64482423')) { + + if (!$table->hasForeignKey('FK_B6BD307F64482423')) { $this->addSql( 'ALTER TABLE message ADD CONSTRAINT FK_B6BD307F64482423 FOREIGN KEY (user_receiver_id) REFERENCES user (id)' ); } - if (!$table->hasIndex('idx_message_user_receiver_status')) { - $this->addSql('CREATE INDEX idx_message_user_receiver_status ON message (user_receiver_id, msg_status)'); + + if ($table->hasIndex('idx_message_user_receiver_status')) { + $this->addSql('DROP INDEX idx_message_user_receiver_status ON message'); + } + + if ($table->hasIndex('idx_message_receiver_status_send_date')) { + $this->addSql('DROP INDEX idx_message_receiver_status_send_date ON message'); } - if (!$table->hasIndex('idx_message_status')) { - $this->addSql('CREATE INDEX idx_message_status ON message (msg_status)'); + if ($table->hasIndex('idx_message_status')) { + $this->addSql('DROP INDEX idx_message_status ON message'); } - if (!$table->hasIndex('idx_message_receiver_status_send_date')) { + if (!$table->hasIndex('idx_message_user_receiver_type')) { + $this->addSql('CREATE INDEX idx_message_user_receiver_type ON message (user_receiver_id, msg_type)'); + } + + if (!$table->hasIndex('idx_message_type')) { + $this->addSql('CREATE INDEX idx_message_type ON message (msg_type)'); + } + + if (!$table->hasIndex('idx_message_receiver_type_send_date')) { $this->addSql( - 'CREATE INDEX idx_message_receiver_status_send_date ON message (user_receiver_id, msg_status, send_date)' + 'CREATE INDEX idx_message_receiver_type_send_date ON message (user_receiver_id, msg_type, send_date)' ); } - $this->addSql('ALTER TABLE message CHANGE msg_status msg_status SMALLINT NOT NULL;'); + //$this->addSql('ALTER TABLE message CHANGE msg_status msg_status SMALLINT NOT NULL;'); $table = $schema->hasTable('message_feedback'); if (false === $table) { @@ -104,19 +127,24 @@ final class Version20200821224242 extends AbstractMigrationChamilo $this->addSql('ALTER TABLE message_attachment ADD CONSTRAINT FK_B68FF524537A1329 FOREIGN KEY (message_id) REFERENCES message (id)'); } - if (false === $table->hasColumn('resource_node_id')) { + if (!$table->hasColumn('resource_node_id')) { $this->addSql('ALTER TABLE message_attachment ADD resource_node_id BIGINT DEFAULT NULL;'); $this->addSql('CREATE UNIQUE INDEX UNIQ_B68FF5241BAD783F ON message_attachment (resource_node_id);'); } - if (false === $table->hasForeignKey('FK_B68FF5241BAD783F')) { + if (!$table->hasForeignKey('FK_B68FF5241BAD783F')) { $this->addSql(' ALTER TABLE message_attachment ADD CONSTRAINT FK_B68FF5241BAD783F FOREIGN KEY (resource_node_id) REFERENCES resource_node (id) ON DELETE CASCADE;'); } - if (false === $schema->hasTable('c_chat_conversation')) { + if (!$schema->hasTable('c_chat_conversation')) { $this->addSql('CREATE TABLE c_chat_conversation (id INT AUTO_INCREMENT NOT NULL, resource_node_id BIGINT DEFAULT NULL, name VARCHAR(255) DEFAULT NULL, UNIQUE INDEX UNIQ_CD09E33F1BAD783F (resource_node_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB ROW_FORMAT = DYNAMIC;'); $this->addSql('ALTER TABLE c_chat_conversation ADD CONSTRAINT FK_CD09E33F1BAD783F FOREIGN KEY (resource_node_id) REFERENCES resource_node (id) ON DELETE CASCADE'); } + + if (!$schema->hasTable('message_tag')) { + //CREATE TABLE message_tag (id BIGINT AUTO_INCREMENT NOT NULL, user_id INT NOT NULL, tag VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL COMMENT '(DC2Type:datetime)', updated_at DATETIME NOT NULL COMMENT '(DC2Type:datetime)', INDEX IDX_2ABC3D6FA76ED395 (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB ROW_FORMAT = DYNAMIC; + //ALTER TABLE message_tag ADD CONSTRAINT FK_2ABC3D6FA76ED395 FOREIGN KEY (user_id) REFERENCES user (id); + } } public function down(Schema $schema): void diff --git a/src/CoreBundle/Security/Authorization/Voter/MessageVoter.php b/src/CoreBundle/Security/Authorization/Voter/MessageVoter.php index 097bc1c638..8048ebec18 100644 --- a/src/CoreBundle/Security/Authorization/Voter/MessageVoter.php +++ b/src/CoreBundle/Security/Authorization/Voter/MessageVoter.php @@ -74,11 +74,11 @@ class MessageVoter extends Voter break; case self::EDIT: case self::DELETE: - if ($message->getUserReceiver() === $user && Message::MESSAGE_TYPE_INBOX === $message->getMsgStatus()) { + if ($message->getUserReceiver() === $user && Message::MESSAGE_TYPE_INBOX === $message->getMsgType()) { return true; } - if ($message->getUserSender() === $user && Message::MESSAGE_TYPE_OUTBOX === $message->getMsgStatus()) { + if ($message->getUserSender() === $user && Message::MESSAGE_TYPE_OUTBOX === $message->getMsgType()) { return true; } diff --git a/src/CoreBundle/Serializer/UserToJsonNormalizer.php b/src/CoreBundle/Serializer/UserToJsonNormalizer.php index 08e12a1248..96cd4804f9 100644 --- a/src/CoreBundle/Serializer/UserToJsonNormalizer.php +++ b/src/CoreBundle/Serializer/UserToJsonNormalizer.php @@ -481,7 +481,7 @@ final class UserToJsonNormalizer 'Title: '.$item->getTitle(), 'Sent date: '.$date, 'To user: '.$userName, - 'Status'.$item->getMsgStatus(), + 'Type: '.$item->getMsgType(), ]; $messageList[] = implode(', ', $list); } diff --git a/tests/CoreBundle/Repository/MessageRepositoryTest.php b/tests/CoreBundle/Repository/MessageRepositoryTest.php index b027918bff..b9e512f094 100644 --- a/tests/CoreBundle/Repository/MessageRepositoryTest.php +++ b/tests/CoreBundle/Repository/MessageRepositoryTest.php @@ -29,7 +29,7 @@ class MessageRepositoryTest extends WebTestCase (new Message()) ->setTitle('hello') ->setContent('content') - ->setMsgStatus(Message::MESSAGE_TYPE_INBOX) + ->setMsgType(Message::MESSAGE_TYPE_INBOX) ->setUserSender($this->getUser('admin')) ->setUserReceiver($testUser) ; @@ -39,11 +39,11 @@ class MessageRepositoryTest extends WebTestCase $repo->update($message); // 1. Message in the inbox - $count = $repo->count(['msgStatus' => Message::MESSAGE_TYPE_INBOX]); + $count = $repo->count(['msgType' => Message::MESSAGE_TYPE_INBOX]); $this->assertSame(1, $count); - // 2. Message in the outbox - $count = $repo->count(['msgStatus' => Message::MESSAGE_TYPE_OUTBOX]); + // 2. Message in the outbox (this is created in the MessageListener by default). + $count = $repo->count(['msgType' => Message::MESSAGE_TYPE_OUTBOX]); $this->assertSame(1, $count); } }