use serde::{Deserialize, Serialize}; use uuid::Uuid; use crate::error::{ApiError, ApiResult}; use crate::models::{Product, Sku}; #[derive(Debug, Serialize)] pub struct ProductWithSkus { #[serde(flatten)] pub product: Product, pub skus: Vec, pub sold_count: i64, } #[derive(Deserialize)] pub struct PublicListQuery { pub page: Option, pub per_page: Option, pub category_id: Option, pub brand_id: Option, pub shop_id: Option, pub q: Option, pub sort: Option, pub order: Option, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum SortBy { Newest, Price, Sales, } impl PublicListQuery { pub fn sort_by(&self) -> ApiResult { match self.sort.as_deref() { None => Ok(SortBy::Newest), Some("price") => Ok(SortBy::Price), Some("sales") => Ok(SortBy::Sales), Some(other) => Err(ApiError::BadRequest(format!("unsupported sort: {other}"))), } } pub fn ascending(&self) -> ApiResult { match self.order.as_deref() { None | Some("asc") => Ok(true), Some("desc") => Ok(false), Some(other) => Err(ApiError::BadRequest(format!("unsupported order: {other}"))), } } } #[derive(Deserialize)] pub struct ProductBody { pub category_id: Option, pub brand_id: Option, pub slug: String, pub name: serde_json::Value, pub description: Option, pub images: Option, } #[derive(Deserialize)] pub struct SkuBody { pub sku_code: String, pub attributes: Option, pub price_minor: i64, pub currency: String, pub stock: i32, pub active: Option, }