Skip to content

Commit 0bda2e7

Browse files
committedMar 6, 2025
refactor: [torrust#801] refactor filtering code logic
1 parent f424234 commit 0bda2e7

File tree

3 files changed

+27
-88
lines changed

3 files changed

+27
-88
lines changed
 

‎src/databases/mysql.rs

+10-34
Original file line numberDiff line numberDiff line change
@@ -176,45 +176,21 @@ impl Database for Mysql {
176176
None => "username ASC".to_string(),
177177
};
178178

179-
let join_filters_query = if let Some(filters) = filters {
180-
let mut join_filters = String::new();
179+
let (join_filters, where_filters) = if let Some(filters) = filters {
180+
let (mut join_filters_query, mut where_filters_query) = (String::new(), String::new());
181181
for filter in filters {
182-
// don't take user input in the db query to smt join filter query
183-
/* if let Some(sanitized_filter) = self.get_filters_from_name(filter).await { */
184182
match filter {
185-
UsersFilters::TorrentUploader => join_filters.push_str(
183+
UsersFilters::TorrentUploader => join_filters_query.push_str(
186184
"INNER JOIN torrust_torrents tt
187-
ON tu.user_id = tt.uploader_id",
185+
ON tu.user_id = tt.uploader_id ",
188186
),
189-
_ => break,
187+
UsersFilters::EmailNotVerified => where_filters_query.push_str(" AND email_verified = false"),
188+
UsersFilters::EmailVerified => where_filters_query.push_str(" AND email_verified = true"),
190189
}
191190
}
192-
//}
193-
join_filters
191+
(join_filters_query, where_filters_query)
194192
} else {
195-
String::new()
196-
};
197-
198-
let where_filters_query = if let Some(filters) = filters {
199-
let mut where_filters = String::new();
200-
for filter in filters {
201-
// don't take user input in the db query
202-
/* if let Some(sanitized_filter) = self.get_filters_from_name(filter).await { */
203-
let mut filter_query = String::new();
204-
match filter {
205-
UsersFilters::EmailNotVerified => filter_query.push_str("email_verified = false"),
206-
UsersFilters::EmailVerified => filter_query.push_str("email_verified = true"),
207-
_ => continue,
208-
};
209-
210-
let str = format!("AND {filter_query} ");
211-
212-
where_filters.push_str(&str);
213-
}
214-
//}
215-
where_filters
216-
} else {
217-
String::new()
193+
(String::new(), String::new())
218194
};
219195

220196
let mut query_string = format!(
@@ -228,9 +204,9 @@ impl Database for Mysql {
228204
FROM torrust_user_profiles tp
229205
INNER JOIN torrust_users tu
230206
ON tp.user_id = tu.user_id
231-
{join_filters_query}
207+
{join_filters}
232208
WHERE username LIKE ?
233-
{where_filters_query}
209+
{where_filters}
234210
"
235211
);
236212

‎src/databases/sqlite.rs

+6-49
Original file line numberDiff line numberDiff line change
@@ -177,64 +177,21 @@ impl Database for Sqlite {
177177
None => "username ASC".to_string(),
178178
};
179179

180-
/* let (join_filters, where_filters) = if let Some(filters) = filters {
181-
let (join_filters_query, where_filters_query) = (String::new(), String::new());
180+
let (join_filters, where_filters) = if let Some(filters) = filters {
181+
let (mut join_filters_query, mut where_filters_query) = (String::new(), String::new());
182182
for filter in filters {
183183
match filter {
184184
UsersFilters::TorrentUploader => join_filters_query.push_str(
185185
"INNER JOIN torrust_torrents tt
186186
ON tu.user_id = tt.uploader_id ",
187187
),
188-
UsersFilters::EmailNotVerified => where_filters_query.push_str("email_verified = false"),
189-
UsersFilters::EmailVerified => where_filters_query.push_str("email_verified = true"),
190-
_ => continue,
188+
UsersFilters::EmailNotVerified => where_filters_query.push_str(" AND email_verified = false"),
189+
UsersFilters::EmailVerified => where_filters_query.push_str(" AND email_verified = true"),
191190
}
192191
}
193192
(join_filters_query, where_filters_query)
194193
} else {
195194
(String::new(), String::new())
196-
}; */
197-
198-
let join_filters_query = if let Some(filters) = filters {
199-
let mut join_filters = String::new();
200-
for filter in filters {
201-
// don't take user input in the db query
202-
/* if let Some(sanitized_filter) = self.get_filters_from_name(filter).await { */
203-
//match sanitized_filter {
204-
match filter {
205-
UsersFilters::TorrentUploader => join_filters.push_str(
206-
"INNER JOIN torrust_torrents tt
207-
ON tu.user_id = tt.uploader_id ",
208-
),
209-
_ => continue,
210-
}
211-
}
212-
//}
213-
join_filters
214-
} else {
215-
String::new()
216-
};
217-
218-
let where_filters_query = if let Some(filters) = filters {
219-
let mut where_filters = String::new();
220-
for filter in filters {
221-
// don't take user input in the db query
222-
// if let Some(sanitized_filter) = self.get_filters_from_name(filter).await {
223-
let mut filter_query = String::new();
224-
match filter {
225-
UsersFilters::EmailNotVerified => filter_query.push_str("email_verified = false"),
226-
UsersFilters::EmailVerified => filter_query.push_str("email_verified = true"),
227-
_ => continue,
228-
};
229-
230-
let str = format!("AND {filter_query} ");
231-
232-
where_filters.push_str(&str);
233-
}
234-
//}
235-
where_filters
236-
} else {
237-
String::new()
238195
};
239196

240197
let mut query_string = format!(
@@ -248,9 +205,9 @@ impl Database for Sqlite {
248205
FROM torrust_user_profiles tp
249206
INNER JOIN torrust_users tu
250207
ON tp.user_id = tu.user_id
251-
{join_filters_query}
208+
{join_filters}
252209
WHERE username LIKE ?
253-
{where_filters_query}
210+
{where_filters}
254211
"
255212
);
256213

‎src/services/user.rs

+11-5
Original file line numberDiff line numberDiff line change
@@ -413,16 +413,22 @@ impl ListingService {
413413
None => None,
414414
};
415415

416-
let filter_values = request.filters.as_csv::<String>().unwrap_or(None);
416+
let filter_values = request
417+
.filters
418+
.as_csv::<String>()
419+
.map_err(|_| ServiceError::InvalidUserListing)?;
417420

418421
let filters = if let Some(filter_values) = filter_values {
419422
let mut sanitized_filters: Vec<UsersFilters> = Vec::new();
420423
for filter in filter_values {
421424
match filter.as_str() {
422-
"torrent_uploader" => sanitized_filters.push(UsersFilters::TorrentUploader),
423-
"email_not_verified" => sanitized_filters.push(UsersFilters::EmailNotVerified),
424-
"email_verified" => sanitized_filters.push(UsersFilters::EmailVerified),
425-
_ => (),
425+
"torrent_uploader" => sanitized_filters
426+
.push(UsersFilters::from_str("torrent_uploader").map_err(|_| ServiceError::InvalidUserListing)?),
427+
"email_not_verified" => sanitized_filters
428+
.push(UsersFilters::from_str("email_not_verified").map_err(|_| ServiceError::InvalidUserListing)?),
429+
"email_verified" => sanitized_filters
430+
.push(UsersFilters::from_str("email_verified").map_err(|_| ServiceError::InvalidUserListing)?),
431+
_ => return Err(ServiceError::InvalidUserListing),
426432
}
427433
}
428434
Some(sanitized_filters)

0 commit comments

Comments
 (0)
Please sign in to comment.