diff --git a/src/auth/adapter/out/forge/forgejo/get_username.rs b/src/auth/adapter/out/forge/forgejo/get_username.rs new file mode 100644 index 0000000..fd7cbd4 --- /dev/null +++ b/src/auth/adapter/out/forge/forgejo/get_username.rs @@ -0,0 +1,35 @@ +use serde::{Deserialize, Serialize}; + +use super::Forgejo; +use crate::auth::application::port::out::forge::{ + errors::OutForgePortResult, get_username::GetUsername, +}; +use crate::auth::domain::OAuthAccessToken; + +#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Serialize, Deserialize)] +struct ForgejoUserResponse { + login: String, +} + +#[async_trait::async_trait] +impl GetUsername for Forgejo { + async fn get_username(&self, access_token: &OAuthAccessToken) -> OutForgePortResult { + let u = { + let mut u = self.url().to_owned(); + u.set_path("/api/v1/user"); + u + }; + let res = self + .http_client + .get(u) + .header( + reqwest::header::AUTHORIZATION, + format!("token {}", access_token.access_token), + ) + .send() + .await + .unwrap(); + let res: ForgejoUserResponse = res.json().await.unwrap(); + Ok(res.login) + } +}