···
func (s *State) EditPatch(w http.ResponseWriter, r *http.Request) {
user := s.auth.GetUser(r)
235
-
f, err := fullyResolvedRepo(r)
237
-
log.Println("failed to get repo and knot", err)
238
-
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
236
+
patch := r.FormValue("patch")
238
+
s.pages.Notice(w, "pull-error", "Patch is required.")
242
-
prId := chi.URLParam(r, "pull")
243
-
prIdInt, err := strconv.Atoi(prId)
245
-
http.Error(w, "bad pr id", http.StatusBadRequest)
246
-
log.Println("failed to parse pr id", err)
242
+
pull, ok := r.Context().Value("pull").(*db.Pull)
244
+
log.Println("failed to get pull")
245
+
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
250
-
patch := r.FormValue("patch")
252
-
s.pages.Notice(w, "pull-error", "Patch is required.")
249
+
if pull.OwnerDid != user.Did {
250
+
log.Println("failed to edit pull information")
251
+
s.pages.Notice(w, "pull-error", "Unauthorized")
256
-
// Get pull information before updating to get the atproto record URI
257
-
pull, _, err := db.GetPullWithComments(s.db, f.RepoAt, prIdInt)
255
+
f, err := fullyResolvedRepo(r)
259
-
log.Println("failed to get pull information", err)
257
+
log.Println("failed to get repo and knot", err)
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
···
// Update patch in the database within transaction
276
-
err = db.EditPatch(tx, f.RepoAt, prIdInt, patch)
274
+
err = db.EditPatch(tx, f.RepoAt, pull.PullId, patch)
log.Println("failed to update patch", err)
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
···
365
-
s.pages.HxLocation(w, fmt.Sprintf("/@%s/%s/pulls/%d", f.OwnerHandle(), f.RepoName, prIdInt))
363
+
s.pages.HxLocation(w, fmt.Sprintf("/@%s/%s/pulls/%d", f.OwnerHandle(), f.RepoName, pull.PullId))
···
492
-
prId := chi.URLParam(r, "pull")
493
-
prIdInt, err := strconv.Atoi(prId)
495
-
http.Error(w, "bad pr id", http.StatusBadRequest)
496
-
log.Println("failed to parse pr id", err)
500
-
pr, comments, err := db.GetPullWithComments(s.db, f.RepoAt, prIdInt)
502
-
log.Println("failed to get pr and comments", err)
503
-
s.pages.Notice(w, "pull", "Failed to load pull request. Try again later.")
490
+
pull, ok1 := r.Context().Value("pull").(*db.Pull)
491
+
comments, ok2 := r.Context().Value("pull_comments").([]db.PullComment)
493
+
log.Println("failed to get pull")
494
+
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
507
-
pullOwnerIdent, err := s.resolver.ResolveIdent(r.Context(), pr.OwnerDid)
509
-
log.Println("failed to resolve pull owner", err)
identsToResolve := make([]string, len(comments))
for i, comment := range comments {
identsToResolve[i] = comment.OwnerDid
502
+
identsToResolve = append(identsToResolve, pull.OwnerDid)
resolvedIds := s.resolver.ResolveIdents(r.Context(), identsToResolve)
didHandleMap := make(map[string]string)
for _, identity := range resolvedIds {
···
var mergeCheckResponse types.MergeCheckResponse
// Only perform merge check if the pull request is not already merged
529
-
if pr.State != db.PullMerged {
517
+
if pull.State != db.PullMerged {
secret, err := db.GetRegistrationKey(s.db, f.Knot)
log.Printf("failed to get registration key for %s", f.Knot)
···
ksClient, err := NewSignedClient(f.Knot, secret, s.config.Dev)
539
-
resp, err := ksClient.MergeCheck([]byte(pr.Patch), pr.OwnerDid, f.RepoName, pr.TargetBranch)
527
+
resp, err := ksClient.MergeCheck([]byte(pull.Patch), pull.OwnerDid, f.RepoName, pull.TargetBranch)
log.Println("failed to check for mergeability:", err)
···
s.pages.RepoSinglePull(w, pages.RepoSinglePullParams{
559
-
LoggedInUser: user,
560
-
RepoInfo: f.RepoInfo(s, user),
562
-
Comments: comments,
563
-
PullOwnerHandle: pullOwnerIdent.Handle.String(),
564
-
DidHandleMap: didHandleMap,
565
-
MergeCheck: mergeCheckResponse,
547
+
LoggedInUser: user,
548
+
RepoInfo: f.RepoInfo(s, user),
550
+
Comments: comments,
551
+
DidHandleMap: didHandleMap,
552
+
MergeCheck: mergeCheckResponse,
···
Description: f.Description,
1015
-
Roles: rolesInRepo(s, u, f),
1002
+
Roles: RolesInRepo(s, u, f),
···
1467
-
// Get the pull request ID from the request URL
1468
-
pullId := chi.URLParam(r, "pull")
1469
-
pullIdInt, err := strconv.Atoi(pullId)
1471
-
log.Println("failed to parse pull ID:", err)
1472
-
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
1454
+
pull, ok := r.Context().Value("pull").(*db.Pull)
1456
+
log.Println("failed to get pull")
1457
+
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
1476
-
// Get the patch data from the request body
1477
-
patch := r.FormValue("patch")
1478
-
branch := r.FormValue("targetBranch")
secret, err := db.GetRegistrationKey(s.db, f.Knot)
log.Printf("no registration key found for domain %s: %s\n", f.Knot, err)
···
// Merge the pull request
1495
-
resp, err := ksClient.Merge([]byte(patch), user.Did, f.RepoName, branch)
1476
+
resp, err := ksClient.Merge([]byte(pull.Patch), user.Did, f.RepoName, pull.TargetBranch)
log.Printf("failed to merge pull request: %s", err)
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
···
if resp.StatusCode == http.StatusOK {
1503
-
err := db.MergePull(s.db, f.RepoAt, pullIdInt)
1484
+
err := db.MergePull(s.db, f.RepoAt, pull.PullId)
log.Printf("failed to update pull request status in database: %s", err)
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
1509
-
s.pages.HxLocation(w, fmt.Sprintf("/@%s/%s/pulls/%d", f.OwnerHandle(), f.RepoName, pullIdInt))
1490
+
s.pages.HxLocation(w, fmt.Sprintf("/@%s/%s/pulls/%d", f.OwnerHandle(), f.RepoName, pull.PullId))
log.Printf("knotserver returned non-OK status code for merge: %d", resp.StatusCode)
s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
···
func (s *State) ClosePull(w http.ResponseWriter, r *http.Request) {
1593
+
user := s.auth.GetUser(r)
f, err := fullyResolvedRepo(r)
log.Println("malformed middleware")
1618
-
pullId := chi.URLParam(r, "pull")
1619
-
pullIdInt, err := strconv.Atoi(pullId)
1621
-
log.Println("malformed middleware")
1601
+
pull, ok := r.Context().Value("pull").(*db.Pull)
1603
+
log.Println("failed to get pull")
1604
+
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
1608
+
// auth filter: only owner or collaborators can close
1609
+
roles := RolesInRepo(s, user, f)
1610
+
isCollaborator := roles.IsCollaborator()
1611
+
isPullAuthor := user.Did == pull.OwnerDid
1612
+
isCloseAllowed := isCollaborator || isPullAuthor
1613
+
if !isCloseAllowed {
1614
+
log.Println("failed to close pull")
1615
+
s.pages.Notice(w, "pull-close", "You are unauthorized to close this pull.")
···
// Close the pull in the database
1634
-
err = db.ClosePull(tx, f.RepoAt, pullIdInt)
1628
+
err = db.ClosePull(tx, f.RepoAt, pull.PullId)
log.Println("failed to close pull", err)
s.pages.Notice(w, "pull-close", "Failed to close pull.")
···
1648
-
s.pages.HxLocation(w, fmt.Sprintf("/%s/pulls/%d", f.OwnerSlashRepo(), pullIdInt))
1642
+
s.pages.HxLocation(w, fmt.Sprintf("/%s/pulls/%d", f.OwnerSlashRepo(), pull.PullId))
func (s *State) ReopenPull(w http.ResponseWriter, r *http.Request) {
1647
+
user := s.auth.GetUser(r)
f, err := fullyResolvedRepo(r)
log.Println("failed to resolve repo", err)
···
1660
-
// Start a transaction
1661
-
tx, err := s.db.BeginTx(r.Context(), nil)
1663
-
log.Println("failed to start transaction", err)
1664
-
s.pages.Notice(w, "pull-reopen", "Failed to reopen pull.")
1656
+
pull, ok := r.Context().Value("pull").(*db.Pull)
1658
+
log.Println("failed to get pull")
1659
+
s.pages.Notice(w, "pull-error", "Failed to edit patch. Try again later.")
1668
-
pullId := chi.URLParam(r, "pull")
1669
-
pullIdInt, err := strconv.Atoi(pullId)
1663
+
// auth filter: only owner or collaborators can close
1664
+
roles := RolesInRepo(s, user, f)
1665
+
isCollaborator := roles.IsCollaborator()
1666
+
isPullAuthor := user.Did == pull.OwnerDid
1667
+
isCloseAllowed := isCollaborator || isPullAuthor
1668
+
if !isCloseAllowed {
1669
+
log.Println("failed to close pull")
1670
+
s.pages.Notice(w, "pull-close", "You are unauthorized to close this pull.")
1674
+
// Start a transaction
1675
+
tx, err := s.db.BeginTx(r.Context(), nil)
1671
-
log.Println("failed to parse pull id", err)
1677
+
log.Println("failed to start transaction", err)
s.pages.Notice(w, "pull-reopen", "Failed to reopen pull.")
// Reopen the pull in the database
1677
-
err = db.ReopenPull(tx, f.RepoAt, pullIdInt)
1683
+
err = db.ReopenPull(tx, f.RepoAt, pull.PullId)
log.Println("failed to reopen pull", err)
s.pages.Notice(w, "pull-reopen", "Failed to reopen pull.")
···
1691
-
s.pages.HxLocation(w, fmt.Sprintf("/%s/pulls/%d", f.OwnerSlashRepo(), pullIdInt))
1697
+
s.pages.HxLocation(w, fmt.Sprintf("/%s/pulls/%d", f.OwnerSlashRepo(), pull.PullId))
···
1734
-
func rolesInRepo(s *State, u *auth.User, f *FullyResolvedRepo) pages.RolesInRepo {
1740
+
func RolesInRepo(s *State, u *auth.User, f *FullyResolvedRepo) pages.RolesInRepo {
r := s.enforcer.GetPermissionsInRepo(u.Did, f.Knot, f.OwnerSlashRepo())
return pages.RolesInRepo{r}