From 4dba1f131623dd2909ad2abaa73ec30fcad26da2 Mon Sep 17 00:00:00 2001
From: oppiliappan
Date: Tue, 14 Oct 2025 14:46:13 +0100
Subject: [PATCH] appview: remove `@` from URLs and interface
Change-Id: ytvszwnnmymowwszkklxxxvnzqsykowk
old URLs that refer to users with the `@` are redirected to the version
without `@`. the leading motivation for this change is that valid
atproto handles do not contain the prefix. it is purely stylistic.
Signed-off-by: oppiliappan
---
appview/middleware/middleware.go | 4 +-
appview/pages/funcmap.go | 7 +--
appview/pages/repoinfo/repoinfo.go | 12 ++---
appview/pages/templates/layouts/repobase.html | 4 +-
.../repo/fragments/cloneDropdown.html | 4 +-
appview/state/router.go | 50 ++++++++++---------
appview/state/state.go | 5 +-
appview/state/userutil/userutil.go | 12 ++---
8 files changed, 50 insertions(+), 48 deletions(-)
diff --git a/appview/middleware/middleware.go b/appview/middleware/middleware.go
index 2d7366ab..0393a8c4 100644
--- a/appview/middleware/middleware.go
+++ b/appview/middleware/middleware.go
@@ -180,13 +180,13 @@ func (mw Middleware) ResolveIdent() middlewareFunc {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
didOrHandle := chi.URLParam(req, "user")
+ didOrHandle = strings.TrimPrefix(didOrHandle, "@")
+
if slices.Contains(excluded, didOrHandle) {
next.ServeHTTP(w, req)
return
}
- didOrHandle = strings.TrimPrefix(didOrHandle, "@")
-
id, err := mw.idResolver.ResolveIdent(req.Context(), didOrHandle)
if err != nil {
// invalid did or handle
diff --git a/appview/pages/funcmap.go b/appview/pages/funcmap.go
index 0ccb070f..5929a56f 100644
--- a/appview/pages/funcmap.go
+++ b/appview/pages/funcmap.go
@@ -17,6 +17,7 @@ import (
"strings"
"time"
+ "github.com/bluesky-social/indigo/atproto/syntax"
"github.com/dustin/go-humanize"
"github.com/go-enry/go-enry/v2"
"tangled.org/core/appview/filetree"
@@ -57,7 +58,7 @@ func (p *Pages) funcMap() template.FuncMap {
return "handle.invalid"
}
- return "@" + identity.Handle.String()
+ return identity.Handle.String()
},
"truncateAt30": func(s string) string {
if len(s) <= 30 {
@@ -117,8 +118,8 @@ func (p *Pages) funcMap() template.FuncMap {
return b
},
"didOrHandle": func(did, handle string) string {
- if handle != "" {
- return fmt.Sprintf("@%s", handle)
+ if handle != "" && handle != syntax.HandleInvalid.String() {
+ return handle
} else {
return did
}
diff --git a/appview/pages/repoinfo/repoinfo.go b/appview/pages/repoinfo/repoinfo.go
index eeb99b6b..2d4550ec 100644
--- a/appview/pages/repoinfo/repoinfo.go
+++ b/appview/pages/repoinfo/repoinfo.go
@@ -1,31 +1,29 @@
package repoinfo
import (
- "fmt"
"path"
"slices"
- "strings"
"github.com/bluesky-social/indigo/atproto/syntax"
"tangled.org/core/appview/models"
"tangled.org/core/appview/state/userutil"
)
-func (r RepoInfo) OwnerWithAt() string {
+func (r RepoInfo) Owner() string {
if r.OwnerHandle != "" {
- return fmt.Sprintf("@%s", r.OwnerHandle)
+ return r.OwnerHandle
} else {
return r.OwnerDid
}
}
func (r RepoInfo) FullName() string {
- return path.Join(r.OwnerWithAt(), r.Name)
+ return path.Join(r.Owner(), r.Name)
}
func (r RepoInfo) OwnerWithoutAt() string {
- if after, ok := strings.CutPrefix(r.OwnerWithAt(), "@"); ok {
- return after
+ if r.OwnerHandle != "" {
+ return r.OwnerHandle
} else {
return userutil.FlattenDid(r.OwnerDid)
}
diff --git a/appview/pages/templates/layouts/repobase.html b/appview/pages/templates/layouts/repobase.html
index 056c64a6..3299d60c 100644
--- a/appview/pages/templates/layouts/repobase.html
+++ b/appview/pages/templates/layouts/repobase.html
@@ -13,8 +13,8 @@
{{ end }}
-
-
{{ .RepoInfo.OwnerWithAt }}
+
diff --git a/appview/pages/templates/repo/fragments/cloneDropdown.html b/appview/pages/templates/repo/fragments/cloneDropdown.html
index 708f12af..24e1ab31 100644
--- a/appview/pages/templates/repo/fragments/cloneDropdown.html
+++ b/appview/pages/templates/repo/fragments/cloneDropdown.html
@@ -29,8 +29,8 @@
https://tangled.org/{{ .RepoInfo.OwnerWithAt }}/{{ .RepoInfo.Name }}
+ data-url="https://tangled.org/{{ resolve .RepoInfo.OwnerDid }}/{{ .RepoInfo.Name }}"
+ >https://tangled.org/{{ resolve .RepoInfo.OwnerDid }}/{{ .RepoInfo.Name }}