mirror of
https://gitlab.com/comunic/comunicapiv3
synced 2025-02-07 09:47:04 +00:00
87 lines
2.9 KiB
Rust
87 lines
2.9 KiB
Rust
//! # 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<GroupID> {
|
|
// 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<GroupID> {
|
|
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<Vec<GroupID>> {
|
|
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"))
|
|
} |