Exemple #1
0
        /// <summary>
        /// Get an array of property names within the specified filters.
        /// Will not return sensitive properties unless the user has the `sensitive-view` claim and belongs to the owning agency.
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public IEnumerable <string> GetNames(AllPropertyFilter filter)
        {
            this.User.ThrowIfNotAuthorized(Permissions.PropertyView);
            filter.ThrowIfNull(nameof(filter));
            if (!filter.IsValid())
            {
                throw new ArgumentException("Argument must have a valid filter", nameof(filter));
            }

            var parcelFilter   = (ParcelFilter)filter;
            var buildingFilter = (BuildingFilter)filter;

            if (parcelFilter.IsValid() && !buildingFilter.IsValid())
            {
                filter.PropertyType = Entities.PropertyTypes.Land;
            }
            else if (!parcelFilter.IsValid())
            {
                filter.PropertyType = Entities.PropertyTypes.Building;
            }

            var query      = this.Context.GenerateQuery(this.User, filter);
            var properties = query.Where(x => !string.IsNullOrWhiteSpace(x.Name)).Select(x => x.Name).ToArray();

            return(properties);
        }
Exemple #2
0
        /// <summary>
        /// Get an array of properties within the specified filters.
        /// Will not return sensitive properties unless the user has the `sensitive-view` claim and belongs to the owning agency.
        /// Note that the 'parcelFilter' will control the 'page' and 'quantity'.
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public IEnumerable <ProjectProperty> Search(AllPropertyFilter filter)
        {
            this.User.ThrowIfNotAuthorized(Permissions.PropertyView);
            filter.ThrowIfNull(nameof(filter));
            if (!filter.IsValid())
            {
                throw new ArgumentException("Argument must have a valid filter", nameof(filter));
            }

            var parcelFilter   = (ParcelFilter)filter;
            var buildingFilter = (BuildingFilter)filter;

            if (parcelFilter.IsValid() && !buildingFilter.IsValid())
            {
                filter.PropertyType = Entities.PropertyTypes.Land;
            }
            else if (!parcelFilter.IsValid())
            {
                filter.PropertyType = Entities.PropertyTypes.Building;
            }

            var query      = this.Context.GenerateQuery(this.User, filter);
            var properties = query.Select(x => new ProjectProperty(x)).ToArray();

            // TODO: Add optional paging ability to query.

            return(properties);
        }
Exemple #3
0
        /// <summary>
        /// Get a page with an array of properties within the specified filters.
        /// Will not return sensitive properties unless the user has the `sensitive-view` claim and belongs to the owning agency.
        /// Note that the 'parcelFilter' will control the 'page' and 'quantity'.
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public Paged <Property> GetPage(AllPropertyFilter filter)
        {
            this.User.ThrowIfNotAuthorized(Permissions.PropertyView);
            filter.ThrowIfNull(nameof(filter));
            if (!filter.IsValid())
            {
                throw new ArgumentException("Argument must have a valid filter", nameof(filter));
            }

            var parcelFilter   = (ParcelFilter)filter;
            var buildingFilter = (BuildingFilter)filter;

            if (parcelFilter.IsValid() && !buildingFilter.IsValid())
            {
                filter.PropertyType = Entities.PropertyTypes.Land;
            }
            else if (!parcelFilter.IsValid() && buildingFilter.IsValid())
            {
                filter.PropertyType = Entities.PropertyTypes.Building;
            }

            var skip  = (filter.Page - 1) * filter.Quantity;
            var query = this.Context.GenerateQuery(this.User, filter);
            var items = query
                        .Skip(skip)
                        .Take(filter.Quantity)
                        .ToArray();

            return(new Paged <Property>(items, filter.Page, filter.Quantity, query.Count()));
        }
Exemple #4
0
        /// <summary>
        /// Get a page with an array of properties within the specified filters.
        /// Will not return sensitive properties unless the user has the `sensitive-view` claim and belongs to the owning agency.
        /// Note that the 'parcelFilter' will control the 'page' and 'quantity'.
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public Paged <Property> GetPage(AllPropertyFilter filter)
        {
            this.User.ThrowIfNotAuthorized(Permissions.PropertyView);
            filter.ThrowIfNull(nameof(filter));
            if (!filter.IsValid())
            {
                throw new ArgumentException("Argument must have a valid filter", nameof(filter));
            }

            var parcelFilter   = (ParcelFilter)filter;
            var buildingFilter = (BuildingFilter)filter;

            if (parcelFilter.IsValid() && !buildingFilter.IsValid())
            {
                filter.PropertyType = Entities.PropertyTypes.Land;
            }
            else if (!parcelFilter.IsValid() && buildingFilter.IsValid())
            {
                filter.PropertyType = Entities.PropertyTypes.Building;
            }

            var skip  = (filter.Page - 1) * filter.Quantity;
            var query = this.Context.GenerateQuery(this.User, filter);
            var items = query
                        .Skip(skip)
                        .Take(filter.Quantity)
                        .ToArray();

            var count = items.Count();
            var total = count < filter.Quantity ? skip + count : filter.Page * filter.Quantity + 1; // TODO: temporary way to improve performance as the DB is having memory issues scanning the whole table.

            return(new Paged <Property>(items, filter.Page, filter.Quantity, total));
        }
