public async Task <bool> UserCanInForum(int forumId, VBUserGroup userGroup, VBForumFlags flags) { // Since we only check if the user has permission, writing and tracking is never required here var forum = await GetForumsQuery().FirstOrDefaultAsync(f => f.Id == forumId); var highestPermission = FetchHighestPermissionFlagForUser(forum, userGroup); return(highestPermission.HasFlag(flags)); }
public async Task <List <VBForum> > GetCategoriesWhereUserCanAsync(VBUserGroup userGroup, VBForumFlags flags = VBForumFlags.CanViewForum | VBForumFlags.CanViewThreads) { var forums = await GetForumsWhereUserCanAsync(userGroup, flags); var categories = forums.Where(f => f.ParentId == -1) .ToList(); return(categories); }
public async Task <List <VBForum> > GetForumsWhereUserCanAsync(VBUserGroup userGroup, VBForumFlags?flags = null, bool writeable = false) { // Better not caching permissions here. We ran into strange issues, altough we used the group id as sub key for caching if (writeable || !cache.TryGet(VBCacheKey.Forums, out List <VBForum> forums)) { forums = await GetForumsQuery().ToListAsync(); cache.Set(VBCacheKey.Forums, forums); } var forumsWithFlags = FetchForumsWithFlags(forums, userGroup); var permittedForums = forumsWithFlags.Where(kvp => flags == null || kvp.Value.HasFlag(flags.Value)) .Select(kvp => kvp.Key) .ToList(); return(permittedForums); }
VBForumFlags FetchHighestPermissionFlagForUser(VBForum forum, VBUserGroup userGroup) { // When there is no specific forum permission, it's inherited from the parent forum. // Logic can be found in fetch_forum_permission function from includes/adminfunctions_forums.php var permission = GetHighestVBForumPermission(forum.Permissions, userGroup.Id); if (permission == null) { if (forum.Parent == null && forum.ParentId != -1) { throw new Exception($"FetchHighestPermissionFlagForUser() needs Parent entity loaded for forum id {forum.Id}"); } permission = GetHighestVBForumPermission(forum.Parent?.Permissions, userGroup.Id); if (permission == null) { return(userGroup.ForumPermissions); } } return(permission.Flag); }
public async Task <Dictionary <VBForum, List <int> > > GetCategoriesWithChildIdsAsync(VBUserGroup userGroup, VBForumFlags flags = VBForumFlags.CanViewForum | VBForumFlags.CanViewThreads) { var forums = await GetCategoriesWhereUserCanAsync(userGroup, flags); var forumsWithChilds = forums.Select(f => new { Forum = f, Childs = new List <int>(f.ChildList) { f.Id } }).GroupBy(x => x.Forum) .ToDictionary(kvp => kvp.Key, kvp => kvp.SelectMany(x => x.Childs).ToList()); return(forumsWithChilds); }
public Dictionary <VBForum, VBForumFlags> FetchForumsWithFlags(List <VBForum> forums, VBUserGroup userGroup) { var permissionDict = forums.Select(forum => { var highestPerms = FetchHighestPermissionFlagForUser(forum, userGroup); return(new KeyValuePair <VBForum, VBForumFlags>(forum, highestPerms)); }).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); return(permissionDict); }
public async Task <Dictionary <VBForum, List <VBThread> > > GetCategoriesWithNewestThreadsAsync(VBUserGroup userGroup, List <int> ignoredCategoryForumIds = null, int countPerCategory = 8) { var dict = new Dictionary <VBForum, List <VBThread> >(); var forums = await forumManager.GetCategoriesWithChildIdsAsync(userGroup, VBForumFlags.CanViewForum); var filteredForums = forums.AsEnumerable(); if (ignoredCategoryForumIds != null) { filteredForums = filteredForums.Where(forumKvp => !ignoredCategoryForumIds.Contains(forumKvp.Key.Id)) .ToList(); } foreach (var forumWithChilds in filteredForums) { var threads = await GetNewestThreadsAsync(forumWithChilds.Key.ChildList, count : countPerCategory); dict.Add(forumWithChilds.Key, threads); } return(dict); }