diff --git a/lib/contracts/contribution.js b/lib/contracts/contribution.js index df52220..2856949 100644 --- a/lib/contracts/contribution.js +++ b/lib/contracts/contribution.js @@ -14,6 +14,10 @@ class Contribution extends Record { }); } + getData (id) { + return this.functions.getContribution(id); + } + getByContributorId (contributorId) { return this.functions.getContributorAddressById(contributorId) .then(address => this.getByContributorAddress(address)); @@ -62,6 +66,7 @@ class Contribution extends Record { deprecate('The function `addContribution()` is deprecated and will be removed in the next major version. Use `add()` instead'); return this.add(...arguments); } + } module.exports = Contribution; diff --git a/lib/contracts/contributor.js b/lib/contracts/contributor.js index 3ca68b2..6a1c1ed 100644 --- a/lib/contracts/contributor.js +++ b/lib/contracts/contributor.js @@ -15,6 +15,10 @@ class Contributor extends Record { }); } + getData (id) { + return this.functions.getContributorById(id); + } + filterByAccount (search) { return this._byAccount(search, 'filter'); } @@ -84,6 +88,7 @@ class Contributor extends Record { }); }); } + } module.exports = Contributor; diff --git a/lib/contracts/record.js b/lib/contracts/record.js index 1e1f83a..52099af 100644 --- a/lib/contracts/record.js +++ b/lib/contracts/record.js @@ -9,6 +9,18 @@ class Record extends Base { return Promise.all(records); }); } + + pinIpfsHashes () { + return this.count.then(count => { + let promises = [...Array(count).keys()].map(i => { + let id = i + 1; // 0 => 1 - ids start with 1 and not with 0 + return this.getData(id).then(data => { + return this.ipfs.pin(data); + }); + }); + return Promise.all(promises); + }); + } } module.exports = Record; diff --git a/lib/utils/ipfs-pinner.js b/lib/utils/ipfs-pinner.js new file mode 100644 index 0000000..59d158f --- /dev/null +++ b/lib/utils/ipfs-pinner.js @@ -0,0 +1,32 @@ +class IpfsPinner { + constructor (kredits) { + this.kredits = kredits; + } + + pinAll () { + return Promise.all([ + this.kredits.Contributor.pinIpfsHashes(), + this.kredits.Contribution.pinIpfsHashes(), + ]); + } + + monitor (callback) { + this.kredits.Contribution.on('ContributionAdded', (id) => { + this.kredits.Contribution.getData(id) + .then(data => { return this.kredits.ipfs.pin(data); }) + .then(callback); + }); + this.kredits.Contributor.on('ContributorAdded', (id) => { + this.kredits.Contribution.getData(id) + .then(data => { return this.kredits.ipfs.pin(data); }) + .then(callback); + }); + this.kredits.Contributor.on('ContributorProfileUpdated', (id) => { + this.kredits.Contributor.getData(id) + .then(data => { return this.kredits.ipfs.pin(data); }) + .then(callback); + }); + } + +} +module.exports = IpfsPinner; diff --git a/lib/utils/ipfs.js b/lib/utils/ipfs.js index 105379f..c4b1beb 100644 --- a/lib/utils/ipfs.js +++ b/lib/utils/ipfs.js @@ -41,6 +41,14 @@ class IPFS { return this._ipfsAPI.cat(ipfsHash); } + pin (hashData) { + let ipfsHash = hashData; // default - if it is a string + if (hashData.hasOwnProperty('hashSize')) { + ipfsHash = this.encodeHash(hashData); + } + return this._ipfsAPI.pin.add(multihashes.toB58String(ipfsHash)); + } + decodeHash (ipfsHash) { let multihash = multihashes.decode(multihashes.fromB58String(ipfsHash)); return { diff --git a/scripts/ipfs-pinner.js b/scripts/ipfs-pinner.js new file mode 100644 index 0000000..985dc01 --- /dev/null +++ b/scripts/ipfs-pinner.js @@ -0,0 +1,31 @@ +const Kredits = require('../lib/kredits'); +const IpfsPinner = require('../lib/utils/ipfs-pinner'); + +const network = process.env.ETH_NETWORK || 'rinkeby'; +const rpcUrl = process.env.ETH_RPC_URL; +const apm = process.env.APM_DOMAIN || 'open.aragonpm.eth'; + +const ipfsConfig = { + host: process.env.IPFS_HOST || 'localhost', + port: process.env.IPFS_PORT || '5001', + protocol: process.env.IPFS_PROTOCOL || 'http', +}; +console.log(`Using IPFS:`, ipfsConfig); + +(async () => { + try { + const kredits = await Kredits.for({ network, rpcUrl }, { apm, ipfsConfig }).init(); + const ipfsPinner = new IpfsPinner(kredits); + + ipfsPinner.pinAll().then(pins => { + console.log('Pinned', JSON.stringify(pins, null, 2)); + }); + ipfsPinner.monitor((pin) => { + console.log('Pinned', JSON.stringify(pin)); + }); + console.log(`Subscribed to DAO: ${kredits.Kernel.contract.address}`); + } catch(e) { + console.log(e); + process.exit(1); + } +})();