summary refs log tree commit diff
path: root/app/src/lib.rs
blob: 98ada196d5f6754fd8c38d4db209dade1b073ed2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
mod oauth;
use oauth::OAuthController;

use tauri_plugin_deep_link::DeepLinkExt;
use tauri_plugin_opener::OpenerExt;

use tauri::{Manager, State, AppHandle};
use url::Host;
use uuid::Uuid;

pub const OAUTH_CLIENT_NAME: &'static str = "foxfleet_test";

struct AppState {
    oauth_controller: OAuthController
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .plugin(tauri_plugin_single_instance::init(|app, argv, cwd| {
            println!("{}, {argv:?}, {cwd}", app.package_info().name);
        }))
        .plugin(tauri_plugin_deep_link::init())
        .plugin(tauri_plugin_opener::init())
        .setup(|app| {
            let oauth_controller = OAuthController::new(tauri::async_runtime::handle());
            app.manage(AppState {
                oauth_controller: oauth_controller.clone() 
            });

            #[cfg(any(target_os = "linux", all(debug_assertions, windows)))]
            app.deep_link().register_all()?;
            app.deep_link().on_open_url(move |event| {
                if oauth_controller.handle_deeplink(&event.urls()).is_some() {
                    return
                }
            });
            Ok(())
        })
        .invoke_handler(tauri::generate_handler![start_account_auth, get_self])
        .run(tauri::generate_context!())
        .expect("Error starting")
}


#[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.add_server(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_signin(state_nonce).await;
    match signin_result {
        Ok((server_domain, username)) => {
            println!("Signed in successfully");
            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 api_key = state.oauth_controller.get_api_token(server_domain, username).await;
    match api_key {
        Err(err) => {
            println!("Error getting API token: {err}");
            return Err(err)
        }
        Ok(api_key) => {
            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());
                }
        }
    }
}