예제 #1
0
        public async Task <CountArray <AggregatedOfferDto> > AggregateOffersAsync(OffersFilterDto filter)
        {
            //TODO: implement HasManyGames in place
            await using var mnpContext = _contextFactory.Create();

            var placesQuery = mnpContext.Places.AsQueryable();

            if (filter.PlaceType.HasValue && filter.PlaceType != PlaceType.Undefined)
            {
                placesQuery = placesQuery.Where(pl => pl.PlaceType == filter.PlaceType);
            }

            var count = await placesQuery.CountAsync();

            if (filter.PageNumber.HasValue && filter.PageSize.HasValue)
            {
                placesQuery = placesQuery.TakePage(filter.PageSize.Value, filter.PageNumber.Value);
            }

            var results = await placesQuery.AsNoTracking().Select(p => new AggregatedOfferDto
                                                                      (p.Id,
                                                                      OfferType.Place,
                                                                      p.Name,
                                                                      p.Description,
                                                                      p.PlaceImages.FirstOrDefault(i => i.IsCurrentPoster).File.FileLink,
                                                                      null,
                                                                      null,
                                                                      null,
                                                                      GameLevel.Undefined,
                                                                      p.PlaceType))
                          .ToArrayAsync();

            return(new CountArray <AggregatedOfferDto>(results, count));
        }
예제 #2
0
        public async Task <AggregatedOfferDto[]> GetLobbiesForAggregatingAsync(OffersFilterDto filter)
        {
            var lobbiesQuery = _mnpContext.Lobbies
                               .Include(l => l.LobbyImages)
                               .ThenInclude(i => i.File)
                               .AsQueryable();

            if (filter.From.HasValue)
            {
                lobbiesQuery = lobbiesQuery.Where(l => l.PlannedGameDate >= filter.From.Value);
            }

            if (filter.To.HasValue)
            {
                lobbiesQuery = lobbiesQuery.Where(l => l.PlannedGameDate <= filter.From.Value);
            }

            //TODO: Implement other filters

            var results = await lobbiesQuery.Select(l => new AggregatedOfferDto(
                                                        l.Id,
                                                        OfferType.Lobby,
                                                        l.Title,
                                                        l.Description,
                                                        l.LobbyImages.FirstOrDefault(i => i.IsCurrentPoster).File.FileLink,
                                                        null,
                                                        l.PlannedGameDate))
                          .ToArrayAsync();

            return(results);
        }
예제 #3
0
        public async Task <CountArray <AggregatedOfferDto> > AggregateOffersAsync(OffersFilterDto filter)
        {
            var lobbies = await _lobbyService.AggregateOffersAsync(filter);

            var userOffers = await _userOfferService.AggregateOffersAsync(filter);

            var places = await _placeService.AggregateOffersAsync(filter);

            var allItems = lobbies.Items
                           .Concat(userOffers.Items)
                           .Concat(places.Items);

            var allCount = lobbies.Count + userOffers.Count + places.Count;

            return(new CountArray <AggregatedOfferDto>(allItems.ToArray(), allCount));
        }
예제 #4
0
        public Task <CountArray <AggregatedOfferDto> > AggregateOffersAsync(OffersFilterDto filter)
        {
            var offers = new List <AggregatedOfferDto>
            {
                new(Guid.Empty,
                    OfferType.Personal,
                    "Тестовый человек, 21 год",
                    "Хочу поиграть в манчкин",
                    "https://www.meme-arsenal.com/memes/1901cf2fa43eac1dba8a005972a6d359.jpg",
                    null,
                    DateTime.Today),
                new(Guid.Empty,
                    OfferType.Lobby,
                    "Собираем команду",
                    "Нас 4, нужно еще 3",
                    "https://minutes.co/wp-content/uploads/2019/04/shutterstock_1214730637.png",
                    null,
                    DateTime.Today),
                new(Guid.Empty,
                    OfferType.Event,
                    "Турнир по манчкину",
                    "Какое то описание",
                    "https://static-ru.insales.ru/images/articles/1/3130/150586/munchkin1.jpg?1504076588",
                    null,
                    DateTime.Today),
                new(Guid.Empty,
                    OfferType.Place,
                    "Антикафе Какое-то",
                    "У нас есть мафия, и много чего еще. Работаем круглосуточно",
                    "https://media-cdn.tripadvisor.com/media/photo-s/15/27/3b/77/caption.jpg",
                    null,
                    DateTime.Today),
            };

            return(Task.FromResult(new CountArray <AggregatedOfferDto>(offers.ToArray(), offers.Count)));
        }
