mirror of
				https://gitlab.com/comunic/comunicapiv2
				synced 2025-11-04 03:24:04 +00:00 
			
		
		
		
	Implement groups visibility system
This commit is contained in:
		@@ -1,4 +1,6 @@
 | 
			
		||||
import { DatabaseHelper } from "./DatabaseHelper";
 | 
			
		||||
import { GroupsAccessLevel, GroupVisibilityLevel } from "../entities/Group";
 | 
			
		||||
import { GroupMembershipLevels } from "../entities/GroupMember";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Groups helper
 | 
			
		||||
@@ -11,6 +13,20 @@ const GROUPS_MEMBERS_TABLE = "comunic_groups_members";
 | 
			
		||||
 | 
			
		||||
export class GroupsHelper {
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Check out whether a group exists or not
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param groupID Target group ID
 | 
			
		||||
	 */
 | 
			
		||||
	public static async Exists(groupID: number) : Promise<boolean> {
 | 
			
		||||
		return await DatabaseHelper.Count({
 | 
			
		||||
			table: GROUPS_LIST_TABLE,
 | 
			
		||||
			where: {
 | 
			
		||||
				id: groupID
 | 
			
		||||
			}
 | 
			
		||||
		}) > 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Get the list of groups of a user
 | 
			
		||||
	 * 
 | 
			
		||||
@@ -28,4 +44,86 @@ export class GroupsHelper {
 | 
			
		||||
		return list.map(e => e.groups_id);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Get the visibility level of a group
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param groupID Target group ID
 | 
			
		||||
	 */
 | 
			
		||||
	public static async GetVisibility(groupID: number) : Promise<GroupVisibilityLevel> {
 | 
			
		||||
		const result = await DatabaseHelper.QueryRow({
 | 
			
		||||
			table: GROUPS_LIST_TABLE,
 | 
			
		||||
			where: {
 | 
			
		||||
				id: groupID
 | 
			
		||||
			},
 | 
			
		||||
			fields: ["visibility"]
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		if(result == null)
 | 
			
		||||
			throw Error("Group " + groupID + " does not exists!");
 | 
			
		||||
		
 | 
			
		||||
		return result.visibility;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Get the membership level of a user for a group
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param groupID The ID of target group
 | 
			
		||||
	 * @param userID The ID of target user
 | 
			
		||||
	 */
 | 
			
		||||
	public static async GetMembershipLevel(groupID: number, userID: number) : Promise<GroupMembershipLevels> {
 | 
			
		||||
		const result = await DatabaseHelper.Query({
 | 
			
		||||
			table: GROUPS_MEMBERS_TABLE,
 | 
			
		||||
			where: {
 | 
			
		||||
				groups_id: groupID,
 | 
			
		||||
				user_id: userID
 | 
			
		||||
			},
 | 
			
		||||
			fields: ["level"]
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		// If user has no membership
 | 
			
		||||
		if(result.length == 0)
 | 
			
		||||
			return GroupMembershipLevels.VISITOR;
 | 
			
		||||
		
 | 
			
		||||
		return result[0].level;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Get the current access of a user to a group
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param groupID The ID of the target group
 | 
			
		||||
	 * @param userID The ID of the target user
 | 
			
		||||
	 */
 | 
			
		||||
	public static async GetAccessLevel(groupID: number, userID: number) : Promise<GroupsAccessLevel> {
 | 
			
		||||
 | 
			
		||||
		const membershipLevel = 
 | 
			
		||||
			userID > 0 ? await this.GetMembershipLevel(userID, groupID) : GroupMembershipLevels.VISITOR;
 | 
			
		||||
		
 | 
			
		||||
		//Check if the user is a confirmed member of group
 | 
			
		||||
		if(membershipLevel == GroupMembershipLevels.ADMINISTRATOR)
 | 
			
		||||
			return GroupsAccessLevel.ADMIN_ACCESS;
 | 
			
		||||
		if(membershipLevel == GroupMembershipLevels.MODERATOR)
 | 
			
		||||
			return GroupsAccessLevel.MODERATOR_ACCESS;
 | 
			
		||||
		if(membershipLevel == GroupMembershipLevels.MEMBER)
 | 
			
		||||
			return GroupsAccessLevel.MEMBER_ACCESS;
 | 
			
		||||
		
 | 
			
		||||
		const groupVisibilityLevel = await this.GetVisibility(groupID);
 | 
			
		||||
 | 
			
		||||
		//If the group is open, everyone has view access
 | 
			
		||||
		if(groupVisibilityLevel == GroupVisibilityLevel.OPEN_GROUP)
 | 
			
		||||
			return GroupsAccessLevel.VIEW_ACCESS;
 | 
			
		||||
		
 | 
			
		||||
		//Else, all pending and invited membership get limited access
 | 
			
		||||
		if(membershipLevel == GroupMembershipLevels.PENDING ||
 | 
			
		||||
			membershipLevel == GroupMembershipLevels.INVITED)
 | 
			
		||||
			return GroupsAccessLevel.LIMITED_ACCESS;
 | 
			
		||||
		
 | 
			
		||||
		//Private groups gives limited access
 | 
			
		||||
		if(groupVisibilityLevel == GroupVisibilityLevel.PRIVATE_GROUP)
 | 
			
		||||
			return GroupsAccessLevel.LIMITED_ACCESS;
 | 
			
		||||
 | 
			
		||||
		// Else the user can not see the group
 | 
			
		||||
		// Especially in the case of secret groupe
 | 
			
		||||
		return GroupsAccessLevel.NO_ACCESS;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user