javascripthyperledger-composer

Error: Expected a Resource or Concept. In hyperledger composer when trying to create a transaction


I have no idea why my code isn't working. Here it is:

milk.cto

 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * Sour milk business network definition.
 */
namespace org.example.milk

concept Address {
  o String street
  o String city default ="Gabrovo"
  o String country default = "Bulgaria"
}

asset SourMilk identified by batchId {
  o Integer quantity
  o String batchId
  --> Producer producer
  --> Owner owner
  o Address origin
  o String description
  o Double fats default=4.0
  o Double saturatedFats default=4.0
  o Double kilocalories default=66.0
  o Double lactose default=4.6
  o Double protein default=3.2
  o Double sodium default=0.1
  o Boolean checked default=false
  o Boolean confirmed default=false
  --> Inspector checkingInspector
}

participant Producer identified by producerId {
  o String producerId
  o String firstName
  o String lastName
  o Address address
}

participant Owner identified by ownerId {
  o String ownerId
  o String firmName
  o String firstNameOfCEO
  o String lastNameOfCEO
  o Address address
  o String description
}

participant Inspector identified by inspectorId {
  o String inspectorId
  o String firstName
  o String lastName
  o Address address
  o String institution default="HEI"
}
transaction QualityCheck {
  --> SourMilk batch
  --> Inspector inspector
  o Boolean approval
}

lib/sample.js

/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* global getAssetRegistry */

/**
 * Confirmation
 * @param {org.example.milk.QualityCheck} batch, inspector, approval
 * @transaction
 */
async function QualityCheck(batch, inspector, approval) 
{  
    batch.checked=true
    batch.confirmed=approval

    // Get the asset registry for the asset.
    const assetRegistry = await getAssetRegistry('org.example.milk.SourMilk');
    // Update the asset in the asset registry.
    await assetRegistry.update(batch.checked);
}

permissions.acl

/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * Sample access control list.
 */
rule ProducersCanReadEverything {
    description: "Allow producers read access to all resources"
    participant: "org.example.milk.Producer"
    operation: READ
    resource: "org.example.milk.*"
    action: ALLOW
}

rule OwnersCanReadEverything {
    description: "Allow owners read access to all resources"
    participant: "org.example.milk.Owner"
    operation: READ
    resource: "org.example.milk.*"
    action: ALLOW
}

rule InspectorCanReadEverything {
    description: "Allow inspectors read access to all resources"
    participant: "org.example.milk.Inspector"
    operation: READ
    resource: "org.example.milk.*"
    action: ALLOW
}

rule InspectorCanCheckQuality {
    description: "Allow inspectors to check quality"
    participant: "org.example.milk.Inspector"
    operation: CREATE
    resource: "org.example.milk.QualityCheck"
    action: ALLOW
}

rule ProducerHasFullAccessToTheirAssets {
    description: "Allow all participants full access to their assets"
    participant(p): "org.example.milk.Producer"
    operation: ALL
    resource(r): "org.example.milk.SourMilk"
    condition: ((r.producer.getIdentifier() === p.getIdentifier()) && !r.checked && !r.confirmed)
    action: ALLOW
}


rule SystemACL {
    description: "System ACL to permit all access"
    participant: "org.hyperledger.composer.system.Participant"
    operation: ALL
    resource: "org.hyperledger.composer.system.**"
    action: ALLOW
}

rule NetworkAdminUser {
    description: "Grant business network administrators full access to user resources"
    participant: "org.hyperledger.composer.system.NetworkAdmin"
    operation: ALL
    resource: "**"
    action: ALLOW
}

rule NetworkAdminSystem {
    description: "Grant business network administrators full access to system resources"
    participant: "org.hyperledger.composer.system.NetworkAdmin"
    operation: ALL
    resource: "org.hyperledger.composer.system.**"
    action: ALLOW
}

Why do I get this error when trying to create a transaction: Error: Expected a Resource or Concept I believe the values I typed are correct. ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


Solution

  • Try this

    await assetRegistry.update(batch);
    

    in QualityCheck function