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