You've already forked AstralRinth
forked from didirus/AstralRinth
Add quilt validators, Deps fix, Fix slug collisions (#338)
This commit is contained in:
@@ -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": {
|
"2162043897db26d0b55a0652c1a6db66c555f1d148ce69bd0bd0d2122de1bd6a": {
|
||||||
"query": "\n DELETE FROM mods_gallery\n WHERE mod_id = $1\n ",
|
"query": "\n DELETE FROM mods_gallery\n WHERE mod_id = $1\n ",
|
||||||
"describe": {
|
"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": {
|
"97690dda7edea8c985891cae5ad405f628ed81e333bc88df5493c928a4324d43": {
|
||||||
"query": "SELECT EXISTS(SELECT 1 FROM reports WHERE id=$1)",
|
"query": "SELECT EXISTS(SELECT 1 FROM reports WHERE id=$1)",
|
||||||
"describe": {
|
"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": {
|
"f22e9aee090f9952cf795a3540c03b0a5036dab0b740847d05e03d4565756283": {
|
||||||
"query": "\n DELETE FROM team_members\n WHERE user_id = $1\n ",
|
"query": "\n DELETE FROM team_members\n WHERE user_id = $1\n ",
|
||||||
"describe": {
|
"describe": {
|
||||||
|
|||||||
@@ -201,10 +201,10 @@ impl VersionBuilder {
|
|||||||
let dependencies = sqlx::query!(
|
let dependencies = sqlx::query!(
|
||||||
"
|
"
|
||||||
SELECT d.id id
|
SELECT d.id id
|
||||||
FROM versions v
|
FROM dependencies d
|
||||||
INNER JOIN dependencies d ON d.mod_dependency_id = $1
|
INNER JOIN game_versions_versions gvv ON gvv.joining_version_id = d.dependent_id AND gvv.game_version_id = ANY($2)
|
||||||
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 = d.dependent_id AND lv.loader_id = ANY($3)
|
||||||
INNER JOIN loaders_versions lv ON lv.version_id = v.id AND lv.loader_id = ANY($3)
|
WHERE d.mod_dependency_id = $1
|
||||||
",
|
",
|
||||||
self.project_id as ProjectId,
|
self.project_id as ProjectId,
|
||||||
&self.game_versions.iter().map(|x| x.0).collect::<Vec<i32>>(),
|
&self.game_versions.iter().map(|x| x.0).collect::<Vec<i32>>(),
|
||||||
|
|||||||
@@ -373,7 +373,23 @@ pub async fn project_create_inner(
|
|||||||
.await
|
.await
|
||||||
.map_err(|e| CreateError::DatabaseError(e.into()))?;
|
.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);
|
return Err(CreateError::SlugCollision);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -223,7 +223,6 @@ pub async fn search_for_project(
|
|||||||
filter_string.push_str(&*filters);
|
filter_string.push_str(&*filters);
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("{}", filter_string);
|
|
||||||
if !filter_string.is_empty() {
|
if !filter_string.is_empty() {
|
||||||
query.with_filter(&filter_string);
|
query.with_filter(&filter_string);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,8 +45,6 @@ impl super::Validator for FabricValidator {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: Check if file is a dev JAR?
|
|
||||||
|
|
||||||
Ok(ValidationResult::Pass)
|
Ok(ValidationResult::Pass)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,11 +31,11 @@ impl super::Validator for ForgeValidator {
|
|||||||
&self,
|
&self,
|
||||||
archive: &mut ZipArchive<Cursor<bytes::Bytes>>,
|
archive: &mut ZipArchive<Cursor<bytes::Bytes>>,
|
||||||
) -> Result<ValidationResult, ValidationError> {
|
) -> Result<ValidationResult, ValidationError> {
|
||||||
archive.by_name("META-INF/mods.toml").map_err(|_| {
|
if archive.by_name("META-INF/mods.toml").is_err() {
|
||||||
ValidationError::InvalidInput(
|
return Ok(ValidationResult::Warning(
|
||||||
"No mods.toml present for Forge file.".into(),
|
"No mods.toml present for Forge file.",
|
||||||
)
|
));
|
||||||
})?;
|
}
|
||||||
|
|
||||||
if !archive.file_names().any(|name| name.ends_with(".class")) {
|
if !archive.file_names().any(|name| name.ends_with(".class")) {
|
||||||
return Ok(ValidationResult::Warning(
|
return Ok(ValidationResult::Warning(
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ use crate::models::projects::{GameVersion, Loader};
|
|||||||
use crate::validate::fabric::FabricValidator;
|
use crate::validate::fabric::FabricValidator;
|
||||||
use crate::validate::forge::{ForgeValidator, LegacyForgeValidator};
|
use crate::validate::forge::{ForgeValidator, LegacyForgeValidator};
|
||||||
use crate::validate::pack::PackValidator;
|
use crate::validate::pack::PackValidator;
|
||||||
|
use crate::validate::quilt::QuiltValidator;
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
use time::OffsetDateTime;
|
use time::OffsetDateTime;
|
||||||
@@ -10,6 +11,7 @@ use zip::ZipArchive;
|
|||||||
mod fabric;
|
mod fabric;
|
||||||
mod forge;
|
mod forge;
|
||||||
mod pack;
|
mod pack;
|
||||||
|
mod quilt;
|
||||||
|
|
||||||
#[derive(Error, Debug)]
|
#[derive(Error, Debug)]
|
||||||
pub enum ValidationError {
|
pub enum ValidationError {
|
||||||
@@ -52,11 +54,12 @@ pub trait Validator: Sync {
|
|||||||
) -> Result<ValidationResult, ValidationError>;
|
) -> Result<ValidationResult, ValidationError>;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALIDATORS: [&dyn Validator; 4] = [
|
static VALIDATORS: [&dyn Validator; 5] = [
|
||||||
&PackValidator,
|
&PackValidator,
|
||||||
&FabricValidator,
|
&FabricValidator,
|
||||||
&ForgeValidator,
|
&ForgeValidator,
|
||||||
&LegacyForgeValidator,
|
&LegacyForgeValidator,
|
||||||
|
&QuiltValidator,
|
||||||
];
|
];
|
||||||
|
|
||||||
/// The return value is whether this file should be marked as primary or not, based on the analysis of the file
|
/// The return value is whether this file should be marked as primary or not, based on the analysis of the file
|
||||||
|
|||||||
50
src/validate/quilt.rs
Normal file
50
src/validate/quilt.rs
Normal file
@@ -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<Cursor<bytes::Bytes>>,
|
||||||
|
) -> Result<ValidationResult, ValidationError> {
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user