Esempio n. 1
0
        public async Task GetRecordsList_ForExistingThemeFilter_ShouldReturnAllMatches()
        {
            var context = CreateContext();

            Create_30Themes_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20));
            var(themeId1, recordsNamesForTheme1, themeId2, recordsNamesForTheme2) = BindRecordsWithThemes(context, ThemesTestDataSet.ThemesOnly);
            var searchService = GetRecordsSearchService(context);
            var filter        = new RecordsFilter();

            filter.AddThemeId(themeId1);
            var result = await searchService.GetRecordsList(filter);

            result.Select(r => r.Name).Should().BeEquivalentTo(recordsNamesForTheme1);

            //----------------------------------------//

            filter.AddThemeId(themeId2);
            filter.RemoveThemeId(themeId1);
            result = await searchService.GetRecordsList(filter);

            result.Select(r => r.Name).Should().BeEquivalentTo(recordsNamesForTheme2);

            //----------------------------------------//

            filter.AddThemeId(themeId1);
            result = await searchService.GetRecordsList(filter);

            result.Select(r => r.Name).Should().BeEquivalentTo(recordsNamesForTheme2.Intersect(recordsNamesForTheme1));
        }
Esempio n. 2
0
        public async Task GetRecordsList_ForDateAndTheme_ShouldReturnOnlyMatchedRecords()
        {
            var context = CreateContext();

            Create_30Themes_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20));
            var(themeId1, recordsNamesForTheme1, themeId2, recordsNamesForTheme2) = BindRecordsWithThemes(context, ThemesTestDataSet.DatesAndThemesRec);
            var searchService = GetRecordsSearchService(context);
            var dateFrom      = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-10));
            var dateTo        = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-5));
            var filter        = new RecordsFilter {
                FromDate = dateFrom, ToDate = dateTo
            };

            filter.AddThemeId(themeId1);

            var list = context.Records.Where(r => r.Date >= dateFrom && r.Date <= dateTo);

            var result = await searchService.GetRecordsList(filter);

            result.Should().OnlyContain(rec =>
                                        rec.Date >= dateFrom &&
                                        rec.Date <= dateTo);
            result.Select(r => r.Name).Should().BeEquivalentTo(new string[] { "05", "07", "09", "10" });

            //-------------------------------------------------//

            filter.AddThemeId(themeId2);
            filter.RemoveThemeId(themeId1);

            result = await searchService.GetRecordsList(filter);

            result.Select(r => r.Name).Should().BeEquivalentTo(new string[] { "05" });
        }
Esempio n. 3
0
        public async Task GetRecordsCount_WithWhiteSpaceInNameFilter_ShouldReturnAllRecordsCount()
        {
            var context = CreateContext();

            Create_20Records(context, GetNumberList(20), GetDatesList(20));
            var svc = GetRecordsSearchService(context);
            var filterWithWhiteSpace = new RecordsFilter {
                FilterName = "       "
            };
            var filterWithNull = new RecordsFilter {
                FilterName = null
            };
            var filterWithRmRf = new RecordsFilter {
                FilterName = "\r\r\n\r\n  \r  \n\n "
            };

            int recCount1 = await svc.GetRecordsCount(filterWithWhiteSpace);

            int recCount2 = await svc.GetRecordsCount(filterWithNull);

            int recCount3 = await svc.GetRecordsCount(filterWithRmRf);

            recCount1.Should().Be(context.Records.Count());
            recCount2.Should().Be(context.Records.Count());
            recCount3.Should().Be(context.Records.Count());
        }
        public async Task <List <DiaryRecord> > GetRecordsList(RecordsFilter filter)
        {
            if (filter == null)
            {
                throw new ArgumentNullException(nameof(filter));
            }

            var recordsPage = await FetchRecordsListFilteredQuery(filter)
                              .OrderByDescending(r => r.Date)
                              .Skip(filter.PageNo * filter.PageSize)
                              .Take(filter.PageSize)
                              .ToListAsync()
                              .ConfigureAwait(false);

            var placeholder        = _appSettingsService.GetHostAndPortPlaceholder();
            var currentHostAndPort = await _appSettingsService.GetHostAndPort();

            foreach (var rec in recordsPage)
            {
                rec.Text = rec.Text?.Replace(placeholder, currentHostAndPort, StringComparison.OrdinalIgnoreCase) ?? "";
                rec.Name = rec.Name?.Replace(placeholder, currentHostAndPort, StringComparison.OrdinalIgnoreCase) ?? "";
                foreach (var cog in rec.Cogitations)
                {
                    cog.Text = cog.Text?.Replace(placeholder, currentHostAndPort, StringComparison.OrdinalIgnoreCase) ?? "";
                }
            }

            return(recordsPage);
        }
