mirror of
				https://gitlab.com/comunic/comunicapiv3
				synced 2025-11-04 09:34:04 +00:00 
			
		
		
		
	Administrators can get information about a single user
This commit is contained in:
		
							
								
								
									
										54
									
								
								src/api_data/admin/admin_user_info_api.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/api_data/admin/admin_user_info_api.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
//! # Admin API : User information
 | 
			
		||||
//!
 | 
			
		||||
//! Get information about a single user
 | 
			
		||||
//!
 | 
			
		||||
//! @author Pierre Hubert
 | 
			
		||||
 | 
			
		||||
use crate::data::user::User;
 | 
			
		||||
 | 
			
		||||
#[derive(serde::Serialize)]
 | 
			
		||||
pub struct AdminUserInfoAPI {
 | 
			
		||||
    id: u64,
 | 
			
		||||
    first_name: String,
 | 
			
		||||
    last_name: String,
 | 
			
		||||
    email: String,
 | 
			
		||||
    account_creation_time: u64,
 | 
			
		||||
    last_activity: u64,
 | 
			
		||||
    page_visibility: &'static str,
 | 
			
		||||
    directory: Option<String>,
 | 
			
		||||
    account_image: String,
 | 
			
		||||
    friend_list_public: bool,
 | 
			
		||||
    is_email_public: bool,
 | 
			
		||||
    personal_website: Option<String>,
 | 
			
		||||
    public_note: Option<String>,
 | 
			
		||||
    location: Option<String>,
 | 
			
		||||
    block_comments: bool,
 | 
			
		||||
    allow_posts_from_friends: bool,
 | 
			
		||||
    allow_mails: bool,
 | 
			
