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  };