mirror of
				https://gitlab.com/comunic/comunicapiv3
				synced 2025-11-04 09:34:04 +00:00 
			
		
		
		
	Can search users
This commit is contained in:
		@@ -5,4 +5,5 @@ pub mod server_controller;
 | 
				
			|||||||
pub mod account_controller;
 | 
					pub mod account_controller;
 | 
				
			||||||
pub mod user_controller;
 | 
					pub mod user_controller;
 | 
				
			||||||
pub mod conversations_controller;
 | 
					pub mod conversations_controller;
 | 
				
			||||||
 | 
					pub mod search_controller;
 | 
				
			||||||
pub mod virtual_directory_controller;
 | 
					pub mod virtual_directory_controller;
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
use std::error::Error;
 | 
					use std::error::Error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::controllers::{account_controller, conversations_controller, server_controller, user_controller, virtual_directory_controller};
 | 
					use crate::controllers::{account_controller, conversations_controller, search_controller, server_controller, user_controller, virtual_directory_controller};
 | 
				
			||||||
use crate::controllers::routes::Method::{GET, POST};
 | 
					use crate::controllers::routes::Method::{GET, POST};
 | 
				
			||||||
use crate::data::http_request_handler::HttpRequestHandler;
 | 
					use crate::data::http_request_handler::HttpRequestHandler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -119,6 +119,12 @@ pub fn get_routes() -> Vec<Route> {
 | 
				
			|||||||
        Route::post("/conversations/deleteMessage", Box::new(conversations_controller::delete_message)),
 | 
					        Route::post("/conversations/deleteMessage", Box::new(conversations_controller::delete_message)),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Search controller
 | 
				
			||||||
 | 
					        Route::post("/search/user", Box::new(search_controller::search_user)),
 | 
				
			||||||
 | 
					        Route::post("/user/search", Box::new(search_controller::search_user)),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Virtual directory controller
 | 
					        // Virtual directory controller
 | 
				
			||||||
        Route::post("/user/findbyfolder", Box::new(virtual_directory_controller::find_user)),
 | 
					        Route::post("/user/findbyfolder", Box::new(virtual_directory_controller::find_user)),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								src/controllers/search_controller.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/controllers/search_controller.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					//! # Search controller
 | 
				
			||||||
 | 
					//!
 | 
				
			||||||
 | 
					//! @author Pierre Hubert
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::controllers::routes::RequestResult;
 | 
				
			||||||
 | 
					use crate::data::http_request_handler::HttpRequestHandler;
 | 
				
			||||||
 | 
					use crate::helpers::user_helper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Search for user
 | 
				
			||||||
 | 
					pub fn search_user(r: &mut HttpRequestHandler) -> RequestResult {
 | 
				
			||||||
 | 
					    let query = r.post_string_opt("query", 1, true)?;
 | 
				
			||||||
 | 
					    let limit = r.post_u64_opt("searchLimit", 5)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let list = user_helper::search_user(&query, limit)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    r.set_response(list)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -340,6 +340,15 @@ impl HttpRequestHandler {
 | 
				
			|||||||
        Ok(self.post_string(name)?.parse::<i64>()?)
 | 
					        Ok(self.post_string(name)?.parse::<i64>()?)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Get an optional number in the request. If none found, return a default value
 | 
				
			||||||
 | 
					    pub fn post_u64_opt(&mut self, name: &str, default: u64) -> ResultBoxError<u64> {
 | 
				
			||||||
 | 
					        if self.has_post_parameter(name) {
 | 
				
			||||||
 | 
					            Ok(self.post_string(name)?.parse::<u64>()?)
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            Ok(default)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn post_u64(&mut self, name: &str) -> ResultBoxError<u64> {
 | 
					    pub fn post_u64(&mut self, name: &str) -> ResultBoxError<u64> {
 | 
				
			||||||
        Ok(self.post_string(name)?.parse::<u64>()?)
 | 
					        Ok(self.post_string(name)?.parse::<u64>()?)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -164,6 +164,12 @@ impl QueryInfo {
 | 
				
			|||||||
        self
 | 
					        self
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Add a custom string WHERE value
 | 
				
			||||||
 | 
					    pub fn add_custom_where_argument_str(mut self, val: &str) -> QueryInfo {
 | 
				
			||||||
 | 
					        self.custom_where_ars.push(mysql::Value::from(val));
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Append a field to the list of selected fields
 | 
					    /// Append a field to the list of selected fields
 | 
				
			||||||
    pub fn add_field(mut self, key: &str) -> QueryInfo {
 | 
					    pub fn add_field(mut self, key: &str) -> QueryInfo {
 | 
				
			||||||
        self.fields.push(key.to_string());
 | 
					        self.fields.push(key.to_string());
 | 
				
			||||||
@@ -367,7 +373,7 @@ pub fn query<E, F: Fn(&RowResult) -> ProcessRowResult<E>>(info: QueryInfo, proce
 | 
				
			|||||||
    if !info.conditions.is_empty() {
 | 
					    if !info.conditions.is_empty() {
 | 
				
			||||||
        let mut where_args = vec![];
 | 
					        let mut where_args = vec![];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (k, v) in info.conditions {
 | 
					        for (k, v) in &info.conditions {
 | 
				
			||||||
            where_args.push(format!("{} = ?", k));
 | 
					            where_args.push(format!("{} = ?", k));
 | 
				
			||||||
            params.push(mysql::Value::from(v));
 | 
					            params.push(mysql::Value::from(v));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -378,7 +384,11 @@ pub fn query<E, F: Fn(&RowResult) -> ProcessRowResult<E>>(info: QueryInfo, proce
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Custom WHERE clause
 | 
					    // Custom WHERE clause
 | 
				
			||||||
    if let Some(custom_where) = info.custom_where {
 | 
					    if let Some(custom_where) = info.custom_where {
 | 
				
			||||||
 | 
					        if !info.conditions.is_empty() {
 | 
				
			||||||
            query = query.add(format!(" AND ({})", custom_where).as_str());
 | 
					            query = query.add(format!(" AND ({})", custom_where).as_str());
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            query = query.add(format!(" WHERE ({})", custom_where).as_str());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let mut custom_args = info.custom_where_ars;
 | 
					        let mut custom_args = info.custom_where_ars;
 | 
				
			||||||
        params.append(&mut custom_args);
 | 
					        params.append(&mut custom_args);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
use crate::data::error::ResultBoxError;
 | 
					 | 
				
			||||||
use crate::data::user::{User, UserID, UserPageStatus, AccountImageVisibility};
 | 
					 | 
				
			||||||
use crate::helpers::{database, friends_helper};
 | 
					 | 
				
			||||||
use crate::constants::database_tables_names::USERS_TABLE;
 | 
					use crate::constants::database_tables_names::USERS_TABLE;
 | 
				
			||||||
 | 
					use crate::data::error::ResultBoxError;
 | 
				
			||||||
 | 
					use crate::data::user::{AccountImageVisibility, User, UserID, UserPageStatus};
 | 
				
			||||||
use crate::data::user::UserPageStatus::PUBLIC;
 | 
					use crate::data::user::UserPageStatus::PUBLIC;
 | 
				
			||||||
 | 
					use crate::helpers::{database, friends_helper};
 | 
				
			||||||
use crate::helpers::friends_helper::are_friend;
 | 
					use crate::helpers::friends_helper::are_friend;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// User helper
 | 
					/// User helper
 | 
				
			||||||
@@ -63,7 +63,7 @@ fn exec_get_user_query(query: database::QueryInfo) -> ResultBoxError<User> {
 | 
				
			|||||||
            public_note: res.get_optional_str("public_note")?,
 | 
					            public_note: res.get_optional_str("public_note")?,
 | 
				
			||||||
            block_comments_on_his_page: res.get_legacy_bool("bloquecommentaire")?,
 | 
					            block_comments_on_his_page: res.get_legacy_bool("bloquecommentaire")?,
 | 
				
			||||||
            allow_posts_from_friends: res.get_legacy_bool("autoriser_post_amis")?,
 | 
					            allow_posts_from_friends: res.get_legacy_bool("autoriser_post_amis")?,
 | 
				
			||||||
            account_creation_time: res.get_date_as_time("date_creation")?
 | 
					            account_creation_time: res.get_date_as_time("date_creation")?,
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -141,3 +141,18 @@ pub fn can_create_posts(user_id: UserID, target_id: UserID) -> ResultBoxError<bo
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    Ok(true)
 | 
					    Ok(true)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Search for user in the database
 | 
				
			||||||
 | 
					pub fn search_user(query: &str, limit: u64) -> ResultBoxError<Vec<UserID>> {
 | 
				
			||||||
 | 
					    let query = format!("%{}%", query.replace(" ", "%"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    database::QueryInfo::new(USERS_TABLE)
 | 
				
			||||||
 | 
					        .add_field("ID")
 | 
				
			||||||
 | 
					        .set_custom_where("(nom LIKE ?) || (prenom LIKE ?) || (CONCAT(prenom, '%', nom) LIKE ?) || (CONCAT(nom, '%', prenom) LIKE ?)")
 | 
				
			||||||
 | 
					        .add_custom_where_argument_str(&query)
 | 
				
			||||||
 | 
					        .add_custom_where_argument_str(&query)
 | 
				
			||||||
 | 
					        .add_custom_where_argument_str(&query)
 | 
				
			||||||
 | 
					        .add_custom_where_argument_str(&query)
 | 
				
			||||||
 | 
					        .set_limit(limit)
 | 
				
			||||||
 | 
					        .exec(|row| row.get_user_id("ID"))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user