		||||
    lang: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl AdminUserInfoAPI {
 | 
			
		||||
    pub fn new(user: User) -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            account_image: user.account_image_url_for_admin(),
 | 
			
		||||
            friend_list_public: user.public_friends_list,
 | 
			
		||||
            is_email_public: user.is_email_public,
 | 
			
		||||
            personal_website: user.personal_website,
 | 
			
		||||
            public_note: user.public_note,
 | 
			
		||||
            location: user.location,
 | 
			
		||||
            block_comments: user.block_comments_on_his_page,
 | 
			
		||||
            allow_posts_from_friends: user.allow_posts_from_friends,
 | 
			
		||||
            allow_mails: user.allow_mails,
 | 
			
		||||
            id: user.id.id(),
 | 
			
		||||
            first_name: user.first_name,
 | 
			
		||||
            last_name: user.last_name,
 | 
			
		||||
            email: user.email,
 | 
			
		||||
            account_creation_time: user.account_creation_time,
 | 
			
		||||
            last_activity: user.last_activity,
 | 
			
		||||
            page_visibility: user.user_page_visibility.to_api(),
 | 
			
		||||
            directory: user.virtual_directory,
 | 
			
		||||
            lang: user.lang,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -11,4 +11,5 @@ pub mod admin_res_create_reset_token;
 | 
			
		||||
pub mod admin_role_api;
 | 
			
		||||
pub mod admin_res_create_account;
 | 
			
		||||
pub mod admin_log_api;
 | 
			
		||||
pub mod admin_search_user_result;
 | 
			
		||||
pub mod admin_search_user_result_api;
 | 
			
		||||
pub mod admin_user_info_api;
 | 
			
		||||
@@ -5,7 +5,7 @@ use serde::Serialize;
 | 
			
		||||
 | 
			
		||||
use crate::api_data::custom_emoji::CustomEmojiAPI;
 | 
			
		||||
use crate::data::error::ResultBoxError;
 | 
			
		||||
use crate::data::user::{User, UserID, UserPageStatus};
 | 
			
		||||
use crate::data::user::{User, UserID, UserPageVisibility};
 | 
			
		||||
use crate::data::user::AccountImageVisibility::{COMUNIC_USERS, EVERYONE};
 | 
			
		||||
use crate::helpers::{background_image_helper, custom_emojies_helper, friends_helper, likes_helper, user_helper};
 | 
			
		||||
use crate::helpers::likes_helper::LikeType;
 | 
			
		||||
@@ -53,8 +53,8 @@ impl APIUserInfo {
 | 
			
		||||
            userID: info.id.id(),
 | 
			
		||||
            firstName: info.first_name.to_string(),
 | 
			
		||||
            lastName: info.last_name.to_string(),
 | 
			
		||||
            publicPage: info.status != UserPageStatus::PRIVATE,
 | 
			
		||||
            openPage: info.status == UserPageStatus::OPEN,
 | 
			
		||||
            publicPage: info.user_page_visibility != UserPageVisibility::PRIVATE,
 | 
			
		||||
            openPage: info.user_page_visibility == UserPageVisibility::OPEN,
 | 
			
		||||
            virtualDirectory: info.virtual_directory.clone().unwrap_or(String::new()),
 | 
			
		||||
            accountImage: APIUserInfo::get_account_image_url(user_id, info)?,
 | 
			
		||||
            customEmojis: custom_emojies_helper::get_list_user(&info.id)?
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,13 @@
 | 
			
		||||
//!
 | 
			
		||||
//! @author Pierre Hubert
 | 
			
		||||
 | 
			
		||||
use crate::data::http_request_handler::HttpRequestHandler;
 | 
			
		||||
use crate::routes::RequestResult;
 | 
			
		||||
use crate::data::base_request_handler::BaseRequestHandler;
 | 
			
		||||
use crate::api_data::admin::admin_search_user_result_api::AdminSearchUserResult;
 | 
			
		||||
use crate::api_data::admin::admin_user_info_api::AdminUserInfoAPI;
 | 
			
		||||
use crate::constants::admin::AdminRole;
 | 
			
		||||
use crate::data::base_request_handler::BaseRequestHandler;
 | 
			
		||||
use crate::data::http_request_handler::HttpRequestHandler;
 | 
			
		||||
use crate::helpers::user_helper;
 | 
			
		||||
use crate::api_data::admin::admin_search_user_result::AdminSearchUserResult;
 | 
			
		||||
use crate::routes::RequestResult;
 | 
			
		||||
 | 
			
		||||
/// Search for user
 | 
			
		||||
pub fn search(r: &mut HttpRequestHandler) -> RequestResult {
 | 
			
		||||
@@ -19,4 +20,14 @@ pub fn search(r: &mut HttpRequestHandler) -> RequestResult {
 | 
			
		||||
    let results = user_helper::search_user_admin(&name, &email, 50)?;
 | 
			
		||||
 | 
			
		||||
    r.set_response(results.into_iter().map(AdminSearchUserResult::new).collect::<Vec<_>>())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Get information about a single user
 | 
			
		||||
pub fn get_single(r: &mut HttpRequestHandler) -> RequestResult {
 | 
			
		||||
    r.check_admin_has_role(AdminRole::MANAGE_USERS)?;
 | 
			
		||||
 | 
			
		||||
    let user_id = r.post_user_id("user_id")?;
 | 
			
		||||
    let user = user_helper::find_user_by_id(&user_id)?;
 | 
			
		||||
 | 
			
		||||
    r.set_response(AdminUserInfoAPI::new(user))
 | 
			
		||||
}
 | 
			
		||||
@@ -19,7 +19,7 @@ use crate::data::new_custom_emoji::NewCustomEmoji;
 | 
			
		||||
use crate::data::new_data_conservation_policy::NewDataConservationPolicy;
 | 
			
		||||
use crate::data::new_notifications_settings::NewNotificationsSettings;
 | 
			
		||||
use crate::data::security_settings::{SecurityQuestion, SecuritySettings};
 | 
			
		||||
use crate::data::user::{AccountImageVisibility, UserPageStatus};
 | 
			
		||||
use crate::data::user::{AccountImageVisibility, UserPageVisibility};
 | 
			
		||||
use crate::helpers::{account_helper, custom_emojies_helper, user_helper};
 | 
			
		||||
use crate::helpers::virtual_directory_helper::VirtualDirType;
 | 
			
		||||
use crate::routes::RequestResult;
 | 
			
		||||
@@ -35,9 +35,9 @@ pub fn get_general(r: &mut HttpRequestHandler) -> RequestResult {
 | 
			
		||||
/// Set the general settings of the user
 | 
			
		||||
pub fn set_general(r: &mut HttpRequestHandler) -> RequestResult {
 | 
			
		||||
    let page_status = match (r.post_bool("isPublic")?, r.post_bool("isOpen")?) {
 | 
			
		||||
        (true, true) => UserPageStatus::OPEN,
 | 
			
		||||
        (true, false) => UserPageStatus::PUBLIC,
 | 
			
		||||
        (_, _) => UserPageStatus::PRIVATE,
 | 
			
		||||
        (true, true) => UserPageVisibility::OPEN,
 | 
			
		||||
        (true, false) => UserPageVisibility::PUBLIC,
 | 
			
		||||
        (_, _) => UserPageVisibility::PRIVATE,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let personal_website = r.post_url_opt("personnalWebsite", false)?;
 | 
			
		||||
 
 | 
			
		||||
@@ -2,13 +2,13 @@
 | 
			
		||||
//!
 | 
			
		||||
//! @author Pierre Hubert
 | 
			
		||||
 | 
			
		||||
use crate::data::user::{UserID, UserPageStatus};
 | 
			
		||||
use crate::data::user::{UserID, UserPageVisibility};
 | 
			
		||||
 | 
			
		||||
pub struct GeneralSettings {
 | 
			
		||||
    pub id: UserID,
 | 
			
		||||
    pub first_name: String,
 | 
			
		||||
    pub last_name: String,
 | 
			
		||||
    pub page_status: UserPageStatus,
 | 
			
		||||
    pub page_status: UserPageVisibility,
 | 
			
		||||
    pub block_comments: bool,
 | 
			
		||||
    pub allow_posts_from_friends: bool,
 | 
			
		||||
    pub friends_list_public: bool,
 | 
			
		||||
 
 | 
			
		||||
@@ -62,12 +62,22 @@ impl PartialEq<UserID> for &UserID {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, PartialEq)]
 | 
			
		||||
pub enum UserPageStatus {
 | 
			
		||||
pub enum UserPageVisibility {
 | 
			
		||||
    OPEN,
 | 
			
		||||
    PUBLIC,
 | 
			
		||||
    PRIVATE,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl UserPageVisibility {
 | 
			
		||||
    pub fn to_api(&self) -> &'static str {
 | 
			
		||||
        match self {
 | 
			
		||||
            UserPageVisibility::OPEN => "open",
 | 
			
		||||
            UserPageVisibility::PUBLIC => "public",
 | 
			
		||||
            UserPageVisibility::PRIVATE => "private"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, PartialEq)]
 | 
			
		||||
#[allow(non_camel_case_types)]
 | 
			
		||||
pub enum AccountImageVisibility {
 | 
			
		||||
@@ -110,7 +120,7 @@ pub struct User {
 | 
			
		||||
    pub first_name: String,
 | 
			
		||||
    pub last_name: String,
 | 
			
		||||
    pub last_activity: u64,
 | 
			
		||||
    pub status: UserPageStatus,
 | 
			
		||||
    pub user_page_visibility: UserPageVisibility,
 | 
			
		||||
    pub virtual_directory: Option<String>,
 | 
			
		||||
    pub account_image_path: Option<String>,
 | 
			
		||||
    pub account_image_visibility: AccountImageVisibility,
 | 
			
		||||
@@ -151,12 +161,12 @@ impl User {
 | 
			
		||||
 | 
			
		||||
    /// Check if user's page is public
 | 
			
		||||
    pub fn is_page_public(&self) -> bool {
 | 
			
		||||
        !matches!(self.status, UserPageStatus::PRIVATE)
 | 
			
		||||
        !matches!(self.user_page_visibility, UserPageVisibility::PRIVATE)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Check if user's page is open
 | 
			
		||||
    pub fn is_page_open(&self) -> bool {
 | 
			
		||||
        matches!(self.status, UserPageStatus::OPEN)
 | 
			
		||||
        matches!(self.user_page_visibility, UserPageVisibility::OPEN)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Get the URL pointing to the default account image
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ use crate::data::new_account::NewAccount;
 | 
			
		||||
use crate::data::new_data_conservation_policy::NewDataConservationPolicy;
 | 
			
		||||
use crate::data::new_notifications_settings::NewNotificationsSettings;
 | 
			
		||||
use crate::data::security_settings::SecuritySettings;
 | 
			
		||||
use crate::data::user::{AccountImageVisibility, User, UserID, UserPageStatus};
 | 
			
		||||
use crate::data::user::{AccountImageVisibility, User, UserID, UserPageVisibility};
 | 
			
		||||
use crate::data::user_token::{PushNotificationToken, UserAccessToken};
 | 
			
		||||
use crate::helpers::{comments_helper, conversations_helper, custom_emojies_helper, database, events_helper, forez_presence_helper, friends_helper, groups_helper, likes_helper, notifications_helper, posts_helper, push_notifications_helper, survey_helper, user_helper};
 | 
			
		||||
use crate::helpers::database::{DeleteQuery, InsertQuery, QueryInfo, RowResult, UpdateInfo};
 | 
			
		||||
@@ -225,8 +225,8 @@ pub fn set_general(settings: &GeneralSettings) -> ResultBoxError {
 | 
			
		||||
        .cond_user_id("ID", &settings.id)
 | 
			
		||||
        .set_str("prenom", &settings.first_name)
 | 
			
		||||
        .set_str("nom", &settings.last_name)
 | 
			
		||||
        .set_legacy_bool("public", settings.page_status != UserPageStatus::PRIVATE)
 | 
			
		||||
        .set_legacy_bool("pageouverte", settings.page_status == UserPageStatus::OPEN)
 | 
			
		||||
        .set_legacy_bool("public", settings.page_status != UserPageVisibility::PRIVATE)
 | 
			
		||||
        .set_legacy_bool("pageouverte", settings.page_status == UserPageVisibility::OPEN)
 | 
			
		||||
        .set_legacy_bool("bloquecommentaire", settings.block_comments)
 | 
			
		||||
        .set_legacy_bool("autoriser_post_amis", settings.allow_posts_from_friends)
 | 
			
		||||
        .set_legacy_bool("autorise_mail", settings.allow_mails)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
use crate::constants::database_tables_names::USERS_TABLE;
 | 
			
		||||
use crate::data::error::{Res, ResultBoxError};
 | 
			
		||||
use crate::data::user::{AccountImageVisibility, User, UserID, UserPageStatus};
 | 
			
		||||
use crate::data::user::UserPageStatus::PUBLIC;
 | 
			
		||||
use crate::data::user::{AccountImageVisibility, User, UserID, UserPageVisibility};
 | 
			
		||||
use crate::data::user::UserPageVisibility::PUBLIC;
 | 
			
		||||
use crate::helpers::{database, friends_helper};
 | 
			
		||||
use crate::helpers::friends_helper::are_friend;
 | 
			
		||||
 | 
			
		||||
@@ -40,11 +40,11 @@ pub fn get_all_users() -> Res<Vec<User>> {
 | 
			
		||||
fn db_to_user(res: &database::RowResult) -> ResultBoxError<User> {
 | 
			
		||||
    // Page status
 | 
			
		||||
    let page_status = if res.get_int64("pageouverte")? == 1 {
 | 
			
		||||
        UserPageStatus::OPEN
 | 
			
		||||
        UserPageVisibility::OPEN
 | 
			
		||||
    } else if res.get_int64("public")? == 1 {
 | 
			
		||||
        UserPageStatus::PUBLIC
 | 
			
		||||
        UserPageVisibility::PUBLIC
 | 
			
		||||
    } else {
 | 
			
		||||
        UserPageStatus::PRIVATE
 | 
			
		||||
        UserPageVisibility::PRIVATE
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // Account image visibility
 | 
			
		||||
@@ -60,7 +60,7 @@ fn db_to_user(res: &database::RowResult) -> ResultBoxError<User> {
 | 
			
		||||
        password: res.get_str("password")?,
 | 
			
		||||
        first_name: res.get_str("prenom")?,
 | 
			
		||||
        last_name: res.get_str("nom")?,
 | 
			
		||||
        status: page_status,
 | 
			
		||||
        user_page_visibility: page_status,
 | 
			
		||||
        last_activity: res.get_u64("last_activity")?,
 | 
			
		||||
        virtual_directory: res.get_optional_str("sous_repertoire")?,
 | 
			
		||||
        account_image_path: res.get_optional_str("account_image_path")?,
 | 
			
		||||
@@ -109,10 +109,10 @@ pub fn can_see_user_page(user_id: &UserID, target_user: &UserID) -> ResultBoxErr
 | 
			
		||||
        return Ok(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let visibility = find_user_by_id(target_user)?.status;
 | 
			
		||||
    let visibility = find_user_by_id(target_user)?.user_page_visibility;
 | 
			
		||||
 | 
			
		||||
    // Open page = OK
 | 
			
		||||
    if visibility == UserPageStatus::OPEN {
 | 
			
		||||
    if visibility == UserPageVisibility::OPEN {
 | 
			
		||||
        return Ok(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -397,5 +397,6 @@ pub fn get_routes() -> Vec<Route> {
 | 
			
		||||
 | 
			
		||||
        // Admin users management controller
 | 
			
		||||
        Route::admin_post("/admin/users/search", Box::new(admin_users_controller::search)),
 | 
			
		||||
        Route::admin_post("/admin/users/info", Box::new(admin_users_controller::get_single))
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user