From 3448672fec8ff81bcecf47bd7fb82fa8719d645b Mon Sep 17 00:00:00 2001 From: Lucien Cartier-Tilet Date: Wed, 15 Mar 2023 16:35:34 +0100 Subject: [PATCH] chore(backend): cleaner code Signed-off-by: Lucien Cartier-Tilet --- src/main.rs | 126 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 74 insertions(+), 52 deletions(-) diff --git a/src/main.rs b/src/main.rs index 0e4621d..fa61cd5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,43 +1,14 @@ use actix_web::{error, get, web, Responder, Result}; +use data::Data; use derive_more::{Display, Error}; use dotenvy::dotenv; -use gql_client::Client; +use gql_client::{Client, GraphQLError}; use std::collections::HashMap; mod data; -#[derive(Debug, Display, Error)] -#[display(fmt = "my error: {}", name)] -struct MyError { - name: String, -} - -struct AppState { - github_token: String, -} - -impl Default for AppState { - fn default() -> Self { - Self { - github_token: github_token(), - } - } -} - -impl error::ResponseError for MyError {} - -fn github_token() -> String { - std::env::var("GH_TOKEN") - .expect("Environment variable GH_TOKEN **MUST** be set!") -} - -#[get("/phundrak-com/{user}")] -async fn user_info_github( - user: web::Path, - state: web::Data, -) -> Result { - let gh_token = &state.github_token; - let body = format!( +macro_rules! GITHUB_GRAPHQL_QUERY { + () => { r#"query {{ user(login: "{}") {{ newest: repositories(first: 10, orderBy: {{field: UPDATED_AT, direction: DESC}}) {{ @@ -64,24 +35,78 @@ async fn user_info_github( }} }} }} -}}"#, - user - ); +}}"# + }; +} + +#[derive(Debug, Display, Error)] +#[display(fmt = "my error: {}", name)] +struct MyError { + name: String, +} + +struct AppState { + github_token: String, +} + +impl Default for AppState { + fn default() -> Self { + Self { + github_token: github_token(), + } + } +} + +impl error::ResponseError for MyError {} + +fn github_token() -> String { + std::env::var("GH_TOKEN") + .expect("Environment variable GH_TOKEN **MUST** be set!") +} + +fn prepare_github_query_headers(gh_token: &String) -> HashMap { let mut headers: HashMap = HashMap::new(); headers.insert("Authorization".to_string(), format!("Bearer {}", gh_token)); headers.insert("User-Agent".to_string(), "PhunCache-App".to_string()); - let client = - Client::new_with_headers("https://api.github.com/graphql", headers); - client - .query::(&body) - .await - .map(web::Json) - .map_err(|e| { - MyError { - name: format!("Failed to retrieve data from GitHub: {e:?}"), - } - .into() - }) + headers +} + +fn make_gh_graphql_client(gh_token: &String) -> Client { + let headers = prepare_github_query_headers(gh_token); + Client::new_with_headers("https://api.github.com/graphql", headers) +} + +async fn make_gh_graphql_call( + user: String, + gh_token: &String, +) -> Result, GraphQLError> { + let body = format!(GITHUB_GRAPHQL_QUERY!(), user); + let client = make_gh_graphql_client(gh_token); + let data = client.query::(&body).await; + println!("{:?}", data); + data +} + +#[get("/phundrak-com/{user}")] +async fn user_info_github( + user: web::Path, + state: web::Data, +) -> Result { + let gh_token = &state.github_token; + match make_gh_graphql_call(user.to_string(), gh_token).await { + Ok(val) => Ok(web::Json(val)), + Err(e) => Err(MyError { + name: format!("Failed to retrieve data from GitHub: {e:?}"), + } + .into()), + } +} + +fn setup_application() { + std::env::set_var("RUST_LOG", "debug"); + env_logger::init(); + dotenv().ok(); + human_panic::setup_panic!(); } #[actix_web::main] @@ -89,10 +114,7 @@ async fn main() -> std::io::Result<()> { use actix_web::{App, HttpServer}; use std::env::var; - std::env::set_var("RUST_LOG", "debug"); - env_logger::init(); - dotenv().ok(); - human_panic::setup_panic!(); + setup_application(); HttpServer::new(|| { App::new()