예제 #5
0
        public async Task <CountArray <AggregatedOfferDto> > AggregateOffersAsync(OffersFilterDto filter)
        {
            await using var mnpContext = _contextFactory.Create();

            var lobbiesQuery = mnpContext.Lobbies.AsQueryable();

            if (filter.From.HasValue)
            {
                lobbiesQuery = lobbiesQuery.Where(l => l.PlannedGameDate >= filter.From);
            }

            if (filter.To.HasValue)
            {
                lobbiesQuery = lobbiesQuery.Where(l => l.PlannedGameDate >= filter.To);
            }

            if (filter.PlaceType.HasValue && filter.PlaceType != PlaceType.Undefined)
            {
                lobbiesQuery = lobbiesQuery.Where(l => l.PlaceType == filter.PlaceType);
            }

            if (filter.GameLevel.HasValue && filter.GameLevel != GameLevel.Undefined)
            {
                lobbiesQuery = lobbiesQuery.Where(l => l.GameLevel == filter.GameLevel);
            }

            if (!filter.GameName.IsNullOrWhiteSpace())
            {
                lobbiesQuery = lobbiesQuery
                               .Where(l => l.LobbyGames.Any(lg => lg.Game.Name.ToLower().Contains(filter.GameName.ToLower())));
            }

            if (filter.AgeFrom.HasValue)
            {
                var dateFrom = DateTime.Now.AddYears(filter.AgeFrom.Value * -1);
                lobbiesQuery = lobbiesQuery
                               .Where(l => l.LobbyPlayers.Any(lp => lp.Player.BirthDate.Value >= dateFrom));
            }

            if (filter.AgeTo.HasValue)
            {
                var dateTo = DateTime.Now.AddYears(filter.AgeTo.Value * -1);
                lobbiesQuery = lobbiesQuery
                               .Where(l => l.LobbyPlayers.Any(lp => lp.Player.BirthDate.Value <= dateTo));
            }

            var count = await lobbiesQuery.CountAsync();

            if (filter.PageNumber.HasValue && filter.PageSize.HasValue)
            {
                lobbiesQuery = lobbiesQuery.TakePage(filter.PageSize.Value, filter.PageNumber.Value);
            }

            var results = await lobbiesQuery.AsNoTracking()
                          .Select(l => new AggregatedOfferDto(
                                      l.Id,
                                      OfferType.Lobby,
                                      l.Title,
                                      l.Description,
                                      l.LobbyImages.FirstOrDefault(i => i.IsCurrentPoster).File.FileLink,
                                      null,
                                      l.PlannedGameDate,
                                      l.LobbyGames.Select(lg => lg.Game.Name).ToArray(),
                                      l.GameLevel,
                                      l.PlaceType))
                          .ToArrayAsync();

            return(new CountArray <AggregatedOfferDto>(results, count));
        }
예제 #6
0
        public async Task <CountArray <AggregatedOfferDto> > AggregateOffersAsync(OffersFilterDto filter)
        {
            await using var mnpContext = _contextFactory.Create();

            var offerQuery = mnpContext.UserOffers.AsQueryable();

            if (filter.From.HasValue)
            {
                var filterWeekDay = (WeekDays)((int)(filter.From.Value.DayOfWeek + 6) % 7);
                var hour          = filter.From.Value.Hour;
                offerQuery = offerQuery.Where(l =>
                                              l.Periods.Any(p => p.IsEveryday ||
                                                            l.Periods.Any(p => p.Day == filterWeekDay && p.HoursFrom >= hour) ||
                                                            l.ActualOfferDate >= filter.From.Value));
            }

            if (filter.To.HasValue)
            {
                var filterWeekDay = (WeekDays)((int)(filter.To.Value.DayOfWeek + 6) % 7);
                var hour          = filter.To.Value.Hour;
                offerQuery = offerQuery.Where(l =>
                                              l.Periods.Any(p => p.IsEveryday ||
                                                            l.Periods.Any(p => p.Day == filterWeekDay && p.HoursFrom <= hour) ||
                                                            l.ActualOfferDate <= filter.To.Value));
            }


            if (filter.PlaceType.HasValue && filter.PlaceType != PlaceType.Undefined)
            {
                offerQuery = offerQuery.Where(l => l.PlaceType == filter.PlaceType);
            }

            if (!filter.GameName.IsNullOrWhiteSpace())
            {
                offerQuery = offerQuery
                             .Where(l => l.UserOfferGames.Any(lg => lg.Game.Name.ToLower().Contains(filter.GameName.ToLower())));
            }

            if (filter.AgeFrom.HasValue)
            {
                var dateFrom = DateTime.Now.AddYears(filter.AgeFrom.Value * -1);
                offerQuery = offerQuery
                             .Where(l => l.Author.BirthDate.Value >= dateFrom);
            }

            if (filter.AgeTo.HasValue)
            {
                var dateTo = DateTime.Now.AddYears(filter.AgeTo.Value * -1);
                offerQuery = offerQuery
                             .Where(l => l.Author.BirthDate.Value <= dateTo);
            }

            var count = await offerQuery.CountAsync();

            if (filter.PageNumber.HasValue && filter.PageSize.HasValue)
            {
                offerQuery = offerQuery.TakePage(filter.PageSize.Value, filter.PageNumber.Value);
            }

            var results = await offerQuery.AsNoTracking()
                          .Select(l => new AggregatedOfferDto(
                                      l.Id,
                                      OfferType.Personal,
                                      l.Author.UserName,
                                      l.Description,
                                      l.Author.UserImages.FirstOrDefault(i => i.IsCurrentAvatar).File.FileLink,
                                      null,
                                      l.ActualOfferDate,
                                      l.UserOfferGames.Select(lg => lg.Game.Name).ToArray(),
                                      GameLevel.Undefined,
                                      l.PlaceType))
                          .ToArrayAsync();

            return(new CountArray <AggregatedOfferDto>(results, count));
        }