A locally focused bluesky appview
1package hydration
2
3import (
4 "context"
5 "fmt"
6
7 "github.com/bluesky-social/indigo/atproto/syntax"
8 "github.com/whyrusleeping/market/models"
9)
10
11func (h *Hydrator) NormalizeUri(ctx context.Context, uri string) (string, error) {
12 puri, err := syntax.ParseATURI(uri)
13 if err != nil {
14 return "", fmt.Errorf("invalid uri: %w", err)
15 }
16
17 var did string
18 if !puri.Authority().IsDID() {
19 resp, err := h.dir.LookupHandle(ctx, syntax.Handle(puri.Authority().String()))
20 if err != nil {
21 return "", err
22 }
23
24 did = resp.DID.String()
25 } else {
26 did = puri.Authority().String()
27 }
28
29 return fmt.Sprintf("at://%s/%s/%s", did, puri.Collection().String(), puri.RecordKey().String()), nil
30}
31
32func (h *Hydrator) UriForPost(ctx context.Context, p *models.Post) (string, error) {
33 did, err := h.backend.DidFromID(ctx, p.Author)
34 if err != nil {
35 return "", err
36 }
37
38 return fmt.Sprintf("at://%s/app.bsky.feed.post/%s", did, p.Rkey), nil
39}