Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }