import { RequestHandler } from "../entities/RequestHandler"; import { GroupsHelper } from "../helpers/GroupsHelper"; import { GroupsAccessLevel, GroupInfo, GroupVisibilityLevel, GroupPostsCreationLevel, GroupRegistrationLevel } from "../entities/Group"; import { GroupMembershipLevels } from "../entities/GroupMember"; import { time } from "../utils/DateUtils"; /** * Groups API controller * * @author Pierre HUBERT */ /** * API groups registration levels */ const GROUPS_REGISTRATION_LEVELS = []; GROUPS_REGISTRATION_LEVELS[GroupRegistrationLevel.OPEN_REGISTRATION] = "open"; GROUPS_REGISTRATION_LEVELS[GroupRegistrationLevel.MODERATED_REGISTRATION] = "moderated"; GROUPS_REGISTRATION_LEVELS[GroupRegistrationLevel.CLOSED_REGISTRATION] = "closed"; /** * API groups membership levels */ const GROUPS_MEMBERSHIP_LEVELS = []; GROUPS_MEMBERSHIP_LEVELS[GroupMembershipLevels.ADMINISTRATOR] = "administrator"; GROUPS_MEMBERSHIP_LEVELS[GroupMembershipLevels.MODERATOR] = "moderator"; GROUPS_MEMBERSHIP_LEVELS[GroupMembershipLevels.MEMBER] = "member"; GROUPS_MEMBERSHIP_LEVELS[GroupMembershipLevels.INVITED] = "invited"; GROUPS_MEMBERSHIP_LEVELS[GroupMembershipLevels.PENDING] = "pending"; GROUPS_MEMBERSHIP_LEVELS[GroupMembershipLevels.VISITOR] = "visitor"; /** * API groups visibility levels */ const GROUPS_VISIBILITY_LEVELS = []; GROUPS_VISIBILITY_LEVELS[GroupVisibilityLevel.OPEN_GROUP] = "open"; GROUPS_VISIBILITY_LEVELS[GroupVisibilityLevel.PRIVATE_GROUP] = "private"; GROUPS_VISIBILITY_LEVELS[GroupVisibilityLevel.SECRETE_GROUP] = "secrete"; /** * API posts creation levels */ const GROUPS_POSTS_LEVELS = []; GROUPS_POSTS_LEVELS[GroupPostsCreationLevel.POSTS_LEVEL_MODERATORS] = "moderators"; GROUPS_POSTS_LEVELS[GroupPostsCreationLevel.POSTS_LEVEL_ALL_MEMBERS] = "members"; export class GroupsController { /** * Create a new group * * @param h Request handler */ public static async Create(h: RequestHandler) { const name = h.postString("name", 3); const groupID = await GroupsHelper.Create({ name: name, userID: h.getUserId(), timeCreate: time() }); h.send({ success: "The group has been successfully created!", id: groupID }); } /** * Get the list of groups of the user * * @param h Request handler */ public static async GetListUser(h: RequestHandler) { h.send(await GroupsHelper.GetListUser(h.getUserId())); } /** * Get information about a single group * * @param h Request handler */ public static async GetInfoSingle(h: RequestHandler) { const groupID = await h.postGroupIDWithAccess("id", GroupsAccessLevel.LIMITED_ACCESS); const groupInfo = await GroupsHelper.GetInfo(groupID); h.send(await this.GroupInfoToAPI(groupInfo, h)); } /** * Get information about multiple users * * @param h Request handler */ public static async GetInfoMultiple(h: RequestHandler) { const ids = h.postNumbersList("list"); const result = {}; for (const id of ids) { // Check group existence & user authorization if(!await GroupsHelper.Exists(id) || await GroupsHelper.GetAccessLevel(id, h.getUserId()) < GroupsAccessLevel.LIMITED_ACCESS) h.error(404, "Group " + id + " not found"); const group = await GroupsHelper.GetInfo(id); result[id] = await this.GroupInfoToAPI(group, h); } h.send(result); } /** * Get advanced information about a group * * @param h Request handler */ public static async GetAdvancedInfo(h: RequestHandler) { const groupID = await h.postGroupIDWithAccess("id", GroupsAccessLevel.VIEW_ACCESS); const group = await GroupsHelper.GetInfo(groupID); h.send(await this.GroupInfoToAPI(group, h)); } /** * Turn a GroupInfo object into a valid API object * * @param info Information about the group * @returns Generated object */ private static async GroupInfoToAPI(info: GroupInfo, h: RequestHandler) : Promise { const membership = await GroupsHelper.GetMembershipInfo(info.id, h.getUserId()) return { id: info.id, name: info.name, icon_url: info.logoURL, number_members: info.membersCount, visibility: GROUPS_VISIBILITY_LEVELS[info.visiblity], registration_level: GROUPS_REGISTRATION_LEVELS[info.registrationLevel], posts_level: GROUPS_POSTS_LEVELS[info.postsCreationLevel], virtual_directory: info.virtualDirectory ? info.virtualDirectory : "null", membership: GROUPS_MEMBERSHIP_LEVELS[membership ? membership.level : GroupMembershipLevels.VISITOR], following: membership ? membership.following : false } } }