use chrono::NaiveDateTime; use derive_more::Deref; #[cfg(feature = "dummy")] use fake::Fake; use serde::{Deserialize, Serialize}; use crate::*; #[cfg_attr(feature = "dummy", derive(fake::Dummy))] #[derive(Serialize, Deserialize, Debug)] #[serde(transparent)] pub struct AccountOrders(pub Vec); impl From<(Vec, Vec)> for AccountOrders { fn from((orders, mut items): (Vec, Vec)) -> 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)> for AccountOrder { fn from( ( crate::AccountOrder { id, buyer_id, status, order_id, order_ext_id: _, service_order_id: _, }, mut items, ): (crate::AccountOrder, Vec), ) -> Self { AccountOrder { id, buyer_id, status, order_id, items: items.drain_filter(|item| item.order_id == id).collect(), } } } #[cfg_attr(feature = "dummy", derive(fake::Dummy))] #[derive(Serialize, Deserialize, Debug)] pub struct AccountOrder { pub id: crate::AccountOrderId, pub buyer_id: crate::AccountId, pub status: crate::OrderStatus, pub order_id: Option, pub items: Vec, } #[cfg_attr(feature = "dummy", derive(fake::Dummy))] #[derive(Serialize, Deserialize, Debug)] pub struct ShoppingCartItem { pub id: ShoppingCartId, pub product_id: ProductId, pub shopping_cart_id: ShoppingCartId, pub quantity: Quantity, pub quantity_unit: QuantityUnit, } impl From for ShoppingCartItem { fn from( crate::ShoppingCartItem { id, product_id, shopping_cart_id, quantity, quantity_unit, }: crate::ShoppingCartItem, ) -> Self { Self { id, product_id, shopping_cart_id, quantity, quantity_unit, } } } #[cfg_attr(feature = "dummy", derive(fake::Dummy))] #[derive(Serialize, Deserialize, Debug)] pub struct ShoppingCart { pub id: ShoppingCartId, pub buyer_id: AccountId, pub payment_method: PaymentMethod, pub state: ShoppingCartState, pub items: Vec, } impl From<(crate::ShoppingCart, Vec)> for ShoppingCart { fn from( ( crate::ShoppingCart { id, buyer_id, payment_method, state, }, items, ): (crate::ShoppingCart, Vec), ) -> 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(), } } } #[cfg_attr(feature = "dummy", derive(fake::Dummy))] #[derive(Serialize, Deserialize, Debug, Hash)] pub struct Photo { pub id: crate::PhotoId, pub file_name: crate::FileName, pub url: String, pub unique_name: crate::UniqueName, } #[cfg_attr(feature = "dummy", derive(fake::Dummy))] #[derive(Serialize, Deserialize, Debug, Hash)] pub struct Product { pub id: crate::ProductId, pub name: crate::ProductName, pub short_description: crate::ProductShortDesc, pub long_description: crate::ProductLongDesc, pub category: Option, pub price: crate::Price, pub deliver_days_flag: crate::Days, pub photos: Vec, } impl<'path> From<(crate::Product, &mut Vec, &'path str)> for Product { fn from( ( crate::Product { id, name, short_description, long_description, category, price, deliver_days_flag, }, photos, public_path, ): (crate::Product, &mut Vec, &'path str), ) -> 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: _, unique_name, }| Photo { id, url: format!("{}/{}", public_path, unique_name.as_str()), unique_name, file_name, }, ) .collect(), } } } #[cfg_attr(feature = "dummy", derive(fake::Dummy))] #[derive(Serialize, Deserialize, Debug, Deref)] #[serde(transparent)] pub struct Products(pub Vec); impl From<(Vec, Vec, String)> for Products { fn from( (products, mut photos, public_path): (Vec, Vec, String), ) -> Self { Self( products .into_iter() .map(|p| (p, &mut photos, public_path.as_str()).into()) .collect(), ) } } #[derive(Serialize, Deserialize, Debug)] pub struct SignInInput { pub login: Login, pub password: Password, } #[derive(Serialize, Deserialize, Debug)] pub struct SignInOutput { pub access_token: AccessTokenString, pub refresh_token: RefreshTokenString, pub exp: NaiveDateTime, } #[derive(Serialize, Deserialize, Debug)] pub struct CreateAccountInput { pub email: Email, pub login: Login, pub password: Password, pub password_confirmation: PasswordConfirmation, } #[derive(Serialize, Deserialize, Debug)] pub struct CreateOrderInput { /// Required customer e-mail pub email: String, /// Required customer phone number pub phone: String, /// Required customer first name pub first_name: String, /// Required customer last name pub last_name: String, /// Required customer language pub language: String, /// False if customer is allowed to be charged on site. /// Otherwise it should be true to use payment service for charging pub charge_client: bool, /// User currency pub currency: String, } #[derive(Serialize, Deserialize, Debug)] pub struct DeleteItemInput { pub shopping_cart_item_id: ShoppingCartItemId, } #[derive(Serialize, Deserialize, Debug)] pub struct DeleteItemOutput { pub success: bool, } #[derive(Serialize, Deserialize, Debug)] pub struct CreateItemInput { pub product_id: ProductId, pub quantity: Quantity, pub quantity_unit: QuantityUnit, } #[derive(Serialize, Deserialize, Debug)] pub struct CreateItemOutput { pub success: bool, pub shopping_cart_item: ShoppingCartItem, } pub mod admin { use serde::{Deserialize, Serialize}; use crate::*; #[derive(Deserialize, Serialize, Debug)] pub struct RegisterInput { pub login: Login, pub email: Email, pub password: Password, pub password_confirmation: PasswordConfirmation, pub role: Role, } #[derive(Serialize, Deserialize, Debug, Default)] pub struct RegisterResponse { pub success: bool, pub errors: Vec, pub account: Option, } #[derive(Serialize, Deserialize, Debug)] pub enum RegisterError { PasswordDiffer, } #[derive(Serialize, Deserialize, Debug)] pub struct SignInInput { pub login: Option, pub email: Option, pub password: Password, } #[derive(Serialize, Deserialize, Debug)] pub struct LogoutResponse {} }