コード例 #1
0
        public IEnumerable <Establishment> FindEstablishments(EstablishmentFilter filter = null)
        {
            int pages;

            filter      = filter ?? new EstablishmentFilter();
            filter.Page = 0;
            PreRequest?.Invoke(filter);
            var response = _client.FindEstablishments(filter, out pages);

            PostRequest?.Invoke(filter, response);

            foreach (var establishment in response)
            {
                yield return(establishment);
            }

            for (var i = 1; i < pages; i++)
            {
                filter.Page = i;

                PreRequest?.Invoke(filter);
                response = _client.FindEstablishments(filter, out pages);
                PostRequest?.Invoke(filter, response);

                foreach (var establishment in response)
                {
                    yield return(establishment);
                }
            }
        }
コード例 #2
0
        private async Task <FindEstablishmentsResponse> RequestEstablishments(EstablishmentFilter filter)
        {
            PreRequest?.Invoke(filter);
            var response = await _client.FindEstablishmentsAsync(new FindEstablishmentsRequest(filter));

            PostRequestAsync?.Invoke(filter, response);
            return(response);
        }
コード例 #3
0
        public async Task <List <Establishment> > FindEstablishmentsAsync(EstablishmentFilter filter = null)
        {
            var list = new List <Establishment>();

            filter      = filter ?? new EstablishmentFilter();
            filter.Page = 0;
            var response = await RequestEstablishments(filter);

            list.AddRange(response.Establishments);
            for (var i = 1; i < response.PageCount; i++)
            {
                filter.Page = i;
                list.AddRange((await RequestEstablishments(filter)).Establishments);
            }

            return(list);
        }
コード例 #4
0
        public async Task ShouldQueryForHeiProviders()
        {
            var client  = new Mock <IEstablishmentClient>();
            var handler = new HeiProviderHandler(Mock.Of <ILog>(), client.Object);

            EstablishmentFilter filter = null;

            client.Setup(m => m.FindEstablishmentsAsync(It.IsAny <EstablishmentFilter>()))
            .Callback <EstablishmentFilter>(model => filter = model)
            .ReturnsAsync(new EstablishmentList());

            await handler.Handle(new HeiProvidersRequest());

            filter.Page.Should().Be(0);
            filter.TypeOfEstablishment.Should().Be(EstablishmentType.HigherEducationInstitutions);
            filter.Fields.Count.Should().Be(1);
            filter.Fields.Should().Contain("UKPRN");
        }
        public async Task <ICollection <EducationOrganisation> > GetOrganisations()
        {
            var client = _factory.Create();

            var filter = new EstablishmentFilter
            {
                Fields = new StringList {
                    "EstablishmentName", "TypeOfEstablishment", "Street", "Locality", "Address3", "Town", "County", "Postcode", "URN"
                }
            };

            try
            {
                var establishments = await client.FindEstablishmentsAsync(filter);

                if (!establishments.Any())
                {
                    return(new EducationOrganisation[0]);
                }

                return(establishments.Select(x => new EducationOrganisation
                {
                    Name = x.EstablishmentName,
                    EducationalType = x.TypeOfEstablishment?.DisplayName ?? string.Empty,
                    AddressLine1 = x.Street,
                    AddressLine2 = x.Locality,
                    AddressLine3 = x.Address3,
                    Town = x.Town,
                    County = x.County?.DisplayName ?? string.Empty,
                    PostCode = x.Postcode,
                    URN = x.URN
                }).ToArray());
            }
            catch (Exception e)
            {
                _logger.Error(e, "Could not get organisations from Edubase API");
            }

            return(new EducationOrganisation[0]);
        }
        public void ShouldIgnoreThePageIfItsExplicitlyStated()
        {
            // Arrange
            int pages         = 2;
            var pageCallbacks = new List <int>();
            var mockClient    = new Mock <IEdubaseClient>();
            var sut           = new EstablishmentClient(mockClient.Object);

            mockClient.Setup(x => x.FindEstablishments(It.IsAny <EstablishmentFilter>(), out pages)).Returns(new EstablishmentList())
            .Callback <EstablishmentFilter, int>((x, y) => pageCallbacks.Add(x.Page));
            var filter = new EstablishmentFilter {
                Page = 1
            };

            // Act
            sut.FindEstablishments(filter).ToList();

            // Assert
            mockClient.Verify(x => x.FindEstablishments(It.IsAny <EstablishmentFilter>(), out pages), Times.Exactly(2));
            CollectionAssert.Contains(pageCallbacks, 0);
            CollectionAssert.Contains(pageCallbacks, 1);
        }
