diff --git a/sqlx-data.json b/sqlx-data.json index 7510ae2f..24dff7bb 100644 --- a/sqlx-data.json +++ b/sqlx-data.json @@ -640,6 +640,28 @@ ] } }, + "20c6f94eae9260fc3f91de3e4a42c544e0b5c01227854956d04db7641c03c1b8": { + "query": "\n SELECT d.id id\n FROM dependencies d\n INNER JOIN game_versions_versions gvv ON gvv.joining_version_id = d.dependent_id AND gvv.game_version_id = ANY($2)\n INNER JOIN loaders_versions lv ON lv.version_id = d.dependent_id AND lv.loader_id = ANY($3)\n WHERE d.mod_dependency_id = $1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int8", + "Int4Array", + "Int4Array" + ] + }, + "nullable": [ + false + ] + } + }, "2162043897db26d0b55a0652c1a6db66c555f1d148ce69bd0bd0d2122de1bd6a": { "query": "\n DELETE FROM mods_gallery\n WHERE mod_id = $1\n ", "describe": { @@ -3019,6 +3041,26 @@ ] } }, + "96587afb05c9d308d665e76dabab497b39cc7993b6fececed7dc9677d159abb3": { + "query": "\n SELECT EXISTS(SELECT 1 FROM mods WHERE slug = $1)\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + } + }, "97690dda7edea8c985891cae5ad405f628ed81e333bc88df5493c928a4324d43": { "query": "SELECT EXISTS(SELECT 1 FROM reports WHERE id=$1)", "describe": { @@ -5766,28 +5808,6 @@ ] } }, - "f17df1295edfaa1cac400ce705181b14a9e763f5e515c6913d0152717b89ceaa": { - "query": "\n SELECT d.id id\n FROM versions v\n INNER JOIN dependencies d ON d.mod_dependency_id = $1\n INNER JOIN game_versions_versions gvv ON gvv.joining_version_id = v.id AND gvv.game_version_id = ANY($2)\n INNER JOIN loaders_versions lv ON lv.version_id = v.id AND lv.loader_id = ANY($3)\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Int8", - "Int4Array", - "Int4Array" - ] - }, - "nullable": [ - false - ] - } - }, "f22e9aee090f9952cf795a3540c03b0a5036dab0b740847d05e03d4565756283": { "query": "\n DELETE FROM team_members\n WHERE user_id = $1\n ", "describe": { diff --git a/src/database/models/version_item.rs b/src/database/models/version_item.rs index 5978e3b9..95db02a4 100644 --- a/src/database/models/version_item.rs +++ b/src/database/models/version_item.rs @@ -201,10 +201,10 @@ impl VersionBuilder { let dependencies = sqlx::query!( " SELECT d.id id - FROM versions v - INNER JOIN dependencies d ON d.mod_dependency_id = $1 - INNER JOIN game_versions_versions gvv ON gvv.joining_version_id = v.id AND gvv.game_version_id = ANY($2) - INNER JOIN loaders_versions lv ON lv.version_id = v.id AND lv.loader_id = ANY($3) + FROM dependencies d + INNER JOIN game_versions_versions gvv ON gvv.joining_version_id = d.dependent_id AND gvv.game_version_id = ANY($2) + INNER JOIN loaders_versions lv ON lv.version_id = d.dependent_id AND lv.loader_id = ANY($3) + WHERE d.mod_dependency_id = $1 ", self.project_id as ProjectId, &self.game_versions.iter().map(|x| x.0).collect::>(), diff --git a/src/routes/project_creation.rs b/src/routes/project_creation.rs index 1206c578..1a1c7a9e 100644 --- a/src/routes/project_creation.rs +++ b/src/routes/project_creation.rs @@ -373,7 +373,23 @@ pub async fn project_create_inner( .await .map_err(|e| CreateError::DatabaseError(e.into()))?; - if results.exists.unwrap_or(true) { + if results.exists.unwrap_or(false) { + return Err(CreateError::SlugCollision); + } + } + + { + let results = sqlx::query!( + " + SELECT EXISTS(SELECT 1 FROM mods WHERE slug = $1) + ", + create_data.slug + ) + .fetch_one(&mut *transaction) + .await + .map_err(|e| CreateError::DatabaseError(e.into()))?; + + if results.exists.unwrap_or(false) { return Err(CreateError::SlugCollision); } } diff --git a/src/search/mod.rs b/src/search/mod.rs index 78c45085..71aae2bb 100644 --- a/src/search/mod.rs +++ b/src/search/mod.rs @@ -223,7 +223,6 @@ pub async fn search_for_project( filter_string.push_str(&*filters); } - println!("{}", filter_string); if !filter_string.is_empty() { query.with_filter(&filter_string); } diff --git a/src/validate/fabric.rs b/src/validate/fabric.rs index e5753f4a..9da6a714 100644 --- a/src/validate/fabric.rs +++ b/src/validate/fabric.rs @@ -45,8 +45,6 @@ impl super::Validator for FabricValidator { )); } - //TODO: Check if file is a dev JAR? - Ok(ValidationResult::Pass) } } diff --git a/src/validate/forge.rs b/src/validate/forge.rs index c4e9aa50..cf3f7e1e 100644 --- a/src/validate/forge.rs +++ b/src/validate/forge.rs @@ -31,11 +31,11 @@ impl super::Validator for ForgeValidator { &self, archive: &mut ZipArchive>, ) -> Result { - archive.by_name("META-INF/mods.toml").map_err(|_| { - ValidationError::InvalidInput( - "No mods.toml present for Forge file.".into(), - ) - })?; + if archive.by_name("META-INF/mods.toml").is_err() { + return Ok(ValidationResult::Warning( + "No mods.toml present for Forge file.", + )); + } if !archive.file_names().any(|name| name.ends_with(".class")) { return Ok(ValidationResult::Warning( diff --git a/src/validate/mod.rs b/src/validate/mod.rs index 090bf93e..e87d33ce 100644 --- a/src/validate/mod.rs +++ b/src/validate/mod.rs @@ -2,6 +2,7 @@ use crate::models::projects::{GameVersion, Loader}; use crate::validate::fabric::FabricValidator; use crate::validate::forge::{ForgeValidator, LegacyForgeValidator}; use crate::validate::pack::PackValidator; +use crate::validate::quilt::QuiltValidator; use std::io::Cursor; use thiserror::Error; use time::OffsetDateTime; @@ -10,6 +11,7 @@ use zip::ZipArchive; mod fabric; mod forge; mod pack; +mod quilt; #[derive(Error, Debug)] pub enum ValidationError { @@ -52,11 +54,12 @@ pub trait Validator: Sync { ) -> Result; } -static VALIDATORS: [&dyn Validator; 4] = [ +static VALIDATORS: [&dyn Validator; 5] = [ &PackValidator, &FabricValidator, &ForgeValidator, &LegacyForgeValidator, + &QuiltValidator, ]; /// The return value is whether this file should be marked as primary or not, based on the analysis of the file diff --git a/src/validate/quilt.rs b/src/validate/quilt.rs new file mode 100644 index 00000000..e5293297 --- /dev/null +++ b/src/validate/quilt.rs @@ -0,0 +1,50 @@ +use crate::validate::{ + SupportedGameVersions, ValidationError, ValidationResult, +}; +use std::io::Cursor; +use time::OffsetDateTime; +use zip::ZipArchive; + +pub struct QuiltValidator; + +impl super::Validator for QuiltValidator { + fn get_file_extensions(&self) -> &[&str] { + &["jar", "zip"] + } + + fn get_project_types(&self) -> &[&str] { + &["mod"] + } + + fn get_supported_loaders(&self) -> &[&str] { + &["fabric"] + } + + fn get_supported_game_versions(&self) -> SupportedGameVersions { + // Time since release of 18w49a, the first fabric version + SupportedGameVersions::PastDate(OffsetDateTime::from_unix_timestamp( + 1646070100, + )) + } + + fn validate( + &self, + archive: &mut ZipArchive>, + ) -> Result { + archive.by_name("quilt.mod.json").map_err(|_| { + ValidationError::InvalidInput( + "No quilt.mod.json present for Quilt file.".into(), + ) + })?; + + if !archive.file_names().any(|name| { + name.ends_with("refmap.json") || name.ends_with(".class") + }) { + return Ok(ValidationResult::Warning( + "Quilt mod file is a source file!", + )); + } + + Ok(ValidationResult::Pass) + } +}