diff options
Diffstat (limited to 'backend/general/records.go')
| -rw-r--r-- | backend/general/records.go | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/backend/general/records.go b/backend/general/records.go new file mode 100644 index 0000000..d623862 --- /dev/null +++ b/backend/general/records.go @@ -0,0 +1,70 @@ +package general + +import ( + "encoding/json" + "fmt" + "io" + "log/slog" + "net/http" +) + +type RawRecord struct { + URI string `json:"uri"` + Value json.RawMessage `json:"value"` +} + +func FetchRawRecordCollection(logger *slog.Logger, did, collection, baseURL string) ([]RawRecord, error) { + url := fmt.Sprintf("%s/xrpc/com.atproto.repo.listRecords?repo=%s&collection=%s", baseURL, did, collection) + + logger.Debug("fetching raw record collection", "did", did, "endpoint", baseURL, "collection", collection) + + resp, err := http.Get(url) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + body, _ := io.ReadAll(resp.Body) + return nil, fmt.Errorf("server returned %d: %s", resp.StatusCode, string(body)) + } + + var result struct { + Records []RawRecord `json:"records"` + } + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return nil, err + } + + return result.Records, nil +} + +func FetchRawRecordByURI(logger *slog.Logger, uri, baseURL string) (*RawRecord, error) { + repo, collection, rkey, err := ParseURI(uri) + if err != nil { + return nil, err + } + + url := fmt.Sprintf("%s/xrpc/com.atproto.repo.getRecord?repo=%s&collection=%s&rkey=%s", + baseURL, repo, collection, rkey) + + logger.Debug("fetching raw record by URI", "uri", uri, "endpoint", baseURL) + + resp, err := http.Get(url) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + body, _ := io.ReadAll(resp.Body) + return nil, fmt.Errorf("endpoint returned %d: %s", resp.StatusCode, string(body)) + } + + var result RawRecord + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return nil, err + } + + return &result, nil +} |
