forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
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}