/// <summary>
        /// Get Predicate.
        /// </summary>
        /// <param name="param">Params.</param>
        /// <returns>The Predicate.</returns>
        private Expression <Func <Models.Location, bool> > GetPredicate(LocationsRetrievalByQuery param)
        {
            Expression <Func <Models.Location, bool> > predicate = x => true;

            if (param.Name != null)
            {
                predicate = predicate.And(x => x.Name == param.Name);
            }

            if (param.ParentId != null)
            {
                // An empty guid takes the place of null allowing us to have no filter, or filter by null.
                var parentId = param.ParentId == Guid.Empty.ToString()
                    ? null
                    : param.ParentId;
                predicate = predicate.And(x => x.ParentId == parentId);
            }

            if (param.OnlyMeOffices)
            {
                predicate = predicate.And(x => x.IsMeOffice);
            }

            return(predicate);
        }
        public async Task Handle_ReturnsFiltered_WhenFilteredByNameAndParentId(bool forLookup)
        {
            // Arrange
            var query = new LocationsRetrievalByQuery("Name2", "Name1", forLookup, false);

            // Act
            var results = (await Service.Handle(query)).ToList();

            // Assert
            results.Should().NotBeNull();
            results.Count.Should().Be(1);
        }
        public async Task Handle_ReturnsAllResults_WhenNoFilterApplied(bool forLookup)
        {
            // Arrange
            var query = new LocationsRetrievalByQuery(null, null, forLookup, false);

            // Act
            var results = (await Service.Handle(query)).ToList();

            // Assert
            results.Should().NotBeNull();
            results.Count.Should().Be(50);
        }
        public async Task Handle_ReturnsFiltered_WhenFilteredByPermissedLocations(bool forLookup)
        {
            // Arrange
            var permissedLocations = new[]
            {
                "Name2",
                "Name3",
            };

            var query = new LocationsRetrievalByQuery(null, null, forLookup, false, permissedLocations);

            // Act
            var results = (await Service.Handle(query)).ToList();

            // Assert
            results.Should().NotBeNull();
            results.Count.Should().Be(2);
            results.ElementAt(0).Name.Should().Be("Name2");
            results.ElementAt(1).Name.Should().Be("Name3");
        }
        /// <inheritdoc/>
        public override async Task <IEnumerable <Models.Location> > Handle(LocationsRetrievalByQuery param)
        {
            if (param == null)
            {
                throw new ArgumentNullException(nameof(param));
            }

            var predicate = GetPredicate(param);

            if (param.PermissedLocations != null)
            {
                Expression <Func <Models.Location, bool> > idFilter = l =>
                                                                      param.PermissedLocations.Contains(l.LocationId) ||
                                                                      param.PermissedLocations.Contains(l.NationalLocationId) ||
                                                                      param.PermissedLocations.Contains(l.RegionLocationId) ||
                                                                      param.PermissedLocations.Contains(l.TrustLocationId) ||
                                                                      param.PermissedLocations.Contains(l.SiteLocationId);

                predicate = predicate.And(idFilter);
            }

            IEnumerable <Models.Location> result;

            if (param.ForLookup)
            {
                result = await GetItemsAsync <Models.Location>(predicate, location => new
                {
                    name = location.Name,
                    id   = location.LocationId
                });
            }
            else
            {
                result = await GetItemsAsync(predicate);
            }

            return(result);
        }