Monorepo for Tangled
0
fork

Configure Feed

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

at master 116 lines 2.9 kB view raw
1package issues 2 3import ( 4 "context" 5 "fmt" 6 "log" 7 "net/http" 8 "time" 9 10 "tangled.org/core/api/tangled" 11 "tangled.org/core/appview/db" 12 "tangled.org/core/appview/models" 13 "tangled.org/core/ogre" 14 "tangled.org/core/orm" 15) 16 17func (rp *Issues) IssueOpenGraphSummary(w http.ResponseWriter, r *http.Request) { 18 f, err := rp.repoResolver.Resolve(r) 19 if err != nil { 20 log.Println("failed to get repo and knot", err) 21 return 22 } 23 24 issue, ok := r.Context().Value("issue").(*models.Issue) 25 if !ok { 26 log.Println("issue not found in context") 27 http.Error(w, "issue not found", http.StatusNotFound) 28 return 29 } 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 70 ownerHandle := rp.pages.DisplayHandle(r.Context(), f.Did) 71 authorHandle := rp.pages.DisplayHandle(r.Context(), issue.Did) 72 73 avatarUrl := rp.pages.AvatarUrl(f.Did, "256") 74 authorAvatarUrl := rp.pages.AvatarUrl(issue.Did, "256") 75 76 status := "closed" 77 if issue.Open { 78 status = "open" 79 } 80 81 commentCount := len(issue.Comments) 82 83 reactionCount, _ := db.GetReactionCount(rp.db, issue.AtUri()) 84 85 payload := ogre.IssueCardPayload{ 86 Type: "issue", 87 RepoName: f.Name, 88 OwnerHandle: ownerHandle, 89 AuthorHandle: authorHandle, 90 AvatarUrl: avatarUrl, 91 AuthorAvatarUrl: authorAvatarUrl, 92 Title: issue.Title, 93 IssueNumber: issue.IssueId, 94 Status: status, 95 Labels: labels, 96 CommentCount: commentCount, 97 ReactionCount: reactionCount, 98 CreatedAt: issue.Created.Format(time.RFC3339), 99 } 100 101 imageBytes, err := rp.ogreClient.RenderIssueCard(r.Context(), payload) 102 if err != nil { 103 log.Println("failed to render issue card", err) 104 http.Error(w, "failed to render issue card", http.StatusInternalServerError) 105 return 106 } 107 108 w.Header().Set("Content-Type", "image/png") 109 w.Header().Set("Cache-Control", "public, max-age=3600") 110 w.WriteHeader(http.StatusOK) 111 _, err = w.Write(imageBytes) 112 if err != nil { 113 log.Println("failed to write issue card", err) 114 return 115 } 116}