Exemplo n.º 1
0
        public async Task <IActionResult> Browse()
        {
            var query = new BrowseRemarks();

            var remarks = await _remarkService.BrowseAsync(query);

            var categories = await _categorySevice.GetAsync();

            var result = remarks
                         .Select(x => new RemarkDto
            {
                Id           = x.Id,
                Name         = x.Name,
                Description  = x.Description,
                Latitude     = x.Latitude,
                Longitude    = x.Longitude,
                Author       = x.AuthorId,
                CategoryId   = x.CategoryId,
                CategoryName = categories.FirstOrDefault(y => y.Id == x.CategoryId)?.Name,
                Status       = x.Status.ToString()
            })
                         .ToList();

            return(Ok(result));
        }
        private static IFindFluent <Remark, Remark> SortRemarks(BrowseRemarks query,
                                                                IFindFluent <Remark, Remark> findResult)
        {
            if (query.OrderBy.Empty() && !query.Latest)
            {
                return(findResult);
            }
            if (query.SortOrder.Empty())
            {
                query.SortOrder = "ascending";
            }
            if (query.Latest)
            {
                query.OrderBy   = "createdat";
                query.SortOrder = "descending";
            }
            query.OrderBy   = query.OrderBy.ToLowerInvariant();
            query.SortOrder = query.SortOrder.ToLowerInvariant();

            switch (query.OrderBy)
            {
            case "userid": return(SortRemarks(query, findResult, x => x.Author.UserId));

            case "createdat": return(SortRemarks(query, findResult, x => x.CreatedAt));
            }

            return(findResult);
        }
Exemplo n.º 3
0
        public async Task <IActionResult> Get()
        {
            var query  = new BrowseRemarks();
            var result = await _remarkRepository.BrowseAsync(query);

            return(Ok(result));
        }
Exemplo n.º 4
0
        private async Task <IEnumerable <Remark> > GetRemarksWithoutLocationAsync(BrowseRemarks query)
        {
            var keys = Enumerable.Empty <string>();

            if (query.AuthorId.NotEmpty())
            {
                keys = await _cache.GetSetAsync($"users:{query.AuthorId}:remarks");
            }
            else if (query.ResolverId.NotEmpty())
            {
                keys = await _cache.GetSetAsync($"users:{query.ResolverId}:remarks");
            }
            else
            {
                keys = await _cache.GetSortedSetAsync("remarks-latest");
            }
            if (keys == null || !keys.Any())
            {
                return(Enumerable.Empty <Remark>());
            }
            var remarks = await _cache.GetManyAsync <Remark>(keys
                                                             .Select(x => $"remarks:{x}")
                                                             .ToArray());

            remarks = remarks?.Where(x => x != null) ?? Enumerable.Empty <Remark>();

            return(remarks);
        }
        private static IFindFluent <Remark, Remark> SortRemarks(BrowseRemarks query,
                                                                IFindFluent <Remark, Remark> findResult, Expression <Func <Remark, object> > sortBy)
        {
            switch (query.SortOrder)
            {
            case "ascending": return(findResult.SortBy(sortBy));

            case "descending": return(findResult.SortByDescending(sortBy));
            }

            return(findResult);
        }
Exemplo n.º 6
0
        public async Task <IActionResult> Browse()
        {
            var query = new BrowseRemarks
            {
                Latitude  = 19,
                Longitude = 19,
                Radius    = 10000
            };

            var result = await _storageService
                         .BrowseRemarksAsync(query)
                         .OrFailAsync();

            return(Ok(result));
        }
Exemplo n.º 7
0
        public async Task <Maybe <PagedResult <Remark> > > BrowseAsync(BrowseRemarks query)
        {
            var results = await _database.Remarks()
                          .QueryAsync(query);

            if (!query.IsLocationProvided())
            {
                return(results);
            }
            var center = new Coordinates(query.Latitude, query.Longitude);

            foreach (var remark in results.Items)
            {
                var coordinates = new Coordinates(remark.Location.Latitude, remark.Location.Longitude);
                remark.Distance = center.DistanceTo(coordinates, UnitOfLength.Meters);
            }

            return(results);
        }
Exemplo n.º 8
0
        public async Task <Maybe <PagedResult <Remark> > > BrowseAsync(BrowseRemarks query)
        {
            if (!_useCache)
            {
                return(await _storageClient.GetFilteredCollectionAsync <Remark, BrowseRemarks>(query, "remarks"));
            }
            var keys = await _cache.GetSortedSetAsync("remarks-latest");

            if (keys == null || !keys.Any())
            {
                return(await _storageClient.GetFilteredCollectionAsync <Remark, BrowseRemarks>(query, "remarks"));
            }
            if (!query.IsLocationProvided() || query.SkipLocation)
            {
                return(_browseRemarksFilter.Filter(await GetRemarksWithoutLocationAsync(query), query));
            }

            return(_browseRemarksFilter.Filter(await GetRemarksByLocationAsync(query), query));
        }
Exemplo n.º 9
0
        public static async Task <PagedResult <Remark> > QueryAsync(this IMongoCollection <Remark> remarks,
                                                                    BrowseRemarks query)
        {
            if (query.Page <= 0)
            {
                query.Page = 1;
            }
            if (query.Results <= 0)
            {
                query.Results = 10;
            }

            var filter     = FilterDefinition <Remark> .Empty;
            var totalCount = await remarks.CountAsync(filter);

            var totalPages = (int)totalCount / query.Results + 1;

            var result = await remarks.Find(filter)
                         .Skip(query.Results * (query.Page - 1))
                         .Limit(query.Results)
                         .ToListAsync();

            return(PagedResult <Remark> .Create(result, query.Page, query.Results, totalPages, totalCount));
        }
