diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs index 184c1a4..cf6f94c 100644 --- a/server/src/api/mod.rs +++ b/server/src/api/mod.rs @@ -4,7 +4,6 @@ use axum::extract::{Path, Query, State}; use axum::routing::get; use axum::Json; use axum::Router; -use sea_orm::ModelTrait; use pagination::PaginatedResponse; @@ -60,31 +59,15 @@ async fn get_packages( Ok(Json(pagination.res(total_pages, pkgs))) } -#[derive(serde::Serialize)] -pub struct PackageRes { - #[serde(flatten)] - entry: db::package::Model, - licenses: Vec, -} - async fn get_single_package( State(global): State, Path(id): Path, -) -> crate::Result> { +) -> crate::Result> { let entry = global .db - .package(id) + .full_package(id) .await? .ok_or(axum::http::StatusCode::NOT_FOUND)?; - let licenses = entry - .find_related(db::PackageLicense) - .all(&global.db) - .await? - .iter() - .map(|e| e.value.clone()) - .collect(); - let res = PackageRes { entry, licenses }; - - Ok(Json(res)) + Ok(Json(entry)) } diff --git a/server/src/db/mod.rs b/server/src/db/mod.rs index bc5204c..1da82dd 100644 --- a/server/src/db/mod.rs +++ b/server/src/db/mod.rs @@ -4,8 +4,8 @@ mod migrator; use sea_orm::{ ActiveModelTrait, ColumnTrait, ConnectOptions, Database, DatabaseConnection, DeleteResult, - DeriveActiveEnum, EntityTrait, EnumIter, InsertResult, NotSet, PaginatorTrait, QueryFilter, - QueryOrder, Set, + DeriveActiveEnum, EntityTrait, EnumIter, InsertResult, ModelTrait, NotSet, PaginatorTrait, + QueryFilter, QueryOrder, Set, }; use sea_orm_migration::MigratorTrait; use serde::{Deserialize, Serialize}; @@ -28,6 +28,18 @@ pub enum PackageDepend { Opt, } +#[derive(Serialize)] +pub struct FullPackage { + #[serde(flatten)] + entry: package::Model, + licenses: Vec, + groups: Vec, + replaces: Vec, + provides: Vec, + depends: Vec<(PackageDepend, String)>, + files: Vec, +} + #[derive(Clone, Debug)] pub struct RieterDb { pub conn: DatabaseConnection, @@ -220,4 +232,63 @@ impl RieterDb { Ok(()) } + + pub async fn full_package(&self, id: i32) -> Result> { + if let Some(entry) = self.package(id).await? { + let licenses = entry + .find_related(PackageLicense) + .all(self) + .await? + .into_iter() + .map(|e| e.value) + .collect(); + let groups = entry + .find_related(PackageGroup) + .all(self) + .await? + .into_iter() + .map(|e| e.value) + .collect(); + let replaces = entry + .find_related(PackageReplaces) + .all(self) + .await? + .into_iter() + .map(|e| e.value) + .collect(); + let provides = entry + .find_related(PackageProvides) + .all(self) + .await? + .into_iter() + .map(|e| e.value) + .collect(); + let depends = entry + .find_related(PackageDepends) + .all(self) + .await? + .into_iter() + .map(|e| (e.r#type, e.value)) + .collect(); + let files = entry + .find_related(PackageFile) + .all(self) + .await? + .into_iter() + .map(|e| e.value) + .collect(); + + Ok(Some(FullPackage { + entry, + licenses, + groups, + replaces, + provides, + depends, + files, + })) + } else { + Ok(None) + } + } }