Monorepo for Tangled
tangled.org
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 newRecord := newPull.AsRecord()
57 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
58 Collection: tangled.RepoPullNSID,
59 Repo: user.Did,
60 Rkey: newPull.Rkey,
61 SwapRecord: ex.Cid,
62 Record: &lexutil.LexiconTypeDecoder{
63 Val: &newRecord,
64 },
65 })
66 if err != nil {
67 l.Error("failed to edit record on PDS", "err", err)
68 s.pages.Notice(w, noticeId, "Failed to edit pull on PDS.")
69 return
70 }
71
72 tx, err := s.db.BeginTx(r.Context(), nil)
73 if err != nil {
74 l.Error("failed to start tx", "err", err)
75 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
76 return
77 }
78 defer tx.Rollback()
79
80 err = db.PutPull(tx, &newPull)
81 if err != nil {
82 l.Error("failed to create pull request in database", "err", err)
83 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
84 return
85 }
86
87 if err = tx.Commit(); err != nil {
88 l.Error("failed to commit transaction for pull request", "err", err)
89 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
90 return
91 }
92
93 s.pages.HxRefresh(w)
94 }
95}