/ dapp-config.js
dapp-config.js
  1  const path = require("path");
  2  const fs = require("fs");
  3  const dappSchema = require('./dapp-schema');
  4  const fm = require('front-matter');
  5  
  6  class DAppConfig {
  7    constructor(config, logger) {
  8      this.configurations = {};
  9      this.appConfig = config;
 10      this.logger = logger;
 11  
 12      this.validate();
 13    }
 14  
 15    validate() {
 16      const exitError = msg => {
 17        this.logger.error(msg);
 18        process.exit(1);
 19      };
 20  
 21      this.appConfig.VALID_DAPPS.forEach(dapp => {
 22        if (!fs.existsSync(`./dapps/${dapp}`)) exitError(`Folder ./dapps/${dapp} does not exist`);
 23        if (!fs.existsSync(`./dapps/${dapp}/config.js`)) exitError(`Config ./dapps/${dapp}/config.js does not exist`);
 24  
 25        const dappConfig = require(`./dapps/${dapp}/config.js`);
 26        
 27        const result = dappSchema.validate(dappConfig);
 28        if (result.error) exitError(result.error);
 29  
 30        // TODO: improve this
 31        if(!fs.existsSync(`./dapps/${dapp}/${dappConfig.templates.subscribe}`)) exitError(`Template ./dapps/${dapp}/${dappConfig.templates.subscribe} does not exist`);
 32        
 33        Object.keys(dappConfig.templates.contracts).forEach(contract => {
 34          Object.values(dappConfig.templates.contracts[contract]).forEach(event => {
 35            if(!fs.existsSync(`./dapps/${dapp}/${event.template}`)) exitError(`Template ./dapps/${dapp}/${event.template} does not exist`);
 36          });
 37        });
 38      });
 39    }
 40  
 41    isDapp(dappId) {
 42      return this.appConfig.VALID_DAPPS.indexOf(dappId) > -1;
 43    }
 44  
 45    getDapps() {
 46      return this.appConfig.VALID_DAPPS;
 47    }
 48  
 49    config(dappId) {
 50      if (this.configurations[dappId]) {
 51        return this.configurations[dappId];
 52      }
 53  
 54      this.configurations[dappId] = require("./" + path.join("./dapps/", dappId, "config.js"));
 55  
 56      return this.configurations[dappId];
 57    }
 58  
 59    contracts(dappId) {
 60      const dappConfig = this.config(dappId);
 61      return Object.keys(dappConfig.templates.contracts);
 62    }
 63  
 64    ABI(dappId, contract) {
 65      const dappConfig = this.config(dappId);
 66      const ABI = Object.values(dappConfig.templates.contracts[contract])
 67        .map(x => x.ABI)
 68        .reduce((accum, curr) => {
 69          if (accum.find(x => x.name === curr.name)) return accum;
 70          return [...accum, curr];
 71        }, []);
 72      return ABI;
 73    }
 74  
 75    template(dappId, templateName) {
 76      const dappConfig = this.config(dappId);
 77      return dappConfig.templates[templateName];
 78    }
 79  
 80    eventConfig(dappId, contract, eventName) {
 81      const dappConfig = this.config(dappId);
 82      return Object.values(dappConfig.templates.contracts[contract]).filter(
 83        x => x.ABI.name === eventName && x.ABI.type === "event"
 84      );
 85    }
 86  
 87    getEmailTemplate(dappId, template) {
 88      const file = fs.readFileSync(path.join("./dapps", dappId, template)).toString();
 89      const content = fm(file);
 90      const subject = content.attributes.subject || template;
 91      const body = content.body;
 92      const html = content.attributes.html ? !!content.attributes.html : true;
 93      return { subject, body, html };
 94    }
 95  
 96    getVariables(dappId, extraData) {
 97      const dappConfig = this.config(dappId);
 98      return Object.assign(dappConfig.templates.variables || {}, extraData);
 99    }
100  }
101  
102  module.exports = DAppConfig;