From 788ab682b6d7860fa74091bb816e393101eead2c 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 50f27792..0f424d61 100644 --- a/appview/pages/funcmap.go +++ b/appview/pages/funcmap.go @@ -22,11 +22,11 @@ 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" "github.com/yuin/goldmark" "tangled.org/core/appview/filetree" + "tangled.org/core/appview/models" "tangled.org/core/appview/pages/markup" "tangled.org/core/crypto" ) @@ -72,6 +72,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 @@ -141,13 +152,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") @@ -379,9 +383,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 1cd25c66..fdbda92c 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -492,7 +492,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 @@ -841,9 +840,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 }}