1package refresolver
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 rawMentions, rawRefs := markup.FindReferences(r.config.Core.AppviewHost, source)
39 l.Debug("found possible references", "mentions", rawMentions, "refs", rawRefs)
40 idents := r.idResolver.ResolveIdents(ctx, rawMentions)
41 var mentions []syntax.DID
42 for _, ident := range idents {
43 if ident != nil && !ident.Handle.IsInvalidHandle() {
44 mentions = append(mentions, ident.DID)
45 }
46 }
47 l.Debug("found mentions", "mentions", mentions)
48
49 var resolvedRefs []models.ReferenceLink
50 for _, rawRef := range rawRefs {
51 ident, err := r.idResolver.ResolveIdent(ctx, rawRef.Handle)
52 if err != nil || ident == nil || ident.Handle.IsInvalidHandle() {
53 continue
54 }
55 rawRef.Handle = string(ident.DID)
56 resolvedRefs = append(resolvedRefs, rawRef)
57 }
58 aturiRefs, err := db.ValidateReferenceLinks(r.execer, resolvedRefs)
59 if err != nil {
60 l.Error("failed running query", "err", err)
61 }
62 l.Debug("found references", "refs", aturiRefs)
63
64 return mentions, aturiRefs
65}