1
1
use diesel;
2
2
use diesel:: types;
3
3
use diesel:: mysql:: MysqlConnection ;
4
+ use diesel:: mysql:: Mysql ;
4
5
use diesel:: query_builder:: AsQuery ;
5
6
use diesel:: QueryDsl ;
6
7
use diesel:: RunQueryDsl ;
7
8
use diesel:: ExpressionMethods ;
8
9
use diesel:: TextExpressionMethods ;
10
+ use diesel:: NullableExpressionMethods ;
11
+ use diesel:: query_builder:: BoxedSelectStatement ;
9
12
10
13
use crate :: errors:: { WebdevError , WebdevErrorKind } ;
11
14
@@ -15,7 +18,9 @@ use super::models::{
15
18
Access , NewAccess , PartialAccess , AccessRequest , AccessResponse ,
16
19
17
20
UserAccess , NewUserAccess , PartialUserAccess , SearchUserAccess ,
18
- UserAccessRequest , UserAccessResponse
21
+ UserAccessRequest , UserAccessResponse ,
22
+
23
+ JoinedUserAccess , JoinedUserAccessList
19
24
} ;
20
25
21
26
use crate :: users:: models:: { User , UserList } ;
@@ -97,7 +102,7 @@ pub fn handle_user_access(
97
102
) -> Result < UserAccessResponse , WebdevError > {
98
103
match request {
99
104
UserAccessRequest :: SearchAccess ( user_access) => {
100
- search_user_access ( user_access, database_connection) . map ( |u| UserAccessResponse :: ManyUsers ( u) )
105
+ search_user_access ( user_access, database_connection) . map ( |u| UserAccessResponse :: ManyUserAccess ( u) )
101
106
} ,
102
107
UserAccessRequest :: GetAccess ( permission_id) => {
103
108
get_user_access ( permission_id, database_connection) . map ( |a| UserAccessResponse :: OneUserAccess ( a) )
@@ -120,9 +125,17 @@ pub fn handle_user_access(
120
125
fn search_user_access (
121
126
user_access_search : SearchUserAccess ,
122
127
database_connection : & MysqlConnection
123
- ) -> Result < UserList , WebdevError > {
128
+ ) -> Result < JoinedUserAccessList , WebdevError > {
124
129
let mut user_access_query = user_access_schema:: table
125
- . as_query ( ) . into_boxed ( ) ;
130
+ . inner_join ( access_schema:: table)
131
+ . inner_join ( users_schema:: table)
132
+ . select ( ( user_access_schema:: permission_id,
133
+ users_schema:: id,
134
+ access_schema:: id,
135
+ users_schema:: first_name,
136
+ users_schema:: last_name,
137
+ users_schema:: banner_id) )
138
+ . into_boxed :: < Mysql > ( ) ;
126
139
127
140
match user_access_search. access_id {
128
141
Search :: Partial ( s) => {
@@ -176,31 +189,10 @@ fn search_user_access(
176
189
NullableSearch :: NoSearch => { }
177
190
}
178
191
179
- let found_access_entries = user_access_query. load :: < UserAccess > ( database_connection) ?;
180
-
181
- let mut out: Vec < User > = Vec :: new ( ) ;
182
-
183
- for user_access in & found_access_entries {
184
-
185
- let mut found_users = users_schema:: table
186
- . filter ( users_schema:: id. eq ( user_access. user_id ) )
187
- . load :: < User > ( database_connection) ?;
188
-
189
- match found_users. pop ( ) {
190
- Some ( user) => {
191
- let mut found: bool = false ;
192
- for pending_user in & out {
193
- if pending_user. id == user. id { found = true ; }
194
- }
195
- if !found { out. push ( user) ; }
196
- } ,
197
- None => { ( ) ; } ,
198
- } ;
199
- }
200
-
201
- let user_list = UserList { users : out } ;
192
+ let found_access_entries = user_access_query. load :: < JoinedUserAccess > ( database_connection) ?;
193
+ let joined_list = JoinedUserAccessList { entries : found_access_entries } ;
202
194
203
- Ok ( user_list )
195
+ Ok ( joined_list )
204
196
}
205
197
206
198
fn get_user_access (
0 commit comments