/// <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); }
/// <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); }
/// <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())); }
/// <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)); }
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" }); }
public void AllPropertyFilter_Base_IsValid() { // Arrange var filter = new AllPropertyFilter(); // Act var result = filter.IsValid(); // Assert result.Should().BeTrue(); }
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(); }
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(); }
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)); }
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)); }
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); }
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); }
/// <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); }
/// <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); }
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(); }
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()); }