//! # Groups helper //! //! @author Pierre Hubert use crate::constants::database_tables_names::{GROUPS_LIST_TABLE, GROUPS_MEMBERS_TABLE}; use crate::data::error::{ExecError, ResultBoxError}; use crate::data::group::GroupVisibilityLevel; use crate::data::group_id::GroupID; use crate::data::group_member::{GroupMember, GroupMembershipLevel}; use crate::data::new_group::NewGroup; use crate::helpers::database; use crate::utils::date_utils::time; impl GroupVisibilityLevel { pub fn to_db(&self) -> u64 { match self { GroupVisibilityLevel::OPEN_GROUP => 0, GroupVisibilityLevel::PRIVATE_GROUP => 1, GroupVisibilityLevel::SECRETE_GROUP => 2, } } } impl GroupMembershipLevel { pub fn to_db(&self) -> u32 { match self { GroupMembershipLevel::ADMINISTRATOR => 0, GroupMembershipLevel::MODERATOR => 1, GroupMembershipLevel::MEMBER => 2, GroupMembershipLevel::INVITED => 3, GroupMembershipLevel::PENDING => 4, GroupMembershipLevel::VISITOR => 5, } } } /// Create a new group. Returns the ID of the new group pub fn create(group: &NewGroup) -> ResultBoxError { // First, create the group let group_id = database::InsertQuery::new(GROUPS_LIST_TABLE) .add_u64("time_create", time()) .add_user_id("userid_create", group.owner_id) .add_str("name", &group.name) .insert()?.ok_or(ExecError::new("Could not get group ID!"))?; let group_id = GroupID::new(group_id); // Insert first member insert_member(&GroupMember { id: 0, user_id: group.owner_id, group_id: group_id.clone(), time_create: time(), level: GroupMembershipLevel::ADMINISTRATOR, following: true, })?; Ok(group_id) } /// Insert a new group into the database pub fn insert_member(m: &GroupMember) -> ResultBoxError<()> { database::InsertQuery::new(GROUPS_MEMBERS_TABLE) .add_group_id("groups_id", &m.group_id) .add_user_id("user_id", m.user_id) .add_u64("time_create", m.time_create) .add_u32("level", m.level.to_db()) .insert_drop_result() } /// Find a group id by virtual directory pub fn find_by_virtual_directory(dir: &str) -> ResultBoxError { database::QueryInfo::new(GROUPS_LIST_TABLE) .cond("virtual_directory", dir) .add_field("id") .query_row(|res| res.get_group_id("id")) } /// Search for group pub fn search_group(query: &str, limit: u64) -> ResultBoxError> { database::QueryInfo::new(GROUPS_LIST_TABLE) .set_custom_where("name LIKE ? AND visibility != ?") .add_custom_where_argument_str(format!("%{}%", query).as_str()) .add_custom_where_argument_u64(GroupVisibilityLevel::SECRETE_GROUP.to_db()) .set_limit(limit) .add_field("id") .exec(|row| row.get_group_id("id")) }