bazzar/shared/model/src/api.rs

218 lines
6.3 KiB
Rust
Raw Normal View History

2022-05-09 16:17:27 +02:00
use derive_more::Deref;
#[cfg(feature = "dummy")]
use fake::Fake;
use serde::{Deserialize, Serialize};
2022-05-06 11:47:18 +02:00
2022-05-08 14:59:59 +02:00
use crate::ProductLinkedPhoto;
2022-05-09 16:17:27 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[derive(Serialize, Deserialize, Debug)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct AccountOrders(pub Vec<AccountOrder>);
impl From<(Vec<crate::AccountOrder>, Vec<crate::OrderItem>)> for AccountOrders {
fn from((orders, mut items): (Vec<crate::AccountOrder>, Vec<crate::OrderItem>)) -> Self {
Self(
orders
.into_iter()
.map(
|crate::AccountOrder {
id,
buyer_id,
status,
order_id,
order_ext_id: _,
service_order_id: _,
}| {
AccountOrder {
id,
buyer_id,
status,
order_id,
items: items.drain_filter(|item| item.order_id == id).collect(),
}
},
)
.collect(),
)
}
}
impl From<(crate::AccountOrder, Vec<crate::OrderItem>)> for AccountOrder {
fn from(
(
crate::AccountOrder {
id,
buyer_id,
status,
order_id,
order_ext_id: _,
service_order_id: _,
},
mut items,
): (crate::AccountOrder, Vec<crate::OrderItem>),
) -> Self {
AccountOrder {
id,
buyer_id,
status,
order_id,
items: items.drain_filter(|item| item.order_id == id).collect(),
}
}
}
2022-05-09 16:17:27 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[derive(Serialize, Deserialize, Debug)]
2022-05-06 11:47:18 +02:00
pub struct AccountOrder {
pub id: crate::AccountOrderId,
pub buyer_id: crate::AccountId,
pub status: crate::OrderStatus,
pub order_id: Option<crate::OrderId>,
pub items: Vec<crate::OrderItem>,
}
2022-05-09 16:17:27 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[derive(Serialize, Deserialize, Debug)]
2022-05-06 11:47:18 +02:00
pub struct ShoppingCartItem {
pub id: crate::ShoppingCartId,
pub product_id: crate::ProductId,
pub shopping_cart_id: crate::ShoppingCartId,
pub quantity: crate::Quantity,
pub quantity_unit: crate::QuantityUnit,
}
2022-05-09 16:17:27 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[derive(Serialize, Deserialize, Debug)]
2022-05-06 11:47:18 +02:00
pub struct ShoppingCart {
pub id: crate::ShoppingCartId,
pub buyer_id: crate::AccountId,
pub payment_method: crate::PaymentMethod,
pub state: crate::ShoppingCartState,
pub items: Vec<ShoppingCartItem>,
}
impl From<(crate::ShoppingCart, Vec<crate::ShoppingCartItem>)> for ShoppingCart {
fn from(
(
crate::ShoppingCart {
id,
buyer_id,
payment_method,
state,
},
items,
): (crate::ShoppingCart, Vec<crate::ShoppingCartItem>),
) -> Self {
Self {
id,
buyer_id,
payment_method,
state,
items: items
.into_iter()
.map(
|crate::ShoppingCartItem {
id,
product_id,
shopping_cart_id,
quantity,
quantity_unit,
}| ShoppingCartItem {
id,
product_id,
shopping_cart_id,
quantity,
quantity_unit,
},
)
.collect(),
}
}
}
2022-05-08 14:59:59 +02:00
2022-05-09 16:17:27 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[derive(Serialize, Deserialize, Debug)]
2022-05-08 14:59:59 +02:00
pub struct Photo {
pub id: crate::PhotoId,
pub file_name: crate::FileName,
2022-05-09 16:17:27 +02:00
pub url: String,
pub unique_name: crate::UniqueName,
2022-05-08 14:59:59 +02:00
}
2022-05-09 16:17:27 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[derive(Serialize, Deserialize, Debug)]
2022-05-08 14:59:59 +02:00
pub struct Product {
pub id: crate::ProductId,
pub name: crate::ProductName,
pub short_description: crate::ProductShortDesc,
pub long_description: crate::ProductLongDesc,
pub category: Option<crate::ProductCategory>,
pub price: crate::Price,
pub deliver_days_flag: crate::Days,
pub photos: Vec<Photo>,
}
2022-05-09 16:17:27 +02:00
impl<'path> From<(crate::Product, &mut Vec<ProductLinkedPhoto>, &'path str)> for Product {
2022-05-08 14:59:59 +02:00
fn from(
(
crate::Product {
id,
name,
short_description,
long_description,
category,
price,
deliver_days_flag,
},
photos,
2022-05-09 16:17:27 +02:00
public_path,
): (crate::Product, &mut Vec<ProductLinkedPhoto>, &'path str),
2022-05-08 14:59:59 +02:00
) -> Self {
Self {
id,
name,
short_description,
long_description,
category,
price,
deliver_days_flag,
photos: photos
.drain_filter(|photo| photo.product_id == id)
.map(
|ProductLinkedPhoto {
id,
local_path: _,
file_name,
product_id: _,
2022-05-09 16:17:27 +02:00
unique_name,
}| Photo {
id,
url: format!("{}/{}", public_path, unique_name.as_str()),
unique_name,
file_name,
},
2022-05-08 14:59:59 +02:00
)
.collect(),
}
}
}
2022-05-09 16:17:27 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[derive(Serialize, Deserialize, Debug, Deref)]
2022-05-08 14:59:59 +02:00
#[serde(transparent)]
2022-05-09 16:17:27 +02:00
pub struct Products(pub Vec<Product>);
2022-05-08 14:59:59 +02:00
2022-05-09 16:17:27 +02:00
impl From<(Vec<crate::Product>, Vec<ProductLinkedPhoto>, String)> for Products {
fn from(
(products, mut photos, public_path): (Vec<crate::Product>, Vec<ProductLinkedPhoto>, String),
) -> Self {
2022-05-08 14:59:59 +02:00
Self(
products
.into_iter()
2022-05-09 16:17:27 +02:00
.map(|p| (p, &mut photos, public_path.as_str()).into())
2022-05-08 14:59:59 +02:00
.collect(),
)
}
}