如何在查询上执行逻辑?

时间:2017-07-01 08:30:52

标签: hyperledger-composer

通过事务,我们可以将业务逻辑放在事务处理器中。非常简单的访问控制逻辑可以放在ACL文件中。但是,我们如何使用更复杂的逻辑来保护(或扩展)查询呢?

我正在处理一个案例,我想通过检查是否存在其他资产并具有某个属性来限制对资产的读取权限。

示例:

asset PersonalDetails identified by id {
  o String id
  o String dateOfBirth
  o String firstName
  o String lastName
  --> Participant owner
}

asset AccessRequest identified by id {
  o String id
  o String property
  o Boolean allowed
  --> PersonalDetails personalDetails
}

当参与者请求PersonalDetails时,必须存在AccessRequest并且允许=== true。个人详细信息的所有者是可以授予访问权限的人。理想情况下,AccessRequest具有字段属性'允许更精细的访问控制。

所以我最初的想法是:

transaction GetInfo identified by transactionId {
  o String transactionId
  --> AccessRequest accessRequest
}

/**
 * Sample transaction
 * @param {org.example.GetInfo} tx
 * @transaction
 */
function getInfo(tx) {
    if (!tx.accessRequest.allowed) {
        throw 'Access denied.';
    }
    return Promise.resolve(tx.accessRequest.personalDetails[tx.accessRequest.property]);
}

但我不认为Composer支持从事务中返回值(对吗?)。因此,一般来说,我们如何在查询中或之前使用逻辑,更具体地说,“作曲家”的方式是什么?'解决我的问题?

1 个答案:

答案 0 :(得分:0)

我正在提交一个新的示例网络,说明如何执行此操作。你可以在这里关注拉取请求: https://github.com/hyperledger/composer-sample-networks/pull/66/commits/6bb0d757a0248046da60b013cfddbd7d549686b6