A vibe coded tangled fork which supports pijul.

appview/issues: render labels in opengraph images

uses the same logic as in the label template to resolve and render
labels.

Signed-off-by: oppiliappan <me@oppi.li>

authored by

oppiliappan and committed by tangled.org bfdfd8c3 5b37d3c7

+48 -11
+48 -11
appview/issues/opengraph.go
··· 2 2 3 3 import ( 4 4 "context" 5 + "fmt" 5 6 "log" 6 7 "net/http" 7 8 "time" 8 9 10 + "tangled.org/core/api/tangled" 11 + "tangled.org/core/appview/db" 9 12 "tangled.org/core/appview/models" 10 13 "tangled.org/core/ogre" 14 + "tangled.org/core/orm" 11 15 ) 12 16 13 17 func (rp *Issues) IssueOpenGraphSummary(w http.ResponseWriter, r *http.Request) { ··· 24 28 return 25 29 } 26 30 31 + labelDefs, err := db.GetLabelDefinitions( 32 + rp.db, 33 + orm.FilterIn("at_uri", f.Labels), 34 + orm.FilterContains("scope", tangled.RepoIssueNSID), 35 + ) 36 + if err != nil { 37 + log.Println("failed to fetch label definitions") 38 + http.Error(w, "label definitions not found", http.StatusInternalServerError) 39 + return 40 + } 41 + 42 + defs := make(map[string]*models.LabelDefinition) 43 + for _, l := range labelDefs { 44 + defs[l.AtUri().String()] = &l 45 + } 46 + 47 + labels := []ogre.LabelData{} 48 + for _, def := range defs { 49 + for val := range issue.Labels.GetValSet(def.AtUri().String()) { 50 + name := def.Name 51 + value := "" 52 + 53 + if !def.ValueType.IsNull() { 54 + name = fmt.Sprintf("%s/", def.Name) 55 + value = val 56 + 57 + if def.ValueType.IsDidFormat() { 58 + if o, err := rp.idResolver.ResolveIdent(context.Background(), val); err == nil { 59 + value = o.Handle.String() 60 + } 61 + } 62 + } 63 + labels = append(labels, ogre.LabelData{ 64 + Color: def.GetColor(), 65 + Name: fmt.Sprintf("%s%s", name, value), 66 + }) 67 + } 68 + } 69 + 27 70 var ownerHandle string 28 71 owner, err := rp.idResolver.ResolveIdent(context.Background(), f.Did) 29 72 if err != nil { ··· 32 75 ownerHandle = owner.Handle.String() 33 76 } 34 77 35 - var authorHandle string 36 - author, err := rp.idResolver.ResolveIdent(context.Background(), issue.Did) 37 - if err != nil { 38 - authorHandle = issue.Did 39 - } else { 40 - authorHandle = "@" + author.Handle.String() 41 - } 42 - 43 - avatarUrl := rp.pages.AvatarUrl(authorHandle, "256") 78 + avatarUrl := rp.pages.AvatarUrl(ownerHandle, "256") 44 79 45 80 status := "closed" 46 81 if issue.Open { ··· 48 83 } 49 84 50 85 commentCount := len(issue.Comments) 86 + 87 + reactionCount, _ := db.GetReactionCount(rp.db, issue.AtUri()) 51 88 52 89 payload := ogre.IssueCardPayload{ 53 90 Type: "issue", ··· 57 94 Title: issue.Title, 58 95 IssueNumber: issue.IssueId, 59 96 Status: status, 60 - Labels: []ogre.LabelData{}, 97 + Labels: labels, 61 98 CommentCount: commentCount, 62 - ReactionCount: 0, 99 + ReactionCount: reactionCount, 63 100 CreatedAt: issue.Created.Format(time.RFC3339), 64 101 } 65 102