Skip to content

Commit

Permalink
Restructure url
Browse files Browse the repository at this point in the history
  • Loading branch information
j178 committed Feb 11, 2025
1 parent c662883 commit d72306e
Showing 1 changed file with 79 additions and 59 deletions.
138 changes: 79 additions & 59 deletions vercel/api/vercel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,26 @@ async fn main() -> Result<(), Error> {
let res = match (req.uri().path(), req.method()) {
("/", method) if method == "GET" => render_form(),
("/", method) if method == "POST" => handle_form_submit(req).await,
("/created", _) => render_created_repos(req).await,
("/contributed", _) => render_contributed_repos(req).await,
(path, method) if method == "GET" && path.ends_with("/created.svg") => {
let username = path
.trim_end_matches("/created.svg")
.trim_start_matches("/");
render_created_svg(username.to_string(), &req).await
}
(path, method) if method == "GET" && path.ends_with("/contributed.svg") => {
let username = path
.trim_end_matches("/contributed.svg")
.trim_start_matches("/");
render_contributed_svg(username.to_string(), &req).await
}
(path, method) if method == "GET" && path.starts_with("/") => {
let username = path.trim_start_matches("/");
if !username.is_empty() {
render_stats_page(username.to_string(), &req).await
} else {
render_form()
}
}
_ => Ok(Response::builder()
.status(StatusCode::NOT_FOUND)
.body(Body::from("Not found"))?),
Expand All @@ -34,49 +52,6 @@ async fn main() -> Result<(), Error> {
run(h).await
}

pub async fn render_created_repos(req: Request) -> Result<Response<Body>, Error> {
let url = Url::parse(&req.uri().to_string()).unwrap();
let query: HashMap<_, _> = url.query_pairs().collect();
let username = query
.get("username")
.ok_or_else(|| anyhow!("name not found"))?;
let max_repos = query
.get("max_repos")
.map(|x| x.parse::<usize>())
.transpose()?;

let repos = github::get_created_repos(username, max_repos).await?;

let mut buf = String::new();
SvgRenderer::new().render_created_repos(&mut buf, &repos, username);

Ok(Response::builder()
.status(StatusCode::OK)
.header("Content-Type", "image/svg+xml")
.body(buf.into())?)
}

pub async fn render_contributed_repos(req: Request) -> Result<Response<Body>, Error> {
let url = Url::parse(&req.uri().to_string()).unwrap();
let query: HashMap<_, _> = url.query_pairs().collect();
let username = query
.get("username")
.ok_or_else(|| anyhow!("name not found"))?;
let max_repos = query
.get("max_repos")
.map(|x| x.parse::<usize>())
.transpose()?;
let repos = github::get_contributed_repos(username, max_repos).await?;

let mut buf = String::new();
SvgRenderer::new().render_contributed_repos(&mut buf, &repos, username);

Ok(Response::builder()
.status(StatusCode::OK)
.header("Content-Type", "image/svg+xml")
.body(buf.into())?)
}

fn render_form() -> Result<Response<Body>, Error> {
let html = r#"<!DOCTYPE html>
<html>
Expand Down Expand Up @@ -162,24 +137,33 @@ async fn handle_form_submit(req: Request) -> Result<Response<Body>, Error> {
let max_repos = params
.get("max_repos")
.filter(|v| !v.is_empty())
.map(|v| v.to_string());
.map(|v| format!("?max_repos={}", v))
.unwrap_or_default();

let base_url = "https://github-contrib-stats.vercel.app";
let max_repos_param = max_repos
.as_ref()
.map(|m| format!("&max_repos={}", m))
// Redirect to /<username>?max_repos=X
Ok(Response::builder()
.status(StatusCode::FOUND)
.header("Location", format!("/{}{}", username, max_repos))
.body(Body::Empty)?)
}

async fn render_stats_page(username: String, req: &Request) -> Result<Response<Body>, Error> {
let url = Url::parse(&req.uri().to_string()).unwrap();
let query: HashMap<_, _> = url.query_pairs().collect();
let max_repos_param = query
.get("max_repos")
.map(|v| format!("?max_repos={}", v))
.unwrap_or_default();

let created_url = format!(
"{}/created?username={}{}",
base_url, username, max_repos_param
);
let base_url = "https://github-contrib-stats.vercel.app";
let created_url = format!("{}/{}/created.svg{}", base_url, username, max_repos_param);
let contributed_url = format!(
"{}/contributed?username={}{}",
"{}/{}/contributed.svg{}",
base_url, username, max_repos_param
);

let result_html = format!(r#"<!DOCTYPE html>
let result_html = format!(
r#"<!DOCTYPE html>
<html>
<head>
<title>GitHub Stats for {}</title>
Expand Down Expand Up @@ -274,13 +258,49 @@ async fn handle_form_submit(req: Request) -> Result<Response<Body>, Error> {
<p><a href="/">← Generate for another user</a></p>
</body>
</html>"#,
username, username,
created_url, created_url,
contributed_url, contributed_url
username, username, created_url, created_url, contributed_url, contributed_url
);

Ok(Response::builder()
.status(StatusCode::OK)
.header("Content-Type", "text/html")
.body(Body::from(result_html))?)
}

async fn render_created_svg(username: String, req: &Request) -> Result<Response<Body>, Error> {
let url = Url::parse(&req.uri().to_string()).unwrap();
let query: HashMap<_, _> = url.query_pairs().collect();
let max_repos = query
.get("max_repos")
.map(|x| x.parse::<usize>())
.transpose()?;

let repos = github::get_created_repos(&username, max_repos).await?;

let mut buf = String::new();
SvgRenderer::new().render_created_repos(&mut buf, &repos, &username);

Ok(Response::builder()
.status(StatusCode::OK)
.header("Content-Type", "image/svg+xml")
.body(buf.into())?)
}

async fn render_contributed_svg(username: String, req: &Request) -> Result<Response<Body>, Error> {
let url = Url::parse(&req.uri().to_string()).unwrap();
let query: HashMap<_, _> = url.query_pairs().collect();
let max_repos = query
.get("max_repos")
.map(|x| x.parse::<usize>())
.transpose()?;

let repos = github::get_contributed_repos(&username, max_repos).await?;

let mut buf = String::new();
SvgRenderer::new().render_contributed_repos(&mut buf, &repos, &username);

Ok(Response::builder()
.status(StatusCode::OK)
.header("Content-Type", "image/svg+xml")
.body(buf.into())?)
}

0 comments on commit d72306e

Please sign in to comment.