Monorepo for Tangled
tangled.org
1package repo
2
3import (
4 "log"
5 "net/http"
6 "time"
7
8 "github.com/bluesky-social/indigo/atproto/syntax"
9 "tangled.org/core/ogre"
10)
11
12const MaxOpengraphLanguageKinds = 4
13
14func (rp *Repo) Opengraph(w http.ResponseWriter, r *http.Request) {
15 f, err := rp.repoResolver.Resolve(r)
16 if err != nil {
17 log.Println("failed to get repo and knot", err)
18 return
19 }
20
21 ownerHandle := rp.pages.DisplayHandle(r.Context(), f.Did)
22
23 avatarUrl := rp.pages.AvatarUrl(f.Did, "256")
24
25 langs, err := rp.getLanguageInfo(r.Context(), syntax.DID(f.RepoDid), "")
26 if err != nil {
27 log.Printf("failed to get language stats from knotmirror: %v", err)
28 }
29 languageStats := makeLanguageStats(langs)
30
31 ogLanguages := []ogre.LanguageData{}
32 for _, lang := range languageStats {
33 if len(ogLanguages) > MaxOpengraphLanguageKinds {
34 break
35 }
36 ogLanguages = append(ogLanguages, ogre.LanguageData{
37 Color: lang.Color,
38 Percentage: lang.Percentage,
39 })
40 }
41
42 payload := ogre.RepositoryCardPayload{
43 Type: "repository",
44 RepoName: f.Name,
45 OwnerHandle: ownerHandle,
46 Stars: f.RepoStats.StarCount,
47 Pulls: f.RepoStats.PullCount.Open,
48 Issues: f.RepoStats.IssueCount.Open,
49 CreatedAt: f.Created.Format(time.RFC3339),
50 AvatarUrl: avatarUrl,
51 Languages: ogLanguages,
52 }
53
54 imageBytes, err := rp.ogreClient.RenderRepositoryCard(r.Context(), payload)
55 if err != nil {
56 log.Println("failed to render repository card", err)
57 http.Error(w, "failed to render repository card", http.StatusInternalServerError)
58 return
59 }
60
61 w.Header().Set("Content-Type", "image/png")
62 w.Header().Set("Cache-Control", "public, max-age=3600")
63 w.WriteHeader(http.StatusOK)
64 _, err = w.Write(imageBytes)
65 if err != nil {
66 log.Println("failed to write repository card", err)
67 return
68 }
69}