限制用户可以在Amplify GraphQL API中创建的记录数的方法

限制用户可以在Amplify GraphQL API中创建的记录数的方法,graphql,amazon-dynamodb,aws-amplify,Graphql,Amazon Dynamodb,Aws Amplify,我有一个应用程序,其中Auth是使用Cognito用户池实现的,API是使用Amplify实现的GraphQLAPI。在模式定义中,是否有一种简单的方法来限制用户可以创建的记录数。例如,在以下模式中 type Product @model @auth(rules: [{ allow: owner }]) { id: ID! name: String! description: String } 我想限制用户最多100个产品 一种方法是通过我的前端。当我检测到一个用户已经达到100个

我有一个应用程序,其中Auth是使用Cognito用户池实现的,API是使用Amplify实现的GraphQLAPI。在模式定义中,是否有一种简单的方法来限制用户可以创建的记录数。例如,在以下模式中

type Product @model @auth(rules: [{ allow: owner }]) {
  id: ID!
  name: String!
  description: String
}
我想限制用户最多100个产品

一种方法是通过我的前端。当我检测到一个用户已经达到100个限制时,我可以让UI停止给他们添加更多的功能。但是如果有人绕过UI,他们可以创建100多个。因此,我更喜欢在后端强制执行此限制

在模式定义中或AWS/DynamoDB的其他地方是否有这样做的方法


谢谢

据我所知,没有一种简单的方法可以做到这一点

下面是我将如何解决这个问题

  • 在owner属性上为Product创建@key,以便您可以按owner进行查询
  • 覆盖CreateProduct。在自定义冲突解决程序中,在创建新产品之前,使用传入的所有者id按所有者查询产品表,以计算已经存在的所有者数量。 以下是文件:

  • 我认为最简单的解决方案是在lambda函数中处理API请求,该函数在脚本写入DB之前验证请求(产品计数<100)。然后,您可以消除模型的内置突变,以防止意外访问

    模式示例:

    type Mutation {
      addProduct(input: ProductAddInput): ProductAddOutput @function(name: "productLambda-${env}")
    }
    type Product 
      @model(queries: null, mutations: null, subscriptions: null) /* update these to what you need */
      @auth(rules: [{ allow: owner }]) {
      id: ID!
      name: String!
      description: String
    }
    
    在Lambda中,您可以从
    event.identity
    属性中提取用户名,该用户名应与数据库中的owner字段相关。由于AWS包是自动加载的,只要db索引设置正确,您就应该看到非常快速的脚本执行

    对于用户产品计数,我看到了两个选项:

    • 在owner字段上设置的二级索引,这样您就不会进行大量的操作 扫描
    • 如果您有一个用户表,您可以添加一个统计的字段 为每个用户提供产品,并随时更新该表 更新产品表