This repository has no description
1package repo
2
3import (
4 "log"
5 "net/http"
6 "sort"
7 "time"
8
9 "github.com/go-enry/go-enry/v2"
10 "tangled.org/core/appview/db"
11 "tangled.org/core/ogre"
12 "tangled.org/core/orm"
13 "tangled.org/core/types"
14)
15
16func (rp *Repo) Opengraph(w http.ResponseWriter, r *http.Request) {
17 f, err := rp.repoResolver.Resolve(r)
18 if err != nil {
19 log.Println("failed to get repo and knot", err)
20 return
21 }
22
23 ownerHandle := rp.pages.DisplayHandle(r.Context(), f.Did)
24
25 avatarUrl := rp.pages.AvatarUrl(f.Did, "256")
26
27 var languageStats []types.RepoLanguageDetails
28 langs, err := db.GetRepoLanguages(
29 rp.db,
30 orm.FilterEq("repo_did", f.RepoDid),
31 orm.FilterEq("is_default_ref", 1),
32 )
33 if err != nil {
34 log.Printf("failed to get language stats from db: %v", err)
35 } else if len(langs) > 0 {
36 var total int64
37 for _, l := range langs {
38 total += l.Bytes
39 }
40
41 for _, l := range langs {
42 percentage := float32(l.Bytes) / float32(total) * 100
43 color := enry.GetColor(l.Language)
44 languageStats = append(languageStats, types.RepoLanguageDetails{
45 Name: l.Language,
46 Percentage: percentage,
47 Color: color,
48 })
49 }
50
51 sort.Slice(languageStats, func(i, j int) bool {
52 if languageStats[i].Name == enry.OtherLanguage {
53 return false
54 }
55 if languageStats[j].Name == enry.OtherLanguage {
56 return true
57 }
58 if languageStats[i].Percentage != languageStats[j].Percentage {
59 return languageStats[i].Percentage > languageStats[j].Percentage
60 }
61 return languageStats[i].Name < languageStats[j].Name
62 })
63 }
64
65 ogLanguages := []ogre.LanguageData{}
66 for _, lang := range languageStats {
67 if len(ogLanguages) >= 5 {
68 break
69 }
70 ogLanguages = append(ogLanguages, ogre.LanguageData{
71 Color: lang.Color,
72 Percentage: lang.Percentage,
73 })
74 }
75
76 payload := ogre.RepositoryCardPayload{
77 Type: "repository",
78 RepoName: f.Name,
79 OwnerHandle: ownerHandle,
80 Stars: f.RepoStats.StarCount,
81 Pulls: f.RepoStats.PullCount.Open,
82 Issues: f.RepoStats.IssueCount.Open,
83 CreatedAt: f.Created.Format(time.RFC3339),
84 AvatarUrl: avatarUrl,
85 Languages: ogLanguages,
86 }
87
88 imageBytes, err := rp.ogreClient.RenderRepositoryCard(r.Context(), payload)
89 if err != nil {
90 log.Println("failed to render repository card", err)
91 http.Error(w, "failed to render repository card", http.StatusInternalServerError)
92 return
93 }
94
95 w.Header().Set("Content-Type", "image/png")
96 w.Header().Set("Cache-Control", "public, max-age=3600")
97 w.WriteHeader(http.StatusOK)
98 _, err = w.Write(imageBytes)
99 if err != nil {
100 log.Println("failed to write repository card", err)
101 return
102 }
103}