public async Task <IActionResult> List([FromQuery] int?page, [FromQuery] int?perPage, [FromQuery] string types, [FromQuery] string name, [FromQuery] bool geoJSON = false) { var query = new ListObjectsQuery(page, perPage) { NameToken = name }; if (types != null) { query.Types = types.Split(',').Select(x => (EObjectType)(int.Parse(x))).ToArray(); } var model = await _objectsRepository.GetObjects(query, CancellationToken.None); if (model == null) { return(BadRequest()); } if (geoJSON) { var featureCollection = new FeatureCollection(); foreach (var item in model.Data) { if (!string.IsNullOrEmpty(item.Latitude) && !string.IsNullOrEmpty(item.Longitude)) { var point = new Point(new Position(double.Parse(item.Latitude, CultureInfo.InvariantCulture), double.Parse(item.Longitude, CultureInfo.InvariantCulture))); var properties = new Dictionary <string, object> { { "objectId", item.ObjectId }, { "name", item.Name }, { "type", item.Type } }; if (!string.IsNullOrEmpty(item.MainPhoto?.Url)) { properties.Add("photoUrl", item.MainPhoto.Url); } var feature = new Feature(point, properties, item.ObjectId); featureCollection.Features.Add(feature); } } return(Ok(featureCollection)); } else { return(Ok(model)); } }
public async Task <PagedList <OknObject> > GetObjects(ListObjectsQuery query, CancellationToken cancellationToken) { var filter = Builders <ObjectEntity> .Filter.Empty; if (query.Types != null) { filter = Builders <ObjectEntity> .Filter.In(x => x.Type, query.Types); } if (!string.IsNullOrEmpty(query.NameToken)) { var nameTokenFilter = Builders <ObjectEntity> .Filter.Regex("name", new BsonRegularExpression(query.NameToken, "i")); filter = Builders <ObjectEntity> .Filter.And(filter, nameTokenFilter); } var excludeFields = Builders <ObjectEntity> .Projection .Exclude(d => d.Events) .Exclude(d => d.Federal) .Exclude(d => d.Version) .Exclude(d => d.Photos); var cursor = _context.Objects.Find(filter); var count = cursor.CountDocuments(cancellationToken); var items = await cursor .Project <ObjectEntity>(excludeFields) .Limit(query.PerPage) .Skip((query.Page - 1) * query.PerPage) .ToListAsync(cancellationToken); var model = _mapper.Map <List <ObjectEntity>, List <OknObject> >(items); var paged = new PagedList <OknObject> { Data = model, Page = query.Page, PerPage = query.PerPage, Total = count }; return(paged); }
public async Task QueryObjectListWithPaging() { var runner = MongoDbRunner.Start(); var database = TestHelpers.GetDefaultDatabase(runner.ConnectionString); var path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "3.json"); runner.Import("okn", "objects", path, true); var handler = new ObjectsRepository(TestHelpers.GetDefaultMapper(), new DbContext(database)); var query = new ListObjectsQuery(page: 2, perPage: 5); var result = await handler.GetObjects(query, CancellationToken.None); Assert.NotNull(result); Assert.Equal(4, result.Data?.Count); runner.Dispose(); }