Esempio n. 5
0
        public async Task OnGetAsync(
            DateTime?fromDate,
            DateTime?toDate,
            Guid[] themes,
            string?filterName,
            bool?combineThemes,
            int?pageNo)
        {
            CombineThemes = combineThemes ?? false;

            Filters = new RecordsFilter
            {
                PageSize      = _pageSize,
                FromDate      = fromDate == null ? null : DateOnly.FromDateTime(fromDate.Value),
                ToDate        = toDate == null ? null : DateOnly.FromDateTime(toDate.Value),
                FilterName    = filterName?.Trim(),
                PageNo        = (pageNo ?? 1) - 1,
                CombineThemes = CombineThemes
            };

            if (themes != null && themes.Length > 0)
            {
                Filters.AddThemeId(themes);
                SelectedThemes = themes;
            }

            var recordsCount = await _searchRecordsService.GetRecordsCount(Filters);

            Pages   = PagesInfo.GetPagesInfo(recordsCount, Filters.PageNo + 1, _pageSize, 10);
            Records = await _searchRecordsService.GetRecordsList(Filters);

            AllScopes = await _scopesSvc.GetScopes();
        }
Esempio n. 6
0
        public async Task GetRecordsCount_ForExistingThemeFilter_And_COmbineThemesTrue_ShouldReturnAllMatchesCount()
        {
            var context = CreateContext();

            Create_30Themes_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20));
            var(themeId1, recordsNamesForTheme1, themeId2, recordsNamesForTheme2) = BindRecordsWithThemes(context, ThemesTestDataSet.ThemesOnly);
            var searchService = GetRecordsSearchService(context);
            var filter        = new RecordsFilter
            {
                CombineThemes = true
            };

            filter.AddThemeId(themeId1);
            var result = await searchService.GetRecordsCount(filter);

            result.Should().Be(recordsNamesForTheme1.Count);

            //----------------------------------------//

            filter.AddThemeId(themeId2);
            filter.RemoveThemeId(themeId1);
            result = await searchService.GetRecordsCount(filter);

            result.Should().Be(recordsNamesForTheme2.Count);

            //----------------------------------------//

            filter.AddThemeId(themeId1);
            result = await searchService.GetRecordsCount(filter);

            result.Should().Be(recordsNamesForTheme2.Union(recordsNamesForTheme1).Count());
        }
 public async Task <int> GetRecordsCount(RecordsFilter filter)
 {
     if (filter == null)
     {
         throw new ArgumentNullException(nameof(filter));
     }
     return(await FetchRecordsListFilteredQuery(filter).CountAsync().ConfigureAwait(false));
 }
        public async Task <ActionResult <RecordsPageDto> > GetRecordsList(
            [FromQuery] DateTime?from,
            [FromQuery] DateTime?to,
            [FromQuery] string?name,
            [FromQuery] bool?combinedThemes,
            [FromQuery] Guid[]?themeId,
            [FromQuery] int?pageSize,
            [FromQuery] int?pageNo)
        {
            try
            {
                pageSize ??= 20;
                pageSize = pageSize > 100 ? 100 : pageSize;
                pageNo ??= 0;

                var filters = new RecordsFilter
                {
                    CombineThemes = combinedThemes ?? false,
                    PageSize      = pageSize.Value,
                    PageNo        = pageNo.Value,
                    FromDate      = from.HasValue ? DateOnly.FromDateTime(from.Value) : null,
                    ToDate        = to.HasValue ? DateOnly.FromDateTime(to.Value) : null,
                    FilterName    = name
                };

                if (themeId != null && themeId.Length > 0)
                {
                    filters.AddThemeId(themeId);
                }

                var records = await _recordsSearchService.GetRecordsList(filters);

                int allCount = await _recordsSearchService.GetRecordsCount(filters);

                var pagesInfo = PagesInfo.GetPagesInfo(allCount, pageNo.Value, pageSize.Value);

                var dto = new RecordsPageDto
                {
                    PagesInfo = pagesInfo,
                    Records   = records.Select(r => new RecordListItemDto
                    {
                        Date          = r.Date,
                        CreatedDate   = r.CreateDate,
                        ModifiedDate  = r.ModifyDate,
                        DisplayedName = r.GetRecordNameDisplay(),
                        DisplayedText = r.GetRecordTextShort(),
                        RecordId      = r.Id
                    }).ToList()
                };

                return(Ok(dto));
            }
            catch (ArgumentException exc)
            {
                return(BadRequest(exc.Message));
            }
        }
