use actix_web::{HttpResponse, Responder, Result, get, web}; use crate::{ app::App, storage::sql::product::{Product, ProductId}, }; pub(crate) fn register_paths(cfg: &mut web::ServiceConfig) { cfg.service(product_by_id).service(products); } /// Get Product by id #[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( ("id" = ProductId, description = "Product id" ), ) )] #[get("/product/{id}")] pub(crate) async fn product_by_id( app: web::Data, id: web::Path, ) -> Result { let id = id.into_inner(); match Product::from_id(&app, id).await? { Some(product) => Ok(HttpResponse::Ok().json(product)), None => Ok(HttpResponse::NotFound().finish()), } } /// Return all registered products #[utoipa::path( responses( (status = OK, description = "All products founds", body = Vec), (status = INTERNAL_SERVER_ERROR, description = "Server encountered error", body = String) ), )] #[get("/products/")] pub(crate) async fn products(app: web::Data) -> Result { let all = Product::get_all(&app).await?; Ok(HttpResponse::Ok().json(all)) }