diff --git a/pkg/appview/handlers/repository.go b/pkg/appview/handlers/repository.go index ccdc630..2839969 100644 --- a/pkg/appview/handlers/repository.go +++ b/pkg/appview/handlers/repository.go @@ -31,21 +31,33 @@ type RepositoryPageHandler struct { } func (h *RepositoryPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - handle := chi.URLParam(r, "handle") + identifier := chi.URLParam(r, "handle") repository := chi.URLParam(r, "repository") - // Look up user by handle - owner, err := db.GetUserByHandle(h.DB, handle) + // Resolve identifier (handle or DID) to canonical DID and current handle + did, resolvedHandle, _, err := atproto.ResolveIdentity(r.Context(), identifier) + if err != nil { + http.Error(w, "User not found", http.StatusNotFound) + return + } + + // Look up user by DID + owner, err := db.GetUserByDID(h.DB, did) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } - if owner == nil { http.Error(w, "User not found", http.StatusNotFound) return } + // Opportunistically update cached handle if it changed + if owner.Handle != resolvedHandle { + _ = db.UpdateUserHandle(h.DB, did, resolvedHandle) + owner.Handle = resolvedHandle + } + // Fetch tags with platform information tagsWithPlatforms, err := db.GetTagsWithPlatforms(h.DB, owner.DID, repository) if err != nil { diff --git a/pkg/appview/handlers/user.go b/pkg/appview/handlers/user.go index 248ac46..48762a4 100644 --- a/pkg/appview/handlers/user.go +++ b/pkg/appview/handlers/user.go @@ -6,6 +6,7 @@ import ( "net/http" "atcr.io/pkg/appview/db" + "atcr.io/pkg/atproto" "github.com/go-chi/chi/v5" ) @@ -17,20 +18,32 @@ type UserPageHandler struct { } func (h *UserPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - handle := chi.URLParam(r, "handle") + identifier := chi.URLParam(r, "handle") - // Look up user by handle - viewedUser, err := db.GetUserByHandle(h.DB, handle) + // Resolve identifier (handle or DID) to canonical DID and current handle + did, resolvedHandle, _, err := atproto.ResolveIdentity(r.Context(), identifier) + if err != nil { + http.Error(w, "User not found", http.StatusNotFound) + return + } + + // Look up user by DID + viewedUser, err := db.GetUserByDID(h.DB, did) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } - if viewedUser == nil { http.Error(w, "User not found", http.StatusNotFound) return } + // Opportunistically update cached handle if it changed + if viewedUser.Handle != resolvedHandle { + _ = db.UpdateUserHandle(h.DB, did, resolvedHandle) + viewedUser.Handle = resolvedHandle + } + // Fetch repositories for this user repos, err := db.GetUserRepositories(h.DB, viewedUser.DID) if err != nil {