Esempio n. 9
0
 public RecordsComparer(Func <TRecord, TKey> recordKeySelector, Func <TRecord, bool> filter = null)
 {
     this.RecordKeySelector = recordKeySelector;
     if (filter != null)
     {
         _filter = new RecordsFilter(filter);
     }
     else
     {
         _filter = new NoFilter();
     }
 }
Esempio n. 10
0
        public async Task GetRecordsCount_WithNotExistingThemeId_ShouldReturn0()
        {
            var context = CreateContext();

            Create_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20));
            var searchService = GetRecordsSearchService(context);
            var filter        = new RecordsFilter();

            filter.AddThemeId(Guid.NewGuid());

            int count = await searchService.GetRecordsCount(filter);

            count.Should().Be(0);
        }
Esempio n. 11
0
        public async Task CheckEntityFrameworkQuert()
        {
            var context = CreateContext();

            Create_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20));
            var filter = new RecordsFilter();

            filter.AddThemeId(Guid.NewGuid());

            IQueryable <DiaryRecord> result;
            List <DiaryRecord>?      r = null;

            if (!filter.IsEmptyTypeFilter)
            {
                var temp = context.RecordThemes
                           .Where(rt => filter.Themes.Contains(rt.ThemeId))
                           .Select(r => new { r.RecordId, r.ThemeId })
                           .ToList()
                           .GroupBy(r => r.RecordId)
                           .Where(g => filter.Themes.All(id => g.Select(r => r.ThemeId).Contains(id)))
                           .Select(g => g.Key);

                result = context.Records.Where(r => temp.Contains(r.Id));
            }
            else
            {
                result = context.Records.AsQueryable();
            }

            if (!RecordsFilter.IsEmpty(filter))
            {
                if (!string.IsNullOrWhiteSpace(filter.FilterName))
                {
                    result = result.Where(r => r.Name.Contains(filter.FilterName, StringComparison.OrdinalIgnoreCase));
                }
                if (filter.FromDate != null)
                {
                    result = result.Where(r => r.Date >= filter.FromDate);
                }
                if (filter.ToDate != null)
                {
                    result = result.Where(r => r.Date <= filter.ToDate);
                }
            }

            var list = r ?? await result.ToListAsync();

            Assert.IsEmpty(list);
        }
Esempio n. 12
0
        public async Task GetRecordsList_ByDate_ForLastWeek_ShouldReturn6Records()
        {
            var context = CreateContext();

            Create_20Records(context, GetNumberList(20), GetDatesList(20));
            var svc      = GetRecordsSearchService(context);
            var dateFrom = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-7));
            var filters  = new RecordsFilter {
                FromDate = dateFrom
            };

            var resList = await svc.GetRecordsList(filters);

            resList.Should().OnlyContain(r => r.Date >= dateFrom);
        }
Esempio n. 13
0
        public async Task GetRecordsList_WithNotExistingThemeId_And_CombineThemesTrue_ShouldReturnEmptyList()
        {
            var context = CreateContext();

            Create_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20));
            var searchService = GetRecordsSearchService(context);
            var filter        = new RecordsFilter();

            filter.AddThemeId(Guid.NewGuid());
            filter.CombineThemes = true;

            var list = await searchService.GetRecordsList(filter);

            list.Should().BeEmpty();
        }
Esempio n. 14
0
        public async Task GetRecordsCount_ByDate_ForConcreteDate_ShouldReturn2()
        {
            var context = CreateContext();

            Create_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20));
            var svc          = GetRecordsSearchService(context);
            var concreteDate = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-7));
            int testCount    = 2;
            var filters      = new RecordsFilter {
                FromDate = concreteDate, ToDate = concreteDate
            };

            int count = await svc.GetRecordsCount(filters);

            count.Should().Be(testCount);
        }
Esempio n. 15
0
        public async Task GetRecordsList_ByDate_ForConcreteDate_ShouldReturnWeekAgoRecords()
        {
            var context = CreateContext();

            Create_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20));
            var svc          = GetRecordsSearchService(context);
            var concreteDate = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-7));
            var filters      = new RecordsFilter {
                FromDate = concreteDate, ToDate = concreteDate
            };

            var resList = await svc.GetRecordsList(filters);

            resList.Should().NotBeEmpty();
            resList.Should().OnlyContain(rec => rec.Date.Year == concreteDate.Year && rec.Date.Day == concreteDate.Day);
        }