コード例 #7
0
        /// <summary>
        /// Return establishment list.
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public ListResult <EstablishmentListDTO> List(EstablishmentFilter filter)
        {
            IAggregateFluent <Establishment> establishmentAggregateFluent = this.MongoRepository
                                                                            .GetCollection <Establishment>().Aggregate();

            if (filter.GeospatialQuery)
            {
                if (!filter.Meters.HasValue)
                {
                    filter.Meters = 10000;
                }

                BsonDocument geoNearOptions = new BsonDocument {
                    {
                        "near", new BsonDocument {
                            { "type", "Point" },
                            { "coordinates", new BsonArray {
                                  filter.Longitude.Value, filter.Latitude.Value
                              } },
                        }
                    },
                    { "maxDistance", filter.Meters },
                    { "includeLocs", "Location.Coordinates" },
                    { "distanceField", "Location.Distance" },
                    { "spherical", true }
                };

                establishmentAggregateFluent = establishmentAggregateFluent.AppendStage(
                    (PipelineStageDefinition <Establishment, Establishment>) new BsonDocument {
                    { "$geoNear", geoNearOptions }
                }
                    );

                this.TelemetryClient.TrackEvent(
                    EventNames.EstablishmentListLocation,
                    new { filter.Latitude, filter.Longitude }
                    );
            }

            if (filter.EstablishmentType.HasValue)
            {
                establishmentAggregateFluent = establishmentAggregateFluent
                                               .Match(document => document.EstablishmentTypes.Contains(filter.EstablishmentType.Value));

                this.TelemetryClient.TrackEvent(
                    EventNames.EstablishmentListType,
                    new { filter.EstablishmentType }
                    );
            }

            if (!string.IsNullOrEmpty(filter.Query))
            {
                establishmentAggregateFluent = establishmentAggregateFluent.Match(
                    document => document.Name.Contains(filter.Query) ||
                    document.Description.Contains(filter.Query)
                    );

                this.TelemetryClient.TrackEvent(
                    EventNames.EstablishmentListQuery,
                    new { filter.Query }
                    );
            }

            if (filter.DaysOfWeekEnum != null)
            {
                Expression <Func <Establishment, bool> > availabilityExpression = document => false;

                foreach (DayOfWeekEnum dayOfWeek in filter.DaysOfWeekEnum)
                {
                    availabilityExpression = availabilityExpression.Or(
                        document => document.Availabilities.Any(
                            availability => availability.DayOfWeek == dayOfWeek || availability.CloseDayOfWeek == dayOfWeek
                            )
                        );
                }

                establishmentAggregateFluent = establishmentAggregateFluent.Match(availabilityExpression);

                this.TelemetryClient.TrackEvent(
                    EventNames.EstablishmentListDaysOfWeek,
                    new { filter.DaysOfWeek }
                    );
            }

            IAggregateFluent <BsonDocument> aggregateFluent = establishmentAggregateFluent.As <BsonDocument>();

            aggregateFluent = filter.OrderType == OrderTypeEnum.Distance
                ? aggregateFluent.SortBy(document => document["Location"]["Distance"])
                : aggregateFluent.SortByDescending(document => document["Relevance"]);

            if (!this.UserContext.EstablishmentId.HasValue)
            {
                this.RelevanceService.Register <Establishment, EstablishmentFilter>(filter);
            }

            IEnumerable <BsonDocument> documents = aggregateFluent
                                                   .Skip((filter.Page - 1) * filter.PageSize)
                                                   .Limit(filter.PageSize)
                                                   .ToList();

            IEnumerable <EstablishmentListDTO> establishments = documents.Select(document =>
                                                                                 new EstablishmentListDTO
            {
                Id = document["_id"].AsObjectId,
                EstablishmentTypes = document["EstablishmentTypes"].AsBsonArray.Select(x => (EstablishmentTypeEnum)x.AsInt32),
                ImageThumbnail     = document["ImageThumbnail"]["Uri"].AsString,
                Name     = document["Name"].AsString,
                Distance = document["Location"].AsBsonDocument.Contains("Distance")
                        ? document["Location"]["Distance"].AsDouble
                        : (double?)null
            }
                                                                                 ).ToList();

            return(new ListResult <EstablishmentListDTO>(
                       establishments,
                       aggregateFluent.Count().FirstOrDefault()?.Count ?? 0,
                       filter
                       ));
        }
コード例 #8
0
 public IActionResult Get([FromQuery] EstablishmentFilter filter)
 {
     return(Ok(this.EstablishmentService.List(filter)));
 }