Get Free Trial
  1. API reference
Connecting to Data Source
  1. Supported data sources
  2. Connecting to other data sources
Configuring the component
  • Documentation for older versions
  • Table of contents

    Implementing the server filter

    The server filter can be used to limit which data is shown on the grid depending on a user’s role. It allows filtering the data right on the application’s back end, so Flexmonster Pivot receives and shows only the subset of the data that meets filtering conditions.

    In this guide, we describe the concept of the server filter, its structure, and provide an example implementation:

    The general idea of the server filter

    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 a possible server-side filtering implementation:

    1. When Flexmonster Pivot sends a request for data to the server, the user’s role can be included in the request headers with customizeAPIRequest. This method allows editing the headers before the request is sent to the server.
    2. After the Data Server accepts the request, the request headers can be read. Depending on the received role, the DLL can apply the appropriate filter to the data.
    3. The resulting subset of data is sent to Flexmonster Pivot. The component gets the dataset specific to the current user.

    To see how the server filter can be implemented, refer to the Example section.

    Example of a server filter

    To simplify the server filter’s implementation, we prepared a sample ASP.NET Core application using Flexmonster.DataServer.Core.dll. This application contains an example server filter, which can be viewed in the FlexmonsterAPIController.cs file.

    To create a new ASP.NET Core application with the Data Server or to embed the DLL in an existing project, refer to the guide on Flexmonster.DataServer.Core.dll.

    Defining user roles on the server side

    In the sample, the data is filtered based on the user’s region token sent by the component using request headers. A 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" } },
    };

    Defining the server filter

    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 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

    Applying the server filter

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

    Note To apply several server filters, add them to an IEnumerable<ServerFilter> collection and pass it to GetMembers() or GetAggregatedData() methods.

    The server filter structure

    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:

    Parameter/Type Description
    Field
    Field
    The field to filter. If a non-existent field is specified, Flexmonster.DataServer.Core.dll throws an 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" };

    What’s next?

    You may be interested in the following articles: