mirror of
https://gitlab.com/comunic/comunicapiv3
synced 2024-11-22 21:39:21 +00:00
Can create custom emoji
This commit is contained in:
parent
110f84eb0a
commit
99c7bb2899
9
Cargo.lock
generated
9
Cargo.lock
generated
@ -560,6 +560,7 @@ dependencies = [
|
|||||||
"pdf",
|
"pdf",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"rand",
|
"rand",
|
||||||
|
"regex",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sha1",
|
"sha1",
|
||||||
@ -1953,9 +1954,9 @@ checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex"
|
name = "regex"
|
||||||
version = "1.3.7"
|
version = "1.4.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a6020f034922e3194c711b82a627453881bc4682166cabb07134a10c26ba7692"
|
checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick",
|
"aho-corasick",
|
||||||
"memchr",
|
"memchr",
|
||||||
@ -1965,9 +1966,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-syntax"
|
name = "regex-syntax"
|
||||||
version = "0.6.17"
|
version = "0.6.21"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae"
|
checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "remove_dir_all"
|
name = "remove_dir_all"
|
||||||
|
@ -27,3 +27,4 @@ kamadak-exif = "0.5.1"
|
|||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
mime_guess = "2.0.3"
|
mime_guess = "2.0.3"
|
||||||
pdf = "0.6.3"
|
pdf = "0.6.3"
|
||||||
|
regex = "1.4.2"
|
@ -55,3 +55,4 @@ pub mod general_settings_api;
|
|||||||
pub mod language_settings_api;
|
pub mod language_settings_api;
|
||||||
pub mod security_settings_api;
|
pub mod security_settings_api;
|
||||||
pub mod account_image_settings_api;
|
pub mod account_image_settings_api;
|
||||||
|
pub mod res_create_custom_emoji;
|
17
src/api_data/res_create_custom_emoji.rs
Normal file
17
src/api_data/res_create_custom_emoji.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
//! # Create custom emoji result
|
||||||
|
//!
|
||||||
|
//! @author Pierre Hubert
|
||||||
|
|
||||||
|
use serde::Serialize;
|
||||||
|
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
#[derive(Serialize)]
|
||||||
|
pub struct ResCreateCustomEmoji {
|
||||||
|
emojiID: u64
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ResCreateCustomEmoji {
|
||||||
|
pub fn new(emoji_id: u64) -> ResCreateCustomEmoji {
|
||||||
|
ResCreateCustomEmoji { emojiID: emoji_id }
|
||||||
|
}
|
||||||
|
}
|
@ -106,6 +106,7 @@ pub fn get_routes() -> Vec<Route> {
|
|||||||
Route::post("/settings/upload_account_image", Box::new(settings_controller::upload_account_image)),
|
Route::post("/settings/upload_account_image", Box::new(settings_controller::upload_account_image)),
|
||||||
Route::post("/settings/delete_account_image", Box::new(settings_controller::delete_account_image)),
|
Route::post("/settings/delete_account_image", Box::new(settings_controller::delete_account_image)),
|
||||||
Route::post("/settings/set_account_image_visibility", Box::new(settings_controller::set_account_image_visibility)),
|
Route::post("/settings/set_account_image_visibility", Box::new(settings_controller::set_account_image_visibility)),
|
||||||
|
Route::post("/settings/upload_custom_emoji", Box::new(settings_controller::upload_custom_emoji)),
|
||||||
|
|
||||||
|
|
||||||
// Friends controller
|
// Friends controller
|
||||||
|
@ -5,15 +5,17 @@
|
|||||||
use crate::api_data::account_image_settings_api::AccountImageSettingsAPI;
|
use crate::api_data::account_image_settings_api::AccountImageSettingsAPI;
|
||||||
use crate::api_data::general_settings_api::GeneralSettingsAPI;
|
use crate::api_data::general_settings_api::GeneralSettingsAPI;
|
||||||
use crate::api_data::language_settings_api::LanguageSettingsAPI;
|
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::api_data::security_settings_api::SecuritySettingsAPI;
|
||||||
use crate::constants::SUPPORTED_LANGUAGES;
|
use crate::constants::SUPPORTED_LANGUAGES;
|
||||||
use crate::controllers::routes::RequestResult;
|
use crate::controllers::routes::RequestResult;
|
||||||
use crate::data::general_settings::GeneralSettings;
|
use crate::data::general_settings::GeneralSettings;
|
||||||
use crate::data::http_request_handler::HttpRequestHandler;
|
use crate::data::http_request_handler::HttpRequestHandler;
|
||||||
use crate::data::lang_settings::LangSettings;
|
use crate::data::lang_settings::LangSettings;
|
||||||
|
use crate::data::new_custom_emoji::NewCustomEmoji;
|
||||||
use crate::data::security_settings::{SecurityQuestion, SecuritySettings};
|
use crate::data::security_settings::{SecurityQuestion, SecuritySettings};
|
||||||
use crate::data::user::{AccountImageVisibility, UserPageStatus};
|
use crate::data::user::{AccountImageVisibility, UserPageStatus};
|
||||||
use crate::helpers::{account_helper, user_helper};
|
use crate::helpers::{account_helper, custom_emojies_helper, user_helper};
|
||||||
use crate::helpers::virtual_directory_helper::VirtualDirType;
|
use crate::helpers::virtual_directory_helper::VirtualDirType;
|
||||||
|
|
||||||
/// Get the general settings of the user
|
/// Get the general settings of the user
|
||||||
@ -172,3 +174,22 @@ pub fn set_account_image_visibility(r: &mut HttpRequestHandler) -> RequestResult
|
|||||||
|
|
||||||
r.success("Account image visibility level updated!")
|
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))
|
||||||
|
}
|
@ -23,7 +23,7 @@ use crate::data::user::UserID;
|
|||||||
use crate::helpers::{account_helper, api_helper, comments_helper, conversations_helper, friends_helper, groups_helper, movies_helper, posts_helper, user_helper, virtual_directory_helper};
|
use crate::helpers::{account_helper, api_helper, comments_helper, conversations_helper, friends_helper, groups_helper, movies_helper, posts_helper, user_helper, virtual_directory_helper};
|
||||||
use crate::helpers::virtual_directory_helper::VirtualDirType;
|
use crate::helpers::virtual_directory_helper::VirtualDirType;
|
||||||
use crate::utils::pdf_utils::is_valid_pdf;
|
use crate::utils::pdf_utils::is_valid_pdf;
|
||||||
use crate::utils::string_utils::{check_string_before_insert, check_url, remove_html_nodes};
|
use crate::utils::string_utils::{check_emoji_code, check_string_before_insert, check_url, remove_html_nodes};
|
||||||
use crate::utils::user_data_utils::{generate_new_user_data_file_name, prepare_file_creation, user_data_path};
|
use crate::utils::user_data_utils::{generate_new_user_data_file_name, prepare_file_creation, user_data_path};
|
||||||
use crate::utils::virtual_directories_utils::check_virtual_directory;
|
use crate::utils::virtual_directories_utils::check_virtual_directory;
|
||||||
|
|
||||||
@ -671,4 +671,15 @@ impl HttpRequestHandler {
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get an emoji shortcut included in a POST request
|
||||||
|
pub fn post_emoji_shortcut(&mut self, field: &str) -> ResultBoxError<String> {
|
||||||
|
let emoji_shortcut = self.post_string(field)?;
|
||||||
|
|
||||||
|
if !check_emoji_code(&emoji_shortcut) {
|
||||||
|
self.bad_request("Invalid emoji shortcut code!".to_string())?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(emoji_shortcut)
|
||||||
|
}
|
||||||
}
|
}
|
@ -33,3 +33,4 @@ pub mod survey_response;
|
|||||||
pub mod general_settings;
|
pub mod general_settings;
|
||||||
pub mod lang_settings;
|
pub mod lang_settings;
|
||||||
pub mod security_settings;
|
pub mod security_settings;
|
||||||
|
pub mod new_custom_emoji;
|
11
src/data/new_custom_emoji.rs
Normal file
11
src/data/new_custom_emoji.rs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
//! # New custom emoji
|
||||||
|
//!
|
||||||
|
//! @author Pierre Hubert
|
||||||
|
|
||||||
|
use crate::data::user::UserID;
|
||||||
|
|
||||||
|
pub struct NewCustomEmoji {
|
||||||
|
pub user_id: UserID,
|
||||||
|
pub shortcut: String,
|
||||||
|
pub path: String,
|
||||||
|
}
|
@ -2,11 +2,12 @@
|
|||||||
//!
|
//!
|
||||||
//! @author Pierre Hubert
|
//! @author Pierre Hubert
|
||||||
|
|
||||||
use crate::data::user::UserID;
|
|
||||||
use crate::data::error::ResultBoxError;
|
|
||||||
use crate::data::custom_emoji::CustomEmoji;
|
|
||||||
use crate::helpers::database;
|
|
||||||
use crate::constants::database_tables_names::EMOJIS_TABLE;
|
use crate::constants::database_tables_names::EMOJIS_TABLE;
|
||||||
|
use crate::data::custom_emoji::CustomEmoji;
|
||||||
|
use crate::data::error::ResultBoxError;
|
||||||
|
use crate::data::new_custom_emoji::NewCustomEmoji;
|
||||||
|
use crate::data::user::UserID;
|
||||||
|
use crate::helpers::database;
|
||||||
|
|
||||||
/// Get the list of emojies of a user
|
/// Get the list of emojies of a user
|
||||||
pub fn get_list_user(user_id: &UserID) -> ResultBoxError<Vec<CustomEmoji>> {
|
pub fn get_list_user(user_id: &UserID) -> ResultBoxError<Vec<CustomEmoji>> {
|
||||||
@ -15,12 +16,30 @@ pub fn get_list_user(user_id: &UserID) -> ResultBoxError<Vec<CustomEmoji>> {
|
|||||||
.exec(db_to_custom_emoji)
|
.exec(db_to_custom_emoji)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check if a given user already as an emoji shortcut or not
|
||||||
|
pub fn has_user_similar_shortcut(user_id: &UserID, shortcut: &str) -> ResultBoxError<bool> {
|
||||||
|
database::QueryInfo::new(EMOJIS_TABLE)
|
||||||
|
.cond_user_id("user_id", user_id)
|
||||||
|
.cond("shortcut", shortcut)
|
||||||
|
.exec_count()
|
||||||
|
.map(|r| r > 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Insert a new emoji in the database
|
||||||
|
pub fn insert(emoji: &NewCustomEmoji) -> ResultBoxError<u64> {
|
||||||
|
database::InsertQuery::new(EMOJIS_TABLE)
|
||||||
|
.add_user_id("user_id", &emoji.user_id)
|
||||||
|
.add_str("shortcut", &emoji.shortcut)
|
||||||
|
.add_str("path", &emoji.path)
|
||||||
|
.insert_expect_result()
|
||||||
|
}
|
||||||
|
|
||||||
/// Turn a database entry into a [CustomEmoji]
|
/// Turn a database entry into a [CustomEmoji]
|
||||||
fn db_to_custom_emoji(row: &database::RowResult) -> ResultBoxError<CustomEmoji> {
|
fn db_to_custom_emoji(row: &database::RowResult) -> ResultBoxError<CustomEmoji> {
|
||||||
Ok(CustomEmoji {
|
Ok(CustomEmoji {
|
||||||
id: row.get_u64("id")?,
|
id: row.get_u64("id")?,
|
||||||
user_id: row.get_user_id("user_id")?,
|
user_id: row.get_user_id("user_id")?,
|
||||||
shortcut: row.get_str("shortcut")?,
|
shortcut: row.get_str("shortcut")?,
|
||||||
path: row.get_str("path")?
|
path: row.get_str("path")?,
|
||||||
})
|
})
|
||||||
}
|
}
|
@ -617,6 +617,12 @@ impl InsertQuery {
|
|||||||
insert(self)?;
|
insert(self)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Process insert, excepting an ID in the response
|
||||||
|
pub fn insert_expect_result(self) -> ResultBoxError<u64> {
|
||||||
|
let res = insert(self)?;
|
||||||
|
res.ok_or(ExecError::boxed_new("Expected an ID in insert result!"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Insert a new entry into the database
|
/// Insert a new entry into the database
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use actix_web::http::Uri;
|
use actix_web::http::Uri;
|
||||||
|
use regex::Regex;
|
||||||
|
|
||||||
/// Escape an HTML string
|
/// Escape an HTML string
|
||||||
///
|
///
|
||||||
@ -72,3 +73,23 @@ pub fn check_youtube_id(id: &str) -> bool {
|
|||||||
&& !id.contains("'")
|
&& !id.contains("'")
|
||||||
&& !id.contains("\"")
|
&& !id.contains("\"")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Check the validity of an emoji shortcut
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use comunic_server::utils::string_utils::check_emoji_code;
|
||||||
|
///
|
||||||
|
/// assert_eq!(check_emoji_code(":comunic:"), true);
|
||||||
|
/// assert_eq!(check_emoji_code(":comunic"), false);
|
||||||
|
/// assert_eq!(check_emoji_code("::"), false);
|
||||||
|
/// assert_eq!(check_emoji_code("a:comunic:"), false);
|
||||||
|
/// assert_eq!(check_emoji_code(":comunic:a"), false);
|
||||||
|
/// assert_eq!(check_emoji_code(":co:munic:"), false);
|
||||||
|
/// assert_eq!(check_emoji_code(":comuni@c:"), false);
|
||||||
|
/// assert_eq!(check_emoji_code("bbb:comuni@c:123"), false);
|
||||||
|
/// ```
|
||||||
|
pub fn check_emoji_code(shortcut: &str) -> bool {
|
||||||
|
let r = Regex::new(r"^:[a-zA-Z0-9]+:$").unwrap();
|
||||||
|
r.is_match(shortcut)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user