This repository has no description
1package pulls
2
3import (
4 "net/http"
5
6 comatproto "github.com/bluesky-social/indigo/api/atproto"
7 lexutil "github.com/bluesky-social/indigo/lex/util"
8
9 "tangled.org/core/api/tangled"
10 "tangled.org/core/appview/db"
11 "tangled.org/core/appview/models"
12 "tangled.org/core/appview/pages"
13)
14
15func (s *Pulls) EditPull(w http.ResponseWriter, r *http.Request) {
16 l := s.logger.With("handler", "EditPull")
17 user := s.oauth.GetMultiAccountUser(r)
18 ctx := r.Context()
19
20 pull, ok := r.Context().Value("pull").(*models.Pull)
21 if !ok {
22 l.Error("failed to get pull")
23 s.pages.Error404(w)
24 return
25 }
26
27 switch r.Method {
28 case http.MethodGet:
29 s.pages.EditPullFragment(w, pages.EditPullParams{
30 LoggedInUser: user,
31 RepoInfo: s.repoResolver.GetRepoInfo(r, user),
32 Pull: pull,
33 })
34 case http.MethodPost:
35 noticeId := "pulls"
36 newPull := *pull
37 newPull.Title = r.FormValue("title")
38 newPull.Body = r.FormValue("body")
39 newPull.Mentions, newPull.References = s.mentionsResolver.Resolve(ctx, newPull.Body)
40
41 // edit an atproto record
42 client, err := s.oauth.AuthorizedClient(r)
43 if err != nil {
44 l.Error("failed to get authorized client", "err", err)
45 s.pages.Notice(w, noticeId, "Failed to edit pull.")
46 return
47 }
48
49 ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoPullNSID, user.Did, newPull.Rkey)
50 if err != nil {
51 l.Error("failed to get record", "err", err)
52 s.pages.Notice(w, noticeId, "Failed to edit pull, no record found on PDS.")
53 return
54 }
55
56 // merge existing pins with new uploads, dropping any removed from body
57 var existingBlobs []*lexutil.LexBlob
58 if ex.Value != nil {
59 if prev, ok := ex.Value.Val.(*tangled.RepoPull); ok {
60 existingBlobs = prev.Blobs
61 }
62 }
63 newPull.Blobs = models.MergeBlobs(existingBlobs, r.PostForm["blobs"], newPull.Body)
64
65 newRecord := newPull.AsRecord()
66 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
67 Collection: tangled.RepoPullNSID,
68 Repo: user.Did,
69 Rkey: newPull.Rkey,
70 SwapRecord: ex.Cid,
71 Record: &lexutil.LexiconTypeDecoder{
72 Val: &newRecord,
73 },
74 })
75 if err != nil {
76 l.Error("failed to edit record on PDS", "err", err)
77 s.pages.Notice(w, noticeId, "Failed to edit pull on PDS.")
78 return
79 }
80
81 tx, err := s.db.BeginTx(r.Context(), nil)
82 if err != nil {
83 l.Error("failed to start tx", "err", err)
84 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
85 return
86 }
87 defer tx.Rollback()
88
89 err = db.PutPull(tx, &newPull)
90 if err != nil {
91 l.Error("failed to create pull request in database", "err", err)
92 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
93 return
94 }
95
96 if err = tx.Commit(); err != nil {
97 l.Error("failed to commit transaction for pull request", "err", err)
98 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
99 return
100 }
101
102 s.pages.HxRefresh(w)
103 }
104}