this repo has no description
1package server
2
3import (
4 "context"
5 "errors"
6 "fmt"
7
8 "github.com/bluesky-social/indigo/atproto/syntax"
9)
10
11var (
12 ErrAtHandleNotPresent = errors.New("could not find at handle inside of did doc")
13 ErrActorNotValid = errors.New("actor was not a valid did or handle")
14)
15
16func (s *Server) handleFromDid(ctx context.Context, did syntax.DID) (syntax.Handle, error) {
17 doc, err := s.directory.LookupDID(ctx, did)
18 if err != nil {
19 return "", fmt.Errorf("failed to fetch did doc: %w", err)
20 }
21
22 return doc.Handle, nil
23}
24
25// Given either a valid DID or handle, finds both the DID and handle for said actor and returns them.
26// Returns ErrActorNotValid if the actor is not a valid DID or handle.
27func (s *Server) fetchDidHandleFromActor(ctx context.Context, actor string) (string, string, error) {
28 logger := s.logger.With("name", "fetchDidHandleForActor", "actor", actor)
29
30 var did *syntax.DID
31 var handle *syntax.Handle
32 if parsed, err := syntax.ParseDID(actor); err == nil {
33 did = &parsed
34 } else if parsed, err := syntax.ParseHandle(actor); err == nil {
35 handle = &parsed
36 }
37
38 logger = logger.With("did", did, "handle", handle)
39
40 if did == nil && handle == nil {
41 logger.Error("actor was not a valid did or handle")
42 return "", "", ErrActorNotValid
43 }
44
45 if did != nil {
46 maybeHandle, err := s.handleFromDid(ctx, *did)
47 if err != nil {
48 logger.Error("error getting handle", "err", err)
49 return "", "", err
50 }
51 handle = &maybeHandle
52 } else if handle != nil {
53 maybeDid, err := s.directory.ResolveHandle(ctx, *handle)
54 if err != nil {
55 logger.Error("error getting did", "err", err)
56 return "", "", err
57 }
58 did = &maybeDid
59 }
60
61 return did.String(), handle.String(), nil
62}