package fetchers import ( "encoding/json" "fmt" "llostre/backend/auth" "llostre/backend/notes" "net/http" ) type ListRecordsResponse struct { Records []notes.AppBskyFeedPostRecord `json:"records"` } func FetchAppBskyFeedPosts(did, pdsURL, accessToken string, keypair *auth.DPoPKeyPair) ([]notes.Note, error) { url := fmt.Sprintf("%s/xrpc/com.atproto.repo.listRecords?repo=%s&collection=app.bsky.feed.post", pdsURL, did) 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 } defer resp.Body.Close() var response ListRecordsResponse if err := json.NewDecoder(resp.Body).Decode(&response); err != nil { return nil, err } profile, err := FetchProfile(did, pdsURL) if err != nil { fmt.Printf("Profile fetch failed for %s: %v\n", did, err) } else { fmt.Printf("Fetched profile: %+v\n", profile) } var posts []notes.Note for _, record := range response.Records { bp, err := notes.AppBskyFeedPostFromRecord(record, profile) if err != nil { fmt.Printf("skipping malformed record %s: %v\n", record.URI, err) continue } posts = append(posts, *bp) } return posts, nil }