Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Inject data_item_id param into arfleet urls #522

Merged
merged 1 commit into from
Aug 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions app/arweave/arweave.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 {
Expand All @@ -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
Expand Down
10 changes: 10 additions & 0 deletions app/arweave/arweave_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
59 changes: 43 additions & 16 deletions app/arweave/resolve.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,23 @@ import (
"fmt"
"io"
"net/http"
"net/url"
"time"
)

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
Expand All @@ -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,
Expand All @@ -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})
Expand All @@ -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})
Expand All @@ -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))
Expand All @@ -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
}
Loading