From ee72e288515c0a1f71b073b79fd3138d7f978a77 Mon Sep 17 00:00:00 2001 From: Seongmin Lee Date: Wed, 12 Nov 2025 18:42:33 +0900 Subject: [PATCH] appview/pages: resolve did on render Change-Id: ozrknyqpstuyxypsvnuwmvlzxxtrzspp 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 | 2 -- appview/pages/repoinfo/repoinfo.go | 4 +-- .../pages/templates/layouts/profilebase.html | 15 ++++---- appview/pages/templates/repo/empty.html | 2 +- .../repo/fragments/cloneDropdown.html | 5 +-- .../pages/templates/repo/settings/access.html | 9 ++--- .../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 +- .../templates/user/fragments/profileCard.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/reporesolver/resolver.go | 14 -------- appview/state/profile.go | 11 +++--- 18 files changed, 70 insertions(+), 63 deletions(-) diff --git a/appview/pages/funcmap.go b/appview/pages/funcmap.go index 3cb6983f..0a407c72 100644 --- a/appview/pages/funcmap.go +++ b/appview/pages/funcmap.go @@ -22,10 +22,10 @@ import ( 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" "tangled.org/core/appview/filetree" + "tangled.org/core/appview/models" "tangled.org/core/appview/pages/markup" "tangled.org/core/crypto" ) @@ -71,6 +71,17 @@ func (p *Pages) funcMap() template.FuncMap { 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 { return s @@ -131,13 +142,6 @@ func (p *Pages) funcMap() template.FuncMap { 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 { return nil, fmt.Errorf("invalid assoc call, must have an even number of arguments") @@ -369,9 +373,25 @@ func (p *Pages) funcMap() template.FuncMap { } } +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)) h.Write([]byte(handle)) diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 80e2803b..4a33b95b 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -482,7 +482,6 @@ func (p *Pages) ForkRepo(w io.Writer, params ForkRepoParams) error { type ProfileCard struct { UserDid string - UserHandle string FollowStatus models.FollowStatus Punchcard *models.Punchcard Profile *models.Profile @@ -832,7 +831,6 @@ func (p *Pages) RepoBlob(w io.Writer, params RepoBlobParams) error { type Collaborator struct { Did string - Handle string Role string } diff --git a/appview/pages/repoinfo/repoinfo.go b/appview/pages/repoinfo/repoinfo.go index 30e3d6fd..d9aaba6b 100644 --- a/appview/pages/repoinfo/repoinfo.go +++ b/appview/pages/repoinfo/repoinfo.go @@ -9,7 +9,7 @@ import ( "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) Owner() string { } 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 index 7c04eb64..0747a39f 100644 --- 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 index 18623ca5..41269d36 100644 --- 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/repo/fragments/cloneDropdown.html b/appview/pages/templates/repo/fragments/cloneDropdown.html index 5e7ceaa1..9179aa5a 100644 --- 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 }}