diff --git a/API.md b/API.md index f9e5757..12d4377 100644 --- a/API.md +++ b/API.md @@ -11,7 +11,7 @@ * [client.cat](#clientcat) * [client.import](#clientimport) * [client.listAsks](#clientlistasks) -* client.payments +* [client.payments](#clientpayments) * client.proposeStorageDeal * client.queryStorageDeal * [config.get](#configget) @@ -401,6 +401,48 @@ After first iteration: */ ``` +## `client.payments` + +> List payments for a given deal + +### `client.payments(dealCid, [options])` + +#### Parameters + +| Name | Type | Description | +|------|------|-------------| +| dealCid | `CID`\|`String` | Channel id from which to list vouchers | +| options | `Object` | Optional options | +| options.signal | [`AbortSignal`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) | A signal that can be used to abort the request | + +#### Returns + +| Type | Description | +|------|-------------| +| `Promise` | List of payments | + +#### Example + +```js +const cid = 'zDPWYqFCuTNxiwRkt1iDJWEy6qKPGCunMGHrP1ojsMrZDWKYsgzF' +const payments = await fc.client.payments(cid) +console.log(payments) + +/* + [ + { + "channel": 0, + "payer": "t1bcvxo4ztdkukjmrsjvc5d4w24cl55vvbrssspyy", + "target": "t1uo4nzu44apoclkbjbbvc4f3irbptg3ctjq44wiq", + "amount": "25000", + "validAt": 8, + "condition": null, + "signature": "1My76149fPIulbdO/DKlkUBMMSLwGYSw2XmVKXq3HrxMG5kkmBgsaPZ/DzdxiOWX5kdnXJ++AFQqsmWHd5dtOwE=" + } + ] +*/ +``` + ## `config.get` > Get config values diff --git a/README.md b/README.md index 9e60093..66d8cd0 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ $ filecoin config api.accessControlAllowOrigin '["http://example.com"]' * [client.cat](API.md#clientcat) * [client.import](API.md#clientimport) * [client.listAsks](API.md#clientlistasks) -* client.payments +* [client.payments](API.md#clientpayments) * client.proposeStorageDeal * client.queryStorageDeal * [config.get](API.md#configget) diff --git a/src/cmd/client/payments.js b/src/cmd/client/payments.js new file mode 100644 index 0000000..a48029c --- /dev/null +++ b/src/cmd/client/payments.js @@ -0,0 +1,22 @@ +const toUri = require('../../lib/multiaddr-to-uri') +const { ok } = require('../../lib/fetch') + +module.exports = (fetch, config) => { + return async (cid, options) => { + options = options || {} + cid = encodeURIComponent(cid) + + const url = `${toUri(config.apiAddr)}/api/client/payments?arg=${cid}` + const res = await ok(fetch(url, { signal: options.signal })) + + const paymentsData = await res.json() + + return (paymentsData || []).map(d => { + const { valid_at, ...rest } = d + if (valid_at != null) { + rest.validAt = valid_at + } + return rest + }) + } +} diff --git a/src/index.js b/src/index.js index 5bb8d41..c45a491 100644 --- a/src/index.js +++ b/src/index.js @@ -29,7 +29,8 @@ module.exports = (fetch, config) => { client: { cat: require('./cmd/client/cat')(fetch, config), import: require('./cmd/client/import')(fetch, config), - listAsks: require('./cmd/client/list-asks')(fetch, config) + listAsks: require('./cmd/client/list-asks')(fetch, config), + payments: require('./cmd/client/payments')(fetch, config) }, config: { get: require('./cmd/config/get')(fetch, config), diff --git a/test/unit/cmd/client/payments.test.js b/test/unit/cmd/client/payments.test.js new file mode 100644 index 0000000..9ac38eb --- /dev/null +++ b/test/unit/cmd/client/payments.test.js @@ -0,0 +1,35 @@ +const test = require('ava') +const Filecoin = require('../../../../src') + +test('should list payments for a given deal', async t => { + const cid = 'zDPWYqFCuTNxiwRkt1iDJWEy6qKPGCunMGHrP1ojsMrZDWKYsgzF' + const payments = [ + { + channel: 0, + payer: 't1bcvxo4ztdkukjmrsjvc5d4w24cl55vvbrssspyy', + target: 't1uo4nzu44apoclkbjbbvc4f3irbptg3ctjq44wiq', + amount: 25000, + valid_at: 8, + condition: null, + signature: '1My76149fPIulbdO/DKlkUBMMSLwGYSw2XmVKXq3HrxMG5kkmBgsaPZ/DzdxiOWX5kdnXJ++AFQqsmWHd5dtOwE=' + } + ] + + const fetch = () => ({ ok: true, json: () => payments }) + const fc = Filecoin(fetch) + + const res = await fc.client.payments(cid) + + t.true(Array.isArray(res)) + t.is(res.length, payments.length) + + res.forEach((p, i) => { + t.is(p.channel, payments[i].channel) + t.is(p.payer, payments[i].payer) + t.is(p.target, payments[i].target) + t.is(p.amount, payments[i].amount) + t.is(p.validAt, payments[i].valid_at) + t.is(p.condition, payments[i].condition) + t.is(p.signature, payments[i].signature) + }) +})