bazzar/shared/model/src/lib.rs

1111 lines
30 KiB
Rust
Raw Normal View History

2022-05-06 11:47:18 +02:00
#![feature(drain_filter)]
pub mod api;
2022-05-08 09:47:05 +02:00
#[cfg(feature = "dummy")]
mod dummy;
pub mod encrypt;
2022-05-13 15:24:11 +02:00
use std::fmt::{Display, Formatter};
use std::ops;
2022-05-06 11:47:18 +02:00
use std::str::FromStr;
2022-05-15 10:30:15 +02:00
use derive_more::{Deref, DerefMut, Display, From};
2022-05-06 16:02:38 +02:00
#[cfg(feature = "dummy")]
use fake::Fake;
2022-05-09 16:17:27 +02:00
#[cfg(feature = "dummy")]
2022-05-08 09:47:05 +02:00
use rand::Rng;
2022-05-06 11:47:18 +02:00
use serde::de::{Error, Visitor};
use serde::{Deserialize, Deserializer, Serialize};
2022-05-08 09:47:05 +02:00
pub use crate::encrypt::*;
2022-05-10 22:32:22 +02:00
#[derive(Debug, Hash, thiserror::Error)]
2022-05-06 11:47:18 +02:00
pub enum TransformError {
#[error("Given value is below minimal value")]
BelowMinimal,
#[error("Given value is not valid day flag")]
NotDay,
#[error("Given value is not valid email address")]
NotEmail,
}
pub type RecordId = i32;
2022-05-11 15:56:41 +02:00
#[derive(Clone, Debug, Hash, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct Category {
pub name: &'static str,
pub key: &'static str,
pub svg: &'static str,
}
impl Category {
pub const CAMERAS_NAME: &'static str = "Cameras";
pub const CAMERAS_KEY: &'static str = "cameras";
pub const DRUGSTORE_NAME: &'static str = "Drugstore";
pub const DRUGSTORE_KEY: &'static str = "drugstore";
pub const SPEAKERS_NAME: &'static str = "Speakers";
pub const SPEAKERS_KEY: &'static str = "speakers";
pub const PHONES_NAME: &'static str = "Phones";
pub const PHONES_KEY: &'static str = "phones";
pub const SWEETS_NAME: &'static str = "Sweets";
pub const SWEETS_KEY: &'static str = "sweets";
pub const MEMORY_NAME: &'static str = "Memory";
pub const MEMORY_KEY: &'static str = "memory";
pub const PANTS_NAME: &'static str = "Pants";
pub const PANTS_KEY: &'static str = "pants";
pub const CLOTHES_NAME: &'static str = "Clothes";
pub const CLOTHES_KEY: &'static str = "clothes";
pub const PLATES_NAME: &'static str = "Plates";
pub const PLATES_KEY: &'static str = "plates";
}
macro_rules! category_svg {
($name: expr) => {
concat!("/svg/", $name, ".svg")
};
}
pub const CATEGORIES: [Category; 9] = [
Category {
name: Category::CAMERAS_NAME,
key: Category::CAMERAS_KEY,
svg: category_svg!("cameras"),
},
2022-05-11 15:56:41 +02:00
Category {
name: Category::DRUGSTORE_NAME,
key: Category::DRUGSTORE_KEY,
svg: category_svg!("drugstore"),
2022-05-11 15:56:41 +02:00
},
Category {
name: Category::SPEAKERS_NAME,
key: Category::SPEAKERS_KEY,
svg: category_svg!("speakers"),
2022-05-11 15:56:41 +02:00
},
Category {
name: Category::PHONES_NAME,
key: Category::PHONES_KEY,
svg: category_svg!("phones"),
2022-05-11 15:56:41 +02:00
},
Category {
name: Category::SWEETS_NAME,
key: Category::SWEETS_KEY,
svg: category_svg!("sweets"),
2022-05-11 15:56:41 +02:00
},
Category {
name: Category::MEMORY_NAME,
key: Category::MEMORY_KEY,
svg: category_svg!("memory"),
2022-05-11 15:56:41 +02:00
},
Category {
name: Category::PANTS_NAME,
key: Category::PANTS_KEY,
svg: category_svg!("pants"),
2022-05-11 15:56:41 +02:00
},
Category {
name: Category::CLOTHES_NAME,
key: Category::CLOTHES_KEY,
svg: category_svg!("clothes"),
2022-05-11 15:56:41 +02:00
},
Category {
name: Category::PLATES_NAME,
key: Category::PLATES_KEY,
svg: category_svg!("plates"),
2022-05-11 15:56:41 +02:00
},
];
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(rename_all = "snake_case"))]
2022-05-10 22:32:22 +02:00
#[derive(Copy, Clone, Debug, Hash, Display, Deserialize, Serialize)]
2022-05-06 11:47:18 +02:00
#[serde(rename_all = "snake_case")]
pub enum OrderStatus {
#[display(fmt = "Potwierdzone")]
Confirmed,
#[display(fmt = "Odebrane")]
Delivered,
#[display(fmt = "Opłacone")]
Payed,
#[display(fmt = "Anulowane")]
Cancelled,
#[display(fmt = "Wymaga zwrotu płatności")]
RequireRefund,
#[display(fmt = "Płatność zwrócona")]
Refunded,
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(rename_all = "snake_case"))]
2022-05-10 22:32:22 +02:00
#[derive(Copy, Clone, Debug, Hash, Display, Deserialize, Serialize, PartialEq)]
2022-05-06 11:47:18 +02:00
#[serde(rename_all = "snake_case")]
pub enum Role {
#[display(fmt = "Adminitrator")]
Admin,
#[display(fmt = "Użytkownik")]
User,
}
impl PartialEq<&str> for Role {
fn eq(&self, other: &&str) -> bool {
self.as_str() == *other
}
}
impl Role {
pub fn as_str(&self) -> &str {
match self {
Role::Admin => "Admin",
Role::User => "User",
}
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
2022-05-10 22:32:22 +02:00
#[derive(Copy, Clone, Debug, Hash, Display, Deserialize, Serialize)]
2022-05-06 11:47:18 +02:00
#[serde(rename_all = "snake_case")]
pub enum QuantityUnit {
#[cfg_attr(feature = "db", sqlx(rename = "g"))]
Gram,
#[cfg_attr(feature = "db", sqlx(rename = "dkg"))]
Decagram,
#[cfg_attr(feature = "db", sqlx(rename = "kg"))]
Kilogram,
#[cfg_attr(feature = "db", sqlx(rename = "piece"))]
Piece,
}
2022-05-12 20:33:16 +02:00
impl QuantityUnit {
pub fn name(self) -> &'static str {
match self {
Self::Gram => "Gram",
Self::Decagram => "Decagram",
Self::Kilogram => "Kilogram",
Self::Piece => "Piece",
}
}
pub fn short_name(&self) -> &'static str {
match self {
Self::Gram => "g",
Self::Decagram => "dkg",
Self::Kilogram => "kg",
Self::Piece => "piece",
}
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(rename_all = "snake_case"))]
2022-05-10 22:32:22 +02:00
#[derive(Copy, Clone, Debug, Hash, Display, Deserialize, Serialize)]
2022-05-06 11:47:18 +02:00
#[serde(rename_all = "snake_case")]
pub enum PaymentMethod {
PayU,
PaymentOnTheSpot,
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(rename_all = "snake_case"))]
2022-05-10 22:32:22 +02:00
#[derive(Copy, Clone, Debug, Hash, Display, Deserialize, Serialize)]
2022-05-06 11:47:18 +02:00
#[serde(rename_all = "snake_case")]
pub enum ShoppingCartState {
Active,
Closed,
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(rename_all = "snake_case"))]
2022-05-10 22:32:22 +02:00
#[derive(Copy, Clone, Debug, Hash, Display, Deserialize, Serialize, PartialEq)]
2022-05-06 11:47:18 +02:00
#[serde(rename_all = "snake_case")]
pub enum Audience {
Web,
Mobile,
Feed,
AdminPanel,
}
impl PartialEq<&str> for Audience {
fn eq(&self, other: &&str) -> bool {
self.as_str() == *other
}
}
impl Audience {
pub fn as_str(&self) -> &str {
match self {
Audience::Web => "Web",
Audience::Mobile => "Mobile",
Audience::Feed => "Feed",
Audience::AdminPanel => "AdminPanel",
}
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(rename_all = "snake_case"))]
#[derive(Copy, Clone, Debug, Display, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum AccountState {
Active,
Suspended,
Banned,
}
impl Default for Audience {
fn default() -> Self {
Self::Web
}
}
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Default, Debug, Copy, Clone, Hash, Deref, From)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct Price(NonNegative);
impl ops::Mul<Quantity> for Price {
type Output = Self;
fn mul(self, rhs: Quantity) -> Self::Output {
Self(NonNegative(rhs.0 .0 * self.0 .0))
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Default, Debug, Copy, Clone, Hash, Deref, From)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct Quantity(NonNegative);
impl Quantity {
pub fn from_u32(v: u32) -> Self {
Self(NonNegative(v.try_into().unwrap_or_default()))
}
}
impl ops::Add for Quantity {
type Output = Self;
fn add(self, rhs: Self) -> Self::Output {
Self(self.0 + rhs.0)
}
}
impl ops::Sub for Quantity {
type Output = Self;
fn sub(self, rhs: Self) -> Self::Output {
Self(self.0 - rhs.0)
}
}
2022-05-06 11:47:18 +02:00
impl TryFrom<i32> for Quantity {
type Error = TransformError;
fn try_from(value: i32) -> Result<Self, Self::Error> {
Ok(Self(value.try_into()?))
}
}
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-09 16:17:27 +02:00
#[derive(Deserialize, Serialize, Debug, Clone, Deref, From, Display)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct Login(String);
2022-05-09 16:17:27 +02:00
impl Login {
pub fn new<S: Into<String>>(s: S) -> Self {
Self(s.into())
}
}
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-15 10:30:15 +02:00
#[derive(Serialize, Debug, Clone, Deref, DerefMut, From, Display)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct Email(String);
2022-05-15 10:30:15 +02:00
impl Email {
pub fn invalid_empty() -> Self {
Self("".into())
}
pub fn new<S: Into<String>>(s: S) -> Self {
Self(s.into())
}
}
2022-05-06 11:47:18 +02:00
impl FromStr for Email {
type Err = TransformError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if validator::validate_email(s) {
Ok(Self(String::from(s)))
} else {
Err(TransformError::NotEmail)
}
}
}
impl<'de> serde::Deserialize<'de> for Email {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct EmailVisitor {}
impl<'v> Visitor<'v> for EmailVisitor {
type Value = String;
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
formatter.write_str("valid e-mail address")
}
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
where
E: Error,
{
if validator::validate_email(s) {
Ok(String::from(s))
} else {
Err(E::custom("this is not email address"))
}
}
}
Ok(Email(deserializer.deserialize_str(EmailVisitor {})?))
}
}
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Default, Debug, Copy, Clone, Hash, Deref, Display)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct NonNegative(i32);
2022-05-18 09:48:01 +02:00
impl ops::Add for NonNegative {
type Output = Self;
fn add(self, rhs: Self) -> Self::Output {
Self(self.0 + rhs.0)
}
}
2022-05-18 09:48:01 +02:00
impl ops::Sub for NonNegative {
type Output = Self;
fn sub(self, rhs: Self) -> Self::Output {
Self((self.0 - rhs.0).max(0))
}
}
2022-05-06 11:47:18 +02:00
impl TryFrom<i32> for NonNegative {
type Error = TransformError;
fn try_from(value: i32) -> Result<Self, Self::Error> {
if value < 0 {
Err(TransformError::BelowMinimal)
} else {
Ok(Self(value))
}
}
}
impl<'de> serde::Deserialize<'de> for NonNegative {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct NonNegativeVisitor;
impl<'v> Visitor<'v> for NonNegativeVisitor {
type Value = i32;
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
formatter.write_str("value equal or greater than 0")
}
fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
where
E: Error,
{
if v >= 0 {
Ok(v)
} else {
Err(E::custom("Value must be equal or greater than 0"))
}
}
fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
where
E: Error,
{
let v = v
.try_into()
.map_err(|_| E::custom("Value must be equal or greater than 0"))?;
if v >= 0 {
Ok(v)
} else {
Err(E::custom("Value must be equal or greater than 0"))
}
}
fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
where
E: Error,
{
let v = v
.try_into()
.map_err(|_| E::custom("Value must be equal or greater than 0"))?;
Ok(v)
}
fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
where
E: Error,
{
let v = v
.try_into()
.map_err(|_| E::custom("Value must be equal or greater than 0"))?;
Ok(v)
}
}
Ok(NonNegative(
deserializer.deserialize_i32(NonNegativeVisitor)?,
))
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Debug, Copy, Clone, Hash, Display, From)]
2022-05-06 11:47:18 +02:00
#[serde(rename_all = "lowercase")]
pub enum Day {
Monday = 1 << 0,
Tuesday = 1 << 1,
Wednesday = 1 << 2,
Thursday = 1 << 3,
Friday = 1 << 4,
Saturday = 1 << 5,
Sunday = 1 << 6,
}
impl Day {
pub fn name(&self) -> &str {
match self {
Self::Monday => "Monday",
Self::Tuesday => "Tuesday",
Self::Wednesday => "Wednesday",
Self::Thursday => "Thursday",
Self::Friday => "Friday",
Self::Saturday => "Saturday",
Self::Sunday => "Sunday",
}
}
pub fn short_name(&self) -> &'static str {
match self {
Self::Monday => "Mon",
Self::Tuesday => "Tue",
Self::Wednesday => "Wed",
Self::Thursday => "Thu",
Self::Friday => "Fri",
Self::Saturday => "Sat",
Self::Sunday => "Sun",
}
}
}
2022-05-06 11:47:18 +02:00
impl TryFrom<i32> for Day {
type Error = TransformError;
fn try_from(value: i32) -> Result<Self, Self::Error> {
if value == (Day::Monday as i32) {
Ok(Day::Monday)
} else if value == (Day::Tuesday as i32) {
Ok(Day::Tuesday)
} else if value == (Day::Wednesday as i32) {
Ok(Day::Wednesday)
} else if value == (Day::Thursday as i32) {
Ok(Day::Thursday)
} else if value == (Day::Friday as i32) {
Ok(Day::Friday)
} else if value == (Day::Saturday as i32) {
Ok(Day::Saturday)
} else if value == (Day::Sunday as i32) {
Ok(Day::Sunday)
} else {
Err(TransformError::NotDay)
}
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[derive(Serialize, Deserialize, Hash, Debug)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct Days(Vec<Day>);
2022-05-18 09:48:01 +02:00
impl ops::Deref for Days {
type Target = Vec<Day>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
2022-05-06 11:47:18 +02:00
#[cfg(feature = "db")]
impl<'q> ::sqlx::encode::Encode<'q, sqlx::Postgres> for Days
where
i32: ::sqlx::encode::Encode<'q, sqlx::Postgres>,
{
fn encode_by_ref(
&self,
buf: &mut <sqlx::Postgres as ::sqlx::database::HasArguments<'q>>::ArgumentBuffer,
) -> ::sqlx::encode::IsNull {
let value = self.0.iter().fold(1, |memo, v| memo | *v as i32);
<i32 as ::sqlx::encode::Encode<sqlx::Postgres>>::encode_by_ref(&value, buf)
}
fn size_hint(&self) -> usize {
<i32 as ::sqlx::encode::Encode<sqlx::Postgres>>::size_hint(&Default::default())
}
}
#[cfg(feature = "db")]
impl<'r> ::sqlx::decode::Decode<'r, sqlx::Postgres> for Days
where
i32: ::sqlx::decode::Decode<'r, sqlx::Postgres>,
{
fn decode(
value: <sqlx::Postgres as ::sqlx::database::HasValueRef<'r>>::ValueRef,
2022-05-18 15:40:50 +02:00
) -> Result<Self, Box<dyn ::std::error::Error + 'static + Send + Sync>> {
2022-05-06 11:47:18 +02:00
let value = <i32 as ::sqlx::decode::Decode<'r, sqlx::Postgres>>::decode(value)?;
Ok(Days(
2022-05-11 15:56:41 +02:00
(0..7)
2022-05-06 11:47:18 +02:00
.into_iter()
2022-05-11 15:56:41 +02:00
.filter_map(|n| Day::try_from(value & 1 << n).ok())
2022-05-06 11:47:18 +02:00
.collect(),
))
}
}
#[cfg(feature = "db")]
impl sqlx::Type<sqlx::Postgres> for Days
where
i32: ::sqlx::Type<sqlx::Postgres>,
{
fn type_info() -> <sqlx::Postgres as ::sqlx::Database>::TypeInfo {
<i32 as ::sqlx::Type<sqlx::Postgres>>::type_info()
}
fn compatible(ty: &<sqlx::Postgres as ::sqlx::Database>::TypeInfo) -> bool {
<i32 as ::sqlx::Type<sqlx::Postgres>>::compatible(ty)
}
}
2022-05-09 16:17:27 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
#[derive(Serialize, Deserialize, Debug, Deref, Display)]
#[serde(transparent)]
pub struct ResetToken(String);
impl ResetToken {
pub fn new<S: Into<String>>(s: S) -> Self {
Self(s.into())
}
}
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-15 10:30:15 +02:00
#[derive(Serialize, Deserialize, Debug, Clone, Deref, From, Display)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct Password(String);
2022-05-08 09:47:05 +02:00
impl Password {
pub fn new<S: Into<String>>(pass: S) -> Self {
Self(pass.into())
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-15 10:30:15 +02:00
#[derive(Serialize, Deserialize, Debug, Clone, Deref, From, Display)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct PasswordConfirmation(String);
2022-05-15 10:30:15 +02:00
impl PasswordConfirmation {
pub fn new<S: Into<String>>(pass: S) -> Self {
Self(pass.into())
}
}
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
#[derive(Serialize, Deserialize, Debug, Deref, From, Display)]
#[serde(transparent)]
pub struct PassHash(String);
2022-05-17 08:23:39 +02:00
impl PassHash {
pub fn new<S: Into<String>>(s: S) -> Self {
Self(s.into())
}
}
2022-05-06 11:47:18 +02:00
impl PartialEq<PasswordConfirmation> for Password {
fn eq(&self, other: &PasswordConfirmation) -> bool {
self.0 == other.0
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
#[derive(Serialize, Deserialize, Copy, Clone, Debug, Deref, Display, From)]
#[serde(transparent)]
pub struct AccountId(RecordId);
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::FromRow))]
2022-05-08 09:47:05 +02:00
#[derive(Serialize, Deserialize, Debug)]
2022-05-06 11:47:18 +02:00
pub struct FullAccount {
pub id: AccountId,
pub email: Email,
pub login: Login,
pub pass_hash: PassHash,
pub role: Role,
pub customer_id: uuid::Uuid,
pub state: AccountState,
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::FromRow))]
2022-05-10 16:20:37 +02:00
#[derive(Serialize, Deserialize, Debug)]
2022-05-06 11:47:18 +02:00
pub struct Account {
pub id: AccountId,
pub email: Email,
pub login: Login,
pub role: Role,
pub customer_id: uuid::Uuid,
pub state: AccountState,
}
impl From<FullAccount> for Account {
fn from(
FullAccount {
id,
email,
login,
pass_hash: _,
role,
customer_id,
state,
}: FullAccount,
) -> Self {
Self {
id,
email,
login,
role,
customer_id,
state,
}
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-13 15:24:11 +02:00
#[derive(Serialize, Deserialize, Debug, Copy, Clone, PartialEq, Eq, Hash, Deref, From)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct ProductId(RecordId);
2022-05-13 15:24:11 +02:00
impl Display for ProductId {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.write_fmt(format_args!("{}", self.0))
}
}
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Debug, Clone, Hash, Deref, Display, From)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct ProductName(String);
2022-05-13 15:24:11 +02:00
impl ProductName {
pub fn new<S: Into<String>>(s: S) -> Self {
Self(s.into())
}
pub fn into_inner(self) -> String {
self.0
}
}
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Debug, Clone, Hash, Deref, Display, From)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct ProductShortDesc(String);
2022-05-12 22:10:17 +02:00
impl ProductShortDesc {
pub fn new<S: Into<String>>(s: S) -> Self {
Self(s.into())
}
2022-05-13 15:24:11 +02:00
pub fn into_inner(self) -> String {
self.0
}
2022-05-12 22:10:17 +02:00
}
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Debug, Clone, Hash, Deref, Display, From)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct ProductLongDesc(String);
2022-05-13 15:24:11 +02:00
impl ProductLongDesc {
pub fn into_inner(self) -> String {
self.0
}
}
2022-05-12 22:10:17 +02:00
impl ProductLongDesc {
pub fn new<S: Into<String>>(s: S) -> Self {
Self(s.into())
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Debug, Clone, Hash, Deref, Display, From)]
2022-05-06 11:47:18 +02:00
#[serde(transparent)]
pub struct ProductCategory(String);
2022-05-08 09:47:05 +02:00
impl ProductCategory {
pub fn new<S: Into<String>>(s: S) -> Self {
Self(s.into())
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::FromRow))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Debug, Hash)]
2022-05-06 11:47:18 +02:00
pub struct Product {
pub id: ProductId,
pub name: ProductName,
pub short_description: ProductShortDesc,
pub long_description: ProductLongDesc,
pub category: Option<ProductCategory>,
pub price: Price,
pub deliver_days_flag: Days,
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
#[derive(Serialize, Deserialize)]
#[serde(transparent)]
pub struct StockId(pub RecordId);
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::FromRow))]
#[derive(Serialize, Deserialize)]
pub struct Stock {
pub id: StockId,
pub product_id: ProductId,
pub quantity: Quantity,
pub quantity_unit: QuantityUnit,
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Display, Deref)]
#[serde(transparent)]
pub struct AccountOrderId(RecordId);
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Display, Deref)]
#[serde(transparent)]
pub struct OrderId(String);
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::FromRow))]
#[derive(Serialize, Deserialize)]
pub struct AccountOrder {
pub id: AccountOrderId,
pub buyer_id: AccountId,
pub status: OrderStatus,
pub order_id: Option<OrderId>,
pub order_ext_id: uuid::Uuid,
pub service_order_id: Option<String>,
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::FromRow))]
#[derive(Serialize, Deserialize)]
pub struct PublicAccountOrder {
pub id: AccountOrderId,
pub buyer_id: AccountId,
pub status: OrderStatus,
pub order_id: Option<OrderId>,
}
impl From<AccountOrder> for PublicAccountOrder {
fn from(
AccountOrder {
id,
buyer_id,
status,
order_id,
order_ext_id: _,
service_order_id: _,
}: AccountOrder,
) -> Self {
Self {
id,
buyer_id,
status,
order_id,
}
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
#[derive(Serialize, Deserialize, Copy, Clone, Debug, Deref)]
pub struct OrderItemId(pub RecordId);
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::FromRow))]
#[derive(Serialize, Deserialize, Debug)]
pub struct OrderItem {
pub id: OrderItemId,
pub product_id: ProductId,
pub order_id: AccountOrderId,
pub quantity: Quantity,
pub quantity_unit: QuantityUnit,
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
#[derive(Serialize, Deserialize, Copy, Clone, Debug, Deref, Display)]
#[serde(transparent)]
pub struct ShoppingCartId(pub RecordId);
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::FromRow))]
#[derive(Serialize, Deserialize)]
pub struct ShoppingCart {
pub id: ShoppingCartId,
pub buyer_id: AccountId,
pub payment_method: PaymentMethod,
pub state: ShoppingCartState,
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
#[derive(Serialize, Deserialize, Copy, Clone, Debug, Deref, Display)]
#[serde(transparent)]
pub struct ShoppingCartItemId(RecordId);
#[cfg_attr(feature = "db", derive(sqlx::FromRow))]
#[derive(Serialize, Deserialize)]
pub struct ShoppingCartItem {
pub id: ShoppingCartId,
pub product_id: ProductId,
pub shopping_cart_id: ShoppingCartId,
pub quantity: Quantity,
pub quantity_unit: QuantityUnit,
}
impl ShoppingCartItem {
pub fn quantity(&self) -> Quantity {
self.quantity
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
#[derive(Serialize, Deserialize, Copy, Clone, Deref, Display, Debug)]
#[serde(transparent)]
pub struct TokenId(RecordId);
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::FromRow))]
#[derive(Serialize, Deserialize)]
pub struct Token {
pub id: TokenId,
pub customer_id: uuid::Uuid,
pub role: Role,
/// iss (issuer): Issuer of the JWT
pub issuer: String,
/// sub (subject): Subject of the JWT (the user)
pub subject: i32,
/// aud (audience): Recipient for which the JWT is intended
pub audience: Audience,
/// exp (expiration time): Time after which the JWT expires
pub expiration_time: chrono::NaiveDateTime,
/// nbt (not before time): Time before which the JWT must not be accepted
/// for processing
pub not_before_time: chrono::NaiveDateTime,
/// iat (issued at time): Time at which the JWT was issued; can be used to
/// determine age of the JWT,
pub issued_at_time: chrono::NaiveDateTime,
/// jti (JWT ID): Unique identifier; can be used to prevent the JWT from
/// being replayed (allows a token to be used only once)
pub jwt_id: uuid::Uuid,
}
2022-05-17 08:23:39 +02:00
impl Token {
pub fn account_id(&self) -> AccountId {
AccountId(self.subject)
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-10 16:20:37 +02:00
#[derive(Serialize, Deserialize, Debug, Clone, Deref, Display, From)]
pub struct AccessTokenString(String);
impl AccessTokenString {
pub fn new<S: Into<String>>(s: S) -> Self {
Self(s.into())
}
}
impl From<RefreshTokenString> for AccessTokenString {
fn from(r: RefreshTokenString) -> Self {
Self(r.0)
}
}
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
#[derive(Serialize, Deserialize, Debug, Clone, Deref, Display, From)]
pub struct RefreshTokenString(String);
impl From<AccessTokenString> for RefreshTokenString {
fn from(r: AccessTokenString) -> Self {
Self(r.0)
}
}
2022-05-06 11:47:18 +02:00
2022-05-10 16:20:37 +02:00
impl RefreshTokenString {
2022-05-09 16:17:27 +02:00
pub fn new<S: Into<String>>(s: S) -> Self {
Self(s.into())
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Debug, Hash, Deref, Display, From)]
2022-05-06 16:02:38 +02:00
pub struct LocalPath(String);
2022-05-09 16:17:27 +02:00
impl LocalPath {
pub fn new<S: Into<String>>(s: S) -> Self {
Self(s.into())
}
}
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Debug, Hash, Deref, Display, From)]
2022-05-09 16:17:27 +02:00
pub struct UniqueName(String);
impl UniqueName {
pub fn new<S: Into<String>>(s: S) -> Self {
Self(s.into())
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-06 11:47:18 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Debug, Hash, Deref, Display, From)]
2022-05-06 11:47:18 +02:00
pub struct FileName(String);
2022-05-06 16:02:38 +02:00
2022-05-08 09:47:05 +02:00
impl FileName {
pub fn new<S: Into<String>>(s: S) -> Self {
Self(s.into())
}
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Debug, Copy, Clone, Hash, Deref, Display, From)]
2022-05-06 16:02:38 +02:00
pub struct PhotoId(RecordId);
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[cfg_attr(feature = "db", derive(sqlx::Type))]
#[cfg_attr(feature = "db", sqlx(transparent))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Debug, Hash, Deref, Display, From)]
2022-05-06 16:02:38 +02:00
pub struct ProductPhotoId(RecordId);
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[cfg_attr(feature = "db", derive(sqlx::FromRow))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Debug, Hash)]
2022-05-06 16:02:38 +02:00
pub struct Photo {
pub id: PhotoId,
pub local_path: LocalPath,
pub file_name: FileName,
2022-05-09 16:17:27 +02:00
pub unique_name: UniqueName,
2022-05-06 16:02:38 +02:00
}
2022-05-08 14:59:59 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[cfg_attr(feature = "db", derive(sqlx::FromRow))]
2022-05-10 22:32:22 +02:00
#[derive(Serialize, Deserialize, Debug, Hash)]
2022-05-08 14:59:59 +02:00
pub struct ProductLinkedPhoto {
pub id: PhotoId,
pub local_path: LocalPath,
pub file_name: FileName,
2022-05-09 16:17:27 +02:00
pub unique_name: UniqueName,
2022-05-08 14:59:59 +02:00
pub product_id: ProductId,
}
2022-05-06 16:02:38 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
#[cfg_attr(feature = "db", derive(sqlx::FromRow))]
#[derive(Serialize, Deserialize, Debug)]
pub struct ProductPhoto {
pub id: ProductPhotoId,
pub product_id: ProductId,
pub photo_id: PhotoId,
}
2022-05-18 09:48:01 +02:00
#[cfg_attr(feature = "dummy", derive(fake::Dummy))]
2022-05-18 15:40:50 +02:00
#[cfg_attr(feature = "db", derive(sqlx::Type))]
2022-05-18 09:48:01 +02:00
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "snake_case")]
pub enum ShippingMethod {
2022-05-18 15:40:50 +02:00
/// Build-in InPost shipping
2022-05-18 09:48:01 +02:00
InPost,
2022-05-18 15:40:50 +02:00
/// Shop owner will ship product manually
Manual,
2022-05-18 09:48:01 +02:00
}