From 89afdf7832b6b00288b2904c28c372dc08e4965a Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Mon, 26 Nov 2012 14:28:00 -0800 Subject: [PATCH] Support removing a reviewer via REST API curl -X DELETE \ http://localhost/changes/test~master~I2933f24c.../reviewers/1000000 Change-Id: I98057ceb7590642a3e5bbcd3c4b17ebef6364eab --- .../gerrit/server/change/DeleteReviewer.java | 88 +++++++++++++++++++ .../google/gerrit/server/change/Module.java | 1 + 2 files changed, 89 insertions(+) create mode 100644 gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java new file mode 100644 index 0000000000..c58f78d89d --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java @@ -0,0 +1,88 @@ +// Copyright (C) 2012 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.server.change; + +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.gerrit.extensions.restapi.AuthException; +import com.google.gerrit.extensions.restapi.ResourceNotFoundException; +import com.google.gerrit.extensions.restapi.RestModifyView; +import com.google.gerrit.reviewdb.client.Change; +import com.google.gerrit.reviewdb.client.PatchSetApproval; +import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.change.DeleteReviewer.Input; +import com.google.gerrit.server.project.ChangeControl; +import com.google.gwtorm.server.OrmException; +import com.google.inject.Inject; +import com.google.inject.Provider; + +import java.util.List; + +class DeleteReviewer implements RestModifyView { + static class Input { + } + + private final Provider dbProvider; + + @Inject + DeleteReviewer(Provider dbProvider) { + this.dbProvider = dbProvider; + } + + @Override + public Class inputType() { + return Input.class; + } + + @Override + public Object apply(ReviewerResource rsrc, Input input) + throws AuthException, ResourceNotFoundException, OrmException { + ChangeControl control = rsrc.getControl(); + Change.Id changeId = rsrc.getChange().getId(); + ReviewDb db = dbProvider.get(); + db.changes().beginTransaction(changeId); + try { + List del = Lists.newArrayList(); + for (PatchSetApproval a : approvals(db, rsrc)) { + if (control.canRemoveReviewer(a)) { + del.add(a); + } else { + throw new AuthException("delete not permitted"); + } + } + if (del.isEmpty()) { + throw new ResourceNotFoundException(); + } + db.patchSetApprovals().delete(del); + db.commit(); + } finally { + db.rollback(); + } + return new Object(); + } + + private Iterable approvals(ReviewDb db, + final ReviewerResource rsrc) throws OrmException { + return Iterables.filter( + db.patchSetApprovals().byChange(rsrc.getChange().getId()), + new Predicate() { + @Override + public boolean apply(PatchSetApproval input) { + return input.getAccountId().equals(rsrc.getAccount().getId()); + } + }); + } +} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java index c03a0e4fbd..deb2253e0a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java @@ -45,6 +45,7 @@ public class Module extends RestApiModule { post(CHANGE_KIND, "revert").to(Revert.class); get(REVIEWER_KIND).to(GetReviewer.class); + delete(REVIEWER_KIND).to(DeleteReviewer.class); child(CHANGE_KIND, "revisions").to(Revisions.class); post(REVISION_KIND, "review").to(PostReview.class);