コード例 #1
0
        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));
            }
        }
コード例 #2
0
ファイル: ObjectsRepository.cs プロジェクト: oldsaratov/okn
        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);
        }
コード例 #3
0
        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();
        }