Server: - PostgreSQL backend (Pool enum over Sqlite/PgPool, all storage methods dual-dialect) - E2EE for DM (4 new protobuf packets, handlers, storage of ciphertext only) - ChannelEdit packet + server-authoritative channel create/delete - Gateway → voice-node membership signaling via broadcast channel Client: - E2EE crypto (X25519 from Ed25519, HKDF, ChaCha20-Poly1305) + UI lock icons - E2EE net layer (PID 0x0071-0x0074, JSON payloads, dispatch, session handlers) - Slint migration: all .slint files, bridge.rs, update.rs, main.rs rewritten - Removed egui UI (~50 files) and all dead code (clean clippy -D warnings)
87 lines
3 KiB
Rust
87 lines
3 KiB
Rust
use anyhow::Result;
|
|
|
|
use super::Pool;
|
|
|
|
impl super::Storage {
|
|
pub async fn increment_dm_unread(&self, dm_id: &str, recipient_id: &str) -> Result<()> {
|
|
match &self.pool {
|
|
Pool::Sqlite(p) => {
|
|
let (u1, _u2) = sqlx::query_as::<_, (String, String)>(
|
|
"SELECT user1_id,user2_id FROM direct_messages WHERE id=?",
|
|
)
|
|
.bind(dm_id)
|
|
.fetch_one(p)
|
|
.await?;
|
|
if recipient_id == u1 {
|
|
sqlx::query(
|
|
"UPDATE direct_messages SET unread_count_2=unread_count_2+1 WHERE id=?",
|
|
)
|
|
.bind(dm_id)
|
|
.execute(p)
|
|
.await?;
|
|
} else {
|
|
sqlx::query(
|
|
"UPDATE direct_messages SET unread_count_1=unread_count_1+1 WHERE id=?",
|
|
)
|
|
.bind(dm_id)
|
|
.execute(p)
|
|
.await?;
|
|
}
|
|
}
|
|
Pool::Postgres(p) => {
|
|
let (u1, _u2) = sqlx::query_as::<_, (String, String)>(
|
|
"SELECT user1_id,user2_id FROM direct_messages WHERE id=$1",
|
|
)
|
|
.bind(dm_id)
|
|
.fetch_one(p)
|
|
.await?;
|
|
if recipient_id == u1 {
|
|
sqlx::query(
|
|
"UPDATE direct_messages SET unread_count_2=unread_count_2+1 WHERE id=$1",
|
|
)
|
|
.bind(dm_id)
|
|
.execute(p)
|
|
.await?;
|
|
} else {
|
|
sqlx::query(
|
|
"UPDATE direct_messages SET unread_count_1=unread_count_1+1 WHERE id=$1",
|
|
)
|
|
.bind(dm_id)
|
|
.execute(p)
|
|
.await?;
|
|
}
|
|
}
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
pub async fn reset_dm_unread(&self, dm_id: &str, user_id: &str) -> Result<()> {
|
|
match &self.pool {
|
|
Pool::Sqlite(p) => {
|
|
sqlx::query(
|
|
"UPDATE direct_messages SET \
|
|
unread_count_1 = CASE WHEN user1_id=? THEN 0 ELSE unread_count_1 END, \
|
|
unread_count_2 = CASE WHEN user2_id=? THEN 0 ELSE unread_count_2 END WHERE id=?",
|
|
)
|
|
.bind(user_id)
|
|
.bind(user_id)
|
|
.bind(dm_id)
|
|
.execute(p)
|
|
.await?;
|
|
}
|
|
Pool::Postgres(p) => {
|
|
sqlx::query(
|
|
"UPDATE direct_messages SET \
|
|
unread_count_1 = CASE WHEN user1_id=$1 THEN 0 ELSE unread_count_1 END, \
|
|
unread_count_2 = CASE WHEN user2_id=$2 THEN 0 ELSE unread_count_2 END WHERE id=$3",
|
|
)
|
|
.bind(user_id)
|
|
.bind(user_id)
|
|
.bind(dm_id)
|
|
.execute(p)
|
|
.await?;
|
|
}
|
|
}
|
|
Ok(())
|
|
}
|
|
}
|