From 4143799ee05934568f2393a1938b2e9dc9cdbb84 Mon Sep 17 00:00:00 2001 From: Seongmin Lee Date: Wed, 12 Nov 2025 09:42:33 +0000 Subject: [PATCH] appview/pages: resolve did on render Don't pass resolved user handles from http handlers. The page renderer is capable of resolving DIDs and we are using redis cache, so the performance won't matter much either. Signed-off-by: Seongmin Lee --- appview/pages/funcmap.go | 36 ++++++++++++++++++++++++++++-------- appview/pages/pages.go | 6 ++---- appview/reporesolver/resolver.go | 14 -------------- appview/state/profile.go | 11 +++++------ appview/pages/repoinfo/repoinfo.go | 4 ++-- appview/pages/templates/layouts/profilebase.html | 15 ++++++++------- appview/pages/templates/repo/empty.html | 2 +- appview/pages/templates/strings/dashboard.html | 11 ++++++----- appview/pages/templates/strings/string.html | 6 +++--- appview/pages/templates/user/followers.html | 2 +- appview/pages/templates/user/following.html | 2 +- appview/pages/templates/user/overview.html | 4 ++-- appview/pages/templates/user/repos.html | 2 +- appview/pages/templates/user/starred.html | 2 +- appview/pages/templates/user/strings.html | 4 ++-- appview/pages/templates/repo/fragments/cloneDropdown.html | 5 +++-- appview/pages/templates/repo/settings/access.html | 9 +++++---- appview/pages/templates/user/fragments/profileCard.html | 2 +- 18 file(s) changed, 72 insertion(s)(+), 65 deletion(s)(-) diff --git a/appview/pages/funcmap.go b/appview/pages/funcmap.go --- a/appview/pages/funcmap.go +++ b/appview/pages/funcmap.go @@ -22,11 +22,11 @@ chromahtml "github.com/alecthomas/chroma/v2/formatters/html" "github.com/alecthomas/chroma/v2/lexers" "github.com/alecthomas/chroma/v2/styles" - "github.com/bluesky-social/indigo/atproto/syntax" "github.com/dustin/go-humanize" "github.com/go-enry/go-enry/v2" "github.com/yuin/goldmark" "tangled.org/core/appview/filetree" + "tangled.org/core/appview/models" "tangled.org/core/appview/pages/markup" "tangled.org/core/crypto" ) @@ -71,6 +71,17 @@ } return identity.Handle.String() + }, + "ownerSlashRepo": func(repo *models.Repo) string { + ownerId, err := p.resolver.ResolveIdent(context.Background(), repo.Did) + if err != nil { + return repo.DidSlashRepo() + } + handle := ownerId.Handle + if handle != "" && !handle.IsInvalidHandle() { + return string(handle) + "/" + repo.Name + } + return repo.DidSlashRepo() }, "truncateAt30": func(s string) string { if len(s) <= 30 { @@ -140,13 +151,6 @@ } return b - }, - "didOrHandle": func(did, handle string) string { - if handle != "" && handle != syntax.HandleInvalid.String() { - return handle - } else { - return did - } }, "assoc": func(values ...string) ([][]string, error) { if len(values)%2 != 0 { @@ -379,8 +383,24 @@ } } +func (p *Pages) resolveDid(did string) string { + identity, err := p.resolver.ResolveIdent(context.Background(), did) + + if err != nil { + return did + } + + if identity.Handle.IsInvalidHandle() { + return "handle.invalid" + } + + return identity.Handle.String() +} + func (p *Pages) AvatarUrl(handle, size string) string { handle = strings.TrimPrefix(handle, "@") + + handle = p.resolveDid(handle) secret := p.avatar.SharedSecret h := hmac.New(sha256.New, []byte(secret)) diff --git a/appview/pages/pages.go b/appview/pages/pages.go --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -492,7 +492,6 @@ type ProfileCard struct { UserDid string - UserHandle string FollowStatus models.FollowStatus Punchcard *models.Punchcard Profile *models.Profile @@ -841,9 +840,8 @@ } type Collaborator struct { - Did string - Handle string - Role string + Did string + Role string } type RepoSettingsParams struct { diff --git a/appview/reporesolver/resolver.go b/appview/reporesolver/resolver.go --- a/appview/reporesolver/resolver.go +++ b/appview/reporesolver/resolver.go @@ -113,23 +113,9 @@ c := pages.Collaborator{ Did: did, - Handle: "", Role: role, } collaborators = append(collaborators, c) - } - - // populate all collborators with handles - identsToResolve := make([]string, len(collaborators)) - for i, collab := range collaborators { - identsToResolve[i] = collab.Did - } - - resolvedIdents := f.rr.idResolver.ResolveIdents(ctx, identsToResolve) - for i, resolved := range resolvedIdents { - if resolved != nil { - collaborators[i].Handle = resolved.Handle.String() - } } return collaborators, nil diff --git a/appview/state/profile.go b/appview/state/profile.go --- a/appview/state/profile.go +++ b/appview/state/profile.go @@ -96,7 +96,6 @@ return &pages.ProfileCard{ UserDid: did, - UserHandle: ident.Handle.String(), Profile: profile, FollowStatus: followStatus, Stats: pages.ProfileStats{ @@ -119,7 +118,7 @@ s.pages.Error500(w) return } - l = l.With("profileDid", profile.UserDid, "profileHandle", profile.UserHandle) + l = l.With("profileDid", profile.UserDid) repos, err := db.GetRepos( s.db, @@ -180,7 +179,7 @@ s.pages.Error500(w) return } - l = l.With("profileDid", profile.UserDid, "profileHandle", profile.UserHandle) + l = l.With("profileDid", profile.UserDid) repos, err := db.GetRepos( s.db, @@ -209,7 +208,7 @@ s.pages.Error500(w) return } - l = l.With("profileDid", profile.UserDid, "profileHandle", profile.UserHandle) + l = l.With("profileDid", profile.UserDid) stars, err := db.GetRepoStars(s.db, 0, db.FilterEq("did", profile.UserDid)) if err != nil { @@ -238,7 +237,7 @@ s.pages.Error500(w) return } - l = l.With("profileDid", profile.UserDid, "profileHandle", profile.UserHandle) + l = l.With("profileDid", profile.UserDid) strings, err := db.GetStrings(s.db, 0, db.FilterEq("did", profile.UserDid)) if err != nil { @@ -270,7 +269,7 @@ if err != nil { return nil, err } - l = l.With("profileDid", profile.UserDid, "profileHandle", profile.UserHandle) + l = l.With("profileDid", profile.UserDid) loggedInUser := s.oauth.GetUser(r) params := FollowsPageParams{ diff --git a/appview/pages/repoinfo/repoinfo.go b/appview/pages/repoinfo/repoinfo.go --- a/appview/pages/repoinfo/repoinfo.go +++ b/appview/pages/repoinfo/repoinfo.go @@ -9,7 +9,7 @@ "tangled.org/core/appview/state/userutil" ) -func (r RepoInfo) Owner() string { +func (r RepoInfo) owner() string { if r.OwnerHandle != "" { return r.OwnerHandle } else { @@ -18,7 +18,7 @@ } func (r RepoInfo) FullName() string { - return path.Join(r.Owner(), r.Name) + return path.Join(r.owner(), r.Name) } func (r RepoInfo) OwnerWithoutAt() string { diff --git a/appview/pages/templates/layouts/profilebase.html b/appview/pages/templates/layouts/profilebase.html --- a/appview/pages/templates/layouts/profilebase.html +++ b/appview/pages/templates/layouts/profilebase.html @@ -1,18 +1,19 @@ -{{ define "title" }}{{ or .Card.UserHandle .Card.UserDid }}{{ end }} +{{ define "title" }}{{ resolve .Card.UserDid }}{{ end }} {{ define "extrameta" }} - {{ $avatarUrl := fullAvatar .Card.UserHandle }} - + {{ $handle := resolve .Card.UserDid }} + {{ $avatarUrl := fullAvatar $handle }} + - - + + - - + + {{ end }} diff --git a/appview/pages/templates/repo/empty.html b/appview/pages/templates/repo/empty.html --- a/appview/pages/templates/repo/empty.html +++ b/appview/pages/templates/repo/empty.html @@ -35,7 +35,7 @@

1First, generate a new SSH key pair.

2Then add the public key to your account from the settings page.

-

3Configure your remote to git@{{ $knot | stripPort }}:{{ .RepoInfo.OwnerHandle }}/{{ .RepoInfo.Name }}

+

3Configure your remote to git@{{ $knot | stripPort }}:{{ resolve .RepoInfo.OwnerDid }}/{{ .RepoInfo.Name }}

4Push!

diff --git a/appview/pages/templates/strings/dashboard.html b/appview/pages/templates/strings/dashboard.html --- a/appview/pages/templates/strings/dashboard.html +++ b/appview/pages/templates/strings/dashboard.html @@ -1,10 +1,11 @@ -{{ define "title" }}strings by {{ or .Card.UserHandle .Card.UserDid }}{{ end }} +{{ define "title" }}strings by {{ resolve .Card.UserDid }}{{ end }} {{ define "extrameta" }} - + {{ $handle := resolve .Card.UserDid }} + - - + + {{ end }} @@ -35,7 +36,7 @@ {{ $s := index . 1 }}
{{ with $s.Description }}
diff --git a/appview/pages/templates/strings/string.html b/appview/pages/templates/strings/string.html --- a/appview/pages/templates/strings/string.html +++ b/appview/pages/templates/strings/string.html @@ -1,7 +1,7 @@ -{{ define "title" }}{{ .String.Filename }} · by {{ didOrHandle .Owner.DID.String .Owner.Handle.String }}{{ end }} +{{ define "title" }}{{ .String.Filename }} · by {{ resolve .Owner.DID.String }}{{ end }} {{ define "extrameta" }} - {{ $ownerId := didOrHandle .Owner.DID.String .Owner.Handle.String }} + {{ $ownerId := resolve .Owner.DID.String }} @@ -9,7 +9,7 @@ {{ end }} {{ define "content" }} -{{ $ownerId := didOrHandle .Owner.DID.String .Owner.Handle.String }} +{{ $ownerId := resolve .Owner.DID.String }}
diff --git a/appview/pages/templates/user/followers.html b/appview/pages/templates/user/followers.html --- a/appview/pages/templates/user/followers.html +++ b/appview/pages/templates/user/followers.html @@ -1,4 +1,4 @@ -{{ define "title" }}{{ or .Card.UserHandle .Card.UserDid }} · followers {{ end }} +{{ define "title" }}{{ resolve .Card.UserDid }} · followers {{ end }} {{ define "profileContent" }}
diff --git a/appview/pages/templates/user/following.html b/appview/pages/templates/user/following.html --- a/appview/pages/templates/user/following.html +++ b/appview/pages/templates/user/following.html @@ -1,4 +1,4 @@ -{{ define "title" }}{{ or .Card.UserHandle .Card.UserDid }} · following {{ end }} +{{ define "title" }}{{ resolve .Card.UserDid }} · following {{ end }} {{ define "profileContent" }}
diff --git a/appview/pages/templates/user/overview.html b/appview/pages/templates/user/overview.html --- a/appview/pages/templates/user/overview.html +++ b/appview/pages/templates/user/overview.html @@ -1,4 +1,4 @@ -{{ define "title" }}{{ or .Card.UserHandle .Card.UserDid }}{{ end }} +{{ define "title" }}{{ resolve .Card.UserDid }}{{ end }} {{ define "profileContent" }}
@@ -224,7 +224,7 @@ {{ define "ownRepos" }}
- PINNED REPOS diff --git a/appview/pages/templates/user/repos.html b/appview/pages/templates/user/repos.html --- a/appview/pages/templates/user/repos.html +++ b/appview/pages/templates/user/repos.html @@ -1,4 +1,4 @@ -{{ define "title" }}{{ or .Card.UserHandle .Card.UserDid }} · repos {{ end }} +{{ define "title" }}{{ resolve .Card.UserDid }} · repos {{ end }} {{ define "profileContent" }}
diff --git a/appview/pages/templates/user/starred.html b/appview/pages/templates/user/starred.html --- a/appview/pages/templates/user/starred.html +++ b/appview/pages/templates/user/starred.html @@ -1,4 +1,4 @@ -{{ define "title" }}{{ or .Card.UserHandle .Card.UserDid }} · repos {{ end }} +{{ define "title" }}{{ resolve .Card.UserDid }} · repos {{ end }} {{ define "profileContent" }}
diff --git a/appview/pages/templates/user/strings.html b/appview/pages/templates/user/strings.html --- a/appview/pages/templates/user/strings.html +++ b/appview/pages/templates/user/strings.html @@ -1,4 +1,4 @@ -{{ define "title" }}{{ or .Card.UserHandle .Card.UserDid }} · strings {{ end }} +{{ define "title" }}{{ resolve .Card.UserDid }} · strings {{ end }} {{ define "profileContent" }}
@@ -23,7 +23,7 @@ {{ $s := index . 1 }}
{{ with $s.Description }}
diff --git a/appview/pages/templates/repo/fragments/cloneDropdown.html b/appview/pages/templates/repo/fragments/cloneDropdown.html --- a/appview/pages/templates/repo/fragments/cloneDropdown.html +++ b/appview/pages/templates/repo/fragments/cloneDropdown.html @@ -43,13 +43,14 @@
+ {{ $repoOwnerHandle := resolve .RepoInfo.OwnerDid }}
git@{{ $knot | stripPort }}:{{ .RepoInfo.OwnerHandle }}/{{ .RepoInfo.Name }} + data-url="git@{{ $knot | stripPort }}:{{ $repoOwnerHandle }}/{{ .RepoInfo.Name }}" + >git@{{ $knot | stripPort }}:{{ $repoOwnerHandle }}/{{ .RepoInfo.Name }}