create_rust_app/auth/permissions/
user_permission.rs

1use diesel::QueryResult;
2use serde::{Deserialize, Serialize};
3
4use crate::auth::schema::user_permissions;
5use crate::diesel::{
6    insert_into, AsChangeset, Associations, BoolExpressionMethods, ExpressionMethods, Insertable,
7    QueryDsl, Queryable, RunQueryDsl,
8};
9use crate::{
10    auth::{user::User, Utc, ID},
11    database::Connection,
12};
13
14#[allow(clippy::module_name_repetitions)]
15#[tsync::tsync]
16#[derive(
17    Debug, Serialize, Deserialize, Clone, Queryable, Insertable, Associations, AsChangeset,
18)]
19#[diesel(table_name=user_permissions,belongs_to(User))]
20/// Rust struct modeling an entry in the `user_permissions` table
21pub struct UserPermission {
22    /* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
23    Add columns here in the same order as the schema
24    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
25    pub user_id: ID,
26    pub permission: String,
27    pub created_at: Utc,
28}
29
30#[allow(clippy::module_name_repetitions)]
31#[derive(Debug, Serialize, Deserialize, Clone, Insertable, AsChangeset)]
32#[diesel(table_name=user_permissions)]
33/// Rust struct modeling mutable data in an entry in the `user_permissions` table
34pub struct UserPermissionChangeset {
35    /* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
36    Add columns here in the same order as the schema
37    Don't include non-mutable columns
38    (ex: id, created_at/updated_at)
39    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
40    pub user_id: ID,
41    pub permission: String,
42}
43
44/// CRUD functions for [`UserPermission`]
45impl UserPermission {
46    /// Create an entry in [`db`](`Connection`)'s `user_permissions` table that has the data stored in [`item`](`UserPermissionChangeset`)
47    ///
48    /// # Errors
49    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
50    pub fn create(db: &mut Connection, item: &UserPermissionChangeset) -> QueryResult<Self> {
51        use crate::auth::schema::user_permissions::dsl::user_permissions;
52
53        insert_into(user_permissions)
54            .values(item)
55            .get_result::<Self>(db)
56    }
57
58    #[cfg(feature = "database_sqlite")]
59    /// Create an entry in [`db`](`Connection`)'s user_permissions table for each [element](`UserPermissionChangeset`) in `items`
60    ///
61    /// # Errors
62    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
63    pub fn create_many(
64        db: &mut Connection,
65        items: Vec<UserPermissionChangeset>,
66    ) -> QueryResult<usize> {
67        use crate::auth::schema::user_permissions::dsl::*;
68
69        insert_into(user_permissions).values(items).execute(db)
70    }
71
72    #[cfg(not(feature = "database_sqlite"))]
73    /// Create an entry in [`db`](`Connection`)'s `user_permissions` table for each [element](`UserPermissionChangeset`) in `items`
74    ///
75    /// # Errors
76    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
77    pub fn create_many(
78        db: &mut Connection,
79        items: Vec<UserPermissionChangeset>,
80    ) -> QueryResult<Self> {
81        use crate::auth::schema::user_permissions::dsl::user_permissions;
82
83        insert_into(user_permissions)
84            .values(items)
85            .get_result::<Self>(db)
86    }
87
88    /// Read from [`db`](`Connection`), querying for an entry in the `user_permissions` table that has
89    /// (`item_user_id`,`item_permission`) as it's primary keys
90    ///
91    /// # Errors
92    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
93    pub fn read(
94        db: &mut Connection,
95        item_user_id: ID,
96        item_permission: String,
97    ) -> QueryResult<Self> {
98        use crate::auth::schema::user_permissions::dsl::{permission, user_id, user_permissions};
99
100        user_permissions
101            .filter(user_id.eq(item_user_id).and(permission.eq(item_permission)))
102            .first::<Self>(db)
103    }
104
105    /// Read from [`db`](`Connection`), querying for every entry in the `user_permissions` table that has
106    /// `item_user_id` as one of its primary keys
107    ///
108    /// # Errors
109    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
110    pub fn read_all(db: &mut Connection, item_user_id: ID) -> QueryResult<Vec<Self>> {
111        use crate::auth::schema::user_permissions::dsl::{created_at, user_id, user_permissions};
112
113        user_permissions
114            .filter(user_id.eq(item_user_id))
115            .order(created_at)
116            .load::<Self>(db)
117    }
118
119    /// Delete the entry in [`db`](`Connection`)'s `user_permissions` table that has
120    /// (`item_user_id`,`item_permission`) as it's primary keys
121    ///
122    /// # Errors
123    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
124    pub fn delete(
125        db: &mut Connection,
126        item_user_id: ID,
127        item_permission: String,
128    ) -> QueryResult<usize> {
129        use crate::auth::schema::user_permissions::dsl::{permission, user_id, user_permissions};
130
131        diesel::delete(
132            user_permissions.filter(user_id.eq(item_user_id).and(permission.eq(item_permission))),
133        )
134        .execute(db)
135    }
136
137    /// Delete every entry in [`db`](`Connection`)'s `user_permissions` table that has
138    /// `item_user_id`, and an element of`item_permissions` as it's primary keys
139    ///
140    /// # Errors
141    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
142    pub fn delete_many(
143        db: &mut Connection,
144        item_user_id: ID,
145        item_permissions: Vec<String>,
146    ) -> QueryResult<usize> {
147        use crate::auth::schema::user_permissions::dsl::{permission, user_id, user_permissions};
148
149        diesel::delete(
150            user_permissions
151                .filter(user_id.eq(item_user_id))
152                .filter(permission.eq_any(item_permissions)),
153        )
154        .execute(db)
155    }
156
157    /// Delete the entry in [`db`](`Connection`)'s `user_permissions` table that has
158    /// `item_user_id` as one of it's primary keys
159    ///
160    /// # Errors
161    /// * [`diesel::result::Error`](`diesel::result::Error`) if the query fails
162    pub fn delete_all(db: &mut Connection, item_user_id: ID) -> QueryResult<usize> {
163        use crate::auth::schema::user_permissions::dsl::{user_id, user_permissions};
164
165        diesel::delete(user_permissions.filter(user_id.eq(item_user_id))).execute(db)
166    }
167}