github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/ui/app/routes/evaluations/index.js (about)

     1  import { inject as service } from '@ember/service';
     2  import Route from '@ember/routing/route';
     3  
     4  export default class EvaluationsIndexRoute extends Route {
     5    @service store;
     6  
     7    queryParams = {
     8      pageSize: {
     9        refreshModel: true,
    10      },
    11      nextToken: {
    12        refreshModel: true,
    13      },
    14      status: {
    15        refreshModel: true,
    16      },
    17      triggeredBy: {
    18        refreshModel: true,
    19      },
    20      qpNamespace: {
    21        refreshModel: true,
    22      },
    23      searchTerm: {
    24        refreshModel: true,
    25      },
    26      type: {
    27        refreshModel: true,
    28      },
    29    };
    30  
    31    model({
    32      nextToken,
    33      pageSize,
    34      searchTerm,
    35      status,
    36      triggeredBy,
    37      type,
    38      qpNamespace: namespace,
    39    }) {
    40      /*
    41      We use our own DSL for filter expressions. This function takes our query parameters and builds a query that matches our DSL.
    42      Documentation can be found here:  https://www.nomadproject.io/api-docs#filtering
    43      */
    44      const generateFilterExpression = () => {
    45        const searchFilter = searchTerm
    46          ? `ID contains "${searchTerm}" or JobID contains "${searchTerm}" or NodeID contains "${searchTerm}" or TriggeredBy contains "${searchTerm}"`
    47          : null;
    48        const typeFilter =
    49          type === 'client' ? `NodeID is not empty` : `NodeID is empty`;
    50        const triggeredByFilter = `TriggeredBy contains "${triggeredBy}"`;
    51        const statusFilter = `Status contains "${status}"`;
    52  
    53        let filterExp;
    54        if (searchTerm) {
    55          if (!type && !status && !triggeredBy) {
    56            return searchFilter;
    57          }
    58          filterExp = `(${searchFilter})`;
    59          if (type) {
    60            filterExp = `${filterExp} and ${typeFilter}`;
    61          }
    62          if (triggeredBy) {
    63            filterExp = `${filterExp} and ${triggeredByFilter}`;
    64          }
    65          if (status) {
    66            filterExp = `${filterExp} and ${statusFilter}`;
    67          }
    68          return filterExp;
    69        }
    70  
    71        if (type || status || triggeredBy) {
    72          const lookup = {
    73            [type]: typeFilter,
    74            [status]: statusFilter,
    75            [triggeredBy]: triggeredByFilter,
    76          };
    77  
    78          filterExp = [type, status, triggeredBy].reduce((result, filter) => {
    79            const expression = lookup[filter];
    80            if (!!filter && result !== '') {
    81              result = result.concat(` and ${expression}`);
    82            } else if (filter) {
    83              result = expression;
    84            }
    85            return result;
    86          }, '');
    87          return filterExp;
    88        }
    89  
    90        return null;
    91      };
    92  
    93      this.store.findAll('namespace');
    94  
    95      return this.store.query('evaluation', {
    96        namespace,
    97        reverse: true,
    98        per_page: pageSize,
    99        next_token: nextToken,
   100        filter: generateFilterExpression(),
   101      });
   102    }
   103  }