corund_lib/
user_change.rs

1use diesel::prelude::*;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5    db::{Con, Id},
6    quco::Collection,
7    ryz::{
8        enm::StrEnum,
9        err,
10        res::Res,
11        time::{utc, Time},
12    },
13    schema,
14};
15
16#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
17pub enum ChangeAction {
18    New,
19    Del,
20}
21
22impl StrEnum for ChangeAction {
23    fn to_str(&self) -> &str {
24        match self {
25            ChangeAction::New => "new",
26            ChangeAction::Del => "del",
27        }
28    }
29
30    fn from_str(s: &str) -> Res<Self> {
31        match s {
32            "new" => Ok(ChangeAction::New),
33            "del" => Ok(ChangeAction::Del),
34            _ => err::res_default(),
35        }
36    }
37}
38
39#[derive(Serialize, Deserialize, Debug)]
40pub struct UserChange {
41    pub id: Id,
42    pub created: Time,
43    pub action: ChangeAction,
44    pub user_id: Id,
45}
46
47#[derive(Queryable, Selectable)]
48#[diesel(table_name = schema::user_change)]
49#[diesel(check_for_backend(diesel::pg::Pg))]
50pub struct UserChangeTable {
51    pub id: Id,
52    pub created: Time,
53    pub action: String,
54    pub user_id: Id,
55}
56
57impl Collection<UserChange> for UserChangeTable {
58    fn to_msg(&self) -> UserChange {
59        UserChange {
60            id: self.id.to_owned(),
61            created: self.created.to_owned(),
62            action: ChangeAction::from_str(self.action.as_str()).unwrap(),
63            user_id: self.user_id.to_owned(),
64        }
65    }
66}
67
68pub struct NewUserChange {
69    pub user_id: Id,
70    pub action: ChangeAction,
71}
72
73#[derive(Insertable)]
74#[diesel(table_name=schema::user_change)]
75struct InsertNewUserChange {
76    pub user_id: Id,
77    pub created: Time,
78    pub action: String,
79}
80
81/// Fetches all user changes for a domain.
82///
83/// # Args
84///
85/// * `from` - from which time to fetch changes
86pub fn get_many(from: Time, con: &mut Con) -> Res<Vec<UserChange>> {
87    let user_changes = schema::user_change::table
88        .filter(schema::user_change::created.ge(from))
89        .select(UserChangeTable::as_select())
90        .load(con)
91        .unwrap();
92    Ok(user_changes.iter().map(|x| x.to_msg()).collect())
93}
94
95pub fn new(data: &NewUserChange, con: &mut Con) -> Res<UserChange> {
96    let change: UserChangeTable =
97        diesel::insert_into(schema::user_change::table)
98            .values(&InsertNewUserChange {
99                user_id: data.user_id,
100                created: utc(),
101                action: data.action.to_str().to_string(),
102            })
103            .returning(UserChangeTable::as_returning())
104            .get_result(con)
105            .unwrap();
106    Ok(change.to_msg())
107}