aboutsummaryrefslogtreecommitdiff
path: root/src/handlers/planets.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/handlers/planets.rs')
-rw-r--r--src/handlers/planets.rs58
1 files changed, 56 insertions, 2 deletions
diff --git a/src/handlers/planets.rs b/src/handlers/planets.rs
index 06773bc..2c66324 100644
--- a/src/handlers/planets.rs
+++ b/src/handlers/planets.rs
@@ -1,11 +1,17 @@
+use axum::Extension;
+use axum_macros::debug_handler;
use axum::{response::IntoResponse, Json, extract::Path};
+use solarlib::ship::{DbShip, Ship};
+use tokio::process::Command;
use tracing::{error, instrument};
-use solarlib::star::Star;
+use solarlib::star::{Star, NewPlanet};
use solarlib::planet::Planet;
+use solarlib::errors::Error as SolarlibError;
-use crate::{errors::*, get_star};
+use crate::{errors::*, get_star, State};
+use std::sync::Arc;
pub async fn list() -> JsonResult<Json<Vec<Planet>>> {
let con_url = std::env::var("QEMU_URL").unwrap_or("qemu:///system".to_string());
@@ -100,3 +106,51 @@ pub async fn force_shutdown(Path(uuid): Path<String>) -> NoneResult {
Ok(())
}
+
+#[debug_handler]
+pub async fn new_planet(Json(new_planet): Json<NewPlanet>) -> JsonResult<Json<Planet>> {
+ let hw_url = std::env::var("HOMEWORLD_URL").unwrap();
+
+ let ship_shasum = new_planet.clone().ship;
+
+ let res: DbShip = reqwest::get(format!("http://{}/ships/get/{}", hw_url, ship_shasum)).await?.json().await?;
+ let ship: Ship = res.into();
+
+ let mut s = get_star()?;
+
+ println!("{:?}", s);
+
+ // Try to create right away, if the Ship already exists on the system, it'll go through. If
+ // not, we can download it by using the shasum
+ let r = s.planet(new_planet.clone().name, new_planet.max_mem, new_planet.max_cpus, new_planet.disk_size_mb, ship.clone());
+ match r {
+ Err(e) => {
+ match e {
+ SolarlibError::MissingImage(_) => {
+ ship.download(&s)?;
+ return Ok(Json(s.planet(new_planet.name, new_planet.max_mem, new_planet.max_cpus, new_planet.disk_size_mb, ship.clone())?));
+ },
+ _ => {
+ return Err(ServiceError::Solarlib(e));
+ }
+ }
+ },
+ Ok(r) => {
+ let tmp = s.inhabitants()?[0].clone();
+ return Ok(Json(tmp));
+ }
+ };
+}
+
+
+pub async fn no_planet(Path(uuid): Path<String>) -> NoneResult {
+ let mut s = get_star()?;
+
+ if let Ok(p) = s.find_planet(uuid) {
+ p.deathstar()?;
+ } else {
+ return Err(ServiceError::NotFound);
+ }
+
+ Ok(())
+}