예제 #1
0
        /// <summary>
        /// Returns the additional filter data.
        /// </summary>
        private async Task FillAdditionalDataAsync(ChangesetsListRequestVM request, ChangesetsListVM data)
        {
            if (!string.IsNullOrEmpty(request.UserId))
            {
                var user = await _db.Users
                           .Where(x => x.Id == request.UserId)
                           .Select(x => new { x.FirstName, x.LastName })
                           .FirstOrDefaultAsync();

                if (user != null)
                {
                    data.UserTitle = user.FirstName + " " + user.LastName;
                }
                else
                {
                    request.UserId = null;
                }
            }

            if (request.EntityId != null)
            {
                var title = await GetPageTitleAsync()
                            ?? await GetMediaTitleAsync();

                if (title != null)
                {
                    data.EntityTitle = title;
                }
                else
                {
                    request.EntityId = null;
                }
            }

            async Task <string> GetPageTitleAsync()
            {
                return(await _db.Pages
                       .Where(x => x.Id == request.EntityId)
                       .Select(x => x.Title)
                       .FirstOrDefaultAsync());
            }

            async Task <string> GetMediaTitleAsync()
            {
                var media = await _db.Media
                            .Where(x => x.Id == request.EntityId)
                            .Select(x => new { Title = x.Title })
                            .FirstOrDefaultAsync();

                return(media == null
                    ? null
                    : StringHelper.Coalesce(media.Title, "Медиа"));
            }
        }
예제 #2
0
        /// <summary>
        /// Finds changesets.
        /// </summary>
        public async Task <ChangesetsListVM> GetChangesetsAsync(ChangesetsListRequestVM request)
        {
            const int PageSize = 20;

            request = NormalizeListRequest(request);

            var result = new ChangesetsListVM {
                Request = request
            };

            await FillAdditionalDataAsync(request, result);

            var query = _db.Changes
                        .AsNoTracking()
                        .Include(x => x.Author)
                        .Include(x => x.EditedPage)
                        .ThenInclude(x => x.MainPhoto)
                        .Include(x => x.EditedMedia)
                        .Include(x => x.EditedRelation)
                        .AsQueryable();

            if (!string.IsNullOrEmpty(request.SearchQuery))
            {
                var search = request.SearchQuery.ToLower();
                query = query.Where(x => (x.EditedPage != null && x.EditedPage.Title.ToLower().Contains(search)) ||
                                    x.EditedMedia != null && x.EditedMedia.Title.ToLower().Contains(search));
            }

            if (request.EntityTypes?.Length > 0)
            {
                query = query.Where(x => request.EntityTypes.Contains(x.Type));
            }

            if (request.EntityId != null)
            {
                query = query.Where(x => x.EditedPageId == request.EntityId ||
                                    x.EditedMediaId == request.EntityId ||
                                    x.EditedRelationId == request.EntityId);
            }

            if (!string.IsNullOrEmpty(request.UserId))
            {
                query = query.Where(x => x.Author.Id == request.UserId);
            }

            var totalCount = await query.CountAsync();

            result.PageCount = (int)Math.Ceiling((double)totalCount / PageSize);

            var dir = request.OrderDescending.Value;

            if (request.OrderBy == nameof(Changeset.Author))
            {
                query = query.OrderBy(x => x.Author.UserName, dir);
            }
            else
            {
                query = query.OrderBy(x => x.Date, dir);
            }

            var changesets = await query.Skip(PageSize *request.Page)
                             .Take(PageSize)
                             .ToListAsync();

            result.Items = changesets.Select(x => new ChangesetTitleVM
            {
                Id                 = x.Id,
                Date               = x.Date,
                ChangeType         = GetChangeType(x),
                Author             = x.Author.FirstName + " " + x.Author.LastName,
                EntityId           = x.EditedPageId ?? x.EditedMediaId ?? x.EditedRelationId ?? Guid.Empty,
                EntityType         = x.Type,
                EntityTitle        = GetEntityTitle(x),
                EntityThumbnailUrl = GetEntityThumbnailUrl(x),
                PageType           = GetPageType(x),
                CanRevert          = CanRevert(x)
            })
                           .ToList();

            return(result);
        }