When there is a need to show a certain subset of data on the grid depending on a user’s role, the server filter can be used. It allows filtering the data right on the application’s back end, so Flexmonster Pivot receives and shows only the part of the data that meets filtering conditions.
In this guide, we describe the concept of the server filter, its structure, and the example of the server filter implementation:
The main advantage of the server filter is that it can be used as a data access management tool. Using the server filter, Flexmonster.DataServer.Core.dll
will filter the data based on the user role received from Flexmonster Pivot.
Here is one of the possible server-side filtering implementations:
To see how the server filter can be implemented, refer to the Example section.
To make the server filter’s implementation easier, we designed a sample ASP.NET Core application using Flexmonster.DataServer.Core.dll
. This application contains an example of a server filter, which can be viewed in the FlexmonsterAPIController.cs file.
To create a new ASP.NET Core application with the Data Server or embed the DLL in the existing project, refer to the guide on Flexmonster.DataServer.Core.dll.
In the sample, the data is filtered based on the user’s region token sent by the component via request headers. A special dictionary defines which subset of data should correlate to the received token. The dictionary contains all possible region tokens and field members corresponding to them:
private static Dictionary<string, List<object>> _userPermissions =
new Dictionary<string, List<object>>()
{
/* a user with the "AdminToken" token will see
the report on all the countries */
{"AdminToken", null },
/* a user with the "EuropeToken" token will see
details about Germany and France */
{"EuropeToken", new List(){ "Germany","France" } },
/* a user with the "AmericaToken" token will see
highlights about USA and Canada */
{"AmericaToken", new List(){ "USA","Canada" } },
/* a user with the "AustraliaToken" token will see
info about Australia */
{"AustraliaToken", new List(){ "Australia" } },
};
In the sample project, the server filter is defined in a separate function. First, a user token is read from the request headers, and then, depending on that token, the filter is applied:
private ServerFilter GetServerFilter()
{
// get the user token from the request headers
HttpContext.Request.Headers.TryGetValue("UserToken", out StringValues userRole);
if (userRole.Count == 1)
{
// create a server filter
ServerFilter serverFilter = new ServerFilter();
// specify a field to filter
serverFilter.Field = new Field() {
UniqueName = "Country",
Type = ColumnType.stringType
};
// include the members that correspond to the user token
serverFilter.Include = _userPermissions[userRole[0]];
return serverFilter;
}
return null;
}
To learn more about the server filter’s parameters and their types, see the server filter structure.
After the filter is specified, it is passed as a parameter to GetMembers() and GetAggregatedData() methods, for example:
public MembersResponse PostMembers([FromBody]MembersRequest request)
{
var response = _apiService.GetMembers(request, GetServerFilter());
return new JsonResult(response);
}
The server filter has the following structure:
public class ServerFilter
{
public Field Field { get; set; }
public List<object> Include { get; set; }
public List<object> Exclude { get; set; }
}
Below is a detailed description of the filter parameters:
Field
– Field. A field to filter. If a non-existent field is specified, Flexmonster.DataServer.Core.dll
throws the exception.Include
– List<object>. Field members to include in the server’s response.Exclude
– List<object>. Field members to exclude from the server’s response.Here is an example of how the server filter can be created:
ServerFilter serverFilter = new ServerFilter();
serverFilter.Field = new Field() {
UniqueName = "Country",
Type = ColumnType.stringType
};
serverFilter.Include = new List<object>(){ "USA", "Canada" };
You may be interested in the following articles: