text: 
  // load the packages we need
  var express       = require('express');        // call express
  var app           = express();                 // define our app using express
  var bodyParser    = require('body-parser');
  var http          = require('http')
  var fs            = require('fs');
  var Fabric_Client = require('fabric-client');
  var path          = require('path');
  var util          = require('util');
  var os            = require('os');
  
  module.exports = (function() {
  return{
  
  	create_landRecord: function(req, res){
  		console.log("submit new land record..: ");
  
  		var array = req.params.landRecord.split("-");
  		console.log(array);
  
  		var pid= args[0]
                  var ward = args[1]
                  var areaCode = args[2]
                  var siteNo = args[3]
  
  		var fabric_client = new Fabric_Client();
  
  		// setup the fabric network
  		var channel = fabric_client.newChannel('mychannel'); //connect to the channel
  		var peer = fabric_client.newPeer('grpc://localhost:7051'); //connect to the peer at 7051
  		channel.addPeer(peer);
  		var order = fabric_client.newOrderer('grpc://localhost:7050')
  		channel.addOrderer(order);
  
  		var member_user = null;
  		var store_path = path.join(os.homedir(), '.hfc-key-store');
  		console.log('Store path:'+store_path);
  		var tx_id = null;
  
  		// create the key value store as defined in the fabric-client/config/default.json 'key-value-store' setting
  		Fabric_Client.newDefaultKeyValueStore({ path: store_path
  		}).then((state_store) => {
  		    // assign the store to the fabric client
  		    fabric_client.setStateStore(state_store);
  		    var crypto_suite = Fabric_Client.newCryptoSuite();
  		    // use the same location for the state store (where the users' certificate are kept)
  		    // and the crypto store (where the users' keys are kept)
  		    var crypto_store = Fabric_Client.newCryptoKeyStore({path: store_path});
  		    crypto_suite.setCryptoKeyStore(crypto_store);
  		    fabric_client.setCryptoSuite(crypto_suite);
  
  		    // get the enrolled user from persistence, this user will sign all requests
  		    return fabric_client.getUserContext('user1', true);
  		}).then((user_from_store) => {
  		    if (user_from_store && user_from_store.isEnrolled()) {
  		        console.log('Successfully loaded user1 from persistence');
  		        member_user = user_from_store;
  		    } else {
  		        throw new Error('Failed to get user1.... run registerUser.js');
  		    }
  
  		    // get a transaction id object based on the current user assigned to fabric client
  		    tx_id = fabric_client.newTransactionID();
  		    console.log("Assigning transaction_id: ", tx_id._transaction_id);
  
  		    /* createLandRecord - requires 4 args*/
  		    // send proposal to endorser
  		    const request = {
  		        //targets : --- letting this default to the peers assigned to the channel
  		        chaincodeId: 'bhoomi',
  		        fcn: 'createLandRecord',
  		        args: [pid,ward,areaCode,siteNo],
  		        chainId: 'mychannel',
  		        txId: tx_id
  		    };
  
  		    // send the transaction proposal to the peers
  		    return channel.sendTransactionProposal(request);
  		}).then((results) => {
  		    var proposalResponses = results[0];
  		    var proposal = results[1];
  		    let isProposalGood = false;
  		    if (proposalResponses && proposalResponses[0].response &&
  		        proposalResponses[0].response.status === 200) {
  		            isProposalGood = true;
  		            console.log('Transaction proposal was good');
  		        } else {
  		            console.error('Transaction proposal was bad');
  		        }
  		    if (isProposalGood) {
  		        console.log(util.format(
  		            'Successfully sent Proposal and received ProposalResponse: Status - %s, message - "%s"',
  		            proposalResponses[0].response.status, proposalResponses[0].response.message));
  
  		        // build up the request for the orderer to have the transaction committed
  		        var request = {
  		            proposalResponses: proposalResponses,
  		            proposal: proposal
  		        };
  
  		        // set the transaction listener and set a timeout of 30 sec
  		        // if the transaction did not get committed within the timeout period,
  		        // report a TIMEOUT status
  		        var transaction_id_string = tx_id.getTransactionID(); //Get the transaction ID string to be used by the event processing
  		        var promises = [];
  
  		        var sendPromise = channel.sendTransaction(request);
  		        promises.push(sendPromise); //we want the send transaction first, so that we know where to check status
  
  		        // get an eventhub once the fabric client has a user assigned. The user
  		        // is required bacause the event registration must be signed
  		        let event_hub = fabric_client.newEventHub();
  		        event_hub.setPeerAddr('grpc://localhost:7053');
  
  		        // using resolve the promise so that result status may be processed
  		        // under the then clause rather than having the catch clause process
  		        // the status
  		        let txPromise = new Promise((resolve, reject) => {
  		            let handle = setTimeout(() => {
  		                event_hub.disconnect();
  		                resolve({event_status : 'TIMEOUT'}); //we could use reject(new Error('Trnasaction did not complete within 30 seconds'));
  		            }, 3000);
  		            event_hub.connect();
  		            event_hub.registerTxEvent(transaction_id_string, (tx, code) => {
  		                // this is the callback for transaction event status
  		                // first some clean up of event listener
  		                clearTimeout(handle);
  		                event_hub.unregisterTxEvent(transaction_id_string);
  		                event_hub.disconnect();
  
  		                // now let the application know what happened
  		                var return_status = {event_status : code, tx_id : transaction_id_string};
  		                if (code !== 'VALID') {
  		                    console.error('The transaction was invalid, code = ' + code);
  		                    resolve(return_status); // we could use reject(new Error('Problem with the tranaction, event status ::'+code));
  		                } else {
  		                    console.log('The transaction has been committed on peer ' + event_hub._ep._endpoint.addr);
  		                    resolve(return_status);
  		                }
  		            }, (err) => {
  		                //this is the callback if something goes wrong with the event registration or processing
  		                reject(new Error('There was a problem with the eventhub ::'+err));
  		            });
  		        });
  		        promises.push(txPromise);
  
  		        return Promise.all(promises);
  		    } else {
  		        console.error('Failed to send Proposal or receive valid response. Response null or status is not 200. exiting...');
  		        throw new Error('Failed to send Proposal or receive valid response. Response null or status is not 200. exiting...');
  		    }
  		}).then((results) => {
  		    console.log('Send transaction promise and event listener promise have completed');
  		    // check the results in the order the promises were added to the promise all list
  		    if (results && results[0] && results[0].status === 'SUCCESS') {
  		        console.log('Successfully sent transaction to the orderer.');
  		        res.send(tx_id.getTransactionID());
  		    } else {
  		        console.error('Failed to order the transaction. Error code: ' + response.status);
  		    }
  
  		    if(results && results[1] && results[1].event_status === 'VALID') {
  		        console.log('Successfully committed the change to the ledger by the peer');
  		        res.send(tx_id.getTransactionID());
  		    } else {
  		        console.log('Transaction failed to be committed to the ledger due to ::'+results[1].event_status);
  		    }
  		}).catch((err) => {
  		    console.error('Failed to invoke successfully :: ' + err);
  		});
  	},
  	
  	allot_landRecord: function(req, res){
  		console.log("submit new land record..: ");
  
  		var array = req.params.landRecord.split("-");
  		console.log(array);
  
  		var pid= args[0]
  	      	var ownerName = args[1]
  		var gender = args[2]
  		var aadharNo= args[3]
  		var mobileNo = args[4]
  		var emailID= args[5]
  		var ownerAddress = args[6]
  
  		var latitude = args[7]
  		var longitude = args[8]
  		var length= args[9]
  		var width= args[10]
  		var totalArea= args[11]
  		var geoAddress = args[12]
  
  
  		var fabric_client = new Fabric_Client();
  
  		// setup the fabric network
  		var channel = fabric_client.newChannel('mychannel'); //connect to the channel
  		var peer = fabric_client.newPeer('grpc://localhost:7051'); //connect to the peer at 7051
  		channel.addPeer(peer);
  		var order = fabric_client.newOrderer('grpc://localhost:7050')
  		channel.addOrderer(order);
  
  		var member_user = null;
  		var store_path = path.join(os.homedir(), '.hfc-key-store');
  		console.log('Store path:'+store_path);
  		var tx_id = null;
  
  		// create the key value store as defined in the fabric-client/config/default.json 'key-value-store' setting
  		Fabric_Client.newDefaultKeyValueStore({ path: store_path
  		}).then((state_store) => {
  		    // assign the store to the fabric client
  		    fabric_client.setStateStore(state_store);
  		    var crypto_suite = Fabric_Client.newCryptoSuite();
  		    // use the same location for the state store (where the users' certificate are kept)
  		    // and the crypto store (where the users' keys are kept)
  		    var crypto_store = Fabric_Client.newCryptoKeyStore({path: store_path});
  		    crypto_suite.setCryptoKeyStore(crypto_store);
  		    fabric_client.setCryptoSuite(crypto_suite);
  
  		    // get the enrolled user from persistence, this user will sign all requests
  		    return fabric_client.getUserContext('user1', true);
  		}).then((user_from_store) => {
  		    if (user_from_store && user_from_store.isEnrolled()) {
  		        console.log('Successfully loaded user1 from persistence');
  		        member_user = user_from_store;
  		    } else {
  		        throw new Error('Failed to get user1.... run registerUser.js');
  		    }
  
  		    // get a transaction id object based on the current user assigned to fabric client
  		    tx_id = fabric_client.newTransactionID();
  		    console.log("Assigning transaction_id: ", tx_id._transaction_id);
  
  		    // allotNewLandRecord - requires 13 args
  		    // send proposal to endorser
  		    const request = {
  		        //targets : --- letting this default to the peers assigned to the channel
  		        chaincodeId: 'bhoomi',
  		        fcn: 'allotNewLandRecord',
  		        args: [pid, ownerName, gender, aadharNo, mobileNo,emailID,ownerAddress,latitude,longitude,length,width,totalArea,geoAddress],
  		        chainId: 'mychannel',
  		        txId: tx_id
  		    };
  
  		    // send the transaction proposal to the peers
  		    return channel.sendTransactionProposal(request);
  		}).then((results) => {
  		    var proposalResponses = results[0];
  		    var proposal = results[1];
  		    let isProposalGood = false;
  		    if (proposalResponses && proposalResponses[0].response &&
  		        proposalResponses[0].response.status === 200) {
  		            isProposalGood = true;
  		            console.log('Transaction proposal was good');
  		        } else {
  		            console.error('Transaction proposal was bad');
  		        }
  		    if (isProposalGood) {
  		        console.log(util.format(
  		            'Successfully sent Proposal and received ProposalResponse: Status - %s, message - "%s"',
  		            proposalResponses[0].response.status, proposalResponses[0].response.message));
  
  		        // build up the request for the orderer to have the transaction committed
  		        var request = {
  		            proposalResponses: proposalResponses,
  		            proposal: proposal
  		        };
  
  		        // set the transaction listener and set a timeout of 30 sec
  		        // if the transaction did not get committed within the timeout period,
  		        // report a TIMEOUT status
  		        var transaction_id_string = tx_id.getTransactionID(); //Get the transaction ID string to be used by the event processing
  		        var promises = [];
  
  		        var sendPromise = channel.sendTransaction(request);
  		        promises.push(sendPromise); //we want the send transaction first, so that we know where to check status
  
  		        // get an eventhub once the fabric client has a user assigned. The user
  		        // is required bacause the event registration must be signed
  		        let event_hub = fabric_client.newEventHub();
  		        event_hub.setPeerAddr('grpc://localhost:7053');
  
  		        // using resolve the promise so that result status may be processed
  		        // under the then clause rather than having the catch clause process
  		        // the status
  		        let txPromise = new Promise((resolve, reject) => {
  		            let handle = setTimeout(() => {
  		                event_hub.disconnect();
  		                resolve({event_status : 'TIMEOUT'}); //we could use reject(new Error('Trnasaction did not complete within 30 seconds'));
  		            }, 3000);
  		            event_hub.connect();
  		            event_hub.registerTxEvent(transaction_id_string, (tx, code) => {
  		                // this is the callback for transaction event status
  		                // first some clean up of event listener
  		                clearTimeout(handle);
  		                event_hub.unregisterTxEvent(transaction_id_string);
  		                event_hub.disconnect();
  
  		                // now let the application know what happened
  		                var return_status = {event_status : code, tx_id : transaction_id_string};
  		                if (code !== 'VALID') {
  		                    console.error('The transaction was invalid, code = ' + code);
  		                    resolve(return_status); // we could use reject(new Error('Problem with the tranaction, event status ::'+code));
  		                } else {
  		                    console.log('The transaction has been committed on peer ' + event_hub._ep._endpoint.addr);
  		                    resolve(return_status);
  		                }
  		            }, (err) => {
  		                //this is the callback if something goes wrong with the event registration or processing
  		                reject(new Error('There was a problem with the eventhub ::'+err));
  		            });
  		        });
  		        promises.push(txPromise);
  
  		        return Promise.all(promises);
  		    } else {
  		        console.error('Failed to send Proposal or receive valid response. Response null or status is not 200. exiting...');
  		        throw new Error('Failed to send Proposal or receive valid response. Response null or status is not 200. exiting...');
  		    }
  		}).then((results) => {
  		    console.log('Send transaction promise and event listener promise have completed');
  		    // check the results in the order the promises were added to the promise all list
  		    if (results && results[0] && results[0].status === 'SUCCESS') {
  		        console.log('Successfully sent transaction to the orderer.');
  		        res.send(tx_id.getTransactionID());
  		    } else {
  		        console.error('Failed to order the transaction. Error code: ' + response.status);
  		    }
  
  		    if(results && results[1] && results[1].event_status === 'VALID') {
  		        console.log('Successfully committed the change to the ledger by the peer');
  		        res.send(tx_id.getTransactionID());
  		    } else {
  		        console.log('Transaction failed to be committed to the ledger due to ::'+results[1].event_status);
  		    }
  		}).catch((err) => {
  		    console.error('Failed to invoke successfully :: ' + err);
  		});
  	},
  	get_landRecord: function(req, res){
  
  		var fabric_client = new Fabric_Client();
  		var key = req.params.id //Pid
  
  		// setup the fabric network
  		var channel = fabric_client.newChannel('mychannel');
  		var peer = fabric_client.newPeer('grpc://localhost:7051');
  		channel.addPeer(peer);
  
  		//
  		var member_user = null;
  		var store_path = path.join(os.homedir(), '.hfc-key-store');
  		console.log('Store path:'+store_path);
  		var tx_id = null;
  
  		// create the key value store as defined in the fabric-client/config/default.json 'key-value-store' setting
  		Fabric_Client.newDefaultKeyValueStore({ path: store_path
  		}).then((state_store) => {
  		    // assign the store to the fabric client
  		    fabric_client.setStateStore(state_store);
  		    var crypto_suite = Fabric_Client.newCryptoSuite();
  		    // use the same location for the state store (where the users' certificate are kept)
  		    // and the crypto store (where the users' keys are kept)
  		    var crypto_store = Fabric_Client.newCryptoKeyStore({path: store_path});
  		    crypto_suite.setCryptoKeyStore(crypto_store);
  		    fabric_client.setCryptoSuite(crypto_suite);
  
  		    // get the enrolled user from persistence, this user will sign all requests
  		    return fabric_client.getUserContext('user1', true);
  		}).then((user_from_store) => {
  		    if (user_from_store && user_from_store.isEnrolled()) {
  		        console.log('Successfully loaded user1 from persistence');
  		        member_user = user_from_store;
  		    } else {
  		        throw new Error('Failed to get user1.... run registerUser.js');
  		    }
  
  		    // queryLandRecord - requires 1 argument, ex: args: ['123456789']
  		    const request = {
  		        chaincodeId: 'bhoomi',
  		        txId: tx_id,
  		        fcn: 'queryLandRecord',
  		        args: [key]
  		    };
  
  		    // send the query proposal to the peer
  		    return channel.queryByChaincode(request);
  		}).then((query_responses) => {
  		    console.log("Query has completed, checking results");
  		    // query_responses could have more than one  results if there multiple peers were used as targets
  		    if (query_responses && query_responses.length == 1) {
  		        if (query_responses[0] instanceof Error) {
  		            console.error("error from query = ", query_responses[0]);
  		            res.send("Failed to get LandRecord")
  		            
  		        } else {
  		            console.log("Response is ", query_responses[0].toString());
  		            res.send(query_responses[0].toString())
  		        }
  		    } else {
  		        console.log("No payloads were returned from query");
  		        res.send("Landrecord not found..")
  		    }
  		}).catch((err) => {
  		    console.error('Failed to query successfully :: ' + err);
  		    res.send("Could not locate tuna")
  		});
  	},
  	transfer_ownership: function(req, res){
  		console.log("transfer land record to new owner");
  
  		var array = req.params.holder.split("-");
                  var pid = args[0];
  		var ownerName = args[1];
  		var gender = args[2];
  		var aadharNo = args[3];
  		var mobileNo = args[4];
  		var emailID = args[5];
          	var address = args[6];
  
  
  		var fabric_client = new Fabric_Client();
  
  		// setup the fabric network
  		var channel = fabric_client.newChannel('mychannel');
  		var peer = fabric_client.newPeer('grpc://localhost:7051');
  		channel.addPeer(peer);
  		var order = fabric_client.newOrderer('grpc://localhost:7050')
  		channel.addOrderer(order);
  
  		var member_user = null;
  		var store_path = path.join(os.homedir(), '.hfc-key-store');
  		console.log('Store path:'+store_path);
  		var tx_id = null;
  
  		// create the key value store as defined in the fabric-client/config/default.json 'key-value-store' setting
  		Fabric_Client.newDefaultKeyValueStore({ path: store_path
  		}).then((state_store) => {
  		    // assign the store to the fabric client
  		    fabric_client.setStateStore(state_store);
  		    var crypto_suite = Fabric_Client.newCryptoSuite();
  		    // use the same location for the state store (where the users' certificate are kept)
  		    // and the crypto store (where the users' keys are kept)
  		    var crypto_store = Fabric_Client.newCryptoKeyStore({path: store_path});
  		    crypto_suite.setCryptoKeyStore(crypto_store);
  		    fabric_client.setCryptoSuite(crypto_suite);
  
  		    // get the enrolled user from persistence, this user will sign all requests
  		    return fabric_client.getUserContext('user1', true);
  		}).then((user_from_store) => {
  		    if (user_from_store && user_from_store.isEnrolled()) {
  		        console.log('Successfully loaded user1 from persistence');
  		        member_user = user_from_store;
  		    } else {
  		        throw new Error('Failed to get user1.... run registerUser.js');
  		    }
  
  		    // get a transaction id object based on the current user assigned to fabric client
  		    tx_id = fabric_client.newTransactionID();
  		    console.log("Assigning transaction_id: ", tx_id._transaction_id);
  
  		    // send proposal to endorser
  	            //transferLandRecord requires 7 arguments
  		    var request = {
  		        //targets : --- letting this default to the peers assigned to the channel
  		        chaincodeId: 'bhoomi',
  		        fcn: 'transferLandRecord',
  		        args: [pid,ownerName, gender,aadharNo,mobileNo,emailID,address],
  		        chainId: 'mychannel',
  		        txId: tx_id
  		    };
  
  		    // send the transaction proposal to the peers
  		    return channel.sendTransactionProposal(request);
  		}).then((results) => {
  		    var proposalResponses = results[0];
  		    var proposal = results[1];
  		    let isProposalGood = false;
  		    if (proposalResponses && proposalResponses[0].response &&
  		        proposalResponses[0].response.status === 200) {
  		            isProposalGood = true;
  		            console.log('Transaction proposal was good');
  		        } else {
  		            console.error('Transaction proposal was bad');
  		        }
  		    if (isProposalGood) {
  		        console.log(util.format(
  		            'Successfully sent Proposal and received ProposalResponse: Status - %s, message - "%s"',
  		            proposalResponses[0].response.status, proposalResponses[0].response.message));
  
  		        // build up the request for the orderer to have the transaction committed
  		        var request = {
  		            proposalResponses: proposalResponses,
  		            proposal: proposal
  		        };
  
  		        // set the transaction listener and set a timeout of 30 sec
  		        // if the transaction did not get committed within the timeout period,
  		        // report a TIMEOUT status
  		        var transaction_id_string = tx_id.getTransactionID(); //Get the transaction ID string to be used by the event processing
  		        var promises = [];
  
  		        var sendPromise = channel.sendTransaction(request);
  		        promises.push(sendPromise); //we want the send transaction first, so that we know where to check status
  
  		        // get an eventhub once the fabric client has a user assigned. The user
  		        // is required bacause the event registration must be signed
  		        let event_hub = fabric_client.newEventHub();
  		        event_hub.setPeerAddr('grpc://localhost:7053');
  
  		        // using resolve the promise so that result status may be processed
  		        // under the then clause rather than having the catch clause process
  		        // the status
  		        let txPromise = new Promise((resolve, reject) => {
  		            let handle = setTimeout(() => {
  		                event_hub.disconnect();
  		                resolve({event_status : 'TIMEOUT'}); //we could use reject(new Error('Trnasaction did not complete within 30 seconds'));
  		            }, 3000);
  		            event_hub.connect();
  		            event_hub.registerTxEvent(transaction_id_string, (tx, code) => {
  		                // this is the callback for transaction event status
  		                // first some clean up of event listener
  		                clearTimeout(handle);
  		                event_hub.unregisterTxEvent(transaction_id_string);
  		                event_hub.disconnect();
  
  		                // now let the application know what happened
  		                var return_status = {event_status : code, tx_id : transaction_id_string};
  		                if (code !== 'VALID') {
  		                    console.error('The transaction was invalid, code = ' + code);
  		                    resolve(return_status); // we could use reject(new Error('Problem with the tranaction, event status ::'+code));
  		                } else {
  		                    console.log('The transaction has been committed on peer ' + event_hub._ep._endpoint.addr);
  		                    resolve(return_status);
  		                }
  		            }, (err) => {
  		                //this is the callback if something goes wrong with the event registration or processing
  		                reject(new Error('There was a problem with the eventhub ::'+err));
  		            });
  		        });
  		        promises.push(txPromise);
  
  		        return Promise.all(promises);
  		    } else {
  		        console.error('Failed to send Proposal or receive valid response. Response null or status is not 200. exiting...');
  		        res.send("Error: no land record found");
  		        // throw new Error('Failed to send Proposal or receive valid response. Response null or status is not 200. exiting...');
  		    }
  		}).then((results) => {
  		    console.log('Send transaction promise and event listener promise have completed');
  		    // check the results in the order the promises were added to the promise all list
  		    if (results && results[0] && results[0].status === 'SUCCESS') {
  		        console.log('Successfully sent transaction to the orderer.');
  		        res.json(tx_id.getTransactionID())
  		    } else {
  		        console.error('Failed to order the transaction. Error code: ' + response.status);
  		        res.send("Error: no land record found");
  		    }
  
  		    if(results && results[1] && results[1].event_status === 'VALID') {
  		        console.log('Successfully committed the change to the ledger by the peer');
  		        res.json(tx_id.getTransactionID())
  		    } else {
  		        console.log('Transaction failed to be committed to the ledger due to ::'+results[1].event_status);
  		    }
  		}).catch((err) => {
  		    console.error('Failed to invoke successfully :: ' + err);
  		    res.send("Error: no land record found");
  		});
  
  	}
  
  }
  })();
  