Esempio n. 16
0
        public async Task GetRecordsCount_ByDate_ForLastWeek_ShouldReturn7()
        {
            var context = CreateContext();

            Create_20Records(context, GetNumberList(20), GetDatesList(20));
            var svc       = GetRecordsSearchService(context);
            var dateFrom  = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-6));
            int testCount = 6; // all records for last week, except today
            var filters   = new RecordsFilter {
                FromDate = dateFrom
            };

            int count = await svc.GetRecordsCount(filters);

            count.Should().Be(testCount);
        }
Esempio n. 17
0
        public async Task GetRecordsCount_WithNameFilter_ShouldReturnAllMathchesCount()
        {
            string    searchName = "SearchТекстІї*01";
            const int matches    = 4;
            var       context    = CreateContext();

            Create_20Records(context, GetNamesList(), GetDatesList(20));
            var svc     = GetRecordsSearchService(context);
            var filters = new RecordsFilter {
                FilterName = searchName
            };

            int matchesFound = await svc.GetRecordsCount(filters);

            matchesFound.Should().Be(matches);
        }
Esempio n. 18
0
        public void Filter_SetDateFromAndDateToProperties_TheSameDate_ShouldSet()
        {
            var date = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-7));

            var filter = new RecordsFilter {
                FromDate = date, ToDate = date
            };

            Assert.AreEqual(filter.FromDate, date);
            Assert.AreEqual(filter.ToDate, date);
            Assert.AreEqual(filter.ToDate, filter.FromDate);
            filter.FromDate = null;
            filter.ToDate   = null;
            Assert.IsNull(filter.FromDate);
            Assert.IsNull(filter.ToDate);
        }
Esempio n. 19
0
        public async Task GetRecordsCount_ByDate_ForBeforeLastWeek_ShouldReturn13()
        {
            var context = CreateContext();

            Create_20Records(context, GetNumberList(20), GetDatesList(20));
            var svc       = GetRecordsSearchService(context);
            var dateTo    = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-7));
            int testCount = 20 - 6; // 20 days except last week (Today date is not added)
            var filters   = new RecordsFilter {
                ToDate = dateTo
            };

            int count = await svc.GetRecordsCount(filters);

            count.Should().Be(testCount);
        }
Esempio n. 20
0
        public async Task GetRecordsCount_ForNameAndTheme_ShouldReturnOnlyMatchedRecordsCount()
        {
            var context = CreateContext();

            var(themeId1, _, _) = await CreateRecordsWithNamesAndThemes(context);

            var    searchService = GetRecordsSearchService(context);
            string searchName    = "SearchТекстІї*01";
            var    filter        = new RecordsFilter {
                FilterName = searchName
            };

            filter.AddThemeId(themeId1);

            int count = await searchService.GetRecordsCount(filter);

            count.Should().Be(2);
        }
Esempio n. 21
0
        public async Task GetRecordsCount_ForDateAndTheme_ShouldReturnOnlyMatchedRecordsCount()
        {
            var context = CreateContext();

            Create_30Themes_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20));
            var(themeId1, _, _, _) = BindRecordsWithThemes(context, ThemesTestDataSet.DatesAndThemesCount);
            var searchService = GetRecordsSearchService(context);
            var dateFrom      = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-10));
            var dateTo        = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-5));
            var filter        = new RecordsFilter {
                FromDate = dateFrom, ToDate = dateTo
            };

            filter.AddThemeId(themeId1);

            int count = await searchService.GetRecordsCount(filter);

            count.Should().Be(3);
        }
Esempio n. 22
0
        public async Task GetRecordsList_WithWhiteSpaceInNameFilter_ShouldReturnAllPageRecords()
        {
            var context = CreateContext();

            Create_20Records(context, GetNumberList(20), GetDatesList(20));
            var svc = GetRecordsSearchService(context);
            var filterWithWhiteSpace = new RecordsFilter {
                FilterName = "       "
            };
            var filterWithNull = new RecordsFilter {
                FilterName = null
            };
            var filterWithRmRf = new RecordsFilter {
                FilterName = "\r\r\n\r\n  \r  \n\n "
            };

            var pageList1 = await svc.GetRecordsList(filterWithWhiteSpace);

            var pageList2 = await svc.GetRecordsList(filterWithNull);

            var pageList3 = await svc.GetRecordsList(filterWithRmRf);

            pageList1.Should().HaveCount(context.Records.Count());
            pageList1.Should().BeEquivalentTo(
                context.Records.ToList(),
                options => options
                .Including(r => r.Id)
                .Including(r => r.Name));
            pageList2.Should().HaveCount(context.Records.Count());
            pageList2.Should().BeEquivalentTo(
                context.Records.ToList(),
                options => options
                .Including(r => r.Id)
                .Including(r => r.Name));
            pageList3.Should().HaveCount(context.Records.Count());
            pageList3.Should().BeEquivalentTo(
                context.Records.ToList(),
                options => options
                .Including(r => r.Id)
                .Including(r => r.Name));
        }
