public IActionResult SearchCalls(CallsFilter filter)
        {
            var         searchResult = repo.SearchCalls(filter);
            List <Call> calls        = searchResult.CallsPage.ToList();
            var         callsVm      = calls.Select(c => new CallViewModel(c)
            {
                DstName = usersRepo.GetUser(c.Dst.ToString())?.Name,
                SrcName = usersRepo.GetUser(c.Src.ToString())?.Name,
            });

            var json = Json(new { total = searchResult.TotalCalls, rows = callsVm });

            return(json);
        }
Esempio n. 2
0
        public SearchResult SearchCalls(CallsFilter filter)
        {
            logger.LogInformation($"SearchCalls with filter: dst={filter.DstCallNumber}, " +
                                  $"src={filter.SrcCallNumber}, " +
                                  $"dtFrom={filter.CallDateFrom}, " +
                                  $"dtTo={filter.CallDateTo}");

            var offset              = filter.Offset;
            var pageSize            = filter.Limit;
            var sortColumn          = filter.Sort;
            var sortColumnDirection = filter.Order;
            int viewOffsetUTC       = filter.OffsetUTC;

            IQueryable <Call> callsData = Enumerable.Empty <Call>().AsQueryable();

            if (!string.IsNullOrWhiteSpace(filter.SrcCallNumber) && !string.IsNullOrWhiteSpace(filter.DstCallNumber))
            {
                callsData = contexts.SelectMany(x => x.Calls.Where(c =>
                                                                   c.CallDate >= filter.CallDateFrom.AddHours(x.OffsetUTC) && c.CallDate < filter.CallDateTo.AddHours(x.OffsetUTC) &&
                                                                   c.Src == filter.SrcCallNumber &&
                                                                   c.Dst == filter.DstCallNumber).AsQueryable().ToList().Select(c => { c.CallDateUTC = c.CallDate.AddHours(-x.OffsetUTC + viewOffsetUTC); return(c); })).AsQueryable();
            }
            else if (!string.IsNullOrWhiteSpace(filter.SrcCallNumber))
            {
                callsData = contexts.SelectMany(x => x.Calls.Where(c =>
                                                                   c.CallDate.AddHours(-8) >= filter.CallDateFrom.AddHours(x.OffsetUTC) && c.CallDate < filter.CallDateTo.AddHours(x.OffsetUTC) &&
                                                                   c.Src == filter.SrcCallNumber).AsQueryable().ToList().Select(c => { c.CallDateUTC = c.CallDate.AddHours(-x.OffsetUTC + viewOffsetUTC); return(c); })).AsQueryable();
            }
            else if (!string.IsNullOrWhiteSpace(filter.DstCallNumber))
            {
                callsData = contexts.SelectMany(x => x.Calls.Where(c =>
                                                                   c.CallDate >= filter.CallDateFrom.AddHours(x.OffsetUTC) && c.CallDate < filter.CallDateTo.AddHours(x.OffsetUTC) &&
                                                                   c.Dst == filter.DstCallNumber).AsQueryable().ToList().Select(c => { c.CallDateUTC = c.CallDate.AddHours(-x.OffsetUTC + viewOffsetUTC); return(c); })).AsQueryable();
            }

            if (!(string.IsNullOrEmpty(sortColumn) && string.IsNullOrEmpty(sortColumnDirection)))
            {
                callsData = callsData.GroupBy(x => new { x.Src, x.Dst, CallDateUTC = x.CallDateUTC.AddSeconds(-x.CallDateUTC.Second) }).
                            Select(g => g.First()).OrderBy(sortColumn + " " + sortColumnDirection);
            }

            int recordsTotal = callsData.Count();
            var data         = callsData.Skip(offset).Take(pageSize).ToList();

            return(new SearchResult()
            {
                TotalCalls = recordsTotal, CallsPage = data
            });
        }