Skip to content

Commit 777ce58

Browse files
authored
Merge pull request #61 from sean118/master
Added AssetAddressesAll function, added APIQueryParams to AssetAddresses, added PreProd and Preview URLs
2 parents d09ce13 + 399f58f commit 777ce58

File tree

5 files changed

+63
-5
lines changed

5 files changed

+63
-5
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,5 @@
1919

2020
# Editor Files
2121
.vscode/
22+
23+
.DS_Store

api_assets.go

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ type AssetResult struct {
103103
Err error
104104
}
105105

106+
type AssetAddressesAll struct {
107+
Res []AssetAddress
108+
Err error
109+
}
110+
106111
// Assets returns a paginated list of assets.
107112
func (c *apiClient) Assets(ctx context.Context, query APIQueryParams) (a []Asset, err error) {
108113
requestUrl, err := url.Parse(fmt.Sprintf("%s/%s", c.server, resourceAssets))
@@ -240,17 +245,21 @@ func (c *apiClient) AssetTransactions(ctx context.Context, asset string) (trs []
240245
return trs, nil
241246
}
242247

243-
// AssetAddresses returns list of a addresses containing a specific asset.
244-
func (c *apiClient) AssetAddresses(ctx context.Context, asset string) (addrs []AssetAddress, err error) {
245-
requestUrl, err := url.Parse(fmt.Sprintf("%s/%s/%s/%s", c.server, resourceAssets, asset, resourceAssetHistory))
248+
func (c *apiClient) AssetAddresses(ctx context.Context, asset string, query APIQueryParams) (addrs []AssetAddress, err error) {
249+
requestUrl, err := url.Parse(fmt.Sprintf("%s/%s/%s/%s", c.server, resourceAssets, asset, resourceAddresses))
246250
if err != nil {
247251
return
248252
}
253+
249254
req, err := http.NewRequestWithContext(ctx, http.MethodGet, requestUrl.String(), nil)
250255
if err != nil {
251256
return
252257
}
253258

259+
v := req.URL.Query()
260+
v = formatParams(v, query)
261+
req.URL.RawQuery = v.Encode()
262+
254263
res, err := c.handleRequest(req)
255264
if err != nil {
256265
return
@@ -263,6 +272,50 @@ func (c *apiClient) AssetAddresses(ctx context.Context, asset string) (addrs []A
263272
return addrs, nil
264273
}
265274

275+
// AssetAddresses returns list of a addresses containing a specific asset.
276+
func (c *apiClient) AssetAddressesAll(ctx context.Context, asset string) <-chan AssetAddressesAll {
277+
ch := make(chan AssetAddressesAll, c.routines)
278+
jobs := make(chan methodOptions, c.routines)
279+
quit := make(chan bool, 1)
280+
281+
wg := sync.WaitGroup{}
282+
283+
for i := 0; i < c.routines; i++ {
284+
wg.Add(1)
285+
go func(jobs chan methodOptions, ch chan AssetAddressesAll, wg *sync.WaitGroup) {
286+
defer wg.Done()
287+
for j := range jobs {
288+
ad, err := c.AssetAddresses(j.ctx, asset, j.query)
289+
if len(ad) != j.query.Count || err != nil {
290+
select {
291+
case quit <- true:
292+
default:
293+
}
294+
}
295+
res := AssetAddressesAll{Res: ad, Err: err}
296+
ch <- res
297+
}
298+
299+
}(jobs, ch, &wg)
300+
}
301+
go func() {
302+
defer close(ch)
303+
fetchScripts := true
304+
for i := 1; fetchScripts; i++ {
305+
select {
306+
case <-quit:
307+
fetchScripts = false
308+
default:
309+
jobs <- methodOptions{ctx: ctx, query: APIQueryParams{Count: 100, Page: i}}
310+
}
311+
}
312+
313+
close(jobs)
314+
wg.Wait()
315+
}()
316+
return ch
317+
}
318+
266319
// AssetsByPolicy returns list of assets minted under a specific policy.
267320
func (c *apiClient) AssetsByPolicy(ctx context.Context, policyId string) (a []Asset, err error) {
268321
requestUrl, err := url.Parse(fmt.Sprintf("%s/%s/%s", c.server, resourcePolicyAssets, policyId))

api_assets_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func TestResourceAssetddressesIntegration(t *testing.T) {
9393
asset := "3a9241cd79895e3a8d65261b40077d4437ce71e9d7c8c6c00e3f658e4669727374636f696e"
9494
api := blockfrost.NewAPIClient(blockfrost.APIClientOptions{})
9595

96-
got, err := api.AssetAddresses(context.TODO(), asset)
96+
got, err := api.AssetAddresses(context.TODO(), asset, blockfrost.APIQueryParams{})
9797
if err != nil {
9898
t.Fatal(err)
9999
}

client.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,8 @@ type APIClient interface {
126126
AssetsAll(ctx context.Context) <-chan AssetResult
127127
AssetHistory(ctx context.Context, asset string) ([]AssetHistory, error)
128128
AssetTransactions(ctx context.Context, asset string) ([]AssetTransaction, error)
129-
AssetAddresses(ctx context.Context, asset string) ([]AssetAddress, error)
129+
AssetAddresses(ctx context.Context, asset string, query APIQueryParams) ([]AssetAddress, error)
130+
AssetAddressesAll(ctx context.Context, asset string) <-chan AssetAddressesAll
130131
AssetsByPolicy(ctx context.Context, policyId string) ([]Asset, error)
131132
Genesis(ctx context.Context) (GenesisBlock, error)
132133
MetadataTxLabels(ctx context.Context, query APIQueryParams) ([]MetadataTxLabel, error)

types.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import "fmt"
55
const (
66
CardanoMainNet = "https://cardano-mainnet.blockfrost.io/api/v0"
77
CardanoTestNet = "https://cardano-testnet.blockfrost.io/api/v0"
8+
CardanoPreProd = "https://cardano-preprod.blockfrost.io/api/v0"
9+
CardanoPreview = "https://cardano-preview.blockfrost.io/api/v0"
810
IPFSNet = "https://ipfs.blockfrost.io/api/v0"
911
)
1012

0 commit comments

Comments
 (0)