feat!: add repo searching, only show most relevant repos first
This commit is contained in:
50
api/src/endpoints/search_repos.rs
Normal file
50
api/src/endpoints/search_repos.rs
Normal 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>>(),
|
||||
))
|
||||
}
|
||||
Reference in New Issue
Block a user