create_rust_app/auth/
user.rs

1use super::schema::users;
2use crate::diesel::{
3    insert_into, AsChangeset, ExpressionMethods, Identifiable, Insertable, QueryDsl, Queryable,
4    RunQueryDsl,
5};
6
7use super::{PaginationParams, Utc, ID};
8use crate::database::Connection;
9use diesel::QueryResult;
10use serde::{Deserialize, Serialize};
11
12#[allow(clippy::module_name_repetitions)]
13#[tsync::tsync]
14#[derive(
15    Debug, Serialize, Deserialize, Clone, Queryable, Insertable, Identifiable, AsChangeset,
16)]
17#[diesel(table_name=users)]
18pub struct User {
19    /* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
20    Add columns here in the same order as the schema
21    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
22    pub id: ID,
23
24    pub email: String,
25    pub hash_password: String,
26    pub activated: bool,
27
28    pub created_at: Utc,
29    #[cfg(not(feature = "database_sqlite"))]
30    pub updated_at: Utc,
31}
32
33#[allow(clippy::module_name_repetitions)]
34#[tsync::tsync]
35#[derive(Debug, Serialize, Deserialize, Clone, Insertable, AsChangeset)]
36#[diesel(table_name=users)]
37pub struct UserChangeset {
38    /* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
39    Add columns here in the same order as the schema
40    Don't include non-mutable columns
41    (ex: id, created_at/updated_at)
42    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
43    pub email: String,
44    pub hash_password: String,
45    pub activated: bool,
46}
47
48impl User {
49    /// Create an entry in [`db`](`Connection`)'s `users` table using the data in [`item`](`UserChangeset`)
50    ///
51    /// # Errors
52    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
53    pub fn create(db: &mut Connection, item: &UserChangeset) -> QueryResult<Self> {
54        use super::schema::users::dsl::users;
55
56        insert_into(users).values(item).get_result::<Self>(db)
57    }
58
59    /// Read from [`db`](`Connection`), querying for an entry in the `users`
60    /// who's primary key matches [`item_id`](`ID`)
61    ///
62    /// # Errors
63    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
64    pub fn read(db: &mut Connection, item_id: ID) -> QueryResult<Self> {
65        use super::schema::users::dsl::{id, users};
66
67        users.filter(id.eq(item_id)).first::<Self>(db)
68    }
69
70    /// Queries [`db`](`Connection`)'s `users` table for an entry
71    /// with an email that matches the given `item_email`
72    ///
73    /// # Errors
74    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
75    pub fn find_by_email(db: &mut Connection, item_email: String) -> QueryResult<Self> {
76        use super::schema::users::dsl::{email, users};
77
78        users.filter(email.eq(item_email)).first::<Self>(db)
79    }
80
81    /// Read from [`db`](`Connection`), return entries of the `users` table,
82    /// paginated according to [`pagination`](`PaginationParams`)
83    ///
84    /// # Errors
85    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
86    pub fn read_all(db: &mut Connection, pagination: &PaginationParams) -> QueryResult<Vec<Self>> {
87        use super::schema::users::dsl::{created_at, users};
88
89        users
90            .order(created_at)
91            .limit(pagination.page_size)
92            .offset(
93                pagination.page
94                    * std::cmp::max(
95                        pagination.page_size,
96                        i64::from(PaginationParams::MAX_PAGE_SIZE),
97                    ),
98            )
99            .load::<Self>(db)
100    }
101
102    /// Update the entry in [`db`](`Connection`)'s `users` table who's primary key matches
103    /// [`item_id`](`ID`), with the data in [`item`](`UserChangeset`)
104    ///
105    /// # Errors
106    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
107    pub fn update(db: &mut Connection, item_id: ID, item: &UserChangeset) -> QueryResult<Self> {
108        use super::schema::users::dsl::{id, users};
109
110        diesel::update(users.filter(id.eq(item_id)))
111            .set(item)
112            .get_result(db)
113    }
114
115    /// Delete the entry in [`db`](`Connection`)'s `users` table who's
116    /// primary key matches [`item_id`](`ID`)
117    ///
118    /// # Errors
119    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
120    pub fn delete(db: &mut Connection, item_id: ID) -> QueryResult<usize> {
121        use super::schema::users::dsl::{id, users};
122
123        diesel::delete(users.filter(id.eq(item_id))).execute(db)
124    }
125}