refactor(tests): reformat code and update dependency management

- Reorganized import statements in adapter tests for better readability
- Replaced or_insert_with(Vec::new) with or_default() in test closures
- Updated Cargo.lock with new dependency versions and checksums
- Added TLS features to tonic dependency configuration
- Included sqlx, chrono, and uuid dependencies with specific features
- Added jsonwebtoken and arc-swap as project dependencies
- Reformatted assertion statements to comply with line length limits
- Adjusted base64 import order in engine codec module
- Updated protobuf include statement formatting
This commit is contained in:
zhenyi
2026-06-11 12:11:05 +08:00
parent 06e8ee96a5
commit 821537186e
111 changed files with 10458 additions and 385 deletions
+94
View File
@@ -0,0 +1,94 @@
//! Reaction CRUD operations on `MessageRepo`.
//!
//! Each (message, user, content) tuple is unique via ON CONFLICT.
//! Toggle semantics: same request adds/removes the reaction.
use chrono::Utc;
use uuid::Uuid;
use crate::ImksResult;
use crate::models::message_reaction::MessageReaction;
use super::message_repo::MessageRepo;
impl MessageRepo {
/// Add or toggle a reaction. Returns the reaction if added, None if already exists.
pub async fn add_reaction(
&self,
message_id: Uuid,
channel_id: Uuid,
user_id: Uuid,
content: &str,
) -> ImksResult<Option<MessageReaction>> {
let id = Uuid::now_v7();
let now = Utc::now();
let row = sqlx::query_as::<_, MessageReaction>(
r#"
INSERT INTO message_reaction (id, message_id, channel_id, user_id, content, created_at)
VALUES ($1, $2, $3, $4, $5, $6)
ON CONFLICT (message_id, user_id, content) DO NOTHING
RETURNING *
"#,
)
.bind(id)
.bind(message_id)
.bind(channel_id)
.bind(user_id)
.bind(content)
.bind(now)
.fetch_optional(self.pool())
.await?;
Ok(row)
}
/// Remove a user's reaction from a message.
pub async fn remove_reaction(
&self,
message_id: Uuid,
user_id: Uuid,
content: &str,
) -> ImksResult<bool> {
let result = sqlx::query(
r#"
DELETE FROM message_reaction
WHERE message_id = $1 AND user_id = $2 AND content = $3
"#,
)
.bind(message_id)
.bind(user_id)
.bind(content)
.execute(self.pool())
.await?;
Ok(result.rows_affected() > 0)
}
/// Get all reactions on a message.
pub async fn get_reactions(&self, message_id: Uuid) -> ImksResult<Vec<MessageReaction>> {
sqlx::query_as::<_, MessageReaction>(
"SELECT * FROM message_reaction WHERE message_id = $1 ORDER BY created_at",
)
.bind(message_id)
.fetch_all(self.pool())
.await
.map_err(Into::into)
}
/// Get a specific user's reactions on a message.
pub async fn get_user_reactions(
&self,
message_id: Uuid,
user_id: Uuid,
) -> ImksResult<Vec<MessageReaction>> {
sqlx::query_as::<_, MessageReaction>(
"SELECT * FROM message_reaction WHERE message_id = $1 AND user_id = $2 ORDER BY created_at",
)
.bind(message_id)
.bind(user_id)
.fetch_all(self.pool())
.await
.map_err(Into::into)
}
}