Exemple #5
0
        public void AllPropertyFilter_Constructor_03()
        {
            // Arrange
            var query = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery("?page=2&quantity=3&pid=323423&zoning=zone&zoningPotential=potential&minLandArea=343&maxLandArea=444&propertyType=Land&constructionTypeId=4&predominateUseId=4&floorCount=4&tenancy=ten&minRentableArea=343&maxRentableArea=444&includeAllProperties=true&sort=one,two");

            // Act
            var filter = new AllPropertyFilter(query);

            // Assert
            filter.Page.Should().Be(2);
            filter.Quantity.Should().Be(3);
            filter.PID.Should().Be("323423");
            filter.Zoning.Should().Be("zone");
            filter.ZoningPotential.Should().Be("potential");
            filter.MinLandArea.Should().Be(343);
            filter.MaxLandArea.Should().Be(444);
            filter.PropertyType.Should().Be(PropertyTypes.Land);
            filter.ConstructionTypeId.Should().Be(4);
            filter.PredominateUseId.Should().Be(4);
            filter.FloorCount.Should().Be(4);
            filter.Tenancy.Should().Be("ten");
            filter.MinRentableArea.Should().Be(343);
            filter.MaxRentableArea.Should().Be(444);
            filter.IncludeAllProperties.Should().BeTrue();
            filter.Sort.Should().BeEquivalentTo(new[] { "one", "two" });
        }
Exemple #6
0
        public void AllPropertyFilter_Base_IsValid()
        {
            // Arrange
            var filter = new AllPropertyFilter();

            // Act
            var result = filter.IsValid();

            // Assert
            result.Should().BeTrue();
        }
Exemple #7
0
        public void AllPropertyFilter_Constructor_02_Null()
        {
            // Arrange
            // Act
            var filter = new AllPropertyFilter((Envelope)null);

            // Assert
            filter.NELatitude.Should().BeNull();
            filter.NELongitude.Should().BeNull();
            filter.SWLatitude.Should().BeNull();
            filter.SWLongitude.Should().BeNull();
        }
Exemple #8
0
        public void AllPropertyFilter_False()
        {
            // Arrange
            var query  = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery("?page=0");
            var filter = new AllPropertyFilter(query);

            // Act
            var result = filter.IsValid();

            // Assert
            result.Should().BeFalse();
        }
Exemple #9
0
        public void GetPage_BuildingProperties(AllPropertyFilter filter, int[] agencyIds, int expectedTotal, int expectedCount)
        {
            // Arrange
            var helper = new TestHelper();
            var user   = PrincipalHelper.CreateForPermission(Permissions.PropertyView).AddAgency(agencyIds);

            using var init = helper.InitializeDatabase(user);

            var parcels = init.CreateParcels(1, 20);

            parcels.Next(0).Latitude         = 50;
            parcels.Next(0).Longitude        = 25;
            parcels.Next(1).Agency           = init.Agencies.Find(3);
            parcels.Next(1).AgencyId         = 3;
            parcels.Next(2).ClassificationId = 2;
            parcels.Next(3).Description      = "-DescriptionTest-";
            parcels.Next(4).Municipality     = "-Municipality-";
            parcels.Next(5).Zoning           = "-Zoning-";
            parcels.Next(6).ZoningPotential  = "-ZoningPotential-";

            var buildings = init.CreateBuildings(parcels.First(), 50, 5);

            buildings.Next(0).Latitude         = 50;
            buildings.Next(0).Longitude        = 25;
            buildings.Next(1).Agency           = init.Agencies.Find(3);
            buildings.Next(1).AgencyId         = 3;
            buildings.Next(2).ClassificationId = 2;
            buildings.Next(3).Description      = "-DescriptionTest-";
            buildings.Next(4).BuildingTenancy  = "-BuildingTenancy-";

            buildings.AddRange(init.CreateBuildings(parcels.Next(1), 56, 5));
            buildings.Next(5).BuildingConstructionTypeId = 2;
            buildings.Next(6).BuildingPredominateUseId   = 2;
            buildings.Next(7).RentableArea = 100;
            buildings.Next(8).RentableArea = 50;

            buildings.AddRange(init.CreateBuildings(parcels.Next(4), 61, 10));

            init.SaveChanges();

            var service = helper.CreateService <PropertyService>(user);

            // Act
            var result = service.GetPage(filter);

            // Assert
            Assert.NotNull(result);
            Assert.IsAssignableFrom <IEnumerable <Entity.Views.Property> >(result);
            Assert.Equal(expectedTotal, result.Total);
            Assert.Equal(expectedCount, result.Count());
            Assert.True(result.All(p => p.PropertyTypeId == Entity.PropertyTypes.Building));
        }
