forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
at master 1.7 kB view raw
1package mentions 2 3import ( 4 "context" 5 "log/slog" 6 7 "github.com/bluesky-social/indigo/atproto/syntax" 8 "tangled.org/core/appview/config" 9 "tangled.org/core/appview/db" 10 "tangled.org/core/appview/models" 11 "tangled.org/core/appview/pages/markup" 12 "tangled.org/core/idresolver" 13) 14 15type Resolver struct { 16 config *config.Config 17 idResolver *idresolver.Resolver 18 execer db.Execer 19 logger *slog.Logger 20} 21 22func New( 23 config *config.Config, 24 idResolver *idresolver.Resolver, 25 execer db.Execer, 26 logger *slog.Logger, 27) *Resolver { 28 return &Resolver{ 29 config, 30 idResolver, 31 execer, 32 logger, 33 } 34} 35 36func (r *Resolver) Resolve(ctx context.Context, source string) ([]syntax.DID, []syntax.ATURI) { 37 l := r.logger.With("method", "Resolve") 38 39 rawMentions, rawRefs := markup.FindReferences(r.config.Core.AppviewHost, source) 40 l.Debug("found possible references", "mentions", rawMentions, "refs", rawRefs) 41 42 idents := r.idResolver.ResolveIdents(ctx, rawMentions) 43 var mentions []syntax.DID 44 for _, ident := range idents { 45 if ident != nil && !ident.Handle.IsInvalidHandle() { 46 mentions = append(mentions, ident.DID) 47 } 48 } 49 l.Debug("found mentions", "mentions", mentions) 50 51 var resolvedRefs []models.ReferenceLink 52 for _, rawRef := range rawRefs { 53 ident, err := r.idResolver.ResolveIdent(ctx, rawRef.Handle) 54 if err != nil || ident == nil || ident.Handle.IsInvalidHandle() { 55 continue 56 } 57 rawRef.Handle = string(ident.DID) 58 resolvedRefs = append(resolvedRefs, rawRef) 59 } 60 aturiRefs, err := db.ValidateReferenceLinks(r.execer, resolvedRefs) 61 if err != nil { 62 l.Error("failed running query", "err", err) 63 } 64 l.Debug("found references", "refs", aturiRefs) 65 66 return mentions, aturiRefs 67}