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