diff options
author | Ashelyn Rose <git@ashen.earth> | 2025-02-25 23:48:46 -0700 |
---|---|---|
committer | Ashelyn Rose <git@ashen.earth> | 2025-02-25 23:48:46 -0700 |
commit | bca380fcf242208e375dd509cbd7bcb4d643a400 (patch) | |
tree | 26e3be107f7be09741781733d623c9e6cddc6b3c /app | |
parent | 29576c7c36f254d6a60b0d599e5f809c636acb4b (diff) |
Diffstat (limited to 'app')
-rw-r--r-- | app/Cargo.toml | 1 | ||||
-rw-r--r-- | app/src/commands/accounts.rs | 84 | ||||
-rw-r--r-- | app/src/commands/mod.rs | 1 | ||||
-rw-r--r-- | app/src/lib.rs | 65 |
4 files changed, 90 insertions, 61 deletions
diff --git a/app/Cargo.toml b/app/Cargo.toml index e0def75..accf7aa 100644 --- a/app/Cargo.toml +++ b/app/Cargo.toml @@ -22,5 +22,6 @@ tauri-plugin-deep-link = "2" tauri-plugin-single-instance = {version = "2", features = ["deep-link"] } tokio = "1.43.0" toml = "0.8.20" +ts-rs = "10.1" url = "2.5.4" uuid = {version="1.13.1", features= ["v4"] } diff --git a/app/src/commands/accounts.rs b/app/src/commands/accounts.rs new file mode 100644 index 0000000..ef9c203 --- /dev/null +++ b/app/src/commands/accounts.rs @@ -0,0 +1,84 @@ +use tauri::{State, AppHandle}; +use crate::oauth::SigninResult; +use crate::persistence::Account as PersistedAccount; +use crate::AppState; +use tauri_plugin_opener::OpenerExt; +use ts_rs::TS; +use serde::Serialize; + +#[derive(TS, Serialize)] +#[ts(export)] +pub struct Account { + username: String, + domain: String, +} + +impl From<PersistedAccount> for Account { + fn from(value: PersistedAccount) -> Self { + Self { + username: value.username, + domain: value.server_domain, + } + } +} + +#[tauri::command] +pub async fn get_all_accounts(state: State<'_, AppState>) -> Result<Vec<Account>, String> { + Ok(state.persistence_controller.get_all_accounts().await.into_iter().map(|a| a.into()).collect()) +} + +#[tauri::command] +pub async fn start_account_auth(app_handle: AppHandle, state: State<'_, AppState>, instance_domain: &str) -> Result<Vec<String>, ()> { + let add_result = state.oauth_controller.start_authorization(instance_domain).await; + + let state_nonce = match add_result { + Ok(result) => { + let opener = app_handle.opener(); + if let Err(_) = opener.open_url(result.auth_url, None::<&str>) { + println!("Could not open authentication page"); + return Err(()) + } + + result.auth_state + } + Err(err) => { + println!("Error adding server: {err}"); + return Err(()) + } + }; + + let signin_result = state.oauth_controller.finish_authorization(state_nonce).await; + match signin_result { + Ok(SigninResult {server_domain, username}) => { + println!("Signed in successfully @{username}@{server_domain}"); + Ok(vec!(server_domain, username)) + } + Err(err) => { + println!("Error completing signin: {err}"); + Err(()) + } + } +} + +#[tauri::command] +pub async fn get_self(state: State<'_, AppState>, server_domain: String, username: String) -> Result<String, String> { + let client = reqwest::Client::builder().user_agent("Foxfleet v0.0.1").build().expect("Could not construct client"); + + let account = state.persistence_controller.get_account(&username, &server_domain).await + .ok_or(format!("No account for @{username}@{server_domain}"))?; + + let api_key = state.persistence_controller.get_credential(account.api_credential_id).await?; + + if let Ok(result) = client.get("https://social.tempest.dev/api/v1/accounts/verify_credentials") + .bearer_auth(api_key) + .send().await { + if let Ok(result) = result.text().await { + return Ok(result) + } else { + return Err("Error decoding response".to_string()); + } + } else { + return Err("Error fetching account".to_string()); + } +} + diff --git a/app/src/commands/mod.rs b/app/src/commands/mod.rs new file mode 100644 index 0000000..9bb4894 --- /dev/null +++ b/app/src/commands/mod.rs @@ -0,0 +1 @@ +pub mod accounts; diff --git a/app/src/lib.rs b/app/src/lib.rs index 91071fa..879a4f3 100644 --- a/app/src/lib.rs +++ b/app/src/lib.rs @@ -4,8 +4,10 @@ use oauth::{OAuthController, SigninResult}; mod persistence; use persistence::{Account, PersistenceController}; + +pub mod commands; + use tauri_plugin_deep_link::DeepLinkExt; -use tauri_plugin_opener::OpenerExt; use tauri::{Manager, State, AppHandle}; @@ -41,67 +43,8 @@ pub fn run() { }); Ok(()) }) - .invoke_handler(tauri::generate_handler![start_account_auth, get_self, get_all_accounts]) + .invoke_handler(tauri::generate_handler![commands::accounts::start_account_auth, commands::accounts::get_self, commands::accounts::get_all_accounts]) .run(tauri::generate_context!()) .expect("Error starting") } -#[tauri::command] -async fn get_all_accounts(state: State<'_, AppState>) -> Result<Vec<Account>, String> { - Ok(state.persistence_controller.get_all_accounts().await) -} - -#[tauri::command] -async fn start_account_auth(app_handle: AppHandle, state: State<'_, AppState>, instance_domain: &str) -> Result<Vec<String>, ()> { - let add_result = state.oauth_controller.start_authorization(instance_domain).await; - - let state_nonce = match add_result { - Ok(result) => { - let opener = app_handle.opener(); - if let Err(_) = opener.open_url(result.auth_url, None::<&str>) { - println!("Could not open authentication page"); - return Err(()) - } - - result.auth_state - } - Err(err) => { - println!("Error adding server: {err}"); - return Err(()) - } - }; - - let signin_result = state.oauth_controller.finish_authorization(state_nonce).await; - match signin_result { - Ok(SigninResult {server_domain, username}) => { - println!("Signed in successfully @{username}@{server_domain}"); - Ok(vec!(server_domain, username)) - } - Err(err) => { - println!("Error completing signin: {err}"); - Err(()) - } - } -} - -#[tauri::command] -async fn get_self(state: State<'_, AppState>, server_domain: String, username: String) -> Result<String, String> { - let client = reqwest::Client::builder().user_agent("Foxfleet v0.0.1").build().expect("Could not construct client"); - - let account = state.persistence_controller.get_account(&username, &server_domain).await - .ok_or(format!("No account for @{username}@{server_domain}"))?; - - let api_key = state.persistence_controller.get_credential(account.api_credential_id).await?; - - if let Ok(result) = client.get("https://social.tempest.dev/api/v1/accounts/verify_credentials") - .bearer_auth(api_key) - .send().await { - if let Ok(result) = result.text().await { - return Ok(result) - } else { - return Err("Error decoding response".to_string()); - } - } else { - return Err("Error fetching account".to_string()); - } -} |