Exemplo n.º 10
0
        public static async Task <IEnumerable <RemarkDto> > QueryAsync(this IMongoCollection <RemarkDto> remarks,
                                                                       BrowseRemarks query)
        {
            if (query.Page <= 0)
            {
                query.Page = 1;
            }
            if (query.Results <= 0)
            {
                query.Results = 100;
            }

            var filterBuilder = new FilterDefinitionBuilder <RemarkDto>();
            var filter        = FilterDefinition <RemarkDto> .Empty;

            var filteredRemarks = remarks.Find(filter);
            var findResults     = filteredRemarks
                                  .Skip(query.Results * (query.Page - 1))
                                  .Limit(query.Results);

            var result = await findResults.ToListAsync();

            return(result);
        }
 public async Task <Maybe <PagedResult <Remark> > > BrowseAsync(BrowseRemarks query)
 => await _remarkRepository.BrowseAsync(query);
Exemplo n.º 12
0
 public async Task <Response <IEnumerable <RemarkDto> > > BrowseRemarksAsync(BrowseRemarks query)
 => await GetAsync <IEnumerable <RemarkDto> >("api/remarks");
        public static async Task <PagedResult <Remark> > QueryAsync(this IMongoCollection <Remark> remarks,
                                                                    BrowseRemarks query)
        {
            if (!query.IsLocationProvided() && query.AuthorId.Empty() && query.ResolverId.Empty())
            {
                query.Latest = true;
            }
            if (query.Page <= 0)
            {
                query.Page = 1;
            }
            if (query.Results <= 0)
            {
                query.Results = 10;
            }
            if (query.Results > 1000)
            {
                query.Results = 1000;
            }
            var filterBuilder = new FilterDefinitionBuilder <Remark>();
            var filter        = FilterDefinition <Remark> .Empty;

            if (query.IsLocationProvided() && !query.SkipLocation)
            {
                var maxDistance = query.Radius > 0 ? (double?)query.Radius / 1000 / 6378.1 : null;
                filter = filterBuilder.NearSphere(x => x.Location,
                                                  query.Longitude, query.Latitude, maxDistance);
            }
            if (query.AuthorId.NotEmpty())
            {
                filter = filter & filterBuilder.Where(x => x.Author.UserId == query.AuthorId);
                if (query.OnlyLiked)
                {
                    filter = filter & filterBuilder.Where(x => x.Votes.Any(v => v.UserId == query.AuthorId && v.Positive));
                }
                else if (query.OnlyDisliked)
                {
                    filter = filter & filterBuilder.Where(x => x.Votes.Any(v => v.UserId == query.AuthorId && !v.Positive));
                }
            }
            if (query.ResolverId.NotEmpty())
            {
                filter = filter & filterBuilder.Where(x => x.State.State == "resolved" &&
                                                      x.State.User.UserId == query.ResolverId);
            }
            if (!query.Description.Empty())
            {
                filter = filter & filterBuilder.Where(x => x.Description.Contains(query.Description));
            }
            if (query.Categories?.Any() == true)
            {
                filter = filter & filterBuilder.Where(x => query.Categories.Contains(x.Category.Name));
            }
            if (query.Tags?.Any() == true)
            {
                filter = filter & filterBuilder.Where(x => x.Tags.Any(y => query.Tags.Contains(y)));
            }
            if (query.States?.Any() == true)
            {
                filter = filter & filterBuilder.Where(x => query.States.Contains(x.State.State));
            }
            if (!query.Disliked)
            {
                filter = filter & filterBuilder.Where(x => x.Rating > NegativeVotesThreshold);
            }
            if (query.GroupId.HasValue && query.GroupId != Guid.Empty)
            {
                filter = filter & filterBuilder.Where(x => x.Group.Id == query.GroupId);
            }
            if (query.UserFavorites.NotEmpty())
            {
                filter = filterBuilder.Where(x => x.UserFavorites.Contains(query.UserFavorites));
            }

            var totalCount = await remarks.CountAsync(_ => true);

            var filteredRemarks = remarks.Find(filter);
            var totalPages      = (int)totalCount / query.Results + 1;
            var findResult      = filteredRemarks
                                  .Skip(query.Results * (query.Page - 1))
                                  .Limit(query.Results);

            findResult = SortRemarks(query, findResult);
            var result = await findResult.ToListAsync();

            return(PagedResult <Remark> .Create(result, query.Page, query.Results, totalPages, totalCount));
        }
Exemplo n.º 14
0
 public static bool IsLocationProvided(this BrowseRemarks query)
 => (Math.Abs(query.Latitude) <= 0.0000000001 ||
     Math.Abs(query.Longitude) <= 0.0000000001) == false;
Exemplo n.º 15
0
 public async Task <IEnumerable <Remark> > BrowseAsync(BrowseRemarks query)
 {
     return(await _context.Remarks.ToListAsync());
 }
Exemplo n.º 16
0
 public async Task <IEnumerable <RemarkDto> > BrowseAsync(BrowseRemarks query)
 {
     return(await _database.Remarks().QueryAsync(query));
 }
Exemplo n.º 17
0
 public async Task <Maybe <PagedResult <Remark> > > BrowseAsync(BrowseRemarks query)
 => await _provider.GetCollectionAsync(async() => await _remarkRepository.BrowseAsync(query));
Exemplo n.º 18
0
 public async Task <Maybe <PagedResult <Remark> > > BrowseAsync(BrowseRemarks query)
 => await _database.Remarks().QueryAsync(query);