this repo has no description
at main 62 lines 1.7 kB view raw
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}