diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 511f2609..541f34ef 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -757,6 +757,7 @@ type StarBtnFragmentParams struct { IsStarred bool SubjectAt syntax.ATURI StarCount int + RepoName string HxSwapOob bool } @@ -1483,6 +1484,18 @@ func (p *Pages) EditLabelPanel(w io.Writer, params EditLabelPanelParams) error { return p.executePlain("repo/fragments/editLabelPanel", w, params) } +type RepoStarsParams struct { + LoggedInUser *oauth.MultiAccountUser + RepoInfo repoinfo.RepoInfo + Active string + Starrers []models.Star +} + +func (p *Pages) RepoStars(w io.Writer, params RepoStarsParams) error { + params.Active = "overview" + return p.executeRepo("repo/stars", w, params) +} + type PipelinesParams struct { LoggedInUser *oauth.MultiAccountUser RepoInfo repoinfo.RepoInfo diff --git a/appview/pages/templates/repo/stars.html b/appview/pages/templates/repo/stars.html new file mode 100644 index 00000000..927ca60d --- /dev/null +++ b/appview/pages/templates/repo/stars.html @@ -0,0 +1,24 @@ +{{ define "title" }}stars ยท {{ .RepoInfo.FullName }}{{ end }} + {{ define "repoContent" }} +
+

Starred by

+
+ {{ range .Starrers }} + {{ $handle := resolve .Did }} +
+
+ {{ template "user/fragments/picLink" (list .Did "size-10") }} +
+ {{ $handle }} +

+ starred {{ .Created | relTimeFmt }} +

+
+
+
+ {{ else }} +

No stars yet.

+ {{ end }} +
+
+{{ end }} diff --git a/appview/repo/repo.go b/appview/repo/repo.go index 606898ea..a3ca4d55 100644 --- a/appview/repo/repo.go +++ b/appview/repo/repo.go @@ -1257,6 +1257,29 @@ func (rp *Repo) ForkRepo(w http.ResponseWriter, r *http.Request) { } } +func (rp *Repo) Stars(w http.ResponseWriter, r *http.Request) { + l := rp.logger.With("handler", "Stars") + + user := rp.oauth.GetMultiAccountUser(r) + f, err := rp.repoResolver.Resolve(r) + if err != nil { + l.Error("failed to resolve source repo", "err", err) + return + } + + starrers, err := db.GetStars(rp.db, f.RepoAt()) + if err != nil { + l.Error("failed to fetch starrers", "err", err, "repoAt", f.RepoAt()) + return + } + + rp.pages.RepoStars(w, pages.RepoStarsParams{ + LoggedInUser: user, + RepoInfo: rp.repoResolver.GetRepoInfo(r, user), + Starrers: starrers, + }) +} + // this is used to rollback changes made to the PDS // // it is a no-op if the provided ATURI is empty diff --git a/appview/repo/router.go b/appview/repo/router.go index f40a22c3..843ca34b 100644 --- a/appview/repo/router.go +++ b/appview/repo/router.go @@ -47,6 +47,8 @@ func (rp *Repo) Router(mw *middleware.Middleware) http.Handler { // a file path r.Get("/archive/{ref}", rp.DownloadArchive) + r.Get("/stars", rp.Stars) + r.Route("/fork", func(r chi.Router) { r.Use(middleware.AuthMiddleware(rp.oauth)) r.Get("/", rp.ForkRepo) diff --git a/appview/state/star.go b/appview/state/star.go index 78dea43d..b5a42948 100644 --- a/appview/state/star.go +++ b/appview/state/star.go @@ -37,6 +37,8 @@ func (s *State) Star(w http.ResponseWriter, r *http.Request) { return } + repoName := r.URL.Query().Get("repoName") + switch r.Method { case http.MethodPost: createdAt := time.Now().Format(time.RFC3339) @@ -87,6 +89,7 @@ func (s *State) Star(w http.ResponseWriter, r *http.Request) { IsStarred: true, SubjectAt: subjectUri, StarCount: starCount, + RepoName: repoName, }) return @@ -127,9 +130,11 @@ func (s *State) Star(w http.ResponseWriter, r *http.Request) { IsStarred: false, SubjectAt: subjectUri, StarCount: starCount, + RepoName: repoName, }) return } } +