From ece1adf5b985ff20586db27a80d31e2eb3ca9e30 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 | 6 ++-- 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, 72 insertions(+), 65 deletions(-) diff --git a/appview/pages/funcmap.go b/appview/pages/funcmap.go index 3cb6983f..04781680 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..15f8b248 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 @@ -831,9 +830,8 @@ func (p *Pages) RepoBlob(w io.Writer, params RepoBlobParams) error { } type Collaborator struct { - Did string - Handle string - Role string + Did string + Role string } type RepoSettingsParams struct { 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 }}