feat!: add repo searching, only show most relevant repos first

This commit is contained in:
2026-01-16 23:29:15 -08:00
parent 68d9a0a626
commit 831259a6a6
14 changed files with 174 additions and 59 deletions

View File

@@ -0,0 +1,50 @@
use crate::{
account::AccountRepository, auth::User, endpoints::get_repos::Repository, error::Result,
};
use actix_web::{
HttpRequest, HttpResponse,
web::{self, ReqData},
};
use serde::{Deserialize, Serialize};
use crate::AppState;
#[derive(Deserialize)]
pub(crate) struct SearchQuery {
q: String,
}
#[derive(Serialize, Deserialize)]
struct SearchResponse {
items: Vec<Repository>,
}
pub async fn search_repos(
app_state: web::Data<AppState>,
query: web::Query<SearchQuery>,
req: ReqData<User>,
) -> Result<HttpResponse> {
let user = req.into_inner();
let token = AccountRepository::new(&app_state.pool)
.get_access_token(&user.id)
.await?;
let search_query = format!("user:{} {} fork:true", user.name, query.q);
let response = app_state
.reqwest_client
.get("https://api.github.com/search/repositories")
.query(&[("q", &search_query)])
.bearer_auth(&token)
.send()
.await?
.json::<SearchResponse>()
.await?;
Ok(HttpResponse::Ok().json(
response
.items
.into_iter()
.filter(|r| r.private == false)
.collect::<Vec<Repository>>(),
))
}