Exemple #10
0
        public void GetPage_Properties_NotAuthorized()
        {
            // Arrange
            var helper = new TestHelper();
            var user   = PrincipalHelper.CreateForPermission();
            var filter = new AllPropertyFilter(50, 25, 50, 20);

            var service = helper.CreateService <PropertyService>(user);

            // Act
            // Assert
            Assert.Throws <NotAuthorizedException>(() =>
                                                   service.GetPage(filter));
        }
Exemple #11
0
        public void AllPropertyFilter_Constructor_02()
        {
            // Arrange
            var envelop = new Envelope(4.454, 3.434, 2.233, 5.565);

            // Act
            var filter = new AllPropertyFilter(envelop);

            // Assert
            filter.NELatitude.Should().Be(envelop.MaxY);
            filter.NELongitude.Should().Be(envelop.MaxX);
            filter.SWLatitude.Should().Be(envelop.MinY);
            filter.SWLongitude.Should().Be(envelop.MinX);
        }
Exemple #12
0
        public void AllPropertyFilter_Constructor_01()
        {
            // Arrange
            var nelat = 4.454;
            var nelng = 3.434;
            var swlat = 2.233;
            var swlng = 5.565;

            // Act
            var filter = new AllPropertyFilter(nelat, nelng, swlat, swlng);

            // Assert
            filter.NELatitude.Should().Be(nelat);
            filter.NELongitude.Should().Be(nelng);
            filter.SWLatitude.Should().Be(swlat);
            filter.SWLongitude.Should().Be(swlng);
        }
Exemple #13
0
        /// <summary>
        /// Get an array of properties within the specified filters.
        /// Will not return sensitive properties unless the user has the `sensitive-view` claim and belongs to the owning agency.
        /// Note that the 'parcelFilter' will control the 'page' and 'quantity'.
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public IEnumerable <ProjectProperty> Get(AllPropertyFilter filter)
        {
            this.User.ThrowIfNotAuthorized(Permissions.PropertyView);
            filter.ThrowIfNull(nameof(filter));
            if (!filter.IsValid())
            {
                throw new ArgumentException("Argument must have a valid filter", nameof(filter));
            }

            var parcelFilter   = (ParcelFilter)filter;
            var buildingFilter = (BuildingFilter)filter;

            if (parcelFilter.IsValid() && !buildingFilter.IsValid())
            {
                filter.PropertyType = Entities.PropertyTypes.Land;
            }
            else if (!parcelFilter.IsValid())
            {
                filter.PropertyType = Entities.PropertyTypes.Building;
            }

            var query      = this.Context.GenerateQuery(this.User, filter);
            var properties = query.Select(x => new ProjectProperty(x)).ToArray();

            var projectNumbers = properties.SelectMany(p => JsonSerializer.Deserialize <IEnumerable <string> >(p.ProjectNumbers ?? "[]")).Distinct().ToArray();
            var statuses       = from p in this.Context.ProjectProperties
                                 where projectNumbers.Contains(p.Project.ProjectNumber)
                                 select new { p.Project.ProjectNumber, p.Project.Status, WorkflowCode = p.Project.Workflow.Code };

            foreach (var status in statuses)
            {
                foreach (var projectProperty in properties.Where(property => property.ProjectNumbers.Contains(status.ProjectNumber)))
                {
                    projectProperty.ProjectStatus   = status.Status.Code;
                    projectProperty.ProjectWorkflow = status.WorkflowCode;
                }
            }

            // TODO: Add optional paging ability to query.

            return(properties);
        }
