use rocket::{get, post, serde::json::Json, Build, Rocket, State}; use rocket_okapi::{ openapi, openapi_get_routes, rapidoc::{make_rapidoc, GeneralConfig, HideShowConfig, RapiDocConfig}, settings::UrlObject, swagger_ui::{make_swagger_ui, SwaggerUIConfig}, }; use zone_core::{Container, PartialEqOrDefault}; /// # Test endpoint /// /// Returns a list of containers based on the query. #[openapi(tag = "Testing")] #[get("/test")] pub fn test_endpoint(zfs_config: &State) -> Json { Json(zfs_config.quota.to_owned()) } /// List containers /// /// Returns a list of containers based on the query. #[openapi(tag = "Container")] #[get("/container/list?")] pub fn container_list(container: Container) -> Json> { zone_nspawn::get_containers() .into_iter() .map(|c| { c.try_into() .unwrap_or_else(|_err| todo!("Log this error and return `Container::default()`")) }) .filter(|c| container.eq_or_default(c)) .collect::>() .into() } /// Create container #[openapi(tag = "Container")] #[post("/container", data = "")] fn create_container( container: Json, zfs_config: &State, ) -> Json { let container = zone_zfs::create_file_system( container.template.clone(), format!("{}-{}", container.user, container.id), zfs_config, ); match container { Ok(f) => Json(Container::try_from(f).expect("failed to convert")), Err(_err) => todo!("Respond with error message"), } } pub fn build_rocket(config: crate::Config) -> Rocket { rocket::custom(config.rocket_config) .mount( "/", openapi_get_routes![test_endpoint, container_list, create_container,], ) .mount( "/swagger-ui/", make_swagger_ui(&SwaggerUIConfig { url: "../openapi.json".to_owned(), ..Default::default() }), ) .mount( "/rapidoc/", make_rapidoc(&RapiDocConfig { general: GeneralConfig { spec_urls: vec![UrlObject::new("General", "../openapi.json")], ..Default::default() }, hide_show: HideShowConfig { allow_spec_url_load: false, allow_spec_file_load: false, ..Default::default() }, ..Default::default() }), ) .manage(config.zfs_config) }