1
0
mirror of https://gitlab.com/comunic/comunicapiv3 synced 2024-11-29 16:56:28 +00:00

Upgrade UserID to a structure

This commit is contained in:
Pierre HUBERT 2020-06-25 10:08:34 +02:00
parent 444cad6e09
commit 96f3217db4
25 changed files with 180 additions and 153 deletions

View File

@ -40,12 +40,12 @@ impl ConversationAPI {
pub fn new(conv: &Conversation) -> ConversationAPI { pub fn new(conv: &Conversation) -> ConversationAPI {
ConversationAPI { ConversationAPI {
ID: conv.id, ID: conv.id,
ID_owner: conv.owner_id as u64, ID_owner: conv.owner_id.id(),
last_active: conv.last_active, last_active: conv.last_active,
name: ConvName(conv.name.clone()), name: ConvName(conv.name.clone()),
following: LegacyBool(conv.following), following: LegacyBool(conv.following),
saw_last_message: LegacyBool(conv.saw_last_message), saw_last_message: LegacyBool(conv.saw_last_message),
members: conv.members.iter().map(|x| x.clone() as u64).collect(), members: conv.members.iter().map(|x| x.id()).collect(),
canEveryoneAddMembers: conv.can_everyone_add_members, canEveryoneAddMembers: conv.can_everyone_add_members,
// TODO : update when call system is implemented // TODO : update when call system is implemented

View File

@ -26,7 +26,7 @@ impl ConversationMessageAPI {
ConversationMessageAPI { ConversationMessageAPI {
ID: msg.id, ID: msg.id,
convID: msg.conv_id, convID: msg.conv_id,
ID_user: msg.user_id as u64, ID_user: msg.user_id.id(),
time_insert: msg.time_sent, time_insert: msg.time_sent,
message: msg.message.clone().unwrap_or(String::new()), message: msg.message.clone().unwrap_or(String::new()),
image_path: msg.image_path.as_ref().map(|f| user_data_url(f)), image_path: msg.image_path.as_ref().map(|f| user_data_url(f)),

View File

@ -6,13 +6,13 @@ use crate::data::user::UserID;
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub struct CurrentUserID { pub struct CurrentUserID {
userID: i64 userID: u64
} }
impl CurrentUserID { impl CurrentUserID {
pub fn new(id: UserID) -> CurrentUserID { pub fn new(id: &UserID) -> CurrentUserID {
CurrentUserID { CurrentUserID {
userID: id userID: id.id()
} }
} }
} }

View File

@ -2,6 +2,7 @@
//! //!
//! @author Pierre Hubert //! @author Pierre Hubert
use serde::Serialize; use serde::Serialize;
use crate::data::custom_emoji::CustomEmoji; use crate::data::custom_emoji::CustomEmoji;
use crate::utils::user_data_utils::user_data_url; use crate::utils::user_data_utils::user_data_url;
@ -9,21 +10,19 @@ use crate::utils::user_data_utils::user_data_url;
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub struct CustomEmojiAPI { pub struct CustomEmojiAPI {
id: u64, id: u64,
userID: i64, userID: u64,
shortcut: String, shortcut: String,
url: String url: String,
} }
impl CustomEmojiAPI { impl CustomEmojiAPI {
/// Create a new Custom Emoji API entry /// Create a new Custom Emoji API entry
pub fn new(custom_emoji: &CustomEmoji) -> CustomEmojiAPI { pub fn new(custom_emoji: &CustomEmoji) -> CustomEmojiAPI {
CustomEmojiAPI { CustomEmojiAPI {
id: custom_emoji.id, id: custom_emoji.id,
userID: custom_emoji.user_id, userID: custom_emoji.user_id.id(),
shortcut: custom_emoji.shortcut.to_string(), shortcut: custom_emoji.shortcut.to_string(),
url: user_data_url(&custom_emoji.path), url: user_data_url(&custom_emoji.path),
} }
} }
} }

View File

@ -18,7 +18,7 @@ impl GlobalSearchResultAPI {
match res { match res {
GlobalSearchResult::User(user_id) => GlobalSearchResultAPI { GlobalSearchResult::User(user_id) => GlobalSearchResultAPI {
kind: "user".to_string(), kind: "user".to_string(),
id: user_id.clone() as u64, id: user_id.id(),
}, },
GlobalSearchResult::Group(group_id) => GlobalSearchResultAPI { GlobalSearchResult::Group(group_id) => GlobalSearchResultAPI {
kind: "group".to_string(), kind: "group".to_string(),

View File

@ -19,7 +19,7 @@ impl UnreadConversationAPI {
id: conv.id, id: conv.id,
conv_name: conv.name.clone().unwrap_or(String::new()), conv_name: conv.name.clone().unwrap_or(String::new()),
last_active: conv.last_active, last_active: conv.last_active,
userID: conv.user_id as u64, userID: conv.user_id.id(),
message: conv.message.clone() message: conv.message.clone()
} }
} }

View File

@ -16,7 +16,7 @@ impl FindUserByVirtualDirectoryAPIResult {
/// Construct a new `FindUserByVirtualDirectoryAPIResult` instance /// Construct a new `FindUserByVirtualDirectoryAPIResult` instance
pub fn new(user_id: UserID) -> FindUserByVirtualDirectoryAPIResult { pub fn new(user_id: UserID) -> FindUserByVirtualDirectoryAPIResult {
FindUserByVirtualDirectoryAPIResult { FindUserByVirtualDirectoryAPIResult {
userID: user_id as u64 userID: user_id.id()
} }
} }
} }

View File

@ -19,7 +19,7 @@ impl ResultFindVirtualDirectory {
match (user, group) { match (user, group) {
// User // User
(Ok(u), _) => ResultFindVirtualDirectory { kind: "user".to_string(), id: u.id as u64 }, (Ok(u), _) => ResultFindVirtualDirectory { kind: "user".to_string(), id: u.id.id() },
// Group // Group
(_, Ok(g)) => ResultFindVirtualDirectory { kind: "group".to_string(), id: g.id() }, (_, Ok(g)) => ResultFindVirtualDirectory { kind: "group".to_string(), id: g.id() },

View File

@ -3,18 +3,18 @@
//! @author Pierre Hubert //! @author Pierre Hubert
use serde::Serialize; use serde::Serialize;
use crate::data::user::{User, UserPageStatus, UserID};
use crate::helpers::{friends_helper, custom_emojies_helper, background_image_helper, likes_helper, user_helper};
use crate::data::error::ResultBoxError;
use crate::utils::user_data_utils::user_data_url;
use crate::data::user::AccountImageVisibility::{EVERYONE, COMUNIC_USERS};
use crate::api_data::custom_emoji::CustomEmojiAPI; use crate::api_data::custom_emoji::CustomEmojiAPI;
use crate::data::error::ResultBoxError;
use crate::data::user::{User, UserID, UserPageStatus};
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; use crate::helpers::likes_helper::LikeType;
use crate::utils::user_data_utils::user_data_url;
#[derive(Serialize)] #[derive(Serialize)]
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub struct APIUserInfo { pub struct APIUserInfo {
userID: i64, userID: u64,
firstName: String, firstName: String,
lastName: String, lastName: String,
publicPage: bool, publicPage: bool,
@ -46,16 +46,16 @@ struct APIAdvancedInfo {
impl APIUserInfo { impl APIUserInfo {
/// Construct a new API user instance. Note: `user_id` is the ID of the user who makes the /// Construct a new API user instance. Note: `user_id` is the ID of the user who makes the
/// requests, not the user whose we return information about! /// requests, not the user whose we return information about!
pub fn new(user_id: Option<UserID>, info: &User) -> ResultBoxError<APIUserInfo> { pub fn new(user_id: &Option<UserID>, info: &User) -> ResultBoxError<APIUserInfo> {
Ok(APIUserInfo { Ok(APIUserInfo {
userID: info.id, userID: info.id.id(),
firstName: info.first_name.to_string(), firstName: info.first_name.to_string(),
lastName: info.last_name.to_string(), lastName: info.last_name.to_string(),
publicPage: info.status != UserPageStatus::PRIVATE, publicPage: info.status != UserPageStatus::PRIVATE,
openPage: info.status == UserPageStatus::OPEN, openPage: info.status == UserPageStatus::OPEN,
virtualDirectory: info.virtual_directory.clone().unwrap_or(String::new()), virtualDirectory: info.virtual_directory.clone().unwrap_or(String::new()),
accountImage: APIUserInfo::get_account_image_url(user_id, info)?, accountImage: APIUserInfo::get_account_image_url(user_id, info)?,
customEmojis: custom_emojies_helper::get_list_user(info.id)? customEmojis: custom_emojies_helper::get_list_user(&info.id)?
.iter() .iter()
.map(|f| CustomEmojiAPI::new(f)) .map(|f| CustomEmojiAPI::new(f))
.collect(), .collect(),
@ -64,18 +64,18 @@ impl APIUserInfo {
} }
/// Get advanced user information /// Get advanced user information
pub fn new_advanced_info(user_id: Option<UserID>, info: &User) -> ResultBoxError<APIUserInfo> { pub fn new_advanced_info(user_id: &Option<UserID>, info: &User) -> ResultBoxError<APIUserInfo> {
let mut user = APIUserInfo::new(user_id, info)?; let mut user = APIUserInfo::new(&user_id, info)?;
let curr_user_id = user_id.unwrap_or(0); let curr_user_id = user_id.clone().unwrap_or(UserID::new(0));
let signed_in = user_id.is_some(); let signed_in = user_id.is_some();
// Check if we can return the number of friends of the user // Check if we can return the number of friends of the user
let number_friends = if info.public_friends_list || curr_user_id == info.id { let number_friends = if info.public_friends_list || curr_user_id == info.id {
friends_helper::count_friends(info.id)? friends_helper::count_friends(&info.id)?
} else { 0 }; } else { 0 };
let likes_page = if signed_in { let likes_page = if signed_in {
likes_helper::is_liking(curr_user_id, info.id as u64, LikeType::USER)? likes_helper::is_liking(&curr_user_id, info.id.id(), LikeType::USER)?
} else { false }; } else { false };
// Set advanced user information // Set advanced user information
@ -86,25 +86,25 @@ impl APIUserInfo {
noCommentOnHisPage: info.block_comments_on_his_page, noCommentOnHisPage: info.block_comments_on_his_page,
allowPostFromFriendOnHisPage: info.allow_posts_from_friends, allowPostFromFriendOnHisPage: info.allow_posts_from_friends,
account_creation_time: info.account_creation_time, account_creation_time: info.account_creation_time,
backgroundImage: background_image_helper::get_url(info.id), backgroundImage: background_image_helper::get_url(&info.id),
number_friends, number_friends,
pageLikes: likes_helper::count(info.id as u64, LikeType::USER)?, pageLikes: likes_helper::count(info.id.id(), LikeType::USER)?,
user_page_like: likes_page, user_page_like: likes_page,
can_post_texts: user_helper::can_create_posts(curr_user_id, info.id)? can_post_texts: user_helper::can_create_posts(&curr_user_id, &info.id)?,
}); });
Ok(user) Ok(user)
} }
/// Get the URL of a specific user account image /// Get the URL of a specific user account image
pub fn get_account_image_url(user_id: Option<UserID>, user: &User) -> ResultBoxError<String> { pub fn get_account_image_url(user_id: &Option<UserID>, user: &User) -> ResultBoxError<String> {
if !user.has_account_image() { if !user.has_account_image() {
return Ok(User::default_account_image_url()); return Ok(User::default_account_image_url());
} }
let user_account_image = Ok(user_data_url(user.account_image_path.as_ref().unwrap())); let user_account_image = Ok(user_data_url(user.account_image_path.as_ref().unwrap()));
if user.account_image_visibility == EVERYONE || user_id == Some(user.id) { if user.account_image_visibility == EVERYONE || user_id == &Some(user.id.clone()) {
return user_account_image; return user_account_image;
} }
@ -113,7 +113,7 @@ impl APIUserInfo {
} }
if user.account_image_visibility == COMUNIC_USERS || if user.account_image_visibility == COMUNIC_USERS ||
friends_helper::are_friend(user_id.unwrap(), user.id)? { friends_helper::are_friend(&user_id.clone().unwrap(), &user.id)? {
return user_account_image; return user_account_image;
} }

View File

@ -34,7 +34,7 @@ pub fn login_user(request: &mut HttpRequestHandler) -> RequestResult {
/// Sign out user /// Sign out user
pub fn logout_user(request: &mut HttpRequestHandler) -> RequestResult { pub fn logout_user(request: &mut HttpRequestHandler) -> RequestResult {
account_helper::destroy_login_tokens( account_helper::destroy_login_tokens(
request.user_id()?, &request.user_id()?,
request.api_client() request.api_client()
)?; )?;
@ -43,5 +43,5 @@ pub fn logout_user(request: &mut HttpRequestHandler) -> RequestResult {
/// Get current user ID /// Get current user ID
pub fn user_id(request: &mut HttpRequestHandler) -> RequestResult { pub fn user_id(request: &mut HttpRequestHandler) -> RequestResult {
request.set_response(CurrentUserID::new(request.user_id()?)) request.set_response(CurrentUserID::new(&request.user_id()?))
} }

View File

@ -15,13 +15,17 @@ use crate::controllers::routes::RequestResult;
use crate::data::http_request_handler::HttpRequestHandler; use crate::data::http_request_handler::HttpRequestHandler;
use crate::data::new_conversation::NewConversation; use crate::data::new_conversation::NewConversation;
use crate::data::new_conversation_message::NewConversationMessage; use crate::data::new_conversation_message::NewConversationMessage;
use crate::data::user::UserID;
use crate::helpers::{conversations_helper, user_helper}; use crate::helpers::{conversations_helper, user_helper};
use crate::utils::string_utils::remove_html_nodes; use crate::utils::string_utils::remove_html_nodes;
/// Create a new conversation /// Create a new conversation
pub fn create(r: &mut HttpRequestHandler) -> RequestResult { pub fn create(r: &mut HttpRequestHandler) -> RequestResult {
let name = r.post_string("name")?; let name = r.post_string("name")?;
let mut members = r.post_numbers_list("users", 1)?; let mut members = r.post_numbers_list("users", 1)?
.iter()
.map(|f| UserID::new(f.clone()))
.collect::<Vec<UserID>>();
// Adapt name // Adapt name
let name = match name.as_str() { let name = match name.as_str() {
@ -31,13 +35,13 @@ pub fn create(r: &mut HttpRequestHandler) -> RequestResult {
// Check if members exists // Check if members exists
for user in &members { for user in &members {
if !user_helper::exists(user.clone())? { if !user_helper::exists(user)? {
r.not_found(format!("User {} not found!", user))?; r.not_found(format!("User {} not found!", user.id()))?;
} }
} }
// Add current user ID if required // Add current user ID if required
let curr_user_id = r.user_id()? as i64; let curr_user_id = r.user_id()?;
if !members.contains(&curr_user_id) { if !members.contains(&curr_user_id) {
members.push(curr_user_id); members.push(curr_user_id);
} }
@ -57,7 +61,7 @@ pub fn create(r: &mut HttpRequestHandler) -> RequestResult {
/// Get the list of conversations of a user /// Get the list of conversations of a user
pub fn get_list(r: &mut HttpRequestHandler) -> RequestResult { pub fn get_list(r: &mut HttpRequestHandler) -> RequestResult {
let list = conversations_helper::get_list_user(r.user_id()?)?; let list = conversations_helper::get_list_user(&r.user_id()?)?;
r.set_response(list.iter().map(|c| ConversationAPI::new(c)).collect::<Vec<ConversationAPI>>()) r.set_response(list.iter().map(|c| ConversationAPI::new(c)).collect::<Vec<ConversationAPI>>())
} }
@ -65,7 +69,7 @@ pub fn get_list(r: &mut HttpRequestHandler) -> RequestResult {
/// Get information about a single conversation /// Get information about a single conversation
pub fn get_single(r: &mut HttpRequestHandler) -> RequestResult { pub fn get_single(r: &mut HttpRequestHandler) -> RequestResult {
let conversation_id = r.post_conv_id("conversationID")?; let conversation_id = r.post_conv_id("conversationID")?;
let conv = conversations_helper::get_single(conversation_id, r.user_id()?)?; let conv = conversations_helper::get_single(conversation_id, &r.user_id()?)?;
r.set_response(ConversationAPI::new(&conv)) r.set_response(ConversationAPI::new(&conv))
} }
@ -73,12 +77,12 @@ pub fn get_single(r: &mut HttpRequestHandler) -> RequestResult {
/// Update the settings of a conversation /// Update the settings of a conversation
pub fn update_settings(r: &mut HttpRequestHandler) -> RequestResult { pub fn update_settings(r: &mut HttpRequestHandler) -> RequestResult {
let conv_id = r.post_conv_id("conversationID")?; let conv_id = r.post_conv_id("conversationID")?;
let is_moderator = conversations_helper::is_user_moderator(r.user_id()?, conv_id)?; let is_moderator = conversations_helper::is_user_moderator(&r.user_id()?, conv_id)?;
// Update following state, if required // Update following state, if required
if r.has_post_parameter("following") { if r.has_post_parameter("following") {
conversations_helper::set_following( conversations_helper::set_following(
r.user_id()?, &r.user_id()?,
conv_id, conv_id,
r.post_bool("following")?, r.post_bool("following")?,
)?; )?;
@ -86,7 +90,11 @@ pub fn update_settings(r: &mut HttpRequestHandler) -> RequestResult {
// Update members list // Update members list
if r.has_post_parameter("members") { if r.has_post_parameter("members") {
let mut members = r.post_numbers_list("members", 1)?; let mut members = r.post_numbers_list("members", 1)?
.iter()
.map(|f| UserID::new(f.clone()))
.collect::<Vec<UserID>>();
let can_everyone_add_members = conversations_helper::can_everyone_add_members(conv_id)?; let can_everyone_add_members = conversations_helper::can_everyone_add_members(conv_id)?;
if !is_moderator && !can_everyone_add_members { if !is_moderator && !can_everyone_add_members {
@ -95,8 +103,8 @@ pub fn update_settings(r: &mut HttpRequestHandler) -> RequestResult {
// Check if the members of the conversation really exists // Check if the members of the conversation really exists
for member in &members { for member in &members {
if !user_helper::exists(member.clone())? { if !user_helper::exists(member)? {
r.not_found(format!("User {} not found!", member))?; r.not_found(format!("User {} not found!", member.id()))?;
} }
} }
@ -142,7 +150,7 @@ pub fn find_private(r: &mut HttpRequestHandler) -> RequestResult {
let allow_create = r.post_bool_opt("allowCreate", false); let allow_create = r.post_bool_opt("allowCreate", false);
// Query the database // Query the database
let mut list = conversations_helper::find_private(r.user_id()?, other_user)?; let mut list = conversations_helper::find_private(&r.user_id()?, &other_user)?;
if list.is_empty() { if list.is_empty() {
if !allow_create { if !allow_create {
@ -172,14 +180,14 @@ pub fn refresh_list(r: &mut HttpRequestHandler) -> RequestResult {
// Check for new conversations // Check for new conversations
if r.has_post_parameter("newConversations") { if r.has_post_parameter("newConversations") {
for conv_id in r.post_numbers_list("newConversations", 0)? { for conv_id in r.post_numbers_list("newConversations", 0)? {
if !conversations_helper::does_user_belongs_to(r.user_id()?, conv_id as u64)? { if !conversations_helper::does_user_belongs_to(&r.user_id()?, conv_id)? {
r.forbidden(format!("Your do not belongs to conversation {} !", conv_id))?; r.forbidden(format!("Your do not belongs to conversation {} !", conv_id))?;
} }
let list_conv = conversations_helper::get_last_messages(conv_id as u64, 10)?; let list_conv = conversations_helper::get_last_messages(conv_id , 10)?;
list.insert(conv_id as u64, list_conv); list.insert(conv_id as u64, list_conv);
conversations_helper::mark_user_seen(conv_id as u64, r.user_id()?)?; conversations_helper::mark_user_seen(conv_id as u64, &r.user_id()?)?;
} }
} }
@ -202,14 +210,14 @@ pub fn refresh_list(r: &mut HttpRequestHandler) -> RequestResult {
let last_message_id = v["last_message_id"].as_u64().unwrap_or(0); let last_message_id = v["last_message_id"].as_u64().unwrap_or(0);
// Check user rights // Check user rights
if !conversations_helper::does_user_belongs_to(r.user_id()?, conv_id)? { if !conversations_helper::does_user_belongs_to(&r.user_id()?, conv_id)? {
return r.forbidden(format!("You do not belong to conversation {}!", conv_id)); return r.forbidden(format!("You do not belong to conversation {}!", conv_id));
} }
let list_conv = conversations_helper::get_new_messages(conv_id, last_message_id)?; let list_conv = conversations_helper::get_new_messages(conv_id, last_message_id)?;
list.insert(conv_id, list_conv); list.insert(conv_id, list_conv);
conversations_helper::mark_user_seen(conv_id as u64, r.user_id()?)?; conversations_helper::mark_user_seen(conv_id as u64, &r.user_id()?)?;
} }
} }
@ -229,7 +237,7 @@ pub fn refresh_single(r: &mut HttpRequestHandler) -> RequestResult {
_ => conversations_helper::get_new_messages(conv_id, last_message_id)?, _ => conversations_helper::get_new_messages(conv_id, last_message_id)?,
}; };
conversations_helper::mark_user_seen(conv_id, r.user_id()?)?; conversations_helper::mark_user_seen(conv_id, &r.user_id()?)?;
r.set_response(ConversationMessageAPI::for_list(&messages)) r.set_response(ConversationMessageAPI::for_list(&messages))
} }
@ -279,14 +287,14 @@ pub fn send_message(r: &mut HttpRequestHandler) -> RequestResult {
/// Count the number of unread conversation of the user /// Count the number of unread conversation of the user
pub fn count_unread(r: &mut HttpRequestHandler) -> RequestResult { pub fn count_unread(r: &mut HttpRequestHandler) -> RequestResult {
let num = conversations_helper::count_unread_for_user(r.user_id()?)?; let num = conversations_helper::count_unread_for_user(&r.user_id()?)?;
r.set_response(ResultCountUnreadConversations::new(num)) r.set_response(ResultCountUnreadConversations::new(num))
} }
/// Get the list of unread conversations of a user /// Get the list of unread conversations of a user
pub fn list_unread(r: &mut HttpRequestHandler) -> RequestResult { pub fn list_unread(r: &mut HttpRequestHandler) -> RequestResult {
let list = conversations_helper::get_list_unread(r.user_id()?)?; let list = conversations_helper::get_list_unread(&r.user_id()?)?;
r.set_response(UnreadConversationAPI::for_list(&list)) r.set_response(UnreadConversationAPI::for_list(&list))
} }
@ -295,7 +303,7 @@ pub fn list_unread(r: &mut HttpRequestHandler) -> RequestResult {
pub fn delete_conversation(r: &mut HttpRequestHandler) -> RequestResult { pub fn delete_conversation(r: &mut HttpRequestHandler) -> RequestResult {
let conv_id = r.post_conv_id("conversationID")?; let conv_id = r.post_conv_id("conversationID")?;
conversations_helper::remove_user_from_conversation(r.user_id()?, conv_id)?; conversations_helper::remove_user_from_conversation(&r.user_id()?, conv_id)?;
r.success("The conversation has been deleted") r.success("The conversation has been deleted")
} }
@ -305,7 +313,7 @@ pub fn update_message(r: &mut HttpRequestHandler) -> RequestResult {
let msg_id = r.post_u64("messageID")?; let msg_id = r.post_u64("messageID")?;
let new_content = r.post_string_opt("content", 3, true)?; let new_content = r.post_string_opt("content", 3, true)?;
if !conversations_helper::is_message_owner(r.user_id()?, msg_id)? { if !conversations_helper::is_message_owner(&r.user_id()?, msg_id)? {
r.forbidden("You are not the owner of this message!".to_string())?; r.forbidden("You are not the owner of this message!".to_string())?;
} }
@ -318,7 +326,7 @@ pub fn update_message(r: &mut HttpRequestHandler) -> RequestResult {
pub fn delete_message(r: &mut HttpRequestHandler) -> RequestResult { pub fn delete_message(r: &mut HttpRequestHandler) -> RequestResult {
let msg_id = r.post_u64("messageID")?; let msg_id = r.post_u64("messageID")?;
if !conversations_helper::is_message_owner(r.user_id()?, msg_id)? { if !conversations_helper::is_message_owner(&r.user_id()?, msg_id)? {
r.forbidden("You are not the owner of this message!".to_string())?; r.forbidden("You are not the owner of this message!".to_string())?;
} }

View File

@ -13,7 +13,10 @@ pub fn search_user(r: &mut HttpRequestHandler) -> RequestResult {
let query = r.post_string_opt("query", 1, true)?; let query = r.post_string_opt("query", 1, true)?;
let limit = r.post_u64_opt("searchLimit", 5)?; let limit = r.post_u64_opt("searchLimit", 5)?;
let list = user_helper::search_user(&query, limit)?; let list = user_helper::search_user(&query, limit)?
.iter()
.map(|f| f.id())
.collect::<Vec<u64>>();
r.set_response(list) r.set_response(list)
} }

View File

@ -15,8 +15,8 @@ use crate::helpers::user_helper::find_user_by_id;
/// Get information about a single user /// Get information about a single user
pub fn get_single(request: &mut HttpRequestHandler) -> RequestResult { pub fn get_single(request: &mut HttpRequestHandler) -> RequestResult {
let user_id = request.post_i64("userID")?; let user_id = UserID::new(request.post_u64("userID")?);
let user = match user_helper::find_user_by_id(user_id) { let user = match user_helper::find_user_by_id(&user_id) {
Ok(user) => user, Ok(user) => user,
Err(e) => { Err(e) => {
println!("Error while getting user info: {}", e); println!("Error while getting user info: {}", e);
@ -25,22 +25,23 @@ pub fn get_single(request: &mut HttpRequestHandler) -> RequestResult {
} }
}; };
request.set_response(APIUserInfo::new(request.user_id_opt(), &user)?) request.set_response(APIUserInfo::new(&request.user_id_opt(), &user)?)
} }
/// Get information about several users /// Get information about several users
pub fn get_multiple(request: &mut HttpRequestHandler) -> RequestResult { pub fn get_multiple(request: &mut HttpRequestHandler) -> RequestResult {
let user_ids = request.post_numbers_list("usersID", 1)?; let user_ids = request.post_numbers_list("usersID", 1)?;
let mut map: HashMap<UserID, APIUserInfo> = HashMap::new(); let mut map: HashMap<u64, APIUserInfo> = HashMap::new();
for user_id in user_ids { for user_id in user_ids {
let user_id = UserID::new(user_id);
let user = request.ok_or_not_found( let user = request.ok_or_not_found(
find_user_by_id(user_id), find_user_by_id(&user_id),
"At least one user was not found!", "At least one user was not found!",
)?; )?;
map.insert(user_id, APIUserInfo::new(request.user_id_opt(), &user)?); map.insert(user_id.id(), APIUserInfo::new(&request.user_id_opt(), &user)?);
} }
request.set_response(map) request.set_response(map)
@ -50,10 +51,10 @@ pub fn get_multiple(request: &mut HttpRequestHandler) -> RequestResult {
pub fn get_advanced_info(request: &mut HttpRequestHandler) -> RequestResult { pub fn get_advanced_info(request: &mut HttpRequestHandler) -> RequestResult {
let user_id = request.post_user_id("userID")?; let user_id = request.post_user_id("userID")?;
if !user_helper::can_see_user_page(request.user_id_opt().unwrap_or(0), user_id)? { if !user_helper::can_see_user_page(&request.user_id_opt().unwrap_or(UserID::new(0)), &user_id)? {
request.forbidden("You are not allowed to see this user page!".to_string())?; request.forbidden("You are not allowed to see this user page!".to_string())?;
} }
let user = user_helper::find_user_by_id(user_id)?; let user = user_helper::find_user_by_id(&user_id)?;
request.set_response(APIUserInfo::new_advanced_info(request.user_id_opt(), &user)?) request.set_response(APIUserInfo::new_advanced_info(&request.user_id_opt(), &user)?)
} }

View File

@ -367,7 +367,7 @@ impl HttpRequestHandler {
/// Get user ID. This function assess that a user ID is available to continue /// Get user ID. This function assess that a user ID is available to continue
pub fn user_id(&self) -> ResultBoxError<UserID> { pub fn user_id(&self) -> ResultBoxError<UserID> {
match self.curr_user_id { match self.curr_user_id.clone() {
Some(s) => Ok(s), Some(s) => Ok(s),
None => Err(ExecError::boxed_new("Could not get required user ID!")) None => Err(ExecError::boxed_new("Could not get required user ID!"))
} }
@ -375,7 +375,7 @@ impl HttpRequestHandler {
/// Get a user ID, if available /// Get a user ID, if available
pub fn user_id_opt(&self) -> Option<UserID> { pub fn user_id_opt(&self) -> Option<UserID> {
self.curr_user_id self.curr_user_id.clone()
} }
/// Get an email included in the request /// Get an email included in the request
@ -390,7 +390,7 @@ impl HttpRequestHandler {
} }
/// Get a list of integers included in the request /// Get a list of integers included in the request
pub fn post_numbers_list(&mut self, name: &str, min_len: usize) -> ResultBoxError<Vec<i64>> { pub fn post_numbers_list(&mut self, name: &str, min_len: usize) -> ResultBoxError<Vec<u64>> {
let param = self.post_string_opt(name, min_len, min_len != 0)?; let param = self.post_string_opt(name, min_len, min_len != 0)?;
let mut list = vec![]; let mut list = vec![];
@ -399,7 +399,7 @@ impl HttpRequestHandler {
continue; continue;
} }
list.push(split.parse::<i64>()?); list.push(split.parse::<u64>()?);
} }
if list.len() < min_len { if list.len() < min_len {
@ -411,14 +411,14 @@ impl HttpRequestHandler {
/// Get the ID of a user included in a POST request /// Get the ID of a user included in a POST request
pub fn post_user_id(&mut self, name: &str) -> ResultBoxError<UserID> { pub fn post_user_id(&mut self, name: &str) -> ResultBoxError<UserID> {
let user_id = self.post_i64(name)?; let user_id = UserID::new(self.post_u64(name)?);
if user_id < 1 { if user_id.id() < 1 {
self.bad_request(format!("Invalid user specified in '{}'!", name))?; self.bad_request(format!("Invalid user specified in '{}'!", name))?;
} }
if !user_helper::exists(user_id)? { if !user_helper::exists(&user_id)? {
self.not_found(format!("User with ID {} not found!", user_id))?; self.not_found(format!("User with ID {} not found!", user_id.id()))?;
} }
Ok(user_id) Ok(user_id)
@ -444,7 +444,7 @@ impl HttpRequestHandler {
pub fn post_conv_id(&mut self, name: &str) -> ResultBoxError<u64> { pub fn post_conv_id(&mut self, name: &str) -> ResultBoxError<u64> {
let conv_id = self.post_u64(name)?; let conv_id = self.post_u64(name)?;
if !conversations_helper::does_user_belongs_to(self.user_id()?, conv_id)? { if !conversations_helper::does_user_belongs_to(&self.user_id()?, conv_id)? {
self.forbidden(format!("You do not belong to conversation {} !", conv_id))?; self.forbidden(format!("You do not belong to conversation {} !", conv_id))?;
} }

View File

@ -3,14 +3,31 @@ use crate::utils::user_data_utils::user_data_url;
///! User information ///! User information
///! ///!
///! @author Pierre Hubert ///! @author Pierre Hubert
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct UserID(u64);
pub type UserID = i64; impl UserID {
/// Initialize a new user ID object
pub fn new(id: u64) -> UserID {
UserID(id)
}
/// Get the current ID stored in this structure
pub fn id(&self) -> u64 {
self.0
}
/// Check if the ID currently stored in this structure is valid or not
pub fn is_valid(&self) -> bool {
self.0 > 0
}
}
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub enum UserPageStatus { pub enum UserPageStatus {
OPEN, OPEN,
PUBLIC, PUBLIC,
PRIVATE PRIVATE,
} }
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
@ -18,7 +35,7 @@ pub enum UserPageStatus {
pub enum AccountImageVisibility { pub enum AccountImageVisibility {
FRIENDS, FRIENDS,
COMUNIC_USERS, COMUNIC_USERS,
EVERYONE EVERYONE,
} }
#[derive(Debug)] #[derive(Debug)]
@ -41,7 +58,6 @@ pub struct User {
} }
impl User { impl User {
/// Get the URL pointing to the default account image /// Get the URL pointing to the default account image
pub fn default_account_image_url() -> String { pub fn default_account_image_url() -> String {
user_data_url(crate::constants::DEFAULT_ACCOUNT_IMAGE) user_data_url(crate::constants::DEFAULT_ACCOUNT_IMAGE)

View File

@ -25,14 +25,14 @@ pub fn login_user(email: &str, password: &str, client: &APIClient) -> ResultBoxE
} }
// Check if we already have a login token for this user // Check if we already have a login token for this user
if let Ok(token) = get_client_tokens(user.id, client) { if let Ok(token) = get_client_tokens(&user.id, client) {
return Ok(token.token); return Ok(token.token);
} }
// Create new login tokens // Create new login tokens
let new_token = UserAccessToken { let new_token = UserAccessToken {
user_id: user.id, user_id: user.id.clone(),
client_id: client.id, client_id: client.id,
token: rand_str(150), token: rand_str(150),
}; };
@ -40,7 +40,7 @@ pub fn login_user(email: &str, password: &str, client: &APIClient) -> ResultBoxE
// Save it // Save it
database::insert( database::insert(
InsertQuery::new(USER_ACCESS_TOKENS_TABLE) InsertQuery::new(USER_ACCESS_TOKENS_TABLE)
.add_i64("user_id", new_token.user_id) .add_user_id("user_id", &new_token.user_id)
.add_u32("service_id", client.id) .add_u32("service_id", client.id)
.add_str("token1", &new_token.token) .add_str("token1", &new_token.token)
.add_str("token2", "dummy_data") .add_str("token2", "dummy_data")
@ -50,14 +50,14 @@ pub fn login_user(email: &str, password: &str, client: &APIClient) -> ResultBoxE
} }
/// Get user login tokens /// Get user login tokens
fn get_client_tokens(user_id: UserID, client: &APIClient) -> ResultBoxError<UserAccessToken> { fn get_client_tokens(user_id: &UserID, client: &APIClient) -> ResultBoxError<UserAccessToken> {
database::query_row( database::query_row(
QueryInfo::new(USER_ACCESS_TOKENS_TABLE) QueryInfo::new(USER_ACCESS_TOKENS_TABLE)
.cond_i64("user_id", user_id) .cond_user_id("user_id", user_id)
.cond_u32("service_id", client.id), .cond_u32("service_id", client.id),
|res| { |res| {
Ok(UserAccessToken { Ok(UserAccessToken {
user_id: res.get_int64("user_id")?, user_id: res.get_user_id("user_id")?,
client_id: res.get_int64("service_id")? as u32, client_id: res.get_int64("service_id")? as u32,
token: res.get_str("token1")?, token: res.get_str("token1")?,
}) })
@ -72,16 +72,16 @@ pub fn get_user_by_login_token(token: &str, client: &APIClient) -> ResultBoxErro
.cond_u32("service_id", client.id) .cond_u32("service_id", client.id)
.cond("token1", token) .cond("token1", token)
.add_field("user_id"), .add_field("user_id"),
|res| res.get_int64("user_id"), |res| res.get_user_id("user_id"),
) )
} }
/// Destroy a given user login tokens /// Destroy a given user login tokens
pub fn destroy_login_tokens(id: UserID, client: &APIClient) -> ResultBoxError<()> { pub fn destroy_login_tokens(id: &UserID, client: &APIClient) -> ResultBoxError<()> {
database::delete(DeleteQuery::new(USER_ACCESS_TOKENS_TABLE) database::delete(DeleteQuery::new(USER_ACCESS_TOKENS_TABLE)
.cond_u32("service_id", client.id) .cond_u32("service_id", client.id)
.cond_i64("user_id", id) .cond_user_id("user_id", id)
)?; )?;
Ok(()) Ok(())

View File

@ -6,6 +6,6 @@
use crate::data::user::UserID; use crate::data::user::UserID;
use crate::utils::user_data_utils::user_data_url; use crate::utils::user_data_utils::user_data_url;
pub fn get_url(_user_id: UserID) -> String { pub fn get_url(_user_id: &UserID) -> String {
user_data_url("imgfond/0.jpg") user_data_url("imgfond/0.jpg")
} }

View File

@ -19,7 +19,7 @@ use crate::utils::user_data_utils::user_data_path;
pub fn create(conv: &NewConversation) -> ResultBoxError<u64> { pub fn create(conv: &NewConversation) -> ResultBoxError<u64> {
// Create the conversation in the main table // Create the conversation in the main table
let conv_id = InsertQuery::new(CONV_LIST_TABLE) let conv_id = InsertQuery::new(CONV_LIST_TABLE)
.add_user_id("user_id", conv.owner_id) .add_user_id("user_id", &conv.owner_id)
.add_str("name", conv.name.clone().unwrap_or(String::new()).as_str()) .add_str("name", conv.name.clone().unwrap_or(String::new()).as_str())
.add_u64("last_active", time()) .add_u64("last_active", time())
.add_u64("creation_time", time()) .add_u64("creation_time", time())
@ -34,14 +34,14 @@ pub fn create(conv: &NewConversation) -> ResultBoxError<u64> {
follow = conv.owner_following; follow = conv.owner_following;
} }
add_member(conv_id, member.clone(), follow)?; add_member(conv_id, member, follow)?;
} }
Ok(conv_id) Ok(conv_id)
} }
/// Add a member to a conversation /// Add a member to a conversation
pub fn add_member(conv_id: u64, user_id: UserID, following: bool) -> ResultBoxError<()> { pub fn add_member(conv_id: u64, user_id: &UserID, following: bool) -> ResultBoxError<()> {
InsertQuery::new(CONV_USERS_TABLE) InsertQuery::new(CONV_USERS_TABLE)
.add_u64("conv_id", conv_id) .add_u64("conv_id", conv_id)
.add_user_id("user_id", user_id) .add_user_id("user_id", user_id)
@ -54,7 +54,7 @@ pub fn add_member(conv_id: u64, user_id: UserID, following: bool) -> ResultBoxEr
} }
/// Remove a member from a conversation /// Remove a member from a conversation
pub fn remove_member(conv_id: u64, user_id: UserID) -> ResultBoxError<()> { pub fn remove_member(conv_id: u64, user_id: &UserID) -> ResultBoxError<()> {
database::DeleteQuery::new(CONV_USERS_TABLE) database::DeleteQuery::new(CONV_USERS_TABLE)
.cond_u64("conv_id", conv_id) .cond_u64("conv_id", conv_id)
.cond_user_id("user_id", user_id) .cond_user_id("user_id", user_id)
@ -62,7 +62,7 @@ pub fn remove_member(conv_id: u64, user_id: UserID) -> ResultBoxError<()> {
} }
/// Get the list of conversations of a specific user /// Get the list of conversations of a specific user
pub fn get_list_user(user_id: UserID) -> ResultBoxError<Vec<Conversation>> { pub fn get_list_user(user_id: &UserID) -> ResultBoxError<Vec<Conversation>> {
database::QueryInfo::new(CONV_LIST_TABLE) database::QueryInfo::new(CONV_LIST_TABLE)
.alias("l") .alias("l")
@ -85,7 +85,7 @@ pub fn get_list_user(user_id: UserID) -> ResultBoxError<Vec<Conversation>> {
} }
/// Get information about a single conversation /// Get information about a single conversation
pub fn get_single(conv_id: u64, user_id: UserID) -> ResultBoxError<Conversation> { pub fn get_single(conv_id: u64, user_id: &UserID) -> ResultBoxError<Conversation> {
// Tables // Tables
database::QueryInfo::new(CONV_LIST_TABLE) database::QueryInfo::new(CONV_LIST_TABLE)
.alias("l") .alias("l")
@ -112,7 +112,7 @@ pub fn get_list_members(conv_id: u64) -> ResultBoxError<Vec<UserID>> {
} }
/// Check if a user belongs to a conversation or not /// Check if a user belongs to a conversation or not
pub fn does_user_belongs_to(user_id: UserID, conv_id: u64) -> ResultBoxError<bool> { pub fn does_user_belongs_to(user_id: &UserID, conv_id: u64) -> ResultBoxError<bool> {
Ok(database::QueryInfo::new(CONV_USERS_TABLE) Ok(database::QueryInfo::new(CONV_USERS_TABLE)
.cond_u64("conv_id", conv_id) .cond_u64("conv_id", conv_id)
.cond_user_id("user_id", user_id) .cond_user_id("user_id", user_id)
@ -120,7 +120,7 @@ pub fn does_user_belongs_to(user_id: UserID, conv_id: u64) -> ResultBoxError<boo
} }
/// Check out wheter a user is the moderator of a conversation or not /// Check out wheter a user is the moderator of a conversation or not
pub fn is_user_moderator(user_id: UserID, conv_id: u64) -> ResultBoxError<bool> { pub fn is_user_moderator(user_id: &UserID, conv_id: u64) -> ResultBoxError<bool> {
Ok(database::QueryInfo::new(CONV_LIST_TABLE) Ok(database::QueryInfo::new(CONV_LIST_TABLE)
.cond_u64("id", conv_id) .cond_u64("id", conv_id)
.cond_user_id("user_id", user_id) .cond_user_id("user_id", user_id)
@ -136,7 +136,7 @@ pub fn can_everyone_add_members(conv_id: u64) -> ResultBoxError<bool> {
} }
/// Set whether a user is following a conversation or not /// Set whether a user is following a conversation or not
pub fn set_following(user_id: UserID, conv_id: u64, following: bool) -> ResultBoxError<()> { pub fn set_following(user_id: &UserID, conv_id: u64, following: bool) -> ResultBoxError<()> {
database::UpdateInfo::new(CONV_USERS_TABLE) database::UpdateInfo::new(CONV_USERS_TABLE)
.cond_u64("conv_id", conv_id) .cond_u64("conv_id", conv_id)
.cond_user_id("user_id", user_id) .cond_user_id("user_id", user_id)
@ -154,7 +154,7 @@ pub fn set_members(conv_id: u64, new_list: &Vec<UserID>, can_delete: bool) -> Re
continue; continue;
} }
add_member(conv_id, member.clone(), true)?; add_member(conv_id, member, true)?;
} }
// Remove a member // Remove a member
@ -163,7 +163,7 @@ pub fn set_members(conv_id: u64, new_list: &Vec<UserID>, can_delete: bool) -> Re
if new_list.contains(&member) { if new_list.contains(&member) {
continue; continue;
} }
remove_member(conv_id, member)?; remove_member(conv_id, &member)?;
} }
} }
@ -188,7 +188,7 @@ pub fn set_can_everyone_add_members(conv_id: u64, allow: bool) -> ResultBoxError
} }
/// Search for private conversation between two users /// Search for private conversation between two users
pub fn find_private(user_1: UserID, user_2: UserID) -> ResultBoxError<Vec<u64>> { pub fn find_private(user_1: &UserID, user_2: &UserID) -> ResultBoxError<Vec<u64>> {
database::QueryInfo::new(CONV_USERS_TABLE) database::QueryInfo::new(CONV_USERS_TABLE)
.alias("t1") .alias("t1")
@ -246,7 +246,7 @@ pub fn get_older_messages(conv_id: u64, start_id: u64, limit: u64) -> ResultBoxE
} }
/// Get all the messages of a single user for a conversation /// Get all the messages of a single user for a conversation
pub fn get_user_messages_for_conversations(conv_id: u64, user_id: UserID) -> ResultBoxError<Vec<ConversationMessage>> { pub fn get_user_messages_for_conversations(conv_id: u64, user_id: &UserID) -> ResultBoxError<Vec<ConversationMessage>> {
database::QueryInfo::new(CONV_MESSAGES_TABLE) database::QueryInfo::new(CONV_MESSAGES_TABLE)
.cond_u64("conv_id", conv_id) .cond_u64("conv_id", conv_id)
.cond_user_id("user_id", user_id) .cond_user_id("user_id", user_id)
@ -274,7 +274,7 @@ pub fn send_message(msg: &NewConversationMessage) -> ResultBoxError<()> {
// Insert the message in the database // Insert the message in the database
database::InsertQuery::new(CONV_MESSAGES_TABLE) database::InsertQuery::new(CONV_MESSAGES_TABLE)
.add_u64("conv_id", msg.conv_id) .add_u64("conv_id", msg.conv_id)
.add_user_id("user_id", msg.user_id) .add_user_id("user_id", &msg.user_id)
.add_u64("time_insert", t) .add_u64("time_insert", t)
.add_str("message", msg.message.as_str()) .add_str("message", msg.message.as_str())
.add_opt_str("image_path", msg.image_path.as_ref()) .add_opt_str("image_path", msg.image_path.as_ref())
@ -292,7 +292,7 @@ pub fn send_message(msg: &NewConversationMessage) -> ResultBoxError<()> {
.cond_legacy_bool("saw_last_message", true) .cond_legacy_bool("saw_last_message", true)
.custom_where("user_id != ?") .custom_where("user_id != ?")
.add_custom_where_arg_u64(msg.user_id as u64) .add_custom_where_arg_u64(msg.user_id.id())
.set_legacy_bool("saw_last_message", false) .set_legacy_bool("saw_last_message", false)
.exec()?; .exec()?;
@ -332,7 +332,7 @@ pub fn delete_message_by_id(id: u64) -> ResultBoxError<()> {
} }
/// Count the number of unread conversation for a specified user /// Count the number of unread conversation for a specified user
pub fn count_unread_for_user(user_id: UserID) -> ResultBoxError<usize> { pub fn count_unread_for_user(user_id: &UserID) -> ResultBoxError<usize> {
database::QueryInfo::new(CONV_USERS_TABLE) database::QueryInfo::new(CONV_USERS_TABLE)
.cond_user_id("user_id", user_id) .cond_user_id("user_id", user_id)
.cond_legacy_bool("saw_last_message", false) .cond_legacy_bool("saw_last_message", false)
@ -341,7 +341,7 @@ pub fn count_unread_for_user(user_id: UserID) -> ResultBoxError<usize> {
} }
/// Get the list of unread conversations of a user /// Get the list of unread conversations of a user
pub fn get_list_unread(user_id: UserID) -> ResultBoxError<Vec<UnreadConversation>> { pub fn get_list_unread(user_id: &UserID) -> ResultBoxError<Vec<UnreadConversation>> {
database::QueryInfo::new(CONV_USERS_TABLE) database::QueryInfo::new(CONV_USERS_TABLE)
.alias("users") .alias("users")
.join(CONV_LIST_TABLE, "list", "users.conv_id = list.id") .join(CONV_LIST_TABLE, "list", "users.conv_id = list.id")
@ -364,7 +364,7 @@ pub fn get_list_unread(user_id: UserID) -> ResultBoxError<Vec<UnreadConversation
} }
/// Indicate that a user has seen the last messages of a conversation /// Indicate that a user has seen the last messages of a conversation
pub fn mark_user_seen(conv_id: u64, user_id: UserID) -> ResultBoxError<()> { pub fn mark_user_seen(conv_id: u64, user_id: &UserID) -> ResultBoxError<()> {
database::UpdateInfo::new(CONV_USERS_TABLE) database::UpdateInfo::new(CONV_USERS_TABLE)
.cond_u64("conv_id", conv_id) .cond_u64("conv_id", conv_id)
.cond_user_id("user_id", user_id) .cond_user_id("user_id", user_id)
@ -374,7 +374,7 @@ pub fn mark_user_seen(conv_id: u64, user_id: UserID) -> ResultBoxError<()> {
} }
/// Remove a user from a conversation /// Remove a user from a conversation
pub fn remove_user_from_conversation(user_id: UserID, conv_id: u64) -> ResultBoxError<()> { pub fn remove_user_from_conversation(user_id: &UserID, conv_id: u64) -> ResultBoxError<()> {
if is_user_moderator(user_id, conv_id)? { if is_user_moderator(user_id, conv_id)? {
delete_conversation(conv_id) delete_conversation(conv_id)
} else { } else {
@ -403,7 +403,7 @@ pub fn delete_conversation(conv_id: u64) -> ResultBoxError<()> {
} }
/// Delete a conversation membership /// Delete a conversation membership
pub fn delete_member(user_id: UserID, conv_id: u64) -> ResultBoxError<()> { pub fn delete_member(user_id: &UserID, conv_id: u64) -> ResultBoxError<()> {
for msg in get_user_messages_for_conversations(conv_id, user_id)? { for msg in get_user_messages_for_conversations(conv_id, user_id)? {
delete_message(&msg)?; delete_message(&msg)?;
} }
@ -415,7 +415,7 @@ pub fn delete_member(user_id: UserID, conv_id: u64) -> ResultBoxError<()> {
} }
/// Check out whether a user is the owner of a message or not /// Check out whether a user is the owner of a message or not
pub fn is_message_owner(user_id: UserID, message_id: u64) -> ResultBoxError<bool> { pub fn is_message_owner(user_id: &UserID, message_id: u64) -> ResultBoxError<bool> {
database::QueryInfo::new(CONV_MESSAGES_TABLE) database::QueryInfo::new(CONV_MESSAGES_TABLE)
.cond_u64("id", message_id) .cond_u64("id", message_id)
.cond_user_id("user_id", user_id) .cond_user_id("user_id", user_id)

View File

@ -9,9 +9,9 @@ use crate::helpers::database;
use crate::constants::database_tables_names::EMOJIS_TABLE; use crate::constants::database_tables_names::EMOJIS_TABLE;
/// 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>> {
database::QueryInfo::new(EMOJIS_TABLE) database::QueryInfo::new(EMOJIS_TABLE)
.cond_i64("user_id", user_id) .cond_user_id("user_id", user_id)
.exec(db_to_custom_emoji) .exec(db_to_custom_emoji)
} }
@ -19,7 +19,7 @@ pub fn get_list_user(user_id: UserID) -> ResultBoxError<Vec<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_int64("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")?
}) })

View File

@ -138,8 +138,8 @@ impl QueryInfo {
self self
} }
pub fn cond_user_id(mut self, key: &str, val: UserID) -> QueryInfo { pub fn cond_user_id(mut self, key: &str, val: &UserID) -> QueryInfo {
self.conditions.insert(key.to_string(), val.to_string()); self.conditions.insert(key.to_string(), val.id().to_string());
self self
} }
@ -290,7 +290,7 @@ impl<'a> RowResult<'a> {
/// Get the ID of a user included in the request /// Get the ID of a user included in the request
pub fn get_user_id(&self, name: &str) -> ResultBoxError<UserID> { pub fn get_user_id(&self, name: &str) -> ResultBoxError<UserID> {
self.get_int64(name) Ok(UserID::new(self.get_u64(name)?))
} }
/// Get the ID of a group included in the response /// Get the ID of a group included in the response
@ -514,8 +514,8 @@ impl InsertQuery {
self self
} }
pub fn add_user_id(mut self, key: &str, value: UserID) -> InsertQuery { pub fn add_user_id(mut self, key: &str, value: &UserID) -> InsertQuery {
self.values.insert(key.to_string(), Value::from(value)); self.values.insert(key.to_string(), Value::from(value.id()));
self self
} }
@ -611,8 +611,8 @@ impl DeleteQuery {
self self
} }
pub fn cond_user_id(mut self, key: &str, value: UserID) -> DeleteQuery { pub fn cond_user_id(mut self, key: &str, value: &UserID) -> DeleteQuery {
self.conditions.insert(key.to_string(), Value::from(value)); self.conditions.insert(key.to_string(), Value::from(value.id()));
self self
} }
@ -666,8 +666,8 @@ impl UpdateInfo {
} }
/// Filter with a user id /// Filter with a user id
pub fn cond_user_id(mut self, name: &str, val: UserID) -> UpdateInfo { pub fn cond_user_id(mut self, name: &str, val: &UserID) -> UpdateInfo {
self.cond.insert(name.to_string(), Value::Int(val)); self.cond.insert(name.to_string(), Value::UInt(val.id()));
self self
} }

View File

@ -10,23 +10,23 @@ use crate::constants::database_tables_names::FRIENDS_TABLE;
use crate::helpers::database::QueryInfo; use crate::helpers::database::QueryInfo;
/// Check out whether two users are friend or not /// Check out whether two users are friend or not
pub fn are_friend(user_one: UserID, user_two: UserID) -> ResultBoxError<bool> { pub fn are_friend(user_one: &UserID, user_two: &UserID) -> ResultBoxError<bool> {
Ok(database::count(QueryInfo::new(FRIENDS_TABLE) Ok(database::count(QueryInfo::new(FRIENDS_TABLE)
.cond_i64("ID_personne", user_one) .cond_user_id("ID_personne", user_one)
.cond_i64("ID_amis", user_two) .cond_user_id("ID_amis", user_two)
.cond_i64("actif", 1))? > 0) .cond_i64("actif", 1))? > 0)
} }
/// Count the number of friends of a user /// Count the number of friends of a user
pub fn count_friends(user_id: UserID) -> ResultBoxError<usize> { pub fn count_friends(user_id: &UserID) -> ResultBoxError<usize> {
QueryInfo::new(FRIENDS_TABLE) QueryInfo::new(FRIENDS_TABLE)
.cond_i64("ID_amis", user_id) .cond_user_id("ID_amis", user_id)
.cond_u32("actif", 1) .cond_u32("actif", 1)
.exec_count() .exec_count()
} }
/// Check if a user can create posts on another friend's page /// Check if a user can create posts on another friend's page
pub fn can_post_texts(user_id: UserID, target_user: UserID) -> ResultBoxError<bool> { pub fn can_post_texts(user_id: &UserID, target_user: &UserID) -> ResultBoxError<bool> {
QueryInfo::new(FRIENDS_TABLE) QueryInfo::new(FRIENDS_TABLE)
.cond_user_id("ID_personne", target_user) .cond_user_id("ID_personne", target_user)
.cond_user_id("ID_amis", user_id) .cond_user_id("ID_amis", user_id)

View File

@ -97,7 +97,7 @@ pub fn create(group: &NewGroup) -> ResultBoxError<GroupID> {
// First, create the group // First, create the group
let group_id = database::InsertQuery::new(GROUPS_LIST_TABLE) let group_id = database::InsertQuery::new(GROUPS_LIST_TABLE)
.add_u64("time_create", time()) .add_u64("time_create", time())
.add_user_id("userid_create", group.owner_id) .add_user_id("userid_create", &group.owner_id)
.add_str("name", &group.name) .add_str("name", &group.name)
.insert()?.ok_or(ExecError::new("Could not get group ID!"))?; .insert()?.ok_or(ExecError::new("Could not get group ID!"))?;
let group_id = GroupID::new(group_id); let group_id = GroupID::new(group_id);
@ -105,7 +105,7 @@ pub fn create(group: &NewGroup) -> ResultBoxError<GroupID> {
// Insert first member // Insert first member
insert_member(&GroupMember { insert_member(&GroupMember {
id: 0, id: 0,
user_id: group.owner_id, user_id: group.owner_id.clone(),
group_id: group_id.clone(), group_id: group_id.clone(),
time_create: time(), time_create: time(),
level: GroupMembershipLevel::ADMINISTRATOR, level: GroupMembershipLevel::ADMINISTRATOR,
@ -119,7 +119,7 @@ pub fn create(group: &NewGroup) -> ResultBoxError<GroupID> {
pub fn insert_member(m: &GroupMember) -> ResultBoxError<()> { pub fn insert_member(m: &GroupMember) -> ResultBoxError<()> {
database::InsertQuery::new(GROUPS_MEMBERS_TABLE) database::InsertQuery::new(GROUPS_MEMBERS_TABLE)
.add_group_id("groups_id", &m.group_id) .add_group_id("groups_id", &m.group_id)
.add_user_id("user_id", m.user_id) .add_user_id("user_id", &m.user_id)
.add_u64("time_create", m.time_create) .add_u64("time_create", m.time_create)
.add_u32("level", m.level.to_db()) .add_u32("level", m.level.to_db())
.insert_drop_result() .insert_drop_result()
@ -129,7 +129,7 @@ pub fn insert_member(m: &GroupMember) -> ResultBoxError<()> {
pub fn get_list_user(user_id: UserID, only_followed: bool) -> ResultBoxError<Vec<GroupID>> { pub fn get_list_user(user_id: UserID, only_followed: bool) -> ResultBoxError<Vec<GroupID>> {
let mut query = database::QueryInfo::new(GROUPS_MEMBERS_TABLE) let mut query = database::QueryInfo::new(GROUPS_MEMBERS_TABLE)
.add_field("groups_id") .add_field("groups_id")
.cond_user_id("user_id", user_id); .cond_user_id("user_id", &user_id);
if only_followed { if only_followed {
query = query.cond_legacy_bool("following", true); query = query.cond_legacy_bool("following", true);
@ -176,7 +176,7 @@ pub fn search_group(query: &str, limit: u64) -> ResultBoxError<Vec<GroupID>> {
pub fn get_membership(group_id: &GroupID, user_id: Option<UserID>) -> ResultBoxError<GroupMember> { pub fn get_membership(group_id: &GroupID, user_id: Option<UserID>) -> ResultBoxError<GroupMember> {
let default_membership = GroupMember { let default_membership = GroupMember {
id: 0, id: 0,
user_id: 0, user_id: UserID::new(0),
group_id: group_id.clone(), group_id: group_id.clone(),
time_create: 0, time_create: 0,
level: GroupMembershipLevel::VISITOR, level: GroupMembershipLevel::VISITOR,
@ -191,7 +191,7 @@ pub fn get_membership(group_id: &GroupID, user_id: Option<UserID>) -> ResultBoxE
Ok(database::QueryInfo::new(GROUPS_MEMBERS_TABLE) Ok(database::QueryInfo::new(GROUPS_MEMBERS_TABLE)
.cond_group_id("groups_id", group_id) .cond_group_id("groups_id", group_id)
.cond_user_id("user_id", user_id) .cond_user_id("user_id", &user_id)
.query_row(db_to_group_member) .query_row(db_to_group_member)
.unwrap_or(default_membership)) .unwrap_or(default_membership))
} }
@ -203,7 +203,7 @@ pub fn get_membership_level(group_id: &GroupID, user_id: Option<UserID>) -> Resu
Some(user_id) => { Some(user_id) => {
let level = database::QueryInfo::new(GROUPS_MEMBERS_TABLE) let level = database::QueryInfo::new(GROUPS_MEMBERS_TABLE)
.cond_group_id("groups_id", group_id) .cond_group_id("groups_id", group_id)
.cond_user_id("user_id", user_id) .cond_user_id("user_id", &user_id)
.add_field("level") .add_field("level")
.query_row(|f| f.get_u32("level")) .query_row(|f| f.get_u32("level"))
.unwrap_or(GroupMembershipLevel::VISITOR.to_db()); .unwrap_or(GroupMembershipLevel::VISITOR.to_db());

View File

@ -36,14 +36,14 @@ pub fn count(id: u64, kind: LikeType) -> ResultBoxError<usize> {
} }
/// Check if a user likes an element or not /// Check if a user likes an element or not
pub fn is_liking(user_id: UserID, id: u64, kind: LikeType) -> ResultBoxError<bool> { pub fn is_liking(user_id: &UserID, id: u64, kind: LikeType) -> ResultBoxError<bool> {
if user_id == 0 { if !user_id.is_valid() {
return Ok(false); return Ok(false);
} }
Ok(QueryInfo::new(LIKES_TABLE) Ok(QueryInfo::new(LIKES_TABLE)
.cond_u64("ID_type", id) .cond_u64("ID_type", id)
.cond_i64("ID_personne", user_id) .cond_user_id("ID_personne", user_id)
.cond("type", kind.to_db_type().as_ref()) .cond("type", kind.to_db_type().as_ref())
.exec_count()? > 0) .exec_count()? > 0)
} }

View File

@ -10,9 +10,9 @@ use crate::helpers::friends_helper::are_friend;
/// @author Pierre Hubert /// @author Pierre Hubert
/// Get & return information about a user based on its ID /// Get & return information about a user based on its ID
pub fn find_user_by_id(id: UserID) -> ResultBoxError<User> { pub fn find_user_by_id(id: &UserID) -> ResultBoxError<User> {
exec_get_user_query( exec_get_user_query(
database::QueryInfo::new(USERS_TABLE).cond_i64("ID", id)) database::QueryInfo::new(USERS_TABLE).cond_user_id("ID", id))
} }
/// Get & return information about a user based on his email /// Get & return information about a user based on his email
@ -49,7 +49,7 @@ fn exec_get_user_query(query: database::QueryInfo) -> ResultBoxError<User> {
}; };
Ok(User { Ok(User {
id: res.get_int64("ID")?, id: res.get_user_id("ID")?,
email: res.get_str("mail")?, email: res.get_str("mail")?,
password: res.get_str("password")?, password: res.get_str("password")?,
first_name: res.get_str("prenom")?, first_name: res.get_str("prenom")?,
@ -69,14 +69,14 @@ fn exec_get_user_query(query: database::QueryInfo) -> ResultBoxError<User> {
} }
/// Check out whether a given id maps to a user or not /// Check out whether a given id maps to a user or not
pub fn exists(id: UserID) -> ResultBoxError<bool> { pub fn exists(id: &UserID) -> ResultBoxError<bool> {
Ok(database::QueryInfo::new(USERS_TABLE) Ok(database::QueryInfo::new(USERS_TABLE)
.cond_i64("ID", id) .cond_user_id("ID", id)
.exec_count()? > 0) .exec_count()? > 0)
} }
/// Check if a given user can see another user's page /// Check if a given user can see another user's page
pub fn can_see_user_page(user_id: UserID, target_user: UserID) -> ResultBoxError<bool> { pub fn can_see_user_page(user_id: &UserID, target_user: &UserID) -> ResultBoxError<bool> {
if user_id == target_user { if user_id == target_user {
return Ok(true); return Ok(true);
} }
@ -89,7 +89,7 @@ pub fn can_see_user_page(user_id: UserID, target_user: UserID) -> ResultBoxError
} }
// The user need to be signed in // The user need to be signed in
if user_id <= 0 { if user_id.id() <= 0 {
return Ok(false); return Ok(false);
} }
@ -107,15 +107,15 @@ pub fn can_see_user_page(user_id: UserID, target_user: UserID) -> ResultBoxError
} }
/// Check out whether a user allow posts on his page or not /// Check out whether a user allow posts on his page or not
pub fn allow_posts_on_his_page(user_id: UserID) -> ResultBoxError<bool> { pub fn allow_posts_on_his_page(user_id: &UserID) -> ResultBoxError<bool> {
Ok(find_user_by_id(user_id)?.allow_posts_from_friends) Ok(find_user_by_id(user_id)?.allow_posts_from_friends)
} }
/// Check out if a user can create posts on another user page /// Check out if a user can create posts on another user page
pub fn can_create_posts(user_id: UserID, target_id: UserID) -> ResultBoxError<bool> { pub fn can_create_posts(user_id: &UserID, target_id: &UserID) -> ResultBoxError<bool> {
// Login required // Login required
if user_id <= 0 { if !user_id.is_valid() {
return Ok(false); return Ok(false);
} }

View File

@ -28,7 +28,7 @@ pub fn user_data_path(uri: &Path) -> PathBuf {
/// This function returns the relative folder path in user data directory where the file can be /// This function returns the relative folder path in user data directory where the file can be
/// created /// created
pub fn prepare_file_creation(user_id: UserID, folder: &str) -> ResultBoxError<PathBuf> { pub fn prepare_file_creation(user_id: UserID, folder: &str) -> ResultBoxError<PathBuf> {
let subfolder = match user_id { let subfolder = match user_id.id() {
0 => Path::new(folder).to_path_buf(), 0 => Path::new(folder).to_path_buf(),
id => Path::new(folder).join(to_string(&id)?) id => Path::new(folder).join(to_string(&id)?)
}; };