Exemple #14
0
        /// <summary>
        /// Get an array of properties within the specified filters.
        /// Will not return sensitive properties unless the user has the `sensitive-view` claim and belongs to the owning agency.
        /// Note that the 'parcelFilter' will control the 'page' and 'quantity'.
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        public IEnumerable <ProjectProperty> Get(AllPropertyFilter filter)
        {
            this.User.ThrowIfNotAuthorized(Permissions.PropertyView);
            filter.ThrowIfNull(nameof(filter));
            if (!filter.IsValid())
            {
                throw new ArgumentException("Argument must have a valid filter", nameof(filter));
            }

            var parcelFilter   = (ParcelFilter)filter;
            var buildingFilter = (BuildingFilter)filter;

            if (parcelFilter.IsValid() && !buildingFilter.IsValid())
            {
                filter.PropertyType = Entities.PropertyTypes.Land;
            }
            else if (!parcelFilter.IsValid())
            {
                filter.PropertyType = Entities.PropertyTypes.Building;
            }

            var query      = this.Context.GenerateQuery(this.User, filter);
            var properties = query.Select(x => new ProjectProperty(x)).ToArray();

            var projectNumbers = properties.Select(p => p.ProjectNumber).Distinct().ToArray();
            var statuses       = from p in this.Context.ProjectProperties
                                 where projectNumbers.Contains(p.Project.ProjectNumber)
                                 select new { p.Project.ProjectNumber, p.Project.Status };

            foreach (var status in statuses)
            {
                foreach (var projectProperty in properties.Where(property => property.ProjectNumber == status.ProjectNumber))
                {
                    projectProperty.ProjectStatus = status.Status.Code;
                }
            }

            return(properties);
        }
Exemple #15
0
        public void AllPropertyFilter_Default_Constructor()
        {
            // Arrange
            // Act
            var filter = new AllPropertyFilter();

            // Assert
            filter.Page.Should().Be(1);
            filter.Quantity.Should().Be(10);
            filter.PID.Should().BeNull();
            filter.Zoning.Should().BeNull();
            filter.ZoningPotential.Should().BeNull();
            filter.MinLandArea.Should().BeNull();
            filter.MaxLandArea.Should().BeNull();
            filter.ConstructionTypeId.Should().BeNull();
            filter.PredominateUseId.Should().BeNull();
            filter.FloorCount.Should().BeNull();
            filter.Tenancy.Should().BeNull();
            filter.MinRentableArea.Should().BeNull();
            filter.MaxRentableArea.Should().BeNull();
            filter.IncludeAllProperties.Should().BeFalse();
        }
Exemple #16
0
        public void GetPage_Properties(AllPropertyFilter filter, int[] agencyIds, int expectedTotal, int expectedCount)
        {
            // Arrange
            var helper = new TestHelper();
            var user   = PrincipalHelper.CreateForPermission(Permissions.PropertyView).AddAgency(agencyIds);

            using var init = helper.InitializeDatabase(user);

            var parcels = init.CreateParcels(1, 20);

            parcels.Next(0).Location.X                 = -123.720810;
            parcels.Next(0).Location.Y                 = 48.529338;
            parcels.Next(1).Agency                     = init.Agencies.Find(3);
            parcels.Next(1).AgencyId                   = 3;
            parcels.Next(2).ClassificationId           = 2;
            parcels.Next(3).Description                = "-DescriptionTest-";
            parcels.Next(4).Address.AdministrativeArea = "-AdministrativeArea-";
            parcels.Next(5).Zoning                     = "-Zoning-";
            parcels.Next(6).ZoningPotential            = "-ZoningPotential-";
            parcels.Next(7).LandArea                   = 5500.55f;

            var classification = init.PropertyClassifications.Find(3);

            parcels.Next(8).Classification   = classification;
            parcels.Next(8).ClassificationId = classification.Id;

            var buildings = init.CreateBuildings(parcels.First(), 50, 5);

            buildings.Next(0).Location.X       = -123.720810;
            buildings.Next(0).Location.Y       = 48.529338;
            buildings.Next(1).Agency           = init.Agencies.Find(3);
            buildings.Next(1).AgencyId         = 3;
            buildings.Next(2).ClassificationId = 2;
            buildings.Next(3).Description      = "-DescriptionTest-";
            buildings.Next(4).BuildingTenancy  = "-BuildingTenancy-";

            buildings.AddRange(init.CreateBuildings(parcels.Next(1), 56, 5));
            buildings.Next(5).BuildingConstructionTypeId = 2;
            buildings.Next(6).BuildingPredominateUseId   = 2;
            buildings.Next(7).RentableArea = 100;
            buildings.Next(8).RentableArea = 50;

            buildings.AddRange(init.CreateBuildings(parcels.Next(4), 61, 10));

            var buildings01 = init.CreateBuildings(parcels.Next(7), 100, 10);

            buildings01.ForEach(b =>
            {
                b.Classification   = classification;
                b.ClassificationId = classification.Id;
            });
            buildings.AddRange(buildings01);

            init.SaveChanges();

            var service = helper.CreateService <PropertyService>(user);

            // Act
            var result = service.GetPage(filter);

            // Assert
            Assert.NotNull(result);
            Assert.IsAssignableFrom <IEnumerable <Entity.Views.Property> >(result);
            Assert.Equal(expectedTotal, result.Total);
            Assert.Equal(expectedCount, result.Count());
        }