From c6b3c35ffeaf10e356a3e577622f72ad051c9917 Mon Sep 17 00:00:00 2001 From: Andriy Biletsky Date: Fri, 30 Aug 2024 20:01:12 +0700 Subject: [PATCH] Inject data_item_id param into arfleet urls --- app/arweave/arweave.go | 6 ++-- app/arweave/arweave_test.go | 10 +++++++ app/arweave/resolve.go | 59 +++++++++++++++++++++++++++---------- 3 files changed, 56 insertions(+), 19 deletions(-) diff --git a/app/arweave/arweave.go b/app/arweave/arweave.go index 8478532b..b5f2001d 100644 --- a/app/arweave/arweave.go +++ b/app/arweave/arweave.go @@ -30,7 +30,7 @@ func ReplaceAssetUrls(baseUrl string, structure any, collPath, itemPath string) return true }) - resolver := NewAssetResolver(baseUrl) + resolver := NewArfleetResolver(baseUrl) subsUrls, err := resolver.ResolveUrls(origUrls) if err != nil { return nil, err @@ -54,7 +54,7 @@ func ReplaceAssetUrl(baseUrl string, structure any, path string) (any, error) { origUrl := gjson.GetBytes(jsonData, path).String() - resolver := NewAssetResolver(baseUrl) + resolver := NewArfleetResolver(baseUrl) subsUrls, err := resolver.ResolveUrls([]string{origUrl}) if err != nil { @@ -72,7 +72,7 @@ func ReplaceAssetUrl(baseUrl string, structure any, path string) (any, error) { } func GetClaimUrl(baseUrl, claim_id string) (string, error) { - resolver := NewAssetResolver(baseUrl) + resolver := NewArfleetResolver(baseUrl) r, err := resolver.ResolveClaims([]string{claim_id}) if err != nil { return "", err diff --git a/app/arweave/arweave_test.go b/app/arweave/arweave_test.go index ff6eaac4..04d385bd 100644 --- a/app/arweave/arweave_test.go +++ b/app/arweave/arweave_test.go @@ -51,3 +51,13 @@ func TestReplaceAssetUrl(t *testing.T) { require.NoError(err) assert.Regexp(`http://odycdn.com/explore/\w{64}\?filename=\w{64}\.jpg`, string(out)) } + +func TestGetClaimUrl(t *testing.T) { + // t.Skip("skipping this in automated mode as it requires extra setup on arfleet") + + require := require.New(t) + assert := assert.New(t) + url, err := GetClaimUrl("https://cdnhost.com", "91e8caf6d1e740aaa6235d4eb81b21ec21cb2652") + require.NoError(err) + assert.Regexp(`^https://cdnhost.com/explore/\w+\?data_item_id=\w+&filename=\w+.mp4$`, url) +} diff --git a/app/arweave/resolve.go b/app/arweave/resolve.go index 2841a92f..e8cdf3a1 100644 --- a/app/arweave/resolve.go +++ b/app/arweave/resolve.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net/http" + "net/url" "time" ) @@ -13,13 +14,15 @@ const ( batchResolverUrl = "https://migrator.arfleet.zephyrdev.xyz/batch-resolve" batchClaimResolverUrl = "https://migrator.arfleet.zephyrdev.xyz/claims/batch-resolve" resolverTimeout = 10 * time.Second + + paramDataItemId = "data_item_id" ) type HttpDoer interface { Do(req *http.Request) (res *http.Response, err error) } -type AssetResolver struct { +type ArfleetResolver struct { baseUrl string batchResolverUrl string batchClaimResolverUrl string @@ -29,21 +32,24 @@ type AssetResolver struct { type BatchResolveUrlResponse map[string]ResolveUrlResponse type ResolveUrlResponse struct { - URL string `json:"url"` - URLHash string `json:"url_hash"` - Arfleet string `json:"arfleet"` - Resolved bool `json:"resolved"` + URL string `json:"url"` + URLHash string `json:"url_hash"` + Arfleet string `json:"arfleet"` + DataItemId string `json:"data_item_id"` + Resolved bool `json:"resolved"` } type BatchResolveClaimResponse map[string]ResolveClaimResponse + type ResolveClaimResponse struct { - ClaimId string `json:"claim_id"` - Arfleet string `json:"arfleet"` - Resolved bool `json:"resolved"` + ClaimId string `json:"claim_id"` + Arfleet string `json:"arfleet"` + DataItemId string `json:"data_item_id"` + Resolved bool `json:"resolved"` } -func NewAssetResolver(baseUrl string) *AssetResolver { - r := &AssetResolver{ +func NewArfleetResolver(baseUrl string) *ArfleetResolver { + r := &ArfleetResolver{ baseUrl: baseUrl, batchResolverUrl: batchResolverUrl, batchClaimResolverUrl: batchClaimResolverUrl, @@ -54,7 +60,7 @@ func NewAssetResolver(baseUrl string) *AssetResolver { return r } -func (c *AssetResolver) ResolveUrls(urls []string) (map[string]string, error) { +func (c *ArfleetResolver) ResolveUrls(urls []string) (map[string]string, error) { substitutes := map[string]string{} jsonData, err := json.Marshal(map[string][]string{"urls": urls}) @@ -76,12 +82,16 @@ func (c *AssetResolver) ResolveUrls(urls []string) (map[string]string, error) { if !resolved.Resolved { continue } - substitutes[url] = c.baseUrl + resolved.Arfleet + u, err := appendParams(resolved.Arfleet, map[string]string{paramDataItemId: resolved.DataItemId}) + if err != nil { + continue + } + substitutes[url] = c.baseUrl + u } return substitutes, nil } -func (c *AssetResolver) ResolveClaims(claim_ids []string) (map[string]string, error) { +func (c *ArfleetResolver) ResolveClaims(claim_ids []string) (map[string]string, error) { substitutes := map[string]string{} jsonData, err := json.Marshal(map[string][]string{"claim_ids": claim_ids}) @@ -99,16 +109,20 @@ func (c *AssetResolver) ResolveClaims(claim_ids []string) (map[string]string, er return nil, fmt.Errorf("error parsing json: %w", err) } - for url, resolved := range resolvedList { + for claim, resolved := range resolvedList { if !resolved.Resolved { continue } - substitutes[url] = c.baseUrl + resolved.Arfleet + u, err := appendParams(resolved.Arfleet, map[string]string{paramDataItemId: resolved.DataItemId}) + if err != nil { + continue + } + substitutes[claim] = c.baseUrl + u } return substitutes, nil } -func (c *AssetResolver) makeRequest(method, url string, jsonData []byte) ([]byte, error) { +func (c *ArfleetResolver) makeRequest(method, url string, jsonData []byte) ([]byte, error) { client := c.client req, err := http.NewRequest(method, url, bytes.NewBuffer(jsonData)) @@ -133,3 +147,16 @@ func (c *AssetResolver) makeRequest(method, url string, jsonData []byte) ([]byte } return body, nil } + +func appendParams(baseUrl string, params map[string]string) (string, error) { + u, err := url.Parse(baseUrl) + if err != nil { + return "", err + } + q := u.Query() + for k, v := range params { + q.Add(k, v) + } + u.RawQuery = q.Encode() + return u.String(), nil +}