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:
@ -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