forked from
tangled.org/core
Monorepo for Tangled
1package pulls
2
3import (
4 "log"
5 "net/http"
6 "time"
7
8 "tangled.org/core/appview/db"
9 "tangled.org/core/appview/models"
10 "tangled.org/core/ogre"
11 "tangled.org/core/patchutil"
12)
13
14func (s *Pulls) PullOpenGraphSummary(w http.ResponseWriter, r *http.Request) {
15 f, err := s.repoResolver.Resolve(r)
16 if err != nil {
17 log.Println("failed to get repo and knot", err)
18 return
19 }
20
21 pull, ok := r.Context().Value("pull").(*models.Pull)
22 if !ok {
23 log.Println("pull not found in context")
24 http.Error(w, "pull not found", http.StatusNotFound)
25 return
26 }
27
28 ownerHandle := s.pages.DisplayHandle(r.Context(), f.Did)
29 authorHandle := s.pages.DisplayHandle(r.Context(), pull.OwnerDid)
30
31 avatarUrl := s.pages.AvatarUrl(f.Did, "256")
32 authorAvatarUrl := s.pages.AvatarUrl(pull.OwnerDid, "256")
33
34 var status string
35 if pull.State.IsOpen() {
36 status = "open"
37 } else if pull.State.IsMerged() {
38 status = "merged"
39 } else {
40 status = "closed"
41 }
42
43 var filesChanged int
44 var additions int64
45 var deletions int64
46
47 if len(pull.Submissions) > 0 {
48 latestSubmission := pull.LatestSubmission()
49 niceDiff := patchutil.AsNiceDiff(latestSubmission.Patch, pull.TargetBranch)
50 filesChanged = niceDiff.Stat.FilesChanged
51 additions = int64(niceDiff.Stat.Insertions)
52 deletions = int64(niceDiff.Stat.Deletions)
53 }
54
55 commentCount := pull.TotalComments()
56
57 reactionCount, _ := db.GetReactionCount(s.db, pull.AtUri())
58
59 rounds := max(1, len(pull.Submissions))
60
61 payload := ogre.PullRequestCardPayload{
62 Type: "pullRequest",
63 RepoName: f.Name,
64 OwnerHandle: ownerHandle,
65 AuthorHandle: authorHandle,
66 AvatarUrl: avatarUrl,
67 AuthorAvatarUrl: authorAvatarUrl,
68 Title: pull.Title,
69 PullRequestNumber: pull.PullId,
70 Status: status,
71 FilesChanged: filesChanged,
72 Additions: int(additions),
73 Deletions: int(deletions),
74 Rounds: rounds,
75 CommentCount: commentCount,
76 ReactionCount: reactionCount,
77 CreatedAt: pull.Created.Format(time.RFC3339),
78 }
79
80 imageBytes, err := s.ogreClient.RenderPullRequestCard(r.Context(), payload)
81 if err != nil {
82 log.Println("failed to render pull request card", err)
83 http.Error(w, "failed to render pull request card", http.StatusInternalServerError)
84 return
85 }
86
87 w.Header().Set("Content-Type", "image/png")
88 w.Header().Set("Cache-Control", "public, max-age=3600")
89 w.WriteHeader(http.StatusOK)
90 _, err = w.Write(imageBytes)
91 if err != nil {
92 log.Println("failed to write pull request card", err)
93 return
94 }
95}