From 2e71ee92dc57bfddaea5edc4b219e3820fd86c02 Mon Sep 17 00:00:00 2001 From: Anirudh Oppiliappan Date: Mon, 15 Dec 2025 14:51:10 +0200 Subject: [PATCH] appview/pages: get avatar cid to bust cache Signed-off-by: Anirudh Oppiliappan --- appview/pages/funcmap.go | 39 ++++++++++++++++++++++++++++------- appview/pages/funcmap_test.go | 2 +- appview/pages/pages.go | 5 ++++- appview/state/state.go | 2 +- 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/appview/pages/funcmap.go b/appview/pages/funcmap.go index c3ea8e65..63340d80 100644 --- a/appview/pages/funcmap.go +++ b/appview/pages/funcmap.go @@ -26,6 +26,7 @@ import ( "github.com/go-enry/go-enry/v2" "github.com/yuin/goldmark" emoji "github.com/yuin/goldmark-emoji" + "tangled.org/core/appview/db" "tangled.org/core/appview/models" "tangled.org/core/appview/oauth" "tangled.org/core/appview/pages/markup" @@ -485,21 +486,45 @@ func (p *Pages) resolveDid(did string) string { return identity.Handle.String() } -func (p *Pages) AvatarUrl(handle, size string) string { - handle = strings.TrimPrefix(handle, "@") +func (p *Pages) AvatarUrl(actor, size string) string { + actor = strings.TrimPrefix(actor, "@") - handle = p.resolveDid(handle) + identity, err := p.resolver.ResolveIdent(context.Background(), actor) + var did string + if err != nil { + did = actor + } else { + did = identity.DID.String() + } secret := p.avatar.SharedSecret h := hmac.New(sha256.New, []byte(secret)) - h.Write([]byte(handle)) + h.Write([]byte(did)) signature := hex.EncodeToString(h.Sum(nil)) - sizeArg := "" + // Get avatar CID for cache busting + profile, err := db.GetProfile(p.db, did) + version := "" + if err == nil && profile != nil && profile.Avatar != "" { + // Use first 8 chars of avatar CID as version + if len(profile.Avatar) > 8 { + version = profile.Avatar[:8] + } else { + version = profile.Avatar + } + } + + baseUrl := fmt.Sprintf("%s/%s/%s", p.avatar.Host, signature, did) if size != "" { - sizeArg = fmt.Sprintf("size=%s", size) + if version != "" { + return fmt.Sprintf("%s?size=%s&v=%s", baseUrl, size, version) + } + return fmt.Sprintf("%s?size=%s", baseUrl, size) + } + if version != "" { + return fmt.Sprintf("%s?v=%s", baseUrl, version) } - return fmt.Sprintf("%s/%s/%s?%s", p.avatar.Host, signature, handle, sizeArg) + return baseUrl } func (p *Pages) icon(name string, classes []string) (template.HTML, error) { diff --git a/appview/pages/funcmap_test.go b/appview/pages/funcmap_test.go index d54b826a..dcaff5cc 100644 --- a/appview/pages/funcmap_test.go +++ b/appview/pages/funcmap_test.go @@ -22,7 +22,7 @@ func TestPages_funcMap(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - p := NewPages(tt.config, tt.res, tt.l) + p := NewPages(tt.config, tt.res, nil, tt.l) got := p.funcMap() // TODO: update the condition below to compare got with tt.want. if true { diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 9dd46cb0..ad8392a1 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -19,6 +19,7 @@ import ( "tangled.org/core/api/tangled" "tangled.org/core/appview/commitverify" "tangled.org/core/appview/config" + "tangled.org/core/appview/db" "tangled.org/core/appview/models" "tangled.org/core/appview/oauth" "tangled.org/core/appview/pages/markup" @@ -42,6 +43,7 @@ type Pages struct { avatar config.AvatarConfig resolver *idresolver.Resolver + db *db.DB dev bool embedFS fs.FS templateDir string // Path to templates on disk for dev mode @@ -49,7 +51,7 @@ type Pages struct { logger *slog.Logger } -func NewPages(config *config.Config, res *idresolver.Resolver, logger *slog.Logger) *Pages { +func NewPages(config *config.Config, res *idresolver.Resolver, database *db.DB, logger *slog.Logger) *Pages { // initialized with safe defaults, can be overriden per use rctx := &markup.RenderContext{ IsDev: config.Core.Dev, @@ -66,6 +68,7 @@ func NewPages(config *config.Config, res *idresolver.Resolver, logger *slog.Logg avatar: config.Avatar, rctx: rctx, resolver: res, + db: database, templateDir: "appview/pages", logger: logger, } diff --git a/appview/state/state.go b/appview/state/state.go index 72b694be..4f7b5b22 100644 --- a/appview/state/state.go +++ b/appview/state/state.go @@ -92,7 +92,7 @@ func Make(ctx context.Context, config *config.Config) (*State, error) { return nil, fmt.Errorf("failed to create posthog client: %w", err) } - pages := pages.NewPages(config, res, log.SubLogger(logger, "pages")) + pages := pages.NewPages(config, res, d, log.SubLogger(logger, "pages")) oauth, err := oauth.New(config, posthog, d, enforcer, res, log.SubLogger(logger, "oauth")) if err != nil { return nil, fmt.Errorf("failed to start oauth handler: %w", err) -- 2.51.2