This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

core / appview / repo / opengraph.go
2.6 kB 103 lines
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}