Monorepo for Tangled tangled.org
12

Configure Feed

Select the types of activity you want to include in your feed.

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}