diff options
| author | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2025-10-23 22:06:01 +0200 |
|---|---|---|
| committer | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2025-10-23 22:06:01 +0200 |
| commit | 1a7f887451faee3083f5bbf55979665a4e6bc7f4 (patch) | |
| tree | ba8c78f52495de25810777f880881761122feef5 /crates/rocie-server/src/api/get/product.rs | |
| parent | chore(crates/rocie-client): Re-generate (diff) | |
| download | server-1a7f887451faee3083f5bbf55979665a4e6bc7f4.zip | |
feat(crates/rocie-server/api/get-product-{by-name,by-part-name}): Init
Diffstat (limited to 'crates/rocie-server/src/api/get/product.rs')
| -rw-r--r-- | crates/rocie-server/src/api/get/product.rs | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/crates/rocie-server/src/api/get/product.rs b/crates/rocie-server/src/api/get/product.rs index 90cb8c8..9356a68 100644 --- a/crates/rocie-server/src/api/get/product.rs +++ b/crates/rocie-server/src/api/get/product.rs @@ -16,7 +16,7 @@ use crate::{ ("id" = ProductId, description = "Product id" ), ) )] -#[get("/product/{id}")] +#[get("/product/by-id/{id}")] pub(crate) async fn product_by_id( app: web::Data<App>, id: web::Path<ProductIdStub>, @@ -29,6 +29,59 @@ pub(crate) async fn product_by_id( } } +/// Get Product by name +#[utoipa::path( + responses( + (status = OK, description = "Product found from database", body = Product), + (status = NOT_FOUND, description = "Product not found in database"), + (status = INTERNAL_SERVER_ERROR, description = "Server encountered error", body = String) + ), + params( + ("name" = String, description = "Name of the product" ), + ) +)] +// TODO: Html decode the name, before use. Otherwise `Milk 2` will not work, as it is send as +// `Milk+2` <2025-10-21> +#[get("/product/by-name/{name}")] +pub(crate) async fn product_by_name( + app: web::Data<App>, + name: web::Path<String>, +) -> Result<impl Responder> { + let name = name.into_inner(); + + match Product::from_name(&app, name).await? { + Some(product) => Ok(HttpResponse::Ok().json(product)), + None => Ok(HttpResponse::NotFound().finish()), + } +} + +/// Get Product suggestion by name +#[utoipa::path( + responses( + (status = OK, description = "Product suggestions found from database", body = Vec<Product>), + (status = INTERNAL_SERVER_ERROR, description = "Server encountered error", body = String) + ), + params( + ("name" = String, description = "Partial name of a product" ), + ) +)] +#[get("/product/by-part-name/{name}")] +pub(crate) async fn product_suggestion_by_name( + app: web::Data<App>, + name: web::Path<String>, +) -> Result<impl Responder> { + let name = name.into_inner(); + + let all = Product::get_all(&app).await?; + + let matching = all + .into_iter() + .filter(|product| product.name.starts_with(name.as_str())) + .collect::<Vec<_>>(); + + Ok(HttpResponse::Ok().json(matching)) +} + /// Return all registered products #[utoipa::path( responses( |
