You've already forked AstralRinth
forked from didirus/AstralRinth
Project Types, Code Cleanup, and Rename Mods -> Projects (#192)
* Initial work for modpacks and project types * Code cleanup, fix some issues * Username route getting, remove pointless tests * Base validator types + fixes * Fix strange IML generation * Multiple hash requests for version files * Fix docker build (hopefully) * Legacy routes * Finish validator architecture * Update rust version in dockerfile * Added caching and fixed typo (#203) * Added caching and fixed typo * Fixed clippy error * Removed log for cache * Add final validators, fix how loaders are handled and add icons to tags * Fix search module * Fix parts of legacy API not working Co-authored-by: Redblueflame <contact@redblueflame.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
use crate::auth::get_user_from_headers;
|
||||
use crate::database;
|
||||
use crate::models::mods::ModId;
|
||||
use crate::models::projects::ProjectId;
|
||||
use crate::routes::ApiError;
|
||||
use actix_web::{get, web, HttpRequest, HttpResponse};
|
||||
use sqlx::PgPool;
|
||||
@@ -55,22 +55,13 @@ pub async fn maven_metadata(
|
||||
pool: web::Data<PgPool>,
|
||||
) -> Result<HttpResponse, ApiError> {
|
||||
let string = info.into_inner().0;
|
||||
let id_option: Option<ModId> = serde_json::from_str(&*format!("\"{}\"", string)).ok();
|
||||
|
||||
let mod_data = if let Some(id) = id_option {
|
||||
match database::models::Mod::get_full(id.into(), &**pool).await {
|
||||
Ok(Some(data)) => Ok(Some(data)),
|
||||
Ok(None) => database::models::Mod::get_full_from_slug(&string, &**pool).await,
|
||||
Err(e) => Err(e),
|
||||
}
|
||||
} else {
|
||||
database::models::Mod::get_full_from_slug(&string, &**pool).await
|
||||
}
|
||||
.map_err(|e| ApiError::DatabaseError(e.into()))?;
|
||||
let project_data =
|
||||
database::models::Project::get_full_from_slug_or_project_id(string, &**pool).await?;
|
||||
|
||||
let user_option = get_user_from_headers(req.headers(), &**pool).await.ok();
|
||||
|
||||
let data = if let Some(data) = mod_data {
|
||||
let data = if let Some(data) = project_data {
|
||||
data
|
||||
} else {
|
||||
return Ok(HttpResponse::NotFound().body(""));
|
||||
@@ -85,17 +76,16 @@ pub async fn maven_metadata(
|
||||
} else {
|
||||
let user_id: database::models::ids::UserId = user.id.into();
|
||||
|
||||
let mod_exists = sqlx::query!(
|
||||
let project_exists = sqlx::query!(
|
||||
"SELECT EXISTS(SELECT 1 FROM team_members WHERE team_id = $1 AND user_id = $2)",
|
||||
data.inner.team_id as database::models::ids::TeamId,
|
||||
user_id as database::models::ids::UserId,
|
||||
)
|
||||
.fetch_one(&**pool)
|
||||
.await
|
||||
.map_err(|e| ApiError::DatabaseError(e.into()))?
|
||||
.await?
|
||||
.exists;
|
||||
|
||||
authorized = mod_exists.unwrap_or(false);
|
||||
authorized = project_exists.unwrap_or(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -110,15 +100,16 @@ pub async fn maven_metadata(
|
||||
LEFT JOIN release_channels ON release_channels.id = versions.release_channel
|
||||
WHERE mod_id = $1
|
||||
",
|
||||
data.inner.id as database::models::ids::ModId
|
||||
data.inner.id as database::models::ids::ProjectId
|
||||
)
|
||||
.fetch_all(&**pool)
|
||||
.await
|
||||
.map_err(|e| ApiError::DatabaseError(e.into()))?;
|
||||
.await?;
|
||||
|
||||
let project_id: ProjectId = data.inner.id.into();
|
||||
|
||||
let respdata = Metadata {
|
||||
group_id: "maven.modrinth".to_string(),
|
||||
artifact_id: string,
|
||||
artifact_id: format!("{}", project_id),
|
||||
versioning: Versioning {
|
||||
latest: version_names
|
||||
.last()
|
||||
@@ -141,7 +132,7 @@ pub async fn maven_metadata(
|
||||
|
||||
Ok(HttpResponse::Ok()
|
||||
.content_type("text/xml")
|
||||
.body(yaserde::ser::to_string(&respdata).map_err(|e| ApiError::XmlError(e))?))
|
||||
.body(yaserde::ser::to_string(&respdata).map_err(ApiError::XmlError)?))
|
||||
}
|
||||
|
||||
#[get("maven/modrinth/{id}/{versionnum}/{file}")]
|
||||
@@ -150,22 +141,21 @@ pub async fn version_file(
|
||||
web::Path((string, vnum, file)): web::Path<(String, String, String)>,
|
||||
pool: web::Data<PgPool>,
|
||||
) -> Result<HttpResponse, ApiError> {
|
||||
let id_option: Option<ModId> = serde_json::from_str(&*format!("\"{}\"", string)).ok();
|
||||
let id_option: Option<ProjectId> = serde_json::from_str(&*format!("\"{}\"", string)).ok();
|
||||
|
||||
let mod_data = if let Some(id) = id_option {
|
||||
match database::models::Mod::get_full(id.into(), &**pool).await {
|
||||
let project_data = if let Some(id) = id_option {
|
||||
match database::models::Project::get_full(id.into(), &**pool).await {
|
||||
Ok(Some(data)) => Ok(Some(data)),
|
||||
Ok(None) => database::models::Mod::get_full_from_slug(&string, &**pool).await,
|
||||
Ok(None) => database::models::Project::get_full_from_slug(&string, &**pool).await,
|
||||
Err(e) => Err(e),
|
||||
}
|
||||
} else {
|
||||
database::models::Mod::get_full_from_slug(&string, &**pool).await
|
||||
}
|
||||
.map_err(|e| ApiError::DatabaseError(e.into()))?;
|
||||
database::models::Project::get_full_from_slug(&string, &**pool).await
|
||||
}?;
|
||||
|
||||
let user_option = get_user_from_headers(req.headers(), &**pool).await.ok();
|
||||
|
||||
let data = if let Some(data) = mod_data {
|
||||
let data = if let Some(data) = project_data {
|
||||
data
|
||||
} else {
|
||||
return Ok(HttpResponse::NotFound().body(""));
|
||||
@@ -180,17 +170,16 @@ pub async fn version_file(
|
||||
} else {
|
||||
let user_id: database::models::ids::UserId = user.id.into();
|
||||
|
||||
let mod_exists = sqlx::query!(
|
||||
let project_exists = sqlx::query!(
|
||||
"SELECT EXISTS(SELECT 1 FROM team_members WHERE team_id = $1 AND user_id = $2)",
|
||||
data.inner.team_id as database::models::ids::TeamId,
|
||||
user_id as database::models::ids::UserId,
|
||||
)
|
||||
.fetch_one(&**pool)
|
||||
.await
|
||||
.map_err(|e| ApiError::DatabaseError(e.into()))?
|
||||
.await?
|
||||
.exists;
|
||||
|
||||
authorized = mod_exists.unwrap_or(false);
|
||||
authorized = project_exists.unwrap_or(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -201,12 +190,11 @@ pub async fn version_file(
|
||||
|
||||
let vid = if let Some(vid) = sqlx::query!(
|
||||
"SELECT id FROM versions WHERE mod_id = $1 AND version_number = $2",
|
||||
data.inner.id as database::models::ids::ModId,
|
||||
data.inner.id as database::models::ids::ProjectId,
|
||||
vnum
|
||||
)
|
||||
.fetch_optional(&**pool)
|
||||
.await
|
||||
.map_err(|e| ApiError::DatabaseError(e.into()))?
|
||||
.await?
|
||||
{
|
||||
vid
|
||||
} else {
|
||||
@@ -215,8 +203,7 @@ pub async fn version_file(
|
||||
|
||||
let version = if let Some(version) =
|
||||
database::models::Version::get_full(database::models::ids::VersionId(vid.id), &**pool)
|
||||
.await
|
||||
.map_err(|e| ApiError::DatabaseError(e.into()))?
|
||||
.await?
|
||||
{
|
||||
version
|
||||
} else {
|
||||
@@ -238,19 +225,17 @@ pub async fn version_file(
|
||||
};
|
||||
return Ok(HttpResponse::Ok()
|
||||
.content_type("text/xml")
|
||||
.body(yaserde::ser::to_string(&respdata).map_err(|e| ApiError::XmlError(e))?));
|
||||
} else {
|
||||
if let Some(selected_file) = version.files.iter().find(|x| x.filename == file) {
|
||||
.body(yaserde::ser::to_string(&respdata).map_err(ApiError::XmlError)?));
|
||||
} else if let Some(selected_file) = version.files.iter().find(|x| x.filename == file) {
|
||||
return Ok(HttpResponse::TemporaryRedirect()
|
||||
.header("Location", &*selected_file.url)
|
||||
.body(""));
|
||||
} else if file == format!("{}-{}.jar", &string, &version.version_number) {
|
||||
if let Some(selected_file) = version.files.iter().last() {
|
||||
return Ok(HttpResponse::TemporaryRedirect()
|
||||
.header("Location", &*selected_file.url)
|
||||
.body(""));
|
||||
} else if file == format!("{}-{}.jar", &string, &version.version_number) {
|
||||
if let Some(selected_file) = version.files.iter().last() {
|
||||
return Ok(HttpResponse::TemporaryRedirect()
|
||||
.header("Location", &*selected_file.url)
|
||||
.body(""));
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Ok(HttpResponse::NotFound().body(""))
|
||||
|
||||
Reference in New Issue
Block a user