Remove group members in separate RPCs

Some web servers don't like a request body during a DELETE
method. Work around this by sending each member deletion as
its own DELETE request.

Change-Id: I67404e06ef6f87d5f96ead1c39ef1ed470ece86c
This commit is contained in:
Shawn Pearce
2013-01-19 00:39:32 -08:00
parent 290ce9b82f
commit 6a80fb67ac
2 changed files with 31 additions and 10 deletions

View File

@@ -19,4 +19,8 @@ import com.google.gwt.core.client.JavaScriptObject;
public final class VoidResult extends JavaScriptObject { public final class VoidResult extends JavaScriptObject {
protected VoidResult() { protected VoidResult() {
} }
public static VoidResult create() {
return createObject().cast();
}
} }

View File

@@ -67,17 +67,34 @@ public class GroupApi {
/** Remove members from a group. */ /** Remove members from a group. */
public static void removeMembers(AccountGroup.UUID groupUUID, public static void removeMembers(AccountGroup.UUID groupUUID,
Set<Account.Id> ids, AsyncCallback<VoidResult> cb) { Set<Account.Id> ids, final AsyncCallback<VoidResult> cb) {
if (ids.size() == 1) { final int cnt = ids.size();
Account.Id u = ids.iterator().next(); if (cnt == 0) {
new RestApi(membersBase(groupUUID) + "/" + u).delete(cb); cb.onSuccess(VoidResult.create());
} else { return;
RestApi call = new RestApi(membersBase(groupUUID)); }
MemberInput input = MemberInput.create();
for (Account.Id id : ids) { final AsyncCallback<VoidResult> state = new AsyncCallback<VoidResult>() {
input.add_member(id.toString()); private int remaining = cnt;
private boolean error;
@Override
public void onSuccess(VoidResult result) {
if (--remaining == 0 && !error) {
cb.onSuccess(result);
}
} }
call.data(input).delete(cb);
@Override
public void onFailure(Throwable caught) {
if (!error) {
error = true;
cb.onFailure(caught);
}
}
};
for (Account.Id u : ids) {
new RestApi(membersBase(groupUUID) + "/" + u).delete(state);
} }
} }