From 9a3ba3f0a5199cb1f60312c5e0f97e50b352c8a5 Mon Sep 17 00:00:00 2001 From: Anna Date: Tue, 19 Jul 2022 18:19:55 -0400 Subject: [PATCH] feat: add delete account message --- server/src/handlers/delete_account.rs | 39 ++++++++++++++++ server/src/handlers/mod.rs | 2 + server/src/main.rs | 3 ++ server/src/types/protocol/container.rs | 4 ++ server/src/types/protocol/delete_account.rs | 9 ++++ server/src/types/protocol/mod.rs | 49 +++++++++++---------- 6 files changed, 83 insertions(+), 23 deletions(-) create mode 100644 server/src/handlers/delete_account.rs create mode 100644 server/src/types/protocol/delete_account.rs diff --git a/server/src/handlers/delete_account.rs b/server/src/handlers/delete_account.rs new file mode 100644 index 0000000..09dc99f --- /dev/null +++ b/server/src/handlers/delete_account.rs @@ -0,0 +1,39 @@ +use std::sync::Arc; + +use anyhow::{Context, Result}; +use tokio::sync::RwLock; + +use crate::{ClientState, ErrorResponse, State, WsStream}; +use crate::types::protocol::{DeleteAccountRequest, DeleteAccountResponse}; + +pub async fn delete_account(state: Arc>, client_state: Arc>, conn: &mut WsStream, number: u32, _req: DeleteAccountRequest) -> Result<()> { + let id = match client_state.read().await.lodestone_id() { + Some(id) => id, + None => return crate::util::send(conn, number, ErrorResponse::new(None, "no Lodestone ID? this is a bug")).await, + }; + let lodestone_id = id as i64; + + let channels = sqlx::query!( + // language=sqlite + "select count(*) as count from user_channels where lodestone_id = ?", + lodestone_id, + ) + .fetch_one(&state.read().await.db) + .await + .context("could not get channel count")?; + + if channels.count > 0 { + return crate::util::send(conn, number, ErrorResponse::new(None, "leave all linkshells first")).await; + } + + sqlx::query!( + // language=sqlite + "delete from users where lodestone_id = ?", + lodestone_id, + ) + .execute(&state.read().await.db) + .await + .context("could not delete user")?; + + crate::util::send(conn, number, DeleteAccountResponse {}).await +} diff --git a/server/src/handlers/mod.rs b/server/src/handlers/mod.rs index 919c317..29dbd44 100644 --- a/server/src/handlers/mod.rs +++ b/server/src/handlers/mod.rs @@ -2,6 +2,7 @@ pub use self::{ allow_invites::*, authenticate::*, create::*, + delete_account::*, disband::*, invite::*, join::*, @@ -22,6 +23,7 @@ pub use self::{ pub mod allow_invites; pub mod authenticate; pub mod create; +pub mod delete_account; pub mod disband; pub mod invite; pub mod join; diff --git a/server/src/main.rs b/server/src/main.rs index 2feba7c..c414134 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -427,6 +427,9 @@ async fn client_loop(state: Arc>, mut conn: WsStream) -> Result<() RequestKind::AllowInvites(req) if logged_in => { crate::handlers::allow_invites(Arc::clone(&state), Arc::clone(&client_state), &mut conn, msg.number, req).await?; } + RequestKind::DeleteAccount(req) if logged_in => { + crate::handlers::delete_account(Arc::clone(&state), Arc::clone(&client_state), &mut conn, msg.number, req).await?; + } _ if !logged_in => { util::send(&mut conn, msg.number, ErrorResponse::new(None, "not logged in")).await?; } diff --git a/server/src/types/protocol/container.rs b/server/src/types/protocol/container.rs index 0c943ff..fb1ffc3 100644 --- a/server/src/types/protocol/container.rs +++ b/server/src/types/protocol/container.rs @@ -29,6 +29,7 @@ pub enum RequestKind { Secrets(SecretsRequest), SendSecrets(SendSecretsRequest), AllowInvites(AllowInvitesRequest), + DeleteAccount(DeleteAccountRequest), } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -63,6 +64,7 @@ pub enum ResponseKind { SendSecrets(SendSecretsResponse), Announce(AnnounceResponse), AllowInvites(AllowInvitesResponse), + DeleteAccount(DeleteAccountResponse), } macro_rules! request_container { @@ -93,6 +95,7 @@ request_container!(PublicKey, PublicKeyRequest); request_container!(Secrets, SecretsRequest); request_container!(SendSecrets, SendSecretsRequest); request_container!(AllowInvites, AllowInvitesRequest); +request_container!(DeleteAccount, DeleteAccountRequest); macro_rules! response_container { ($name:ident, $response:ty) => { @@ -127,3 +130,4 @@ response_container!(Secrets, SecretsResponse); response_container!(SendSecrets, SendSecretsResponse); response_container!(Announce, AnnounceResponse); response_container!(AllowInvites, AllowInvitesResponse); +response_container!(DeleteAccount, DeleteAccountResponse); diff --git a/server/src/types/protocol/delete_account.rs b/server/src/types/protocol/delete_account.rs new file mode 100644 index 0000000..aaa62a1 --- /dev/null +++ b/server/src/types/protocol/delete_account.rs @@ -0,0 +1,9 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DeleteAccountRequest { +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DeleteAccountResponse { +} diff --git a/server/src/types/protocol/mod.rs b/server/src/types/protocol/mod.rs index bd08313..702d383 100644 --- a/server/src/types/protocol/mod.rs +++ b/server/src/types/protocol/mod.rs @@ -1,8 +1,34 @@ +pub use self::{ + allow_invites::*, + announce::*, + authenticate::*, + container::*, + create::*, + delete_account::*, + disband::*, + error::*, + invite::*, + join::*, + kick::*, + leave::*, + list::*, + member_change::*, + message::*, + ping::*, + promote::*, + public_key::*, + register::*, + secrets::*, + update::*, + version::*, +}; + pub mod allow_invites; pub mod announce; pub mod authenticate; pub mod container; pub mod create; +pub mod delete_account; pub mod disband; pub mod error; pub mod invite; @@ -22,26 +48,3 @@ pub mod version; pub mod channel; -pub use self::{ - allow_invites::*, - announce::*, - authenticate::*, - container::*, - create::*, - disband::*, - error::*, - invite::*, - join::*, - kick::*, - leave::*, - list::*, - member_change::*, - message::*, - ping::*, - promote::*, - public_key::*, - register::*, - secrets::*, - update::*, - version::*, -};