Apollo GraphQL自定义数据源设置默认筛选器

Apollo GraphQL自定义数据源设置默认筛选器,graphql,apollo,Graphql,Apollo,对于Apollo GraphQL服务器自定义数据源,向每个数据库查询添加默认where子句的最佳方法是什么 where isDeleted = false 使用Apollo GraphQL服务器,我创建了一个自定义数据源。数据源只是从数据库获取数据 class CustomDataSource extends DataSource { 我扩展了CustomDataSource,以便可以向其中添加特定于项目的详细信息。i、 e.CustomDataSource应该是普通的,可以跨项目重用,而M

对于Apollo GraphQL服务器自定义数据源,向每个数据库查询添加默认where子句的最佳方法是什么

where isDeleted = false
使用Apollo GraphQL服务器,我创建了一个自定义数据源。数据源只是从数据库获取数据

class CustomDataSource extends DataSource {
我扩展了CustomDataSource,以便可以向其中添加特定于项目的详细信息。i、 e.CustomDataSource应该是普通的,可以跨项目重用,而MyProjectDataSource可以包含特定于项目的业务规则

class MyProjectDataSource extends CustomDataSource {
My GraphQL查询接受过滤器参数,CustomDataSource将过滤器应用于数据库查询

type Query {
  users(filter: JSON): [User]
}
我的customDataSource是最重要的,所以它包含返回所有查询数据的连接

实施理念

  • MyProjectDataSource更改/覆盖筛选器参数,然后调用CustomDataSource。更改查询参数是直截了当的,但不清楚是否可以(或建议)更改子字段参数。我正在使用npm模块graphql解析解析信息进行字段前瞻
  • MyProjectDataSource重写CustomDataSource函数。缺点:看起来太复杂了。也许公开一个可以被覆盖的“getFilter”函数是可行的,但是覆盖函数感觉像是一个重锤式的方法

  • 添加新的defaultFilter参数。缺点:我们不想将此参数公开给应用程序

  • 创建一个defaultFilter指令。缺点:使模式复杂化。需要在整个架构中手动添加。不清楚如何在MyProjectDataSource中实现,并且具有与上面2相同的实现缺点

  • 使用NodeJS eventEmitter允许CustomDataSource重写筛选器参数。缺点:对于所有特定于项目的规则,必须将挂钩烘焙到CustomDataSource

  • 创建自定义筛选器数据类型(而不是JSON类型)。可能此筛选器类可以公开defaultFilter属性。缺点:增加一个简单的需求感觉像是一条复杂的道路

  • 我找不到任何阿波罗服务器架构来帮助实现这一功能。因此,我决定使用这种简化方法:

    class CustomDataSource extends DataSource {
      // Override this method in MyProjectDataSource (optional).
      static onFilterEvent(args, info, eargs) {
        return eargs;
      }
    
      // Add filter.
      eargs = { filter: get(args, 'filter') };
      eargs = this.constructor.onFilterEvent(this.args, this.info, eargs);
      if (eargs.filter) {
        // Run database query with modified filter in eargs.filter.
      }
    }
    
    // CustomDataSource to emit event (and pass filter argument).
    eventEmitter.emit('filter', ...
    
    // MyDataSource to listen for event (and override filter argument).
    eventEmitter.on('filter', ...
    
    class CustomDataSource extends DataSource {
      // Override this method in MyProjectDataSource (optional).
      static onFilterEvent(args, info, eargs) {
        return eargs;
      }
    
      // Add filter.
      eargs = { filter: get(args, 'filter') };
      eargs = this.constructor.onFilterEvent(this.args, this.info, eargs);
      if (eargs.filter) {
        // Run database query with modified filter in eargs.filter.
      }
    }
    
    class MyProjectDataSource extends CustomDataSource {
      static onFilterEvent(args, info, eargs) {
        eargs.filter = { isDeleted: false }; // TODO: If existing filter then use and clause.
        return eargs;
      }
    }