mirror of
				https://gitlab.com/comunic/comunicapiv3
				synced 2025-10-31 07:34:45 +00:00 
			
		
		
		
	Can delete group members
This commit is contained in:
		| @@ -245,5 +245,27 @@ pub fn cancel_request(r: &mut HttpRequestHandler) -> RequestResult { | ||||
|  | ||||
| /// Remove a member from a group (as a moderator or an admin) | ||||
| pub fn delete_member(r: &mut HttpRequestHandler) -> RequestResult { | ||||
|     r.success("Implement me") | ||||
|     let group_id = r.post_group_id_with_access("groupID", GroupAccessLevel::MODERATOR_ACCESS)?; | ||||
|  | ||||
|     // Get the membership of the user making the request | ||||
|     let curr_user_membership = groups_helper::get_membership(&group_id, r.user_id_opt())?; | ||||
|  | ||||
|     // Get information about the member to delete | ||||
|     let user_id = r.post_user_id("userID")?; | ||||
|     let membership = groups_helper::get_membership(&group_id, Some(user_id.clone()))?; | ||||
|  | ||||
|     if user_id == r.user_id()? && groups_helper::is_last_admin(&group_id, &r.user_id()?)? { | ||||
|         r.forbidden("You are the last administrator of this group!".to_string())?; | ||||
|     } | ||||
|  | ||||
|     // Only administrator can delete members that are more than members (moderators & administrators) | ||||
|     if membership.level < GroupMembershipLevel::MEMBER && curr_user_membership.level != GroupMembershipLevel::ADMINISTRATOR { | ||||
|         r.forbidden("Only administrators can delete this membership!".to_string())?; | ||||
|     } | ||||
|  | ||||
|     groups_helper::delete_member(&group_id, &user_id)?; | ||||
|  | ||||
|     // TODO : Delete related notifications | ||||
|  | ||||
|     r.success("Membership of the user has been successfully deleted!") | ||||
| } | ||||
| @@ -2,17 +2,21 @@ | ||||
| //! | ||||
| //! @author Pierre Hubert | ||||
|  | ||||
| use crate::data::user::UserID; | ||||
| use crate::data::group_id::GroupID; | ||||
| use crate::data::user::UserID; | ||||
|  | ||||
| #[derive(PartialEq, Eq)] | ||||
| #[derive(PartialEq, Eq, PartialOrd)] | ||||
| pub enum GroupMembershipLevel { | ||||
|     ADMINISTRATOR = 0, | ||||
|     MODERATOR = 1, | ||||
|     MEMBER = 2, | ||||
|     INVITED = 3, | ||||
|     PENDING = 4, //When the group membership has not been approved yet | ||||
|     VISITOR = 5, //Simple visit | ||||
|  | ||||
|     // When the group membership has not been approved yet | ||||
|     PENDING = 4, | ||||
|  | ||||
|     // Simple visit | ||||
|     VISITOR = 5, | ||||
| } | ||||
|  | ||||
| impl GroupMembershipLevel { | ||||
| @@ -34,5 +38,19 @@ pub struct GroupMember { | ||||
|     pub group_id: GroupID, | ||||
|     pub time_create: u64, | ||||
|     pub level: GroupMembershipLevel, | ||||
|     pub following: bool | ||||
|     pub following: bool, | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use crate::data::group_member::GroupMembershipLevel; | ||||
|  | ||||
|     #[test] | ||||
|     fn membership_level_coherence() { | ||||
|         assert!(GroupMembershipLevel::ADMINISTRATOR < GroupMembershipLevel::MODERATOR); | ||||
|         assert!(GroupMembershipLevel::MODERATOR < GroupMembershipLevel::MEMBER); | ||||
|         assert!(GroupMembershipLevel::MEMBER < GroupMembershipLevel::INVITED); | ||||
|         assert!(GroupMembershipLevel::INVITED < GroupMembershipLevel::PENDING); | ||||
|         assert!(GroupMembershipLevel::PENDING < GroupMembershipLevel::VISITOR); | ||||
|     } | ||||
| } | ||||
| @@ -297,6 +297,20 @@ pub fn count_members(group_id: &GroupID) -> ResultBoxError<usize> { | ||||
|         .exec_count() | ||||
| } | ||||
|  | ||||
| /// Count the number of group's members at a specific level | ||||
| pub fn count_members_at_level(group_id: &GroupID, level: GroupMembershipLevel) -> ResultBoxError<usize> { | ||||
|     database::QueryInfo::new(GROUPS_MEMBERS_TABLE) | ||||
|         .cond_group_id("groups_id", group_id) | ||||
|         .cond_u32("level", level.to_db()) | ||||
|         .exec_count() | ||||
| } | ||||
|  | ||||
| /// Check out whether a user is the last administrator of a group | ||||
| pub fn is_last_admin(group_id: &GroupID, user_id: &UserID) -> ResultBoxError<bool> { | ||||
|     Ok(get_membership_level(group_id, Some(user_id.clone()))? == GroupMembershipLevel::ADMINISTRATOR && | ||||
|         count_members_at_level(&group_id, GroupMembershipLevel::ADMINISTRATOR)? == 1) | ||||
| } | ||||
|  | ||||
| /// Check the availability of a virtual directory for a group | ||||
| pub fn check_directory_availability(dir: &str, group_id: Option<GroupID>) -> ResultBoxError<bool> { | ||||
|     let group = find_by_virtual_directory(dir); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user