2021-05-27 07:26:39 +02:00
|
|
|
use std::ops::Deref;
|
|
|
|
|
2021-05-20 11:40:44 +02:00
|
|
|
use serde::{Deserialize, Serialize, Serializer};
|
2021-06-13 12:58:55 +02:00
|
|
|
use strum_macros::{AsRefStr, EnumIter, EnumString, ToString};
|
2021-06-14 13:47:48 +02:00
|
|
|
|
|
|
|
use crate::apirequests::users::Role;
|
2021-05-04 11:29:36 +02:00
|
|
|
/// A generic list returntype containing the User and a Vec containing e.g. Links or Users
|
|
|
|
#[derive(Clone, Deserialize, Serialize)]
|
|
|
|
pub struct ListWithOwner<T> {
|
|
|
|
pub user: User,
|
|
|
|
pub list: Vec<T>,
|
|
|
|
}
|
|
|
|
|
|
|
|
/// A link together with its author and its click-count.
|
|
|
|
#[derive(Clone, Deserialize, Serialize, Debug)]
|
|
|
|
pub struct FullLink {
|
|
|
|
pub link: Link,
|
|
|
|
pub user: User,
|
|
|
|
pub clicks: Count,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(PartialEq, Serialize, Deserialize, Clone, Debug)]
|
|
|
|
pub struct User {
|
|
|
|
pub id: i64,
|
|
|
|
pub username: String,
|
|
|
|
pub email: String,
|
2021-05-20 11:40:44 +02:00
|
|
|
pub password: Secret,
|
2021-06-14 13:47:48 +02:00
|
|
|
pub role: Role,
|
2021-06-13 12:58:55 +02:00
|
|
|
pub language: Lang,
|
2021-05-04 11:29:36 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Serialize, Deserialize, Clone, Debug)]
|
|
|
|
pub struct Link {
|
|
|
|
pub id: i64,
|
|
|
|
pub title: String,
|
|
|
|
pub target: String,
|
|
|
|
pub code: String,
|
|
|
|
pub author: i64,
|
|
|
|
pub created_at: chrono::NaiveDateTime,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Serialize, Deserialize, Clone, Debug)]
|
|
|
|
pub struct Count {
|
|
|
|
pub number: i32,
|
|
|
|
}
|
|
|
|
#[derive(Serialize, Debug)]
|
|
|
|
pub struct Click {
|
|
|
|
pub id: i64,
|
|
|
|
pub link: i64,
|
|
|
|
pub created_at: chrono::NaiveDateTime,
|
|
|
|
}
|
2021-05-20 11:40:44 +02:00
|
|
|
|
|
|
|
#[derive(PartialEq, Clone, Deserialize)]
|
|
|
|
#[serde(from = "String")]
|
|
|
|
pub struct Secret {
|
|
|
|
pub secret: Option<String>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<String> for Secret {
|
|
|
|
fn from(_: String) -> Self {
|
|
|
|
Self { secret: None }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Serialize for Secret {
|
|
|
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
|
|
where
|
|
|
|
S: Serializer,
|
|
|
|
{
|
|
|
|
serializer.serialize_str("*****SECRET*****")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Secret {
|
|
|
|
#[must_use]
|
|
|
|
pub const fn new(secret: String) -> Self {
|
|
|
|
Self {
|
|
|
|
secret: Some(secret),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl std::fmt::Debug for Secret {
|
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
|
f.write_str("*****SECRET*****")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl std::fmt::Display for Secret {
|
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
|
f.write_str("*****SECRET*****")
|
|
|
|
}
|
|
|
|
}
|
2021-05-27 07:26:39 +02:00
|
|
|
|
2021-06-02 10:41:54 +02:00
|
|
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
2021-05-27 07:26:39 +02:00
|
|
|
pub enum Loadable<T> {
|
|
|
|
Data(Option<T>),
|
|
|
|
Loading,
|
|
|
|
}
|
|
|
|
|
2021-05-28 17:22:27 +02:00
|
|
|
impl<T> Deref for Loadable<T> {
|
2021-05-27 07:26:39 +02:00
|
|
|
type Target = Option<T>;
|
|
|
|
|
|
|
|
fn deref(&self) -> &Self::Target {
|
|
|
|
match self {
|
|
|
|
Loadable::Data(t) => t,
|
2021-05-28 17:22:27 +02:00
|
|
|
Loadable::Loading => &None,
|
2021-05-27 07:26:39 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-06-13 12:58:55 +02:00
|
|
|
|
|
|
|
/// An `enum` containing the available languages.
|
|
|
|
/// To add an additional language add it to this enum aswell as an appropriate file into the locales folder.
|
|
|
|
#[allow(clippy::upper_case_acronyms)]
|
|
|
|
#[derive(
|
|
|
|
Debug,
|
|
|
|
Copy,
|
|
|
|
Clone,
|
|
|
|
EnumIter,
|
|
|
|
EnumString,
|
|
|
|
ToString,
|
|
|
|
AsRefStr,
|
|
|
|
Eq,
|
|
|
|
PartialEq,
|
|
|
|
Serialize,
|
|
|
|
Deserialize,
|
|
|
|
)]
|
|
|
|
pub enum Lang {
|
|
|
|
#[strum(serialize = "en-US", serialize = "en", serialize = "enUS")]
|
|
|
|
EnUS,
|
|
|
|
#[strum(serialize = "de-DE", serialize = "de", serialize = "deDE")]
|
|
|
|
DeDE,
|
|
|
|
}
|