use actix_web::{HttpResponse, Responder, Result, get, web}; use crate::{ app::App, storage::sql::{ unit::{Unit, UnitId, UnitIdStub}, unit_property::{UnitPropertyId, UnitPropertyIdStub}, }, }; /// Return all registered units #[utoipa::path( responses( ( status = OK, description = "All units founds", body = Vec ), ( status = INTERNAL_SERVER_ERROR, description = "Server encountered error", body = String ) ), )] #[get("/units/")] pub(crate) async fn units(app: web::Data) -> Result { let all = Unit::get_all(&app).await?; Ok(HttpResponse::Ok().json(all)) } /// Return all registered units for a specific unit property #[utoipa::path( responses( ( status = OK, description = "All units founds", body = Vec ), ( status = INTERNAL_SERVER_ERROR, description = "Server encountered error", body = String ) ), params( ( "id" = UnitPropertyId, description = "Unit property id" ), ) )] #[get("/units-by-property/{id}")] pub(crate) async fn units_by_property_id( app: web::Data, id: web::Path, ) -> Result { let id = id.into_inner(); let all = Unit::get_all(&app) .await? .into_iter() .filter(|unit| unit.unit_property == id.into()) .collect::>(); Ok(HttpResponse::Ok().json(all)) } /// Get Unit by id #[utoipa::path( responses( ( status = OK, description = "Unit found from database", body = Unit ), ( status = NOT_FOUND, description = "Unit not found in database" ), ( status = INTERNAL_SERVER_ERROR, description = "Server encountered error", body = String ) ), params( ( "id" = UnitId, description = "Unit id" ), ) )] #[get("/unit/{id}")] pub(crate) async fn unit_by_id( app: web::Data, id: web::Path, ) -> Result { let id = id.into_inner(); match Unit::from_id(&app, id.into()).await? { Some(unit) => Ok(HttpResponse::Ok().json(unit)), None => Ok(HttpResponse::NotFound().finish()), } }