summaryrefslogtreecommitdiff
path: root/src/handlers/ships.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/handlers/ships.rs')
-rw-r--r--src/handlers/ships.rs43
1 files changed, 32 insertions, 11 deletions
diff --git a/src/handlers/ships.rs b/src/handlers/ships.rs
index 5e8c000..ddb81a6 100644
--- a/src/handlers/ships.rs
+++ b/src/handlers/ships.rs
@@ -1,23 +1,44 @@
-use axum::{Json, extract::Path};
-use solarlib::ship::{Ship, Sha256};
+use std::sync::Arc;
-use crate::errors::{JsonResult, StringResult};
+use axum::{Json, extract::Path, Extension};
+use solarlib::ship::{Ship, DbShip, Sha256};
+use sqlx::{query_as, query};
+use crate::{errors::{JsonResult, StringResult}, State};
-pub async fn list() -> JsonResult<Json<Vec<Ship>>> {
+
+pub async fn list(state: Extension<Arc<State>>) -> JsonResult<Json<Vec<Ship>>> {
let mut result: Vec<Ship> = Vec::new();
- Ok(Json(result))
+ let mut conn = state.conn.acquire().await?;
+
+ let db_ships = query_as!(DbShip, "SELECT * FROM ships").fetch_all(&mut conn).await?;
+
+ let ships = db_ships.into_iter().map(|d| d.into()).collect::<Vec<Ship>>();
+
+ Ok(Json(ships))
}
-pub async fn new(Json(new_ship): Json<Ship>) -> StringResult {
- unimplemented!();
+pub async fn new(Json(new_ship): Json<Ship>, state: Extension<Arc<State>>) -> StringResult {
+ let mut conn = state.conn.acquire().await?;
+
+ query!("INSERT INTO ships (name, shasum, download_url, version) VALUES ($1, $2, $3, $4)", new_ship.name, new_ship.shasum.to_string(), new_ship.download_url, new_ship.version).execute(&mut conn).await?;
+
+ Ok("OK")
}
-pub async fn update(Json(new_ship): Json<Ship>) -> StringResult {
- todo!();
+pub async fn delete(Path(shasum): Path<Sha256>, state: Extension<Arc<State>>) -> StringResult {
+ let mut conn = state.conn.acquire().await?;
+
+ query!("DELETE FROM ships WHERE shasum=$1", shasum.to_string()).execute(&mut conn).await?;
+
+ Ok("OK")
}
-pub async fn delete(Path(shasum): Path<Sha256>) -> StringResult {
- todo!();
+pub async fn get(Path(shasum): Path<Sha256>, state: Extension<Arc<State>>) -> JsonResult<Json<DbShip>> {
+ let mut conn = state.conn.acquire().await?;
+
+ let db_ship = query_as!(DbShip, "SELECT * FROM ships WHERE shasum=$1", shasum.to_string()).fetch_one(&mut conn).await?;
+
+ Ok(Json(db_ship))
}