mirror of
https://gitlab.com/comunic/comunicapiv3
synced 2025-01-06 10:58:50 +00:00
259 lines
9.3 KiB
Rust
259 lines
9.3 KiB
Rust
//! # Settings controller
|
|
//!
|
|
//! @author Pierre Hubert
|
|
|
|
use crate::api_data::account_image_settings_api::AccountImageSettingsAPI;
|
|
use crate::api_data::data_conservation_settings_api::DataConservationSettingsAPI;
|
|
use crate::api_data::general_settings_api::GeneralSettingsAPI;
|
|
use crate::api_data::language_settings_api::LanguageSettingsAPI;
|
|
use crate::api_data::res_create_custom_emoji::ResCreateCustomEmoji;
|
|
use crate::api_data::security_settings_api::SecuritySettingsAPI;
|
|
use crate::constants::{conservation_policy, SUPPORTED_LANGUAGES};
|
|
use crate::data::base_request_handler::BaseRequestHandler;
|
|
use crate::data::general_settings::GeneralSettings;
|
|
use crate::data::http_request_handler::HttpRequestHandler;
|
|
use crate::data::lang_settings::LangSettings;
|
|
use crate::data::new_custom_emoji::NewCustomEmoji;
|
|
use crate::data::new_data_conservation_policy::NewDataConservationPolicy;
|
|
use crate::data::security_settings::{SecurityQuestion, SecuritySettings};
|
|
use crate::data::user::{AccountImageVisibility, UserPageStatus};
|
|
use crate::helpers::{account_helper, custom_emojies_helper, user_helper};
|
|
use crate::helpers::virtual_directory_helper::VirtualDirType;
|
|
use crate::routes::RequestResult;
|
|
|
|
/// Get the general settings of the user
|
|
pub fn get_general(r: &mut HttpRequestHandler) -> RequestResult {
|
|
let user = user_helper::find_user_by_id(r.user_id_ref()?)?;
|
|
|
|
r.set_response(GeneralSettingsAPI::new(&user))
|
|
}
|
|
|
|
/// 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,
|
|
};
|
|
|
|
let personal_website = r.post_url_opt("personnalWebsite", false)?;
|
|
|
|
let virtual_directory = r.post_checked_virtual_directory_opt(
|
|
"virtualDirectory", r.user_id_ref()?.id(), VirtualDirType::USER)?;
|
|
|
|
let new_settings = GeneralSettings {
|
|
id: r.user_id()?,
|
|
first_name: r.post_content("firstName", 3, true)?,
|
|
last_name: r.post_content("lastName", 3, true)?,
|
|
page_status,
|
|
block_comments: !r.post_bool("allowComments")?,
|
|
allow_posts_from_friends: r.post_bool("allowPostsFromFriends")?,
|
|
friends_list_public: r.post_bool("publicFriendsList")?,
|
|
personal_website,
|
|
virtual_directory,
|
|
allow_mails: r.post_bool("allow_comunic_mails")?,
|
|
public_note: Some(r.post_content("publicNote", 0, false)?),
|
|
};
|
|
|
|
account_helper::set_general(&new_settings)?;
|
|
|
|
r.success("Settings updated")
|
|
}
|
|
|
|
/// Check the availability of a virtual directory
|
|
pub fn check_virtual_directory(r: &mut HttpRequestHandler) -> RequestResult {
|
|
// We can do this check just by getting it, there is no need to store it in a variable
|
|
r.post_checked_virtual_directory_opt("directory", r.user_id()?.id(), VirtualDirType::USER)?;
|
|
|
|
r.success("The directory is available!")
|
|
}
|
|
|
|
/// Get the current language of the user
|
|
pub fn get_language(r: &mut HttpRequestHandler) -> RequestResult {
|
|
let user = user_helper::find_user_by_id(r.user_id_ref()?)?;
|
|
|
|
r.set_response(LanguageSettingsAPI::new(&user))
|
|
}
|
|
|
|
/// Set the current language of the user
|
|
pub fn set_language(r: &mut HttpRequestHandler) -> RequestResult {
|
|
let lang = r.post_string("lang")?;
|
|
|
|
if !SUPPORTED_LANGUAGES.contains(&lang.as_str()) {
|
|
r.forbidden("Language not supported!".to_string())?;
|
|
}
|
|
|
|
let new_settings = LangSettings {
|
|
id: r.user_id()?,
|
|
lang,
|
|
};
|
|
|
|
account_helper::set_language_settings(&new_settings)?;
|
|
|
|
r.success("Language settings updated.")
|
|
}
|
|
|
|
/// Get security settings
|
|
pub fn get_security(r: &mut HttpRequestHandler) -> RequestResult {
|
|
r.need_user_password("password")?;
|
|
|
|
let user = user_helper::find_user_by_id(r.user_id_ref()?)?;
|
|
|
|
r.set_response(SecuritySettingsAPI::new(&user))
|
|
}
|
|
|
|
/// Set security settings
|
|
pub fn set_security(r: &mut HttpRequestHandler) -> RequestResult {
|
|
r.need_user_password("password")?;
|
|
|
|
let new_settings = SecuritySettings {
|
|
id: r.user_id()?,
|
|
question1: SecurityQuestion::new(
|
|
&Option::Some(r.post_content("security_question_1", 0, false)?),
|
|
&Option::Some(r.post_content("security_answer_1", 0, false)?),
|
|
),
|
|
|
|
question2: SecurityQuestion::new(
|
|
&Option::Some(r.post_content("security_question_2", 0, false)?),
|
|
&Option::Some(r.post_content("security_answer_2", 0, false)?),
|
|
),
|
|
};
|
|
|
|
account_helper::set_security_settings(&new_settings)?;
|
|
|
|
r.success("Security settings update.")
|
|
}
|
|
|
|
/// Check user password
|
|
pub fn check_password(r: &mut HttpRequestHandler) -> RequestResult {
|
|
r.need_user_password("password")?;
|
|
|
|
r.success("The password is valid.")
|
|
}
|
|
|
|
/// Update user password
|
|
pub fn update_password(r: &mut HttpRequestHandler) -> RequestResult {
|
|
r.need_user_password("oldPassword")?;
|
|
|
|
let new_password = r.post_string("newPassword")?;
|
|
|
|
account_helper::change_password(r.user_id_ref()?, &new_password)?;
|
|
|
|
r.success("Password updated !")
|
|
}
|
|
|
|
/// Get account image settings
|
|
pub fn get_account_image_settings(r: &mut HttpRequestHandler) -> RequestResult {
|
|
let user = user_helper::find_user_by_id(r.user_id_ref()?)?;
|
|
|
|
r.set_response(AccountImageSettingsAPI::new(&user))
|
|
}
|
|
|
|
/// Upload a new account image
|
|
pub fn upload_account_image(r: &mut HttpRequestHandler) -> RequestResult {
|
|
if !r.has_file("picture") {
|
|
return r.bad_request("An error occurred while receiving the image !".to_string());
|
|
}
|
|
|
|
let uri = r.save_post_image("picture", "avatars", 800, 800)?;
|
|
|
|
account_helper::set_account_image(r.user_id_ref()?, &uri)?;
|
|
|
|
r.success("Account image updated!")
|
|
}
|
|
|
|
/// Delete user account image
|
|
pub fn delete_account_image(r: &mut HttpRequestHandler) -> RequestResult {
|
|
account_helper::delete_account_image(r.user_id_ref()?)?;
|
|
|
|
r.success("Account image deleted!")
|
|
}
|
|
|
|
/// Change account image visibility
|
|
pub fn set_account_image_visibility(r: &mut HttpRequestHandler) -> RequestResult {
|
|
let level = AccountImageVisibility::from_api(&r.post_string("visibility")?);
|
|
|
|
account_helper::set_account_image_visibility(r.user_id_ref()?, level)?;
|
|
|
|
r.success("Account image visibility level updated!")
|
|
}
|
|
|
|
/// Upload a custom emoji
|
|
pub fn upload_custom_emoji(r: &mut HttpRequestHandler) -> RequestResult {
|
|
let shortcut = r.post_emoji_shortcut("shortcut")?;
|
|
|
|
if custom_emojies_helper::has_user_similar_shortcut(r.user_id_ref()?, &shortcut)? {
|
|
r.forbidden("A custom emoji with the same shortcut is already defined!".to_string())?;
|
|
}
|
|
|
|
let path = r.save_post_image("image", "custom_emojies", 72, 72)?;
|
|
|
|
let emoji_id = custom_emojies_helper::insert(&NewCustomEmoji {
|
|
user_id: r.user_id()?,
|
|
shortcut,
|
|
path,
|
|
})?;
|
|
|
|
r.set_response(ResCreateCustomEmoji::new(emoji_id))
|
|
}
|
|
|
|
/// Delete custom emoji
|
|
pub fn delete_custom_emoji(r: &mut HttpRequestHandler) -> RequestResult {
|
|
let emoji = r.post_emoji_id("emojiID")?;
|
|
|
|
custom_emojies_helper::delete(&emoji)?;
|
|
|
|
r.success("Emoji deleted.")
|
|
}
|
|
|
|
/// Get data conservation policy
|
|
pub fn get_data_conservation_policy(r: &mut HttpRequestHandler) -> RequestResult {
|
|
let user = user_helper::find_user_by_id(r.user_id_ref()?)?;
|
|
|
|
r.set_response(DataConservationSettingsAPI::new(&user))
|
|
}
|
|
|
|
/// Set data conservation policy
|
|
pub fn set_data_conservation_policy(r: &mut HttpRequestHandler) -> RequestResult {
|
|
r.need_user_password("password")?;
|
|
|
|
let policy = NewDataConservationPolicy {
|
|
user_id: r.user_id()?,
|
|
delete_account_after: r.post_positive_u64_opt("inactive_account_lifetime")?,
|
|
delete_notifications_after: r.post_positive_u64_opt("notification_lifetime")?,
|
|
delete_comments_after: r.post_positive_u64_opt("comments_lifetime")?,
|
|
delete_posts_after: r.post_positive_u64_opt("posts_lifetime")?,
|
|
delete_conversation_messages_after: r.post_positive_u64_opt("conversation_messages_lifetime")?,
|
|
delete_likes_after: r.post_positive_u64_opt("likes_lifetime")?,
|
|
};
|
|
|
|
|
|
// Check policy is respected
|
|
if policy.delete_account_after.map(|f| f < conservation_policy::MIN_INACTIVE_ACCOUNT_LIFETIME.as_secs()) == Some(true) {
|
|
r.bad_request("Invalid lifetime for inactive account !".to_string())?;
|
|
}
|
|
|
|
if policy.delete_notifications_after.map(|f| f < conservation_policy::MIN_NOTIFICATIONS_LIFETIME.as_secs()) == Some(true) {
|
|
r.bad_request("Invalid lifetime for notifications !".to_string())?;
|
|
}
|
|
|
|
if policy.delete_comments_after.map(|f| f < conservation_policy::MIN_COMMENTS_LIFETIME.as_secs()) == Some(true) {
|
|
r.bad_request("Invalid lifetime for comments !".to_string())?;
|
|
}
|
|
|
|
if policy.delete_posts_after.map(|f| f < conservation_policy::MIN_POSTS_LIFETIME.as_secs()) == Some(true) {
|
|
r.bad_request("Invalid lifetime for posts !".to_string())?;
|
|
}
|
|
|
|
if policy.delete_conversation_messages_after.map(|f| f < conservation_policy::MIN_CONVERSATION_MESSAGES_LIFETIME.as_secs()) == Some(true) {
|
|
r.bad_request("Invalid lifetime for conversation messages !".to_string())?;
|
|
}
|
|
|
|
if policy.delete_likes_after.map(|f| f < conservation_policy::MIN_LIKES_LIFETIME.as_secs()) == Some(true) {
|
|
r.bad_request("Invalid lifetime for likes !".to_string())?;
|
|
}
|
|
|
|
account_helper::set_data_conservation_policy(policy)?;
|
|
|
|
r.success("Successfully updated data conservation policy!")
|
|
} |