Esempio n. 23
0
        public async Task GetRecordsList_WithNameFilter_ShouldReturnAllMatches()
        {
            string    searchName = "SearchТекстІї*01";
            const int matches    = 4;
            var       context    = CreateContext();

            Create_20Records(context, GetNamesList(), GetDatesList(20));
            var svc     = GetRecordsSearchService(context);
            var filters = new RecordsFilter {
                FilterName = searchName
            };

            var resPage = await svc.GetRecordsList(filters);

            resPage.Should().HaveCount(matches);
            resPage.Should().SatisfyRespectively(
                first => first.Name.Should().Be("893472983 SearchТекстІї*01"),
                second => second.Name.Should().Be("* /*SearchтекстІї*01/*"),
                third => third.Name.Should().Be("_SearchТекстІї*011АРРОПРОлрффлвыа"),
                fourth => fourth.Name.Should().Be("№%№SearCHТекстІї*01%№!::!;%№:%; "));
        }
Esempio n. 24
0
        public async Task GetRecordsCount_ByDateAndName_ShouldReturn2()
        {
            string    searchName     = "SearchТекстІї*01";
            const int matchesInRange = 2;
            var       dateFrom       = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-14));
            var       dateTo         = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-9));
            var       context        = CreateContext();

            Create_20Records(context, GetNamesList(), GetDatesList(20));
            var searchService = GetRecordsSearchService(context);
            var filters       = new RecordsFilter
            {
                FilterName = searchName,
                FromDate   = dateFrom,
                ToDate     = dateTo
            };

            int count = await searchService.GetRecordsCount(filters);

            count.Should().Be(matchesInRange);
        }
Esempio n. 25
0
        public async Task GetRecordsList_ForNameAndTheme_ShouldReturnOnlyMatchedRecords()
        {
            var context = CreateContext();

            var(themeId1, themeId2, names) = await CreateRecordsWithNamesAndThemes(context);

            var    searchService = GetRecordsSearchService(context);
            string searchName    = "SearchТекстІї*01";
            var    filter        = new RecordsFilter {
                FilterName = searchName
            };

            filter.AddThemeId(themeId1);

            var result = await searchService.GetRecordsList(filter);

            result.Should().NotBeEmpty();
            result.Should().SatisfyRespectively(
                first => first.Name.Should().Be("56SearchТекстІї*01"),
                second => second.Name.Should().Be("_SearchТекстІї*011АРРОПРОлрффлвыа"));
        }
Esempio n. 26
0
        public async Task GetRecordsList_ByDateAndName_ShouldReturn2Records()
        {
            string searchName = "SearchТекстІї*01";
            var    dateFrom   = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-14));
            var    dateTo     = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-9));
            var    context    = CreateContext();

            Create_20Records(context, GetNamesList(), GetDatesList(20));
            var svc     = GetRecordsSearchService(context);
            var filters = new RecordsFilter
            {
                FilterName = searchName,
                FromDate   = dateFrom,
                ToDate     = dateTo
            };

            var resList = await svc.GetRecordsList(filters);

            resList.Should().OnlyContain(rec =>
                                         rec.Name.IndexOf(searchName, StringComparison.InvariantCultureIgnoreCase) != -1 &&
                                         rec.Date >= dateFrom &&
                                         rec.Date <= dateTo);
        }
