diff --git a/Kontent.Ai.Delivery.Tests/DeliveryClientTests.cs b/Kontent.Ai.Delivery.Tests/DeliveryClientTests.cs index 96596bf1..f3e21fc9 100644 --- a/Kontent.Ai.Delivery.Tests/DeliveryClientTests.cs +++ b/Kontent.Ai.Delivery.Tests/DeliveryClientTests.cs @@ -741,7 +741,7 @@ public async Task QueryParameters() var client = InitializeDeliveryClientWithACustomTypeProvider(_mockHttp); var parameters = new IQueryParameter[] - { + { new AllFilter("elements.personas", "barista", "coffee", "blogger"), new AnyFilter("elements.personas", "barista", "coffee", "blogger"), new ContainsFilter("system.sitemap_locations", "cafes"), @@ -763,7 +763,45 @@ public async Task QueryParameters() new SkipParameter(2), new LanguageParameter("en"), new IncludeTotalCountParameter() - }; + }; + + var response = await client.GetItemsAsync(parameters); + + Assert.Equal(0, response.Items.Count); + } + + [Fact] + public async Task QueryParametersWithGenericFilter() + { + string url = $"{_baseUrl}/items?elements.personas%5Ball%5D=barista%2Ccoffee%2Cblogger&elements.personas%5Bany%5D=barista%2Ccoffee%2Cblogger&system.sitemap_locations%5Bcontains%5D=cafes&system.last_modified%5Beq%5D=2023-03-01T00%3A00%3A00Z&system.last_modified%5Bneq%5D=2023-03-02T00%3A00%3A00Z&elements.price%5Bgt%5D=&elements.price%5Bgte%5D=4&elements.price%5Bin%5D=100%2C50&elements.price%5Bnin%5D=300%2C400&elements.price%5Blt%5D=10.0001&elements.price%5Blte%5D=10000000000&system.last_modified%5Brange%5D=2022-01-01T00%3A00%3A00Z%2C2023-01-01T00%3A00%3A00Z&depth=2&elements=price%2Cproduct_name&limit=10&order=elements.price%5Bdesc%5D&skip=2&language=en&includeTotalCount"; + _mockHttp + .When($"{url}") + .Respond("application/json", " { 'items': [],'modular_content': {},'pagination': {'skip': 2,'limit': 10,'count': 0, 'total_count': 0, 'next_page': ''}}"); + + var client = InitializeDeliveryClientWithACustomTypeProvider(_mockHttp); + + var parameters = new IQueryParameter[] + { + new AllFilter("elements.personas", "barista", "coffee", "blogger"), + new AnyFilter("elements.personas", "barista", "coffee", "blogger"), + new ContainsFilter("system.sitemap_locations", "cafes"), + new EqualsFilter("system.last_modified", new DateTime(2023, 3, 1)), + new NotEqualsFilter("system.last_modified", new DateTime(2023, 3, 2)), + new GreaterThanFilter("elements.price", 0.00000000001m), + new GreaterThanOrEqualFilter("elements.price", 4), + new InFilter("elements.price", 100, 50.0m), + new NotInFilter("elements.price", 300, 400), + new LessThanFilter("elements.price", 10.0001m), + new LessThanOrEqualFilter("elements.price", 10000000000m), + new RangeFilter("system.last_modified", new DateTime(2022, 1, 1), new DateTime(2023, 1, 1)), + new DepthParameter(2), + new ElementsParameter("price", "product_name"), + new LimitParameter(10), + new OrderParameter("elements.price", SortOrder.Descending), + new SkipParameter(2), + new LanguageParameter("en"), + new IncludeTotalCountParameter() + }; var response = await client.GetItemsAsync(parameters); diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/AllFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/AllFilter.cs index 64253ba2..638d546d 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/AllFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/AllFilter.cs @@ -1,16 +1,34 @@ -namespace Kontent.Ai.Urls.Delivery.QueryParameters.Filters +using System; + +namespace Kontent.Ai.Urls.Delivery.QueryParameters.Filters { /// /// Represents a filter that matches a content item if the specified content element or system attribute has a value that contains all the specified values. /// This filter is applicable to array values only, such as sitemap location or value of Linked Items, Taxonomy and Multiple choice content elements. /// - public sealed class AllFilter : Filter + public sealed class AllFilter : Filter { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The codename of a content element or system attribute, for example elements.title or system.name. /// The filter values. + public AllFilter(string elementOrAttributePath, params T[] values) : base(elementOrAttributePath, values) + { + Operator = "[all]"; + } + } + + /// + /// Represents a filter that matches a content item if the specified content element or system attribute has a value that contains all the specified values. + /// This filter is applicable to array values only, such as sitemap location or value of Linked Items, Taxonomy and Multiple choice content elements. + /// + public sealed class AllFilter : Filter + { + /// + /// Initializes a new instance of the class. + /// The codename of a content element or system attribute, for example elements.title or system.name. + /// The filter values. public AllFilter(string elementOrAttributePath, params string[] values) : base(elementOrAttributePath, values) { Operator = "[all]"; diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/AnyFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/AnyFilter.cs index 3c934e08..63764644 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/AnyFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/AnyFilter.cs @@ -4,7 +4,24 @@ /// Represents a filter that matches a content item if the specified content element or system attribute has a value that contains any of the specified values. /// This filter is applicable to array values only, such as sitemap location or value of Linked Items, Taxonomy and Multiple choice content elements. /// - public sealed class AnyFilter : Filter + public sealed class AnyFilter : Filter + { + /// + /// Initializes a new instance of the class. + /// + /// The codename of a content element or system attribute, for example elements.title or system.name. + /// The filter values. + public AnyFilter(string elementOrAttributePath, params T[] values) : base(elementOrAttributePath, values) + { + Operator = "[any]"; + } + } + + /// + /// Represents a filter that matches a content item if the specified content element or system attribute has a value that contains any of the specified values. + /// This filter is applicable to array values only, such as sitemap location or value of Linked Items, Taxonomy and Multiple choice content elements. + /// + public sealed class AnyFilter : Filter { /// /// Initializes a new instance of the class. diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/ContainsFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/ContainsFilter.cs index d761401c..a22fe222 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/ContainsFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/ContainsFilter.cs @@ -4,10 +4,27 @@ /// Represents a filter that matches a content item if the specified content element or system attribute has a value that contains the specified value. /// This filter is applicable to array values only, such as sitemap location or value of Linked Items, Taxonomy and Multiple choice content elements. /// - public sealed class ContainsFilter : Filter + public sealed class ContainsFilter : Filter { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. + /// + /// The codename of a content element or system attribute, for example elements.title or system.name. + /// The filter value. + public ContainsFilter(string elementOrAttributePath, T value) : base(elementOrAttributePath, value) + { + Operator = "[contains]"; + } + } + + /// + /// Represents a filter that matches a content item if the specified content element or system attribute has a value that contains the specified value. + /// This filter is applicable to array values only, such as sitemap location or value of Linked Items, Taxonomy and Multiple choice content elements. + /// + public sealed class ContainsFilter : Filter + { + /// + /// Initializes a new instance of the class. /// /// The codename of a content element or system attribute, for example elements.title or system.name. /// The filter value. diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/EmptyFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/EmptyFilter.cs index 29843d53..1d931019 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/EmptyFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/EmptyFilter.cs @@ -3,7 +3,7 @@ /// /// Represents a filter that matches a content item if the specified content element or system attribute is empty. /// - public sealed class EmptyFilter : Filter + public sealed class EmptyFilter : Filter { /// /// Initializes a new instance of the class. diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/EqualsFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/EqualsFilter.cs index 5908d127..e239e707 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/EqualsFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/EqualsFilter.cs @@ -3,7 +3,23 @@ /// /// Represents a filter that matches a content item if the specified content element or system attribute has the specified value. /// - public sealed class EqualsFilter : Filter + public sealed class EqualsFilter : Filter + { + /// + /// Initializes a new instance of the class. + /// + /// The codename of a content element or system attribute, for example elements.title or system.name. + /// The filter value. + public EqualsFilter(string elementOrAttributePath, T value) : base(elementOrAttributePath, value) + { + Operator = "[eq]"; + } + } + + /// + /// Represents a filter that matches a content item if the specified content element or system attribute has the specified value. + /// + public sealed class EqualsFilter : Filter { /// /// Initializes a new instance of the class. diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/Filter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/Filter.cs index 169a6005..9baefc8d 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/Filter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/Filter.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; using System.Linq; using Kontent.Ai.Delivery.Abstractions; @@ -7,9 +8,11 @@ namespace Kontent.Ai.Urls.Delivery.QueryParameters.Filters /// /// Provides the base class for filter implementations. /// - public abstract class Filter : IQueryParameter + public abstract class Filter : IQueryParameter { private static readonly string SEPARATOR = Uri.EscapeDataString(","); + private static readonly string DECIMAL_FORMAT = "##########.##########"; + private static readonly string DATETIME_FORMAT = "yyyy-MM-ddTHH:mm:ssZ"; /// /// Gets the codename of a content element or system attribute, for example elements.title or system.name. @@ -19,7 +22,7 @@ public abstract class Filter : IQueryParameter /// /// Gets the filter values. /// - public string[] Values { get; protected set; } + public T[] Values { get; protected set; } /// /// Gets the filter operator. @@ -27,11 +30,11 @@ public abstract class Filter : IQueryParameter public string Operator { get; protected set; } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The codename of a content element or system attribute, for example elements.title or system.name. /// The filter values. - protected Filter(string elementOrAttributePath, params string[] values) + protected Filter(string elementOrAttributePath, params T[] values) { ElementOrAttributePath = elementOrAttributePath; Values = values; @@ -42,7 +45,23 @@ protected Filter(string elementOrAttributePath, params string[] values) /// public string GetQueryStringParameter() { - var escapedValues = Values.Select(Uri.EscapeDataString); + var values = Values switch + { + string[] strings => strings, + short[] shorts => shorts.Select(shortValue => shortValue.ToString(DECIMAL_FORMAT)), + ushort[] unsignedShorts => unsignedShorts.Select( shortValue => shortValue.ToString(DECIMAL_FORMAT )), + int[] integers => integers.Select(integer => integer.ToString(DECIMAL_FORMAT)), + uint[] unsignedIntegers => unsignedIntegers.Select( integer => integer.ToString(DECIMAL_FORMAT)), + long[] longs => longs.Select( longValue => longValue.ToString(DECIMAL_FORMAT)), + ulong[] unsignedLongs => unsignedLongs.Select( longValue => longValue.ToString(DECIMAL_FORMAT)), + float[] floats => floats.Select(floatValue => floatValue.ToString(DECIMAL_FORMAT)), + double[] doubles => doubles.Select(doubleValue => doubleValue.ToString(DECIMAL_FORMAT)), + decimal[] decimals => decimals.Select(decimalValue => decimalValue.ToString(DECIMAL_FORMAT)), + DateTime[] dateTimes => dateTimes.Select(dateTime => dateTime.ToString(DATETIME_FORMAT, CultureInfo.InvariantCulture)), + _ => Values.Select(value => value.ToString()) + }; + + var escapedValues = values.Select(Uri.EscapeDataString); return $"{Uri.EscapeDataString(ElementOrAttributePath)}{Uri.EscapeDataString(Operator ?? string.Empty)}={string.Join(SEPARATOR, escapedValues)}"; } } diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/GreaterThanFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/GreaterThanFilter.cs index b0e18b75..6d68ffe3 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/GreaterThanFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/GreaterThanFilter.cs @@ -3,7 +3,23 @@ /// /// Represents a filter that matches a content item if the specified content element or system attribute has a value that is greater than the specified value. /// - public sealed class GreaterThanFilter : Filter + public sealed class GreaterThanFilter : Filter + { + /// + /// Initializes a new instance of the class. + /// + /// The codename of a content element or system attribute, for example elements.title or system.name. + /// The filter value. + public GreaterThanFilter(string elementOrAttributePath, T value) : base(elementOrAttributePath, value) + { + Operator = "[gt]"; + } + } + + /// + /// Represents a filter that matches a content item if the specified content element or system attribute has a value that is greater than the specified value. + /// + public sealed class GreaterThanFilter : Filter { /// /// Initializes a new instance of the class. diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/GreaterThanOrEqualFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/GreaterThanOrEqualFilter.cs index 4a1fd390..c521c4dd 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/GreaterThanOrEqualFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/GreaterThanOrEqualFilter.cs @@ -3,7 +3,23 @@ /// /// Represents a filter that matches a content item if the specified content element or system attribute has a value that is greater than or equal to the specified value. /// - public sealed class GreaterThanOrEqualFilter : Filter + public sealed class GreaterThanOrEqualFilter : Filter + { + /// + /// Initializes a new instance of the class. + /// + /// The codename of a content element or system attribute, for example elements.title or system.name. + /// The filter value. + public GreaterThanOrEqualFilter(string elementOrAttributePath, T value) : base(elementOrAttributePath, value) + { + Operator = "[gte]"; + } + } + + /// + /// Represents a filter that matches a content item if the specified content element or system attribute has a value that is greater than or equal to the specified value. + /// + public sealed class GreaterThanOrEqualFilter : Filter { /// /// Initializes a new instance of the class. diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/InFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/InFilter.cs index 9681343a..200e1269 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/InFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/InFilter.cs @@ -3,7 +3,23 @@ /// /// Represents a filter that matches a content item if the specified content element or system attribute has a value that matches a value in the specified list. /// - public sealed class InFilter : Filter + public sealed class InFilter : Filter + { + /// + /// Initializes a new instance of the class. + /// + /// The codename of a content element or system attribute, for example elements.title or system.name. + /// The filter values. + public InFilter(string elementOrAttributePath, params T[] values) : base(elementOrAttributePath, values) + { + Operator = "[in]"; + } + } + + /// + /// Represents a filter that matches a content item if the specified content element or system attribute has a value that matches a value in the specified list. + /// + public sealed class InFilter : Filter { /// /// Initializes a new instance of the class. diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/LessThanFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/LessThanFilter.cs index e69f78a0..7ba10b62 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/LessThanFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/LessThanFilter.cs @@ -3,7 +3,23 @@ /// /// Represents a filter that matches a content item if the specified content element or system attribute has a value that is less than the specified value. /// - public sealed class LessThanFilter : Filter + public sealed class LessThanFilter : Filter + { + /// + /// Initializes a new instance of the class. + /// + /// The codename of a content element or system attribute, for example elements.title or system.name. + /// The filter value. + public LessThanFilter(string elementOrAttributePath, T value) : base(elementOrAttributePath, value) + { + Operator = "[lt]"; + } + } + + /// + /// Represents a filter that matches a content item if the specified content element or system attribute has a value that is less than the specified value. + /// + public sealed class LessThanFilter : Filter { /// /// Initializes a new instance of the class. diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/LessThanOrEqualFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/LessThanOrEqualFilter.cs index 0b932329..a1a1a162 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/LessThanOrEqualFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/LessThanOrEqualFilter.cs @@ -3,7 +3,23 @@ /// /// Represents a filter that matches a content item if the specified content element or system attribute has a value that is less than or equal to the specified value. /// - public sealed class LessThanOrEqualFilter : Filter + public sealed class LessThanOrEqualFilter : Filter + { + /// + /// Initializes a new instance of the class. + /// + /// The codename of a content element or system attribute, for example elements.title or system.name. + /// The filter value. + public LessThanOrEqualFilter(string elementOrAttributePath, T value) : base(elementOrAttributePath, value) + { + Operator = "[lte]"; + } + } + + /// + /// Represents a filter that matches a content item if the specified content element or system attribute has a value that is less than or equal to the specified value. + /// + public sealed class LessThanOrEqualFilter : Filter { /// /// Initializes a new instance of the class. diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/NotEmptyFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/NotEmptyFilter.cs index 1a1e88fc..1a44d395 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/NotEmptyFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/NotEmptyFilter.cs @@ -3,7 +3,7 @@ /// /// Represents a filter that matches a content item if the specified content element or system attribute is not empty. /// - public sealed class NotEmptyFilter : Filter + public sealed class NotEmptyFilter : Filter { /// /// Initializes a new instance of the class. diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/NotEqualsFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/NotEqualsFilter.cs index cd502ed9..e67d0bf5 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/NotEqualsFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/NotEqualsFilter.cs @@ -3,7 +3,23 @@ /// /// Represents a filter that matches a content item if the specified content element or system attribute doesn't have the specified value. /// - public sealed class NotEqualsFilter : Filter + public sealed class NotEqualsFilter : Filter + { + /// + /// Initializes a new instance of the class. + /// + /// The codename of a content element or system attribute, for example elements.title or system.name. + /// The filter value. + public NotEqualsFilter(string elementOrAttributePath, T value) : base(elementOrAttributePath, value) + { + Operator = "[neq]"; + } + } + + /// + /// Represents a filter that matches a content item if the specified content element or system attribute doesn't have the specified value. + /// + public sealed class NotEqualsFilter : Filter { /// /// Initializes a new instance of the class. diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/NotInFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/NotInFilter.cs index 0e44e871..46934fd6 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/NotInFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/NotInFilter.cs @@ -3,7 +3,23 @@ /// /// Represents a filter that matches a content item if the specified content element or system attribute has a value that doesn't match a value in the specified list. /// - public sealed class NotInFilter : Filter + public sealed class NotInFilter : Filter + { + /// + /// Initializes a new instance of the class. + /// + /// The codename of a content element or system attribute, for example elements.title or system.name. + /// The filter values. + public NotInFilter(string elementOrAttributePath, params T[] values) : base(elementOrAttributePath, values) + { + Operator = "[nin]"; + } + } + + /// + /// Represents a filter that matches a content item if the specified content element or system attribute has a value that doesn't match a value in the specified list. + /// + public sealed class NotInFilter : Filter { /// /// Initializes a new instance of the class. diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/RangeFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/RangeFilter.cs index c916b887..08a9efda 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/RangeFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/RangeFilter.cs @@ -3,7 +3,24 @@ /// /// Represents a filter that matches a content item if the specified content element or system attribute has a value that falls within the specified range of values (both inclusive). /// - public sealed class RangeFilter : Filter + public sealed class RangeFilter : Filter + { + /// + /// Initializes a new instance of the class. + /// + /// The codename of a content element or system attribute, for example elements.title or system.name. + /// The lower limit of the filter range. + /// The upper limit of the filter range. + public RangeFilter(string elementOrAttributePath, T lowerLimit, T upperLimit) : base(elementOrAttributePath, lowerLimit, upperLimit) + { + Operator = "[range]"; + } + } + + /// + /// Represents a filter that matches a content item if the specified content element or system attribute has a value that falls within the specified range of values (both inclusive). + /// + public sealed class RangeFilter : Filter { /// /// Initializes a new instance of the class. @@ -11,7 +28,7 @@ public sealed class RangeFilter : Filter /// The codename of a content element or system attribute, for example elements.title or system.name. /// The lower limit of the filter range. /// The upper limit of the filter range. - public RangeFilter(string elementOrAttributePath, string lowerLimit, string upperLimit) : base(elementOrAttributePath, lowerLimit , upperLimit) + public RangeFilter(string elementOrAttributePath, string lowerLimit, string upperLimit) : base(elementOrAttributePath, lowerLimit, upperLimit) { Operator = "[range]"; } diff --git a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/SystemTypeEqualsFilter.cs b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/SystemTypeEqualsFilter.cs index e79669f2..29881470 100644 --- a/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/SystemTypeEqualsFilter.cs +++ b/Kontent.Ai.Urls/Delivery/QueryParameters/Filters/SystemTypeEqualsFilter.cs @@ -3,7 +3,7 @@ /// /// Represents a filter that matches a content item of the given content type. /// - public sealed class SystemTypeEqualsFilter : Filter + public sealed class SystemTypeEqualsFilter : Filter { /// /// Initializes a new instance of the class.