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
2.7 kB 99 lines
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}