Messages: Add message.read, change msgStatus to msgType

Fix inbox UI + fix test
pull/3924/head
Julio Montoya 5 years ago
parent 163c941ebe
commit 00efbc33bf
  1. 2
      assets/vue/mixins/CreateMixin.js
  2. 4
      assets/vue/views/message/List.vue
  3. 2
      public/main/inc/lib/usergroup.lib.php
  4. 4
      src/CoreBundle/DataProvider/Extension/MessageExtension.php
  5. 8
      src/CoreBundle/Entity/Listener/MessageListener.php
  6. 41
      src/CoreBundle/Entity/Message.php
  7. 50
      src/CoreBundle/Migrations/Schema/V200/Version20200821224242.php
  8. 4
      src/CoreBundle/Security/Authorization/Voter/MessageVoter.php
  9. 2
      src/CoreBundle/Serializer/UserToJsonNormalizer.php
  10. 8
      tests/CoreBundle/Repository/MessageRepositoryTest.php

@ -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);
});
}

@ -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
};

@ -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)

@ -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,

@ -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();
}

@ -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;
}
}

@ -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

@ -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;
}

@ -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);
}

@ -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);
}
}

Loading…
Cancel
Save