class IpfsPinner { constructor (kredits, ipfsApi) { this.kredits = kredits; this.ipfsApi = ipfsApi || this.kredits.ipfs; } pinAll () { return Promise.all([ this._pinAllFromContract(this.kredits.Contributor), this._pinAllFromContract(this.kredits.Contribution), this._pinAllFromContract(this.kredits.Proposal) ]); } monitor (callback) { this.kredits.Contribution.on('ContributionAdded', (id) => { this.kredits.Contribution.getData(id) .then(data => { return this.ipfsApi.pin(data); }) .then(callback); }); this.kredits.Contributor.on('ContributorAdded', (id) => { this.kredits.Contribution.getData(id) .then(data => { return this.ipfsApi.pin(data); }) .then(callback); }); this.kredits.Contributor.on('ContributorProfileUpdated', (id) => { this.kredits.Contributor.getData(id) .then(data => { return this.ipfsApi.pin(data); }) .then(callback); }); } _pinAllFromContract (contract) { console.log(`Pinning data from ${contract.constructor.name}...`); return contract.count.then(count => { let promises = [...Array(count).keys()].map(i => { let id = i + 1; // 0 => 1 - ids start with 1 and not with 0 console.log(`Loading ${contract.constructor.name} #${id}`); return contract.getData(id).then(data => { console.log(`Pinning ${contract.constructor.name} #${id}`); return this.ipfsApi.pin(data); }); }); return Promise.all(promises); }); } } module.exports = IpfsPinner;