create_rust_app/auth/permissions/
role_permission.rs

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