From 5e2bbe77f2c43f8af1be0cf29ed3ba48eead7385 Mon Sep 17 00:00:00 2001 From: ericthelemur Date: Sun, 2 Oct 2022 18:08:13 +0100 Subject: [PATCH] Can fetch package data by name or ID --- dcspkg-server/src/db.rs | 13 +++++++++++++ dcspkg-server/src/handlers.rs | 11 +++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/dcspkg-server/src/db.rs b/dcspkg-server/src/db.rs index b4c282b..3e537eb 100644 --- a/dcspkg-server/src/db.rs +++ b/dcspkg-server/src/db.rs @@ -19,6 +19,19 @@ pub async fn get_package_by_name( Ok(all.pop()) } +pub async fn get_package_by_id( + conn: &mut PoolConnection, + id: i64, +) -> Result, sqlx::Error> { + let mut all: Vec = sqlx::query_as("SELECT * FROM packages WHERE id=?") + .bind(id) + .fetch_all(conn) + .await?; + //get latest version + all.sort_by_key(|p| semver::Version::parse(&p.version).unwrap()); + Ok(all.pop()) +} + pub async fn get_all_packages( conn: &mut PoolConnection, ) -> Result, sqlx::Error> { diff --git a/dcspkg-server/src/handlers.rs b/dcspkg-server/src/handlers.rs index 8e7a4e6..a5eb0b3 100644 --- a/dcspkg-server/src/handlers.rs +++ b/dcspkg-server/src/handlers.rs @@ -1,4 +1,4 @@ -use crate::db::{get_all_packages, get_package_by_name, PackageDB}; +use crate::db::{get_all_packages, get_package_by_name, get_package_by_id, PackageDB}; use dcspkg_common::Package; use rocket::get; use rocket::serde::json::Json; @@ -14,8 +14,11 @@ pub async fn list(mut db: Connection) -> Json> { #[get("/pkgdata/")] pub async fn pkgdata(mut db: Connection, name: &str) -> Option> { - match get_package_by_name(&mut *db, name).await { - Ok(x) => x.map(Json), - Err(e) => panic!("{e:?}"), //TODO, work out how to handle failure in reponder + let mut pkg = get_package_by_name(&mut *db, name).await.ok()?; + // If nothing, attempt fetching by ID + if pkg.is_none() { + let id: i64 = name.parse().ok()?; + pkg = get_package_by_id(&mut *db, id).await.ok()?; } + pkg.map(Json) }