1
0
mirror of https://gitlab.com/comunic/comunicapiv2 synced 2025-06-20 00:25:17 +00:00

Implement groups visibility system

This commit is contained in:
2019-12-13 18:30:08 +01:00
parent ee6579efa0
commit af9e95a914
6 changed files with 187 additions and 0 deletions

View File

@ -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;
}
}