Добавление связей в массив отношений в hyperledger-composer - PullRequest
0 голосов
/ 25 июня 2018

В моём приложении для составления гиперлогов у меня есть клиенты и консультанты.Клиент имеет доступ на чтение к Консультантам, которые были добавлены в его / ее "readAccessList".

Вот модели этих двух типов участников:

participant Client identified by id {
  o String id
  o String name
  --> Consultant[] readAccessList optional
}

participant Consultant identified by id {
  o String id
  o String name
  o String text
}

Транзакция для добавления консультантов вreadAccessList клиентов определяется следующим образом:

transaction AddToReadableConsultantsOfClient {
  --> Client client
  --> Consultant[] newReadableConsultants
}

Функция процессора транзакций для этой транзакции следующая:

/**
 * transaction AddToReadableConsultantsOfClient
 * @param {org.comp.myapp.AddToReadableConsultantsOfClient} transaction
 * @transaction
 */
async function addToReadableConsultantsOfClient(transaction) {

    // Save the old version of the client:
    const clientOld = transaction.client;

    // Update the client with the new readableConsultants:
    transaction.client.readAccessList.concat(transaction.newReadableConsultants);    

    // Get the participant registry containing the clients:
    const participantRegistry = await getParticipantRegistry('org.comp.myapp.Client');

    // Update the client in the participant registry:
    await participantRegistry.update(transaction.client);

    // Emit an event for the modified client:
    let event = getFactory().newEvent('org.comp.myapp', 'ClientUpdated');
    event.clientOld = clientOld;
    event.clientNew = transaction.client;
    emit(event);

}

В моем угловом приложении я пытаюсь добавить паруКонсультанты readAccessList клиента, используя следующий код:

//Note that the consultants referred to in the following array do actually exist:
let consultants = ["resource:org.comp.myapp.Consultant#1", "resource:org.comp.myapp.Consultant#2"];

this.transaction = {
  $class: "org.comp.myapp.AddToReadableConsultantsOfClient",       
      "client": "resource:org.comp.myapp.Client#" + this.clientId,
      "newReadableConsultants": consultants,
      "timestamp": new Date().getTime()
};

return this.addToReadableConsultantsOfClientService.addTransaction(this.transaction)
.toPromise()
.then(() => {
  this.errorMessage = null;
})
.catch((error) => {
    if(error == 'Server error'){
      this.errorMessage = "Could not connect to REST server. Please check your configuration details.";
    }
    else if(error == '404 - Not Found'){
      this.errorMessage = "404 - Could not find API route. Please check your available APIs."
    }
    else{
      this.errorMessage = error;
    }
});

По некоторым причинам это не работает.Консультанты не добавляются в «readAccessList» клиента (который остается пустым).

В консоли появляется странное сообщение об ошибке, в котором говорится следующее:

Error: 2 UNKNOWN: error executing chaincode: transaction returned with failure: ReferenceError: org is not defined

Что не так с моим подходом к добавлению отношений в массив отношений?

1 Ответ

0 голосов
/ 26 июня 2018

Я изменил 1 строку вашего сценария транзакции:

transaction.client.readAccessList.concat(transaction.newReadableConsultants);

на

transaction.client.readAccessList=transaction.client.readAccessList.concat(transaction.newReadableConsultants);

Я тестировал на Composer Playground иданные JSON, которые я использовал, были:

{
 "$class": "org.comp.myapp.AddToReadableConsultantsOfClient",
 "client": "resource:org.comp.myapp.Client#MBC01",
 "newReadableConsultants": [
  "resource:org.comp.myapp.Consultant#C02"
 ]
}

Транзакция теперь работает в Playground, но я не тестировал ее через приложение Angular.

...