refactor!: setup file proxy for projects

This commit is contained in:
2026-01-20 19:10:01 -08:00
parent 5eccfe32da
commit a2afc3fa05
17 changed files with 279 additions and 103 deletions

View File

@@ -6,9 +6,11 @@ use crate::AppState;
pub async fn add_repo(
app_state: web::Data<AppState>,
user: web::ReqData<User>,
payload: web::Json<RepositorySchema>,
repo: web::Json<RepositorySchema>,
) -> Result<HttpResponse> {
let repo = payload.into_inner();
validate_repo(app_state.clone(), &repo).await?;
app_state.user.add_repository(&user.id, repo).await
validate_repo(app_state.clone(), &repo, &user.id).await?;
app_state
.user
.add_repository(&user.id, repo.into_inner())
.await
}

View File

@@ -24,9 +24,8 @@ pub struct Repository {
pub async fn get_repos(
app_state: web::Data<AppState>,
req: web::ReqData<User>,
user: web::ReqData<User>,
) -> Result<HttpResponse> {
let user = req.into_inner();
let token = app_state.user.get_access_token(&user.id).await?;
let response = app_state
@@ -38,7 +37,7 @@ pub async fn get_repos(
response.error_for_status_ref()?;
let added_ids = app_state
.user
.get_repositories(&user.id)
.get_repositories_user(&user.id)
.await?
.into_iter()
.map(|r| r.id)
@@ -47,11 +46,9 @@ pub async fn get_repos(
.json::<Vec<Repository>>()
.await?
.into_iter()
.filter_map(|mut r| {
(!r.private).then(|| {
r.added = added_ids.contains(&r.id.to_string());
r
})
.map(|mut r| {
r.added = added_ids.contains(&r.id.to_string());
r
})
.collect::<Vec<Repository>>();

View File

@@ -1,4 +1,5 @@
pub mod add_repo;
pub mod get_repos;
pub mod global_repos;
pub mod proxy_file;
pub mod search_repos;

View File

@@ -0,0 +1,47 @@
use actix_web::{HttpResponse, web};
use crate::{
AppState,
error::{Error, Result},
};
#[derive(serde::Deserialize)]
pub struct Params {
repo_id: String,
file: String,
}
pub async fn proxy_file(
app_state: web::Data<AppState>,
path: web::Path<Params>,
) -> Result<HttpResponse> {
let repo = app_state
.user
.get_approved_repository(&path.repo_id)
.await?
.ok_or(Error::NotFound)?;
let token = app_state.user.get_access_token(&repo.owner_id).await?;
let url = format!(
"https://raw.githubusercontent.com/{}/HEAD/dist/{}",
repo.full_name, path.file
);
let response = app_state
.reqwest_client
.get(&url)
.bearer_auth(token)
.send()
.await?;
response.error_for_status_ref()?;
let bytes = response.bytes().await?;
let mime = mime_guess::from_path(&path.file)
.first_or_octet_stream()
.to_string();
Ok(HttpResponse::Ok()
.content_type(mime)
.insert_header(("Cache-Control", "public, max-age=3600"))
.body(bytes))
}

View File

@@ -1,6 +1,6 @@
use crate::{auth::User, endpoints::get_repos::Repository, error::Result};
use actix_web::{
HttpRequest, HttpResponse,
HttpResponse,
web::{self, ReqData},
};
use serde::{Deserialize, Serialize};
@@ -20,9 +20,8 @@ struct SearchResponse {
pub async fn search_repos(
app_state: web::Data<AppState>,
query: web::Query<SearchQuery>,
req: ReqData<User>,
user: ReqData<User>,
) -> Result<HttpResponse> {
let user = req.into_inner();
let token = app_state.user.get_access_token(&user.id).await?;
let search_query = format!("user:{} {} fork:true", user.name, query.q);