This repository has no description
0

Configure Feed

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

core / appview / pulls / edit.go
3.0 kB 104 lines
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}