corund_lib/
user_change.rs1use 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
81pub 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}