From 94fd46905ce7547f5a56f1f8b1c8c95f6984b143 Mon Sep 17 00:00:00 2001 From: Haythem Sellami Date: Mon, 29 Apr 2019 15:28:25 +0100 Subject: [PATCH] member app endpoints --- lib/addresses/CoinsenceKit.json | 1 + lib/http/apps/index.js | 1 + lib/http/apps/member.js | 44 ++++++++++++++++++++++ lib/http/index.js | 11 +++++- lib/http/middlewares/index.js | 4 +- lib/http/middlewares/load-member-app.js | 19 ++++++++++ lib/http/middlewares/require-member-app.js | 11 ++++++ lib/member.js | 44 ++++++++++++++++++++++ 8 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 lib/http/apps/member.js create mode 100644 lib/http/middlewares/load-member-app.js create mode 100644 lib/http/middlewares/require-member-app.js create mode 100644 lib/member.js diff --git a/lib/addresses/CoinsenceKit.json b/lib/addresses/CoinsenceKit.json index 9b6b7b4..7df1be1 100644 --- a/lib/addresses/CoinsenceKit.json +++ b/lib/addresses/CoinsenceKit.json @@ -7,6 +7,7 @@ "35475823": "0x3dc13327c065cb2e79656ef45b6af0bed76132f8", "38301683": "0x3dfb393eca923681e803dd4eafa09c17de40fef1", "40722062": "0x650121ee1d4c3ea8faeba138f88d674d07fca918", + "49857146": "0x87fe1061b0f97a6ea260781647b7704e0f4ea7a2", "89511784": "0x8b9a1ce7d34aa289652750a2539b99e7bff95cf1", "91724461": "0x6fe2039c2dc1b6409f5522c8b7fa686570388403" } \ No newline at end of file diff --git a/lib/http/apps/index.js b/lib/http/apps/index.js index 237ab3d..e90cb78 100644 --- a/lib/http/apps/index.js +++ b/lib/http/apps/index.js @@ -3,5 +3,6 @@ module.exports = { wallet: require('./wallet'), space: require('./space'), coin: require('./coin'), + member: require('./member'), generic: require('./generic') } diff --git a/lib/http/apps/member.js b/lib/http/apps/member.js new file mode 100644 index 0000000..078482b --- /dev/null +++ b/lib/http/apps/member.js @@ -0,0 +1,44 @@ +const express = require('express'); +const app = express(); + +app.post(`/addMember`, (req, res) => { + let address = req.body.address; + let ipfsHash = req.body.ipfsHash; + + res.locals.memberApp.contract.functions.addMember(address, ipfsHash, { gasLimit: 5000000 }).then(transaction => { + const txHash = transaction.hash; + res.status(201).json(txHash); + }).catch(e => { + console.log(e); + res.sendStatus(500); + }) +}); + +app.post(`/updateMemberAccount`, (req, res) => { + let id = req.body.id; + let oldAccount = req.body.oldAccount; + let newAccount = req.body.newAccount; + + res.locals.memberApp.contract.functions.updateMemberAccount(id, oldAccount, newAccount, { gasLimit: 5000000 }).then(transaction => { + const txHash = transaction.hash; + res.status(201).json(txHash); + }).catch(e => { + console.log(e); + res.sendStatus(500); + }) +}); + +app.post(`/updateMemberIpfsHash`, (req, res) => { + let id = req.body.id; + let ipfsHash = req.body.ipfsHash; + + res.locals.memberApp.contract.functions.updateMemberIpfsHash(id, ipfsHash, { gasLimit: 5000000 }).then(transaction => { + const txHash = transaction.hash; + res.status(201).json(txHash); + }).catch(e => { + console.log(e); + res.sendStatus(500); + }) +}); + +module.exports = app; \ No newline at end of file diff --git a/lib/http/index.js b/lib/http/index.js index 6d9876c..e5e7d4e 100644 --- a/lib/http/index.js +++ b/lib/http/index.js @@ -19,7 +19,8 @@ const router = express.Router(); const walletApp = require('./apps/wallet'); const daoApp = require('./apps/dao'); const spaceApp = require('./apps/space'); -const coinApp = require('./apps/coin');; +const coinApp = require('./apps/coin'); +const memberApp = require('./apps/member'); const genericApp = require('./apps/generic'); let ethProvider; @@ -60,6 +61,14 @@ app.use( ], coinApp ); +app.use( + '/member', + [ + middlewares.requireMemberApp, + middlewares.loadMemberApp({ password, ethProvider }) + ], + memberApp +); app.use( '/', [ diff --git a/lib/http/middlewares/index.js b/lib/http/middlewares/index.js index e66a89a..7401fe1 100644 --- a/lib/http/middlewares/index.js +++ b/lib/http/middlewares/index.js @@ -4,5 +4,7 @@ module.exports = { loadCoinsenceKit: require('./load-coinsence-kit'), requireDao: require('./require-dao'), setEthProvider: require('./set-eth-provider'), - monitoring: require('./monitoring') + monitoring: require('./monitoring'), + loadMemberApp: require('./load-member-app'), + requireMemberApp: require('./require-member-app') } diff --git a/lib/http/middlewares/load-member-app.js b/lib/http/middlewares/load-member-app.js new file mode 100644 index 0000000..d9e91a6 --- /dev/null +++ b/lib/http/middlewares/load-member-app.js @@ -0,0 +1,19 @@ +const Member = require('../../member'); +const loadWallet = require('../utils/load-wallet'); + +module.exports = function (options = {}) { + let { password, ethProvider } = options; + + return function (req, res, next) { + loadWallet(res.locals.accountId, password).then(wallet => { + const signer = wallet.connect(ethProvider); + new Member(ethProvider, signer, {address: res.locals.memberAppAddress}).init().then(memberApp => { + res.locals.memberApp = memberApp; + next(); + }).catch(e => { + console.log(e); + res.sendStatus(500); + }); + }); + } +} diff --git a/lib/http/middlewares/require-member-app.js b/lib/http/middlewares/require-member-app.js new file mode 100644 index 0000000..48ae48e --- /dev/null +++ b/lib/http/middlewares/require-member-app.js @@ -0,0 +1,11 @@ +module.exports = function (req, res, next) { + const memberAppAddress = req.body.memberApp || req.query.memberApp; + if (!memberAppAddress) { + res.status(400).json({error: 'member app is missing'}); + } else { + res.locals.memberAppAddress = memberAppAddress; + next(); + } + } + + \ No newline at end of file diff --git a/lib/member.js b/lib/member.js new file mode 100644 index 0000000..e8cd695 --- /dev/null +++ b/lib/member.js @@ -0,0 +1,44 @@ +const ethers = require('ethers'); + +const ABI = require('./abis/Member.json'); + +const KitAddress = require('./addresses/CoinsenceKit.json'); + +const IPFS = require('./utils/ipfs'); + +class Member { + + constructor(provider, signer, options = {}) { + let { address, abi, ipfsConfig } = options; + + this.provider = provider; + this.signer = signer; + this.options = options; + this.address = address; + this.abi = abi || ABI; + this.ipfs = new IPFS(ipfsConfig); + } + + static withRpcProvider(url, options = {}) { + const provider = new ethers.providers.JsonRpcProvider(url); + const signer = options.signer || provider.getSigner(); + return new Member(provider, signer, options); + } + + async init() { + return this.provider.getNetwork().then((network) => { + this.address = this.address; + + this.contract = new ethers.Contract( + this.address, + this.abi, + (this.signer || this.provider) + ); + + return this; + }); + } + +} + +module.exports = Member;