From 9c1ba977913fe64c2a3ce4916900a91cbd857bbc Mon Sep 17 00:00:00 2001
From: Awiteb
Date: Wed, 17 Jul 2024 22:59:47 +0300
Subject: [PATCH] feat: Create unique index for `SenderId` and `Recipient`
Signed-off-by: Awiteb
---
.../src/database/out_chat_requests.rs | 20 ++++++++++---------
.../create_outgoing_chat_requests_table.rs | 13 ++++++++++++
2 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/crates/oxidetalis/src/database/out_chat_requests.rs b/crates/oxidetalis/src/database/out_chat_requests.rs
index df8840c..f0cb280 100644
--- a/crates/oxidetalis/src/database/out_chat_requests.rs
+++ b/crates/oxidetalis/src/database/out_chat_requests.rs
@@ -69,21 +69,23 @@ impl OutChatRequestsExt for DatabaseConnection {
requester: &UserModel,
recipient: &PublicKey,
) -> ServerResult<()> {
- if self
- .have_chat_request_to(requester, recipient)
- .await?
- .is_some()
- {
- return Err(WsError::AlreadySendChatRequest.into());
- }
- OutChatRequestsActiveModel {
+ if let Err(err) = (OutChatRequestsActiveModel {
sender_id: Set(requester.id),
recipient: Set(recipient.to_string()),
out_on: Set(Utc::now()),
..Default::default()
}
.save(self)
- .await?;
+ .await)
+ {
+ match err.sql_err() {
+ Some(SqlErr::UniqueConstraintViolation(_)) => {
+ return Err(WsError::AlreadySendChatRequest.into());
+ }
+ _ => return Err(err.into()),
+ }
+ }
+
Ok(())
}
diff --git a/crates/oxidetalis_migrations/src/create_outgoing_chat_requests_table.rs b/crates/oxidetalis_migrations/src/create_outgoing_chat_requests_table.rs
index 6880157..d033bc3 100644
--- a/crates/oxidetalis_migrations/src/create_outgoing_chat_requests_table.rs
+++ b/crates/oxidetalis_migrations/src/create_outgoing_chat_requests_table.rs
@@ -29,6 +29,19 @@ pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager
+ .create_index(
+ Index::create()
+ .if_not_exists()
+ .name("sep_request")
+ .table(OutChatRequests::Table)
+ .col(OutChatRequests::SenderId)
+ .col(OutChatRequests::Recipient)
+ .unique()
+ .to_owned(),
+ )
+ .await?;
+
manager
.create_table(
Table::create()