Move downloads to queue for better performance (#367)

This commit is contained in:
Geometrically
2022-06-09 12:21:51 -07:00
committed by GitHub
parent 5c4a864680
commit 75614fb13c
12 changed files with 785 additions and 700 deletions

View File

@@ -1,9 +1,11 @@
use crate::models::ids::ProjectId;
use crate::routes::ApiError;
use crate::util::guards::admin_key_guard;
use crate::DownloadQueue;
use actix_web::{patch, web, HttpResponse};
use serde::Deserialize;
use sqlx::PgPool;
use std::sync::Arc;
#[derive(Deserialize)]
pub struct DownloadBody {
@@ -17,6 +19,7 @@ pub struct DownloadBody {
pub async fn count_download(
pool: web::Data<PgPool>,
download_body: web::Json<DownloadBody>,
download_queue: web::Data<Arc<DownloadQueue>>,
) -> Result<HttpResponse, ApiError> {
let project_id: crate::database::models::ids::ProjectId =
download_body.hash.into();
@@ -49,27 +52,12 @@ pub async fn count_download(
));
};
let mut transaction = pool.begin().await?;
sqlx::query!(
"UPDATE versions
SET downloads = downloads + 1
WHERE (id = $1)",
version_id
)
.execute(&mut *transaction)
.await?;
sqlx::query!(
"UPDATE mods
SET downloads = downloads + 1
WHERE (id = $1)",
project_id
)
.execute(&mut *transaction)
.await?;
transaction.commit().await?;
download_queue
.add(
crate::database::models::ProjectId(project_id),
crate::database::models::VersionId(version_id),
)
.await;
Ok(HttpResponse::Ok().body(""))
}

View File

@@ -38,11 +38,10 @@ pub async fn projects_get(
web::Query(ids): web::Query<ProjectIds>,
pool: web::Data<PgPool>,
) -> Result<HttpResponse, ApiError> {
let project_ids =
serde_json::from_str::<Vec<ProjectId>>(&*ids.ids)?
.into_iter()
.map(|x| x.into())
.collect();
let project_ids = serde_json::from_str::<Vec<ProjectId>>(&*ids.ids)?
.into_iter()
.map(|x| x.into())
.collect();
let projects_data =
database::models::Project::get_many_full(project_ids, &**pool).await?;
@@ -871,8 +870,7 @@ pub async fn project_icon_edit(
let project_item =
database::models::Project::get_from_slug_or_project_id(
string.clone(),
&**pool,
&string, &**pool,
)
.await?
.ok_or_else(|| {
@@ -963,8 +961,7 @@ pub async fn delete_project_icon(
let string = info.into_inner().0;
let project_item = database::models::Project::get_from_slug_or_project_id(
string.clone(),
&**pool,
&string, &**pool,
)
.await?
.ok_or_else(|| {
@@ -1053,8 +1050,7 @@ pub async fn add_gallery_item(
let project_item =
database::models::Project::get_from_slug_or_project_id(
string.clone(),
&**pool,
&string, &**pool,
)
.await?
.ok_or_else(|| {
@@ -1173,8 +1169,7 @@ pub async fn edit_gallery_item(
})?;
let project_item = database::models::Project::get_from_slug_or_project_id(
string.clone(),
&**pool,
&string, &**pool,
)
.await?
.ok_or_else(|| {
@@ -1301,8 +1296,7 @@ pub async fn delete_gallery_item(
let string = info.into_inner().0;
let project_item = database::models::Project::get_from_slug_or_project_id(
string.clone(),
&**pool,
&string, &**pool,
)
.await?
.ok_or_else(|| {
@@ -1385,8 +1379,7 @@ pub async fn project_delete(
let string = info.into_inner().0;
let project = database::models::Project::get_from_slug_or_project_id(
string.clone(),
&**pool,
&string, &**pool,
)
.await?
.ok_or_else(|| {
@@ -1446,14 +1439,15 @@ pub async fn project_follow(
let user = get_user_from_headers(req.headers(), &**pool).await?;
let string = info.into_inner().0;
let result =
database::models::Project::get_from_slug_or_project_id(string, &**pool)
.await?
.ok_or_else(|| {
ApiError::InvalidInput(
"The specified project does not exist!".to_string(),
)
})?;
let result = database::models::Project::get_from_slug_or_project_id(
&string, &**pool,
)
.await?
.ok_or_else(|| {
ApiError::InvalidInput(
"The specified project does not exist!".to_string(),
)
})?;
let user_id: database::models::ids::UserId = user.id.into();
let project_id: database::models::ids::ProjectId = result.id;
@@ -1514,14 +1508,15 @@ pub async fn project_unfollow(
let user = get_user_from_headers(req.headers(), &**pool).await?;
let string = info.into_inner().0;
let result =
database::models::Project::get_from_slug_or_project_id(string, &**pool)
.await?
.ok_or_else(|| {
ApiError::InvalidInput(
"The specified project does not exist!".to_string(),
)
})?;
let result = database::models::Project::get_from_slug_or_project_id(
&string, &**pool,
)
.await?
.ok_or_else(|| {
ApiError::InvalidInput(
"The specified project does not exist!".to_string(),
)
})?;
let user_id: database::models::ids::UserId = user.id.into();
let project_id = result.id;

View File

@@ -20,7 +20,7 @@ pub async fn team_members_get_project(
let string = info.into_inner().0;
let project_data =
crate::database::models::Project::get_from_slug_or_project_id(
string, &**pool,
&string, &**pool,
)
.await?;

View File

@@ -63,9 +63,10 @@ pub async fn version_list(
) -> Result<HttpResponse, ApiError> {
let string = info.into_inner().0;
let result =
database::models::Project::get_from_slug_or_project_id(string, &**pool)
.await?;
let result = database::models::Project::get_from_slug_or_project_id(
&string, &**pool,
)
.await?;
if let Some(project) = result {
let id = project.id;
@@ -161,11 +162,10 @@ pub async fn versions_get(
ids: web::Query<VersionIds>,
pool: web::Data<PgPool>,
) -> Result<HttpResponse, ApiError> {
let version_ids =
serde_json::from_str::<Vec<models::ids::VersionId>>(&*ids.ids)?
.into_iter()
.map(|x| x.into())
.collect();
let version_ids = serde_json::from_str::<Vec<VersionId>>(&*ids.ids)?
.into_iter()
.map(|x| x.into())
.collect();
let versions_data =
database::models::Version::get_many_full(version_ids, &**pool).await?;
@@ -180,7 +180,7 @@ pub async fn versions_get(
#[get("{version_id}")]
pub async fn version_get(
info: web::Path<(models::ids::VersionId,)>,
info: web::Path<(VersionId,)>,
pool: web::Data<PgPool>,
) -> Result<HttpResponse, ApiError> {
let id = info.into_inner().0;

View File

@@ -756,12 +756,14 @@ pub async fn upload_file(
}
for file in files {
dependencies.push(DependencyBuilder {
project_id: None,
version_id: None,
file_name: Some(file.to_string()),
dependency_type: DependencyType::Required.to_string(),
});
if !file.is_empty() {
dependencies.push(DependencyBuilder {
project_id: None,
version_id: None,
file_name: Some(file.to_string()),
dependency_type: DependencyType::Required.to_string(),
});
}
}
}
}