feat: add repo importing
This commit is contained in:
19
api/src/endpoints/add_repo.rs
Normal file
19
api/src/endpoints/add_repo.rs
Normal file
@@ -0,0 +1,19 @@
|
||||
use crate::{auth::User, error::Result, user::RepositorySchema};
|
||||
use actix_web::{HttpResponse, web};
|
||||
use serde::Serialize;
|
||||
|
||||
use crate::AppState;
|
||||
|
||||
#[derive(Serialize)]
|
||||
struct AddResponse {
|
||||
id: String,
|
||||
}
|
||||
|
||||
pub async fn add_repo(
|
||||
app_state: web::Data<AppState>,
|
||||
user: web::ReqData<User>,
|
||||
payload: web::Json<RepositorySchema>,
|
||||
) -> Result<HttpResponse> {
|
||||
let repo = payload.into_inner();
|
||||
app_state.user.add_repository(&user.id, repo).await
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
use actix_web::{HttpRequest, HttpResponse, web};
|
||||
use std::collections::HashSet;
|
||||
|
||||
use actix_web::{HttpResponse, web};
|
||||
use chrono::{DateTime, Utc};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{AppState, account::AccountRepository, auth::User, error::Result};
|
||||
use crate::{AppState, auth::User, error::Result};
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
pub struct Repository {
|
||||
@@ -15,6 +17,9 @@ pub struct Repository {
|
||||
pub stars: Option<usize>,
|
||||
pub updated_at: DateTime<Utc>,
|
||||
pub private: bool,
|
||||
pub default_branch: String,
|
||||
#[serde(default)]
|
||||
pub added: bool,
|
||||
}
|
||||
|
||||
pub async fn get_repos(
|
||||
@@ -22,8 +27,7 @@ pub async fn get_repos(
|
||||
req: web::ReqData<User>,
|
||||
) -> Result<HttpResponse> {
|
||||
let user = req.into_inner();
|
||||
let query = AccountRepository::new(&app_state.pool);
|
||||
let token = query.get_access_token(&user.id).await?;
|
||||
let token = app_state.user.get_access_token(&user.id).await?;
|
||||
|
||||
let response = app_state
|
||||
.reqwest_client
|
||||
@@ -32,11 +36,24 @@ pub async fn get_repos(
|
||||
.send()
|
||||
.await?;
|
||||
response.error_for_status_ref()?;
|
||||
let added_ids = app_state
|
||||
.user
|
||||
.get_repositories(&user.id)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|r| r.id.clone())
|
||||
.collect::<HashSet<String>>();
|
||||
tracing::debug!(added_response = ?added_ids);
|
||||
let data = response
|
||||
.json::<Vec<Repository>>()
|
||||
.await?
|
||||
.into_iter()
|
||||
.filter(|r| r.private == false)
|
||||
.filter_map(|mut r| {
|
||||
(!r.private).then(|| {
|
||||
r.added = added_ids.contains(&r.id.to_string());
|
||||
r
|
||||
})
|
||||
})
|
||||
.collect::<Vec<Repository>>();
|
||||
|
||||
Ok(HttpResponse::Ok().json(data))
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
pub mod add_repo;
|
||||
pub mod get_repos;
|
||||
pub mod search_repos;
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
use crate::{
|
||||
account::AccountRepository, auth::User, endpoints::get_repos::Repository, error::Result,
|
||||
};
|
||||
use crate::{auth::User, endpoints::get_repos::Repository, error::Result};
|
||||
use actix_web::{
|
||||
HttpRequest, HttpResponse,
|
||||
web::{self, ReqData},
|
||||
@@ -25,9 +23,7 @@ pub async fn search_repos(
|
||||
req: ReqData<User>,
|
||||
) -> Result<HttpResponse> {
|
||||
let user = req.into_inner();
|
||||
let token = AccountRepository::new(&app_state.pool)
|
||||
.get_access_token(&user.id)
|
||||
.await?;
|
||||
let token = app_state.user.get_access_token(&user.id).await?;
|
||||
|
||||
let search_query = format!("user:{} {} fork:true", user.name, query.q);
|
||||
let response = app_state
|
||||
|
||||
Reference in New Issue
Block a user