Monorepo for Tangled
at master 98 lines 2.5 kB view raw
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}