Esempio n. 27
0
        protected IQueryable <DiaryRecord> FetchRecordsListFilteredQuery(RecordsFilter filter)
        {
            var result = _context.Records
                         .AsNoTracking()
                         .Include(r => r.Cogitations)
                         .Include(r => r.ThemesRefs)
                         .ThenInclude(rt => rt.Theme)
                         .Include(r => r.ImagesRefs.OrderBy(x => x.Order))
                         .ThenInclude(ri => ri.Image)
                         .AsQueryable();


            if (!filter.IsEmptyTypeFilter)
            {
                IEnumerable <Guid> preliminaryRecordsList;

                if (filter.CombineThemes)
                {
                    preliminaryRecordsList = _context.RecordThemes
                                             .AsNoTracking()
                                             .Where(rt => filter.Themes.Contains(rt.ThemeId))
                                             .Select(rt => rt.RecordId)
                                             .Distinct();
                }
                else
                {
                    preliminaryRecordsList = _context.RecordThemes
                                             .AsNoTracking()
                                             .Where(rt => filter.Themes.Contains(rt.ThemeId))
                                             .Select(r => new { r.RecordId, r.ThemeId })
                                             .ToList()
                                             .GroupBy(r => r.RecordId)
                                             .Where(g => filter.Themes.All(id => g.Select(r => r.ThemeId).Contains(id)))
                                             .Select(g => g.Key);
                }

                result = result.Where(r => preliminaryRecordsList.Contains(r.Id));
            }

            if (!RecordsFilter.IsEmpty(filter))
            {
                if (!string.IsNullOrWhiteSpace(filter.FilterName))
                {
                    IEnumerable <Guid> recordsWithMatchedNames = _context.Records
                                                                 .AsNoTracking()
                                                                 .Select(r => new { r.Id, r.Name })
                                                                 .ToList()
                                                                 .Where(r => r.Name.ToUpper().Contains(filter.FilterName.ToUpper()))
                                                                 .Select(r => r.Id);

                    result = result.Where(r => recordsWithMatchedNames.Contains(r.Id));
                }

                if (filter.FromDate != null)
                {
                    result = result.Where(r => r.Date >= filter.FromDate);
                }

                if (filter.ToDate != null)
                {
                    result = result.Where(r => r.Date <= filter.ToDate);
                }
            }

            return(result);
        }
        public async Task <ActionResult <RecordsDetailPageDto> > GetRecordsListExpanded(
            [FromQuery] DateTime?from,
            [FromQuery] DateTime?to,
            [FromQuery] string?name,
            [FromQuery] bool?combinedThemes,
            [FromQuery] Guid[]?themeId,
            [FromQuery] int?pageSize,
            [FromQuery] int?pageNo)
        {
            try
            {
                pageSize ??= 20;
                pageSize = pageSize > 100 ? 100 : pageSize;
                pageNo ??= 0;

                var filters = new RecordsFilter
                {
                    CombineThemes = combinedThemes ?? false,
                    PageSize      = pageSize.Value,
                    PageNo        = pageNo.Value,
                    FromDate      = from.HasValue ? DateOnly.FromDateTime(from.Value) : null,
                    ToDate        = to.HasValue ? DateOnly.FromDateTime(to.Value) : null,
                    FilterName    = name
                };

                if (themeId != null && themeId.Length > 0)
                {
                    filters.AddThemeId(themeId);
                }

                var records = await _recordsSearchService.GetRecordsList(filters);

                int allCount = await _recordsSearchService.GetRecordsCount(filters);

                var pagesInfo = PagesInfo.GetPagesInfo(allCount, pageNo.Value, pageSize.Value);

                var dto = new RecordsDetailPageDto
                {
                    PagesInfo = pagesInfo,
                    Records   = records.Select(record => new RecordDto
                    {
                        Id           = record.Id,
                        Date         = record.Date,
                        CreatedDate  = record.CreateDate,
                        ModifiedDate = record.ModifyDate,
                        Name         = record.Name,
                        Text         = record.Text,
                        Cogitations  = record.Cogitations
                                       .Select(c => new CogitationDto
                        {
                            Id         = c.Id,
                            CreateDate = c.Date,
                            Text       = c.Text
                        })
                                       .ToArray(),
                        Themes = record.ThemesRefs
                                 .Select(rt => rt.Theme)
                                 .Select(t => new ThemeDto
                        {
                            ThemeId   = t !.Id,
                            ThemeName = t.ThemeName,
                            Actual    = t.Actual
                        })
                                 .ToArray(),
                        Images = record.ImagesRefs
                                 .Select(ri => ri.Image)
                                 .Select(i => new ImageListItemDto
                        {
                            Id              = i !.Id,
                            Name            = i.Name,
                            Width           = i.Width,
                            Height          = i.Height,
                            SizeKb          = i.GetSizeKbString(),
                            Base64Thumbnail = i.GetBase64Thumbnail()
                        })