From e31ecf316598efc7c6228d25a300b63a6d19ca16 Mon Sep 17 00:00:00 2001 From: Brett Logan Date: Fri, 24 Jul 2020 12:37:10 -0400 Subject: [PATCH] Decorate Typescript Chaincode Add the contract-api specific annotations and enable the experimental features. Also properly format code according to the linter Signed-off-by: Brett Logan --- .../chaincode-typescript/src/asset.ts | 18 +++- .../chaincode-typescript/src/assetTransfer.ts | 82 +++++++++---------- .../chaincode-typescript/src/index.ts | 5 +- .../chaincode-typescript/tsconfig.json | 1 + .../chaincode-typescript/tslint.json | 4 +- 5 files changed, 64 insertions(+), 46 deletions(-) diff --git a/asset-transfer-basic/chaincode-typescript/src/asset.ts b/asset-transfer-basic/chaincode-typescript/src/asset.ts index 56d33439..9fd62d35 100644 --- a/asset-transfer-basic/chaincode-typescript/src/asset.ts +++ b/asset-transfer-basic/chaincode-typescript/src/asset.ts @@ -1,12 +1,26 @@ /* - * SPDX-License-Identifier: Apache-2.0 - */ + SPDX-License-Identifier: Apache-2.0 +*/ +import {Object, Property} from 'fabric-contract-api'; + +@Object() export class Asset { + @Property() public docType?: string; + + @Property() public ID: string; + + @Property() public Color: string; + + @Property() public Size: number; + + @Property() public Owner: string; + + @Property() public AppraisedValue: number; } diff --git a/asset-transfer-basic/chaincode-typescript/src/assetTransfer.ts b/asset-transfer-basic/chaincode-typescript/src/assetTransfer.ts index 04ebcb99..5646ce54 100644 --- a/asset-transfer-basic/chaincode-typescript/src/assetTransfer.ts +++ b/asset-transfer-basic/chaincode-typescript/src/assetTransfer.ts @@ -2,65 +2,67 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Context, Contract } from 'fabric-contract-api'; -import { Asset } from './asset'; +import {Context, Contract, Returns, Transaction} from 'fabric-contract-api'; +import {Asset} from './asset'; export class AssetTransfer extends Contract { + @Transaction() public async initLedger(ctx: Context) { const assets: Asset[] = [ { - ID: "asset1", - Color: "blue", + ID: 'asset1', + Color: 'blue', Size: 5, - Owner: "Tomoko", + Owner: 'Tomoko', AppraisedValue: 300, }, { - ID: "asset2", - Color: "red", + ID: 'asset2', + Color: 'red', Size: 5, - Owner: "Brad", + Owner: 'Brad', AppraisedValue: 400, }, { - ID: "asset3", - Color: "green", + ID: 'asset3', + Color: 'green', Size: 10, - Owner: "Jin Soo", + Owner: 'Jin Soo', AppraisedValue: 500, }, { - ID: "asset4", - Color: "yellow", + ID: 'asset4', + Color: 'yellow', Size: 10, - Owner: "Max", + Owner: 'Max', AppraisedValue: 600, }, { - ID: "asset5", - Color: "black", + ID: 'asset5', + Color: 'black', Size: 15, - Owner: "Adriana", + Owner: 'Adriana', AppraisedValue: 700, }, { - ID: "asset6", - Color: "white", + ID: 'asset6', + Color: 'white', Size: 15, - Owner: "Michel", + Owner: 'Michel', AppraisedValue: 800, }, ]; - for (let i = 0; i < assets.length; i++) { - assets[i].docType = 'asset'; - await ctx.stub.putState(assets[i].ID, Buffer.from(JSON.stringify(assets[i]))); - console.info('Added <--> ', assets[i]); + for (const asset of assets) { + asset.docType = 'asset'; + await ctx.stub.putState(asset.ID, Buffer.from(JSON.stringify(asset))); + console.info(`Asset ${asset.ID} initialized`); } } // createAsset issues a new asset to the world state with given details. + @Transaction() public async createAsset(ctx: Context, id: string, color: string, size: number, owner: string, appraisedValue: number) { const asset = { ID: id, @@ -69,73 +71,72 @@ export class AssetTransfer extends Contract { Owner: owner, AppraisedValue: appraisedValue, }; - await ctx.stub.putState(id, Buffer.from(JSON.stringify(asset))); } // readAsset returns the asset stored in the world state with given id. + @Transaction(false) public async readAsset(ctx: Context, id: string): Promise { const assetJSON = await ctx.stub.getState(id); // get the asset from chaincode state if (!assetJSON || assetJSON.length === 0) { throw new Error(`The asset ${id} does not exist`); } - return assetJSON.toString(); } // updateAsset updates an existing asset in the world state with provided parameters. + @Transaction() public async updateAsset(ctx: Context, id: string, color: string, size: number, owner: string, appraisedValue: number) { const exists = await this.assetExists(ctx, id); if (!exists) { throw new Error(`The asset ${id} does not exist`); } - // overwritting original asset with new asset - let updatedAsset = { + // overwriting original asset with new asset + const updatedAsset = { ID: id, Color: color, Size: size, Owner: owner, AppraisedValue: appraisedValue, }; - return ctx.stub.putState(id, Buffer.from(JSON.stringify(updatedAsset))); } // deleteAsset deletes an given asset from the world state. + @Transaction() public async deleteAsset(ctx: Context, id: string) { const exists = await this.assetExists(ctx, id); if (!exists) { throw new Error(`The asset ${id} does not exist`); } - return ctx.stub.deleteState(id); } // assetExists returns true when asset with given ID exists in world state. + @Transaction(false) + @Returns('boolean') public async assetExists(ctx: Context, id: string): Promise { const assetJSON = await ctx.stub.getState(id); - if (!assetJSON || assetJSON.length === 0) { - return false; - } - return true; + return assetJSON && assetJSON.length > 0; } // transferAsset updates the owner field of asset with given id in the world state. + @Transaction() public async transferAsset(ctx: Context, id: string, newOwner: string) { - let assetString = await this.readAsset(ctx, id); - - let asset = JSON.parse(assetString); + const assetString = await this.readAsset(ctx, id); + const asset = JSON.parse(assetString); asset.Owner = newOwner; - await ctx.stub.putState(id, Buffer.from(JSON.stringify(asset))); } // getAllAssets returns all assets found in the world state. + @Transaction(false) + @Returns('string') public async getAllAssets(ctx: Context): Promise { const allResults = []; // range query with empty string for startKey and endKey does an open-ended query of all assets in the chaincode namespace. - for await (const { key, value } of ctx.stub.getStateByRange("", "")) { + for await (const {key, value} of ctx.stub.getStateByRange('', '')) { const strValue = Buffer.from(value).toString('utf8'); let record; try { @@ -144,9 +145,8 @@ export class AssetTransfer extends Contract { console.log(err); record = strValue; } - allResults.push({ Key: key, Record: record }); + allResults.push({Key: key, Record: record}); } - console.info(allResults); return JSON.stringify(allResults); } diff --git a/asset-transfer-basic/chaincode-typescript/src/index.ts b/asset-transfer-basic/chaincode-typescript/src/index.ts index a5f5e17b..c018f4b7 100644 --- a/asset-transfer-basic/chaincode-typescript/src/index.ts +++ b/asset-transfer-basic/chaincode-typescript/src/index.ts @@ -2,7 +2,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { AssetTransfer } from './assetTransfer'; -export { AssetTransfer } from './assetTransfer'; +import {AssetTransfer} from './assetTransfer'; + +export {AssetTransfer} from './assetTransfer'; export const contracts: any[] = [AssetTransfer]; diff --git a/asset-transfer-basic/chaincode-typescript/tsconfig.json b/asset-transfer-basic/chaincode-typescript/tsconfig.json index 8c96ea07..2eaf5b98 100644 --- a/asset-transfer-basic/chaincode-typescript/tsconfig.json +++ b/asset-transfer-basic/chaincode-typescript/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "experimentalDecorators": true, "outDir": "dist", "target": "es2017", "moduleResolution": "node", diff --git a/asset-transfer-basic/chaincode-typescript/tslint.json b/asset-transfer-basic/chaincode-typescript/tslint.json index 33ccbf3c..a52c3ee2 100644 --- a/asset-transfer-basic/chaincode-typescript/tslint.json +++ b/asset-transfer-basic/chaincode-typescript/tslint.json @@ -15,7 +15,9 @@ "no-string-throw": true, "no-var-keyword": true, "no-trailing-whitespace": true, - "object-literal-key-quotes": [true, "as-needed"] + "object-literal-key-quotes": [true, "as-needed"], + "object-literal-sort-keys": false, + "max-line-length": false }, "rulesDirectory": [] }