Как написать разрешение графографических фильтров на сервере apollo graphql - PullRequest
0 голосов
/ 21 февраля 2019

Требование:

Мне нужна рекомендация при написании функции распознавателя для работы с фильтрами graphql.Фильтр поддерживает eq, ne, like, содержит, а не like операторы.

Схема:

import { gql } from 'apollo-server-express';

export default gql`
   extend type Query {
       authGroups(filter: AuthGroupFilterInput): AuthGroupConnection!
    }

    type AuthGroup implements Node {
       id: ID!
       name: String
    }

    input AuthGroupFilterInput {
       name: StringFilterInput
    }

    type AuthGroupConnection {
       edges: [AuthGroup!]!
       pageInfo: PageInfo
    }

    input StringFilterInput {
      lt: String,
      gt: String,
      eq: String,
      ne: String,
      contains: String,
      like: String,
      notLike: String,
    }  

`;

Запрос GraphQL:

 Query {
    authGroups(filter: {  
          name: {
             like: '%AD'
          }
       }
      )
    {
       edges {
         id
         name
       }
    }
 }

Resolvers:

authGroups: async (parent, args, { models }) => {
        const filter = args.filter;
        const filters = filter 
                        ? {
                            where: filter,
                        } 
                        : {};

        const authGroups = await models.authGroup.findAll({
           ...filters
        //    where : {
        //        name: {
        //            [Sequelize.Op.like] : 'AD%'
        //        }
        //    }
        });  
}

Используемые технологии:

  • Apollo Server
  • express
  • Sequelize
  • PostgreSQL

Как заменить операторы в фильтре на [Sequelize.Op.operator]?Я попытался использовать operatorAliases в config.json, но это не имело никакого эффекта.Ваша помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Я решил эту проблему с OperatorAliases, передав ее в конструктор Sequelize.

import Sequelize from 'sequelize';
const operatorsAliases = {
    eq: Op.eq,
    ne: Op.ne,
    gte: Op.gte,
    gt: Op.gt,
    lte: Op.lte,
    lt: Op.lt,
    ......
}

Используйте этот псевдоним в sequelize при подключении ..

const dbService = {
    connect: (host, database) => {
        const sequelize = new Sequelize(
            database,
            user,
            pwd, {
                host: host,
                dialect: 'yourDialect',
                dialectOptions: {
                    domain: domain,
                    encrypt: true
                },
                operatorsAliases: operatorsAliases,
                pool: {
                    max: 100,
                    min: 10,
                    idle: 200
                }
            }
        );

        sequelize
            .authenticate()
            .then(() => {
                console.log(database, 'Connection has been established successfully.');
            })
            .catch((err) => {
                console.error(err, `Unable to connect to the database.`);
            });

        return sequelize;
    }
};
const yourDBRef = dbService.connect(hostName, dbName);

И это должно работать непосредственно в вашемраспознаватель без каких-либо дополнительных усилий.

  const authGroups = await models.authGroup.findAll({
        where :filters
    }); 
0 голосов
/ 21 февраля 2019

Вы можете просто использовать скобочные обозначения для доступа к правильному свойству Op.Примерно так:

function transformFilter (filter) {
  for (const fieldName in filter) {
    const condition = filter[fieldName]
    filter[fieldName] = {}
    for (const operatorName in condition) {
      filter[fieldName][Op[operatorName]] = condition[operatorName]
    }
  }
}

Брекетная нотация работает даже тогда, когда она «вложена» вот так.

...