diff options
Diffstat (limited to 'backend/fetchers')
| -rw-r--r-- | backend/fetchers/app.bsky.go | 22 | ||||
| -rw-r--r-- | backend/fetchers/profiles.go | 38 |
2 files changed, 57 insertions, 3 deletions
diff --git a/backend/fetchers/app.bsky.go b/backend/fetchers/app.bsky.go index 7c42f44..b6bb939 100644 --- a/backend/fetchers/app.bsky.go +++ b/backend/fetchers/app.bsky.go @@ -3,6 +3,7 @@ package fetchers import ( "encoding/json" "fmt" + "llostre/backend/auth" "llostre/backend/notes" "net/http" ) @@ -11,10 +12,25 @@ type ListRecordsResponse struct { Records []notes.AppBskyFeedPostRecord `json:"records"` } -func FetchAppBskyFeedPosts(did string, pdsURL string) ([]notes.AppBskyFeedPostNote, error) { - url := fmt.Sprintf("%s/xrpc/com.atproto.repo.listRecords?repo=%s&collection=app.bsky.feed.post&limit=50", pdsURL, did) +func FetchAppBskyFeedPosts(did, pdsURL, accessToken string, keypair *auth.DPoPKeyPair) ([]notes.AppBskyFeedPostNote, error) { + url := fmt.Sprintf("%s/xrpc/com.atproto.repo.listRecords?repo=%s&collection=app.bsky.feed.post", pdsURL, did) - resp, err := http.Get(url) + fmt.Printf("Generating DPoP proof for: %s\n", url) + dpopProof, err := keypair.GenerateDPoPProof("GET", url, "") + if err != nil { + fmt.Printf("DPoP generation failed: %v\n", err) + return nil, err + } + + fmt.Printf("Making request to PDS\n") + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + req.Header.Set("Authorization", "Bearer "+accessToken) + req.Header.Set("DPoP", dpopProof) + + resp, err := http.DefaultClient.Do(req) if err != nil { return nil, err } diff --git a/backend/fetchers/profiles.go b/backend/fetchers/profiles.go index 038a07f..01a27c0 100644 --- a/backend/fetchers/profiles.go +++ b/backend/fetchers/profiles.go @@ -3,7 +3,9 @@ package fetchers import ( "encoding/json" "fmt" + "io" "llostre/backend/general" + "net" "net/http" "strings" ) @@ -17,6 +19,42 @@ type DIDDocument struct { } `json:"service"` } +func FetchDID(handle string) (string, error) { + // return if it's a DID already + if strings.HasPrefix(handle, "did:") { + return handle, nil + } + + // resolve DNS record first + txtRecords, err := net.LookupTXT("_atproto." + handle) + if err == nil { + for _, txt := range txtRecords { + if after, ok := strings.CutPrefix(txt, "did="); ok { + return after, nil + } + } + } + + // fallback to HTTPS well-known + resp, err := http.Get(fmt.Sprintf("https://%s/.well-known/atproto-did", handle)) + if err != nil { + return "", err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return "", err + } + + did := strings.TrimSpace(string(body)) + if !strings.HasPrefix(did, "did:") { + return "", fmt.Errorf("invalid DID returned: %s", did) + } + + return did, nil +} + func FetchDidDoc(did string) (*DIDDocument, error) { didDocURL := fmt.Sprintf("https://plc.directory/%s", did) |
