mirror of
https://tangled.org/evan.jarrett.net/at-container-registry
synced 2026-08-30 12:46:57 +00:00
79 lines
1.8 KiB
Go
79 lines
1.8 KiB
Go
package handlers
|
|
|
|
import (
|
|
"database/sql"
|
|
"html/template"
|
|
"net/http"
|
|
|
|
"atcr.io/pkg/appview/db"
|
|
"github.com/gorilla/mux"
|
|
)
|
|
|
|
// UserPageHandler handles the public user page showing all images for a user
|
|
type UserPageHandler struct {
|
|
DB *sql.DB
|
|
Templates *template.Template
|
|
RegistryURL string
|
|
}
|
|
|
|
func (h *UserPageHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
handle := vars["handle"]
|
|
|
|
// Look up user by handle
|
|
viewedUser, err := db.GetUserByHandle(h.DB, handle)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
if viewedUser == nil {
|
|
http.Error(w, "User not found", http.StatusNotFound)
|
|
return
|
|
}
|
|
|
|
// Fetch repositories for this user
|
|
repos, err := db.GetUserRepositories(h.DB, viewedUser.DID)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
// Convert to RepoCardData for template
|
|
cards := make([]db.RepoCardData, 0, len(repos))
|
|
for _, repo := range repos {
|
|
stats, err := db.GetRepositoryStats(h.DB, viewedUser.DID, repo.Name)
|
|
if err != nil {
|
|
// Continue with zero stats on error
|
|
stats = &db.RepositoryStats{
|
|
DID: viewedUser.DID,
|
|
Repository: repo.Name,
|
|
}
|
|
}
|
|
cards = append(cards, db.RepoCardData{
|
|
OwnerHandle: viewedUser.Handle,
|
|
Repository: repo.Name,
|
|
Title: repo.Title,
|
|
Description: repo.Description,
|
|
IconURL: repo.IconURL,
|
|
StarCount: stats.StarCount,
|
|
PullCount: stats.PullCount,
|
|
})
|
|
}
|
|
|
|
data := struct {
|
|
PageData
|
|
ViewedUser *db.User // User whose page we're viewing
|
|
Repositories []db.RepoCardData
|
|
}{
|
|
PageData: NewPageData(r, h.RegistryURL),
|
|
ViewedUser: viewedUser,
|
|
Repositories: cards,
|
|
}
|
|
|
|
if err := h.Templates.ExecuteTemplate(w, "user", data); err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
}
|