/// <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 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 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(); 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)); }
/// <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); }