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