Monorepo for Tangled

appview: add "starred-by" page at /{user}/{repo}/stars

Signed-off-by: Patrick Dewey <p@pdewey.com>

pdewey.com 3c41bb79 d272c794

verified
+61
+12
appview/pages/pages.go
··· 1387 1387 return p.executePlain("repo/fragments/editLabelPanel", w, params) 1388 1388 } 1389 1389 1390 + type RepoStarsParams struct { 1391 + LoggedInUser *oauth.MultiAccountUser 1392 + RepoInfo repoinfo.RepoInfo 1393 + Active string 1394 + Starrers []models.Star 1395 + } 1396 + 1397 + func (p *Pages) RepoStars(w io.Writer, params RepoStarsParams) error { 1398 + params.Active = "stars" 1399 + return p.executeRepo("repo/stars", w, params) 1400 + } 1401 + 1390 1402 type PipelinesParams struct { 1391 1403 LoggedInUser *oauth.MultiAccountUser 1392 1404 RepoInfo repoinfo.RepoInfo
+24
appview/pages/templates/repo/stars.html
··· 1 + {{ define "title" }}stars · {{ .RepoInfo.FullName }}{{ end }} 2 + {{ define "repoContent" }} 3 + <div class="flex flex-col gap-4"> 4 + <h2 class="text-sm uppercase font-bold">Starred by</h2> 5 + <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4"> 6 + {{ range .Starrers }} 7 + {{ $handle := resolve .Did }} 8 + <div class="border border-gray-200 dark:border-gray-700 rounded p-4"> 9 + <div class="flex items-center gap-3"> 10 + {{ template "user/fragments/picLink" (list .Did "size-10") }} 11 + <div class="flex-1 min-w-0"> 12 + <a href="/{{ $handle }}" class="block truncate">{{ $handle }}</a> 13 + <p class="text-sm text-gray-500 dark:text-gray-400"> 14 + starred {{ .Created | relTimeFmt }} 15 + </p> 16 + </div> 17 + </div> 18 + </div> 19 + {{ else }} 20 + <p class="text-gray-500 dark:text-gray-400 col-span-3">No stars yet.</p> 21 + {{ end }} 22 + </div> 23 + </div> 24 + {{ end }}
+23
appview/repo/repo.go
··· 1195 1195 } 1196 1196 } 1197 1197 1198 + func (rp *Repo) Stars(w http.ResponseWriter, r *http.Request) { 1199 + l := rp.logger.With("handler", "Stars") 1200 + 1201 + user := rp.oauth.GetMultiAccountUser(r) 1202 + f, err := rp.repoResolver.Resolve(r) 1203 + if err != nil { 1204 + l.Error("failed to resolve source repo", "err", err) 1205 + return 1206 + } 1207 + 1208 + starrers, err := db.GetStars(rp.db, f.RepoAt()) 1209 + if err != nil { 1210 + l.Error("failed to fetch starrers", "err", err, "repoAt", f.RepoAt()) 1211 + return 1212 + } 1213 + 1214 + rp.pages.RepoStars(w, pages.RepoStarsParams{ 1215 + LoggedInUser: user, 1216 + RepoInfo: rp.repoResolver.GetRepoInfo(r, user), 1217 + Starrers: starrers, 1218 + }) 1219 + } 1220 + 1198 1221 // this is used to rollback changes made to the PDS 1199 1222 // 1200 1223 // it is a no-op if the provided ATURI is empty
+2
appview/repo/router.go
··· 45 45 // a file path 46 46 r.Get("/archive/{ref}", rp.DownloadArchive) 47 47 48 + r.Get("/stars", rp.Stars) 49 + 48 50 r.Route("/fork", func(r chi.Router) { 49 51 r.Use(middleware.AuthMiddleware(rp.oauth)) 50 52 r.Get("/", rp.ForkRepo)