diff --git a/src/models/pack.rs b/src/models/pack.rs index c6feac604..67bb7c260 100644 --- a/src/models/pack.rs +++ b/src/models/pack.rs @@ -84,6 +84,7 @@ pub enum EnvType { #[serde(rename_all = "kebab-case")] pub enum PackDependency { Forge, + Neoforge, FabricLoader, QuiltLoader, Minecraft, @@ -100,6 +101,7 @@ impl PackDependency { pub fn as_str(&self) -> &'static str { match self { PackDependency::Forge => "forge", + PackDependency::Neoforge => "neoforge", PackDependency::FabricLoader => "fabric-loader", PackDependency::Minecraft => "minecraft", PackDependency::QuiltLoader => "quilt-loader", diff --git a/src/routes/updates.rs b/src/routes/updates.rs index 13c8e3972..d3674f35e 100644 --- a/src/routes/updates.rs +++ b/src/routes/updates.rs @@ -1,7 +1,7 @@ use std::collections::HashMap; use actix_web::{get, web, HttpRequest, HttpResponse}; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use sqlx::PgPool; use crate::auth::{filter_authorized_versions, get_user_from_headers, is_authorized}; @@ -16,9 +16,20 @@ pub fn config(cfg: &mut web::ServiceConfig) { cfg.service(forge_updates); } +#[derive(Serialize, Deserialize)] +pub struct NeoForge { + #[serde(default = "default_neoforge")] + pub neoforge: String, +} + +fn default_neoforge() -> String { + "none".into() +} + #[get("{id}/forge_updates.json")] pub async fn forge_updates( req: HttpRequest, + web::Query(neo): web::Query, info: web::Path<(String,)>, pool: web::Data, redis: web::Data, @@ -49,10 +60,16 @@ pub async fn forge_updates( let versions = database::models::Version::get_many(&project.versions, &**pool, &redis).await?; + let loaders = match &*neo.neoforge { + "only" => |x: &String| *x == "neoforge", + "include" => |x: &String| *x == "forge" || *x == "neoforge", + _ => |x: &String| *x == "forge", + }; + let mut versions = filter_authorized_versions( versions .into_iter() - .filter(|x| x.loaders.iter().any(|y| *y == "forge")) + .filter(|x| x.loaders.iter().any(loaders)) .collect(), &user_option, &pool,