Phase 2: PostgreSQL, E2EE, channel CRUD, voice signaling, Slint migration

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)
This commit is contained in:
loki5512344 2026-07-14 13:25:14 +02:00
parent c34ed2a192
commit 742cf03a5f
Signed by: boba
GPG key ID: 253067914055423B
31 changed files with 2203 additions and 639 deletions

View file

@ -1,38 +1,87 @@
use anyhow::Result;
use super::Pool;
impl super::Storage {
pub async fn increment_dm_unread(&self, dm_id: &str, recipient_id: &str) -> Result<()> {
let (u1, _u2) = sqlx::query_as::<_, (String, String)>(
"SELECT user1_id,user2_id FROM direct_messages WHERE id=?",
)
.bind(dm_id)
.fetch_one(&self.pool)
.await?;
if recipient_id == u1 {
sqlx::query("UPDATE direct_messages SET unread_count_2=unread_count_2+1 WHERE id=?")
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)
.execute(&self.pool)
.fetch_one(p)
.await?;
} else {
sqlx::query("UPDATE direct_messages SET unread_count_1=unread_count_1+1 WHERE id=?")
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)
.execute(&self.pool)
.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<()> {
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(&self.pool)
.await?;
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(())
}
}