feat: add delete account message

This commit is contained in:
Anna 2022-07-19 18:19:55 -04:00
parent e602194f85
commit 9a3ba3f0a5
6 changed files with 83 additions and 23 deletions

View File

@ -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<RwLock<State>>, client_state: Arc<RwLock<ClientState>>, 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
}

View File

@ -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;

View File

@ -427,6 +427,9 @@ async fn client_loop(state: Arc<RwLock<State>>, 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?;
}

View File

@ -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);

View File

@ -0,0 +1,9 @@
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeleteAccountRequest {
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeleteAccountResponse {
}

View File

@ -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::*,
};