github.com/muhammedhassanm/blockchain@v0.0.0-20200120143007-697261defd4d/blockapps-ba-master/server/dapp/dapp.js (about) 1 const ba = require('blockapps-rest'); 2 const rest = ba.rest; 3 const util = ba.common.util; 4 const config = ba.common.config; 5 const Promise = ba.common.Promise; 6 7 const userManagerJs = require(process.cwd() + '/' + config.libPath + '/user/userManager'); 8 const projectManagerJs = require(process.cwd() + '/' + config.libPath + '/project/projectManager'); 9 10 const ProjectEvent = ba.rest.getEnums(`${config.libPath}/project/contracts/ProjectEvent.sol`).ProjectEvent; 11 const ErrorCodes = ba.rest.getEnums(`${config.libPath}/common/ErrorCodes.sol`).ErrorCodes; 12 13 const contractName = 'AdminInterface'; 14 const contractFilename = '/admin/AdminInterface.sol'; 15 const subContractsNames = ['userManager', 'projectManager']; 16 17 function* uploadContract(admin, libPath) { 18 const contract = yield rest.uploadContract(admin, contractName, libPath + contractFilename); 19 contract.src = 'removed'; 20 yield compileSearch(); 21 return yield setContract(admin, contract); 22 } 23 24 function* compileSearch() { 25 const libPath = process.cwd() + '/' + config.libPath; 26 // compile dependencies 27 const bidJs = require(`${libPath}/bid/bid`); 28 const userJs = require(`${libPath}/user/user`); 29 const projectJs = require(`${libPath}/project/project`); 30 // compile 31 const searchable = [ 32 bidJs.contractName, 33 projectJs.contractName, 34 userJs.contractName, 35 userManagerJs.contractName, 36 projectManagerJs.contractName, 37 contractName 38 ]; 39 yield rest.compileSearch(searchable, contractName, config.libPath + contractFilename) 40 } 41 42 function* getSubContracts(contract) { 43 rest.verbose('getSubContracts', {contract, subContractsNames}); 44 const state = yield rest.getState(contract); 45 const subContracts = {} 46 subContractsNames.map(name => { 47 const address = state[name]; 48 if (address === undefined || address == 0) throw new Error('Sub contract address not found ' + name); 49 subContracts[name] = { 50 name: name[0].toUpperCase() + name.substring(1), 51 address: address, 52 } 53 }); 54 return subContracts; 55 } 56 57 function* setContract(admin, contract) { 58 rest.verbose('setContract', {admin, contract}); 59 // set the managers 60 const subContarcts = yield getSubContracts(contract); 61 const userManager = userManagerJs.setContract(admin, subContarcts['userManager']); 62 const projectManager = projectManagerJs.setContract(admin, subContarcts['projectManager']); 63 64 contract.getBalance = function* (username) { 65 rest.verbose('dapp: getBalance', username); 66 return yield userManager.getBalance(username); 67 } 68 // project - create 69 contract.createProject = function* (args) { 70 return yield createProject(projectManager, args); 71 } 72 // project - by name 73 contract.getProject = function* (name) { 74 rest.verbose('dapp: getProject', name); 75 return yield projectManager.getProject(name); 76 } 77 // projects - by buyer 78 contract.getProjectsByBuyer = function* (buyer) { 79 rest.verbose('dapp: getProjectsByBuyer', buyer); 80 return yield projectManager.getProjectsByBuyer(buyer); 81 } 82 // projects - by state 83 contract.getProjectsByState = function* (state) { 84 rest.verbose('dapp: getProjectsByState', state); 85 return yield projectManager.getProjectsByState(state); 86 } 87 // projects - by supplier 88 contract.getProjectsBySupplier = function* (supplier) { 89 rest.verbose('dapp: getProjectsBySupplier', supplier); 90 return yield projectManager.getProjectsBySupplier(supplier); 91 } 92 // create bid 93 contract.createBid = function* (name, supplier, amount) { 94 rest.verbose('dapp: createBid', {name, supplier, amount}); 95 return yield projectManager.createBid(name, supplier, amount); 96 } 97 // bids by name 98 contract.getBids = function* (name) { 99 rest.verbose('dapp: getBids', name); 100 return yield projectManagerJs.getBidsByName(name); 101 } 102 // handle event 103 contract.handleEvent = function* (args) { 104 return yield handleEvent(userManager, projectManager, args); 105 } 106 // login 107 contract.login = function* (username, password) { 108 return yield login(userManager, username, password); 109 } 110 // deploy 111 contract.deploy = function* (dataFilename, deployFilename) { 112 return yield deploy(admin, contract, userManager, dataFilename, deployFilename); 113 } 114 115 return contract; 116 } 117 118 // =========================== business functions ======================== 119 120 function* login(userManager, username, password) { 121 rest.verbose('dapp: login', {username, password}); 122 const args = {username:username, password:password}; 123 const result = yield userManager.login(args); 124 // auth failed 125 if (!result) { 126 return {authenticate: false}; 127 } 128 // auth OK 129 const baUser = yield userManager.getUser(username); 130 return {authenticate: true, user: baUser}; 131 } 132 133 function* createProject(projectManager, args) { 134 rest.verbose('dapp: createProject', {args}); 135 args.created = +new Date(); 136 const project = yield projectManager.createProject(args); 137 return project; 138 } 139 140 // accept bid 141 function* acceptBid(userManager, projectManager, buyerName, buyerPassword, bidId, projectName) { 142 rest.verbose('dapp: acceptBid', {buyerName, buyerPassword, bidId, projectName}); 143 const buyer = yield userManager.getUser(buyerName); 144 buyer.password = buyerPassword; 145 const result = yield projectManager.acceptBid(buyer, bidId, projectName); 146 return result; 147 } 148 149 // receive project 150 function* receiveProject(userManager, projectManager, projectName) { 151 rest.verbose('dapp: receiveProject', projectName); 152 // get the accepted bid 153 const bid = yield projectManager.getAcceptedBid(projectName); 154 // get the supplier for the accepted bid 155 const supplier = yield userManager.getUser(bid.supplier); 156 // Settle the project: change state to RECEIVED and tell the bid to send the funds to the supplier 157 const result = yield projectManager.settleProject(projectName, supplier.account, bid.address); 158 return result; 159 } 160 161 // handle project event 162 function* handleEvent(userManager, projectManager, args) { 163 const name = args.name; 164 rest.verbose('dapp: project handleEvent', args); 165 166 switch(args.projectEvent) { 167 case ProjectEvent.RECEIVE: 168 return yield receiveProject(userManager, projectManager, args.projectName); 169 170 case ProjectEvent.ACCEPT: 171 return yield acceptBid(userManager, projectManager, args.username, args.password, args.bidId, args.projectName); 172 173 default: 174 return yield projectManager.handleEvent(args.projectName, args.projectEvent); 175 } 176 } 177 178 function* createPresetUsers(userManager, presetUsers) { 179 const UserRole = rest.getEnums(`${config.libPath}/user/contracts/UserRole.sol`).UserRole; 180 const users = []; 181 for (let presetUser of presetUsers) { 182 const args = { 183 username: presetUser.username, 184 password: presetUser.password, 185 role: UserRole[presetUser.role], 186 } 187 const user = yield userManager.createUser(args); 188 users.push(user); 189 } 190 return users; 191 } 192 193 function* deploy(admin, contract, userManager, presetDataFilename, deployFilename) { 194 rest.verbose('dapp: deploy', {presetDataFilename, deployFilename}); 195 const fsutil = ba.common.fsutil; 196 197 const presetData = fsutil.yamlSafeLoadSync(presetDataFilename); 198 if (presetData === undefined) throw new Error('Preset data read failed ' + presetDataFilename); 199 console.log('Preset data', JSON.stringify(presetData, null, 2)); 200 201 // create preset users 202 const users = yield createPresetUsers(userManager, presetData.users); // TODO test the users are all in 203 204 const deployment = { 205 url: config.getBlocUrl(), 206 admin: admin, 207 contract: { 208 name: contract.name, 209 address: contract.address, 210 }, 211 users: presetData.users, 212 }; 213 // write 214 console.log('deploy filename:', deployFilename); 215 console.log(fsutil.yamlSafeDumpSync(deployment)); 216 217 fsutil.yamlWrite(deployment, deployFilename); 218 return deployment; 219 } 220 221 module.exports = { 222 setContract: setContract, 223 compileSearch: compileSearch, 224 uploadContract: uploadContract, 225 };