You've already forked AstralRinth
forked from didirus/AstralRinth
Dependencies, fix panic on version get, Filtered Versions route (#153)
This commit is contained in:
@@ -611,7 +611,7 @@ async fn create_initial_version(
|
||||
let dependencies = version_data
|
||||
.dependencies
|
||||
.iter()
|
||||
.map(|x| (*x).into())
|
||||
.map(|x| ((x.version_id).into(), x.dependency_type.to_string()))
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let version = models::version_item::VersionBuilder {
|
||||
|
||||
@@ -3,7 +3,7 @@ use crate::database::models;
|
||||
use crate::database::models::version_item::{VersionBuilder, VersionFileBuilder};
|
||||
use crate::file_hosting::FileHost;
|
||||
use crate::models::mods::{
|
||||
GameVersion, ModId, ModLoader, Version, VersionFile, VersionId, VersionType,
|
||||
Dependency, GameVersion, ModId, ModLoader, Version, VersionFile, VersionId, VersionType,
|
||||
};
|
||||
use crate::models::teams::Permissions;
|
||||
use crate::routes::mod_creation::{CreateError, UploadedFile};
|
||||
@@ -21,7 +21,7 @@ pub struct InitialVersionData {
|
||||
pub version_number: String,
|
||||
pub version_title: String,
|
||||
pub version_body: Option<String>,
|
||||
pub dependencies: Vec<VersionId>,
|
||||
pub dependencies: Vec<Dependency>,
|
||||
pub game_versions: Vec<GameVersion>,
|
||||
pub release_channel: VersionType,
|
||||
pub loaders: Vec<ModLoader>,
|
||||
@@ -221,6 +221,12 @@ async fn version_create_inner(
|
||||
loaders.push(id);
|
||||
}
|
||||
|
||||
let dependencies = version_create_data
|
||||
.dependencies
|
||||
.iter()
|
||||
.map(|x| ((x.version_id).into(), x.dependency_type.to_string()))
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
version_builder = Some(VersionBuilder {
|
||||
version_id: version_id.into(),
|
||||
mod_id: version_create_data.mod_id.unwrap().into(),
|
||||
@@ -232,11 +238,7 @@ async fn version_create_inner(
|
||||
.clone()
|
||||
.unwrap_or_else(|| "".to_string()),
|
||||
files: Vec::new(),
|
||||
dependencies: version_create_data
|
||||
.dependencies
|
||||
.iter()
|
||||
.map(|x| (*x).into())
|
||||
.collect::<Vec<_>>(),
|
||||
dependencies,
|
||||
game_versions,
|
||||
loaders,
|
||||
release_channel,
|
||||
|
||||
@@ -2,6 +2,7 @@ use super::ApiError;
|
||||
use crate::auth::get_user_from_headers;
|
||||
use crate::file_hosting::FileHost;
|
||||
use crate::models;
|
||||
use crate::models::mods::{Dependency, DependencyType};
|
||||
use crate::models::teams::Permissions;
|
||||
use crate::{database, Pepper};
|
||||
use actix_web::{delete, get, patch, web, HttpRequest, HttpResponse};
|
||||
@@ -10,14 +11,17 @@ use sqlx::PgPool;
|
||||
use std::borrow::Borrow;
|
||||
use std::sync::Arc;
|
||||
|
||||
// TODO: this needs filtering, and a better response type
|
||||
// Currently it only gives a list of ids, which have to be
|
||||
// requested manually. This route could give a list of the
|
||||
// ids as well as the supported versions and loaders, or
|
||||
// other info that is needed for selecting the right version.
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct VersionListFilters {
|
||||
pub game_versions: Option<Vec<String>>,
|
||||
pub loaders: Option<Vec<String>>,
|
||||
pub featured: Option<bool>,
|
||||
}
|
||||
|
||||
#[get("version")]
|
||||
pub async fn version_list(
|
||||
info: web::Path<(models::ids::ModId,)>,
|
||||
web::Query(filters): web::Query<VersionListFilters>,
|
||||
pool: web::Data<PgPool>,
|
||||
) -> Result<HttpResponse, ApiError> {
|
||||
let id = info.into_inner().0.into();
|
||||
@@ -32,14 +36,29 @@ pub async fn version_list(
|
||||
.exists;
|
||||
|
||||
if mod_exists.unwrap_or(false) {
|
||||
let mod_data = database::models::Version::get_mod_versions(id, &**pool)
|
||||
let version_ids = database::models::Version::get_mod_versions(
|
||||
id,
|
||||
filters.game_versions,
|
||||
filters.loaders,
|
||||
&**pool,
|
||||
)
|
||||
.await
|
||||
.map_err(|e| ApiError::DatabaseError(e.into()))?;
|
||||
|
||||
let versions = database::models::Version::get_many_full(version_ids, &**pool)
|
||||
.await
|
||||
.map_err(|e| ApiError::DatabaseError(e.into()))?;
|
||||
|
||||
let response = mod_data
|
||||
.into_iter()
|
||||
.map(|v| v.into())
|
||||
.collect::<Vec<models::ids::VersionId>>();
|
||||
let mut response = Vec::new();
|
||||
for version in versions {
|
||||
if let Some(featured) = filters.featured {
|
||||
if featured {
|
||||
response.push(convert_version(version))
|
||||
}
|
||||
} else {
|
||||
response.push(convert_version(version))
|
||||
}
|
||||
}
|
||||
|
||||
Ok(HttpResponse::Ok().json(response))
|
||||
} else {
|
||||
@@ -132,7 +151,14 @@ fn convert_version(data: database::models::version_item::QueryVersion) -> models
|
||||
}
|
||||
})
|
||||
.collect(),
|
||||
dependencies: Vec::new(), // TODO: dependencies
|
||||
dependencies: data
|
||||
.dependencies
|
||||
.into_iter()
|
||||
.map(|d| Dependency {
|
||||
version_id: d.0.into(),
|
||||
dependency_type: DependencyType::from_str(&*d.1),
|
||||
})
|
||||
.collect(),
|
||||
game_versions: data
|
||||
.game_versions
|
||||
.into_iter()
|
||||
@@ -152,7 +178,7 @@ pub struct EditVersion {
|
||||
pub version_number: Option<String>,
|
||||
pub changelog: Option<String>,
|
||||
pub version_type: Option<models::mods::VersionType>,
|
||||
pub dependencies: Option<Vec<models::ids::VersionId>>,
|
||||
pub dependencies: Option<Vec<Dependency>>,
|
||||
pub game_versions: Option<Vec<models::mods::GameVersion>>,
|
||||
pub loaders: Option<Vec<models::mods::ModLoader>>,
|
||||
pub featured: Option<bool>,
|
||||
@@ -272,15 +298,17 @@ pub async fn version_edit(
|
||||
.map_err(|e| ApiError::DatabaseError(e.into()))?;
|
||||
|
||||
for dependency in dependencies {
|
||||
let dependency_id: database::models::ids::VersionId = dependency.clone().into();
|
||||
let dependency_id: database::models::ids::VersionId =
|
||||
dependency.version_id.clone().into();
|
||||
|
||||
sqlx::query!(
|
||||
"
|
||||
INSERT INTO dependencies (dependent_id, dependency_id)
|
||||
VALUES ($1, $2)
|
||||
INSERT INTO dependencies (dependent_id, dependency_id, dependency_type)
|
||||
VALUES ($1, $2, $3)
|
||||
",
|
||||
id as database::models::ids::VersionId,
|
||||
dependency_id as database::models::ids::VersionId,
|
||||
dependency.dependency_type.as_str()
|
||||
)
|
||||
.execute(&mut *transaction)
|
||||
.await
|
||||
|
||||
Reference in New Issue
Block a user