Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2

appview/pages: get avatar cid to bust cache

Signed-off-by: Anirudh Oppiliappan <anirudh@tangled.org>

authored by anirudh.fi and committed by tangled.org 2e71ee92 c7fbb98c

+39 -11
+33 -8
appview/pages/funcmap.go
··· 26 26 "github.com/go-enry/go-enry/v2" 27 27 "github.com/yuin/goldmark" 28 28 emoji "github.com/yuin/goldmark-emoji" 29 + "tangled.org/core/appview/db" 29 30 "tangled.org/core/appview/models" 30 31 "tangled.org/core/appview/oauth" 31 32 "tangled.org/core/appview/pages/markup" ··· 486 485 return identity.Handle.String() 487 486 } 488 487 489 - func (p *Pages) AvatarUrl(handle, size string) string { 490 - handle = strings.TrimPrefix(handle, "@") 488 + func (p *Pages) AvatarUrl(actor, size string) string { 489 + actor = strings.TrimPrefix(actor, "@") 491 490 492 - handle = p.resolveDid(handle) 491 + identity, err := p.resolver.ResolveIdent(context.Background(), actor) 492 + var did string 493 + if err != nil { 494 + did = actor 495 + } else { 496 + did = identity.DID.String() 497 + } 493 498 494 499 secret := p.avatar.SharedSecret 495 500 h := hmac.New(sha256.New, []byte(secret)) 496 - h.Write([]byte(handle)) 501 + h.Write([]byte(did)) 497 502 signature := hex.EncodeToString(h.Sum(nil)) 498 503 499 - sizeArg := "" 500 - if size != "" { 501 - sizeArg = fmt.Sprintf("size=%s", size) 504 + // Get avatar CID for cache busting 505 + profile, err := db.GetProfile(p.db, did) 506 + version := "" 507 + if err == nil && profile != nil && profile.Avatar != "" { 508 + // Use first 8 chars of avatar CID as version 509 + if len(profile.Avatar) > 8 { 510 + version = profile.Avatar[:8] 511 + } else { 512 + version = profile.Avatar 513 + } 502 514 } 503 - return fmt.Sprintf("%s/%s/%s?%s", p.avatar.Host, signature, handle, sizeArg) 515 + 516 + baseUrl := fmt.Sprintf("%s/%s/%s", p.avatar.Host, signature, did) 517 + if size != "" { 518 + if version != "" { 519 + return fmt.Sprintf("%s?size=%s&v=%s", baseUrl, size, version) 520 + } 521 + return fmt.Sprintf("%s?size=%s", baseUrl, size) 522 + } 523 + if version != "" { 524 + return fmt.Sprintf("%s?v=%s", baseUrl, version) 525 + } 526 + return baseUrl 504 527 } 505 528 506 529 func (p *Pages) icon(name string, classes []string) (template.HTML, error) {
+1 -1
appview/pages/funcmap_test.go
··· 22 22 } 23 23 for _, tt := range tests { 24 24 t.Run(tt.name, func(t *testing.T) { 25 - p := NewPages(tt.config, tt.res, tt.l) 25 + p := NewPages(tt.config, tt.res, nil, tt.l) 26 26 got := p.funcMap() 27 27 // TODO: update the condition below to compare got with tt.want. 28 28 if true {
+4 -1
appview/pages/pages.go
··· 19 19 "tangled.org/core/api/tangled" 20 20 "tangled.org/core/appview/commitverify" 21 21 "tangled.org/core/appview/config" 22 + "tangled.org/core/appview/db" 22 23 "tangled.org/core/appview/models" 23 24 "tangled.org/core/appview/oauth" 24 25 "tangled.org/core/appview/pages/markup" ··· 43 42 44 43 avatar config.AvatarConfig 45 44 resolver *idresolver.Resolver 45 + db *db.DB 46 46 dev bool 47 47 embedFS fs.FS 48 48 templateDir string // Path to templates on disk for dev mode ··· 51 49 logger *slog.Logger 52 50 } 53 51 54 - func NewPages(config *config.Config, res *idresolver.Resolver, logger *slog.Logger) *Pages { 52 + func NewPages(config *config.Config, res *idresolver.Resolver, database *db.DB, logger *slog.Logger) *Pages { 55 53 // initialized with safe defaults, can be overriden per use 56 54 rctx := &markup.RenderContext{ 57 55 IsDev: config.Core.Dev, ··· 68 66 avatar: config.Avatar, 69 67 rctx: rctx, 70 68 resolver: res, 69 + db: database, 71 70 templateDir: "appview/pages", 72 71 logger: logger, 73 72 }
+1 -1
appview/state/state.go
··· 92 92 return nil, fmt.Errorf("failed to create posthog client: %w", err) 93 93 } 94 94 95 - pages := pages.NewPages(config, res, log.SubLogger(logger, "pages")) 95 + pages := pages.NewPages(config, res, d, log.SubLogger(logger, "pages")) 96 96 oauth, err := oauth.New(config, posthog, d, enforcer, res, log.SubLogger(logger, "oauth")) 97 97 if err != nil { 98 98 return nil, fmt.Errorf("failed to start oauth handler: %w", err)