Extract code to change inactive flag into its own class

This will allow to reuse the logic to activate/deactivate account
without calling the REST endpoints which do extra validation.

Change-Id: I8f376942454522c17b1251c8f8cf76b07176a91e
This commit is contained in:
Owen Li
2017-06-14 10:04:00 -04:00
committed by Hugo Arès
parent fdbfe277e4
commit d52e1c7e28
3 changed files with 98 additions and 61 deletions

View File

@@ -17,12 +17,9 @@ package com.google.gerrit.server.account;
import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.extensions.annotations.RequiresCapability;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.DeleteActive.Input;
import com.google.gwtorm.server.OrmException;
@@ -30,7 +27,6 @@ import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.jgit.errors.ConfigInvalidException;
@RequiresCapability(GlobalCapability.MODIFY_ACCOUNT)
@@ -38,17 +34,12 @@ import org.eclipse.jgit.errors.ConfigInvalidException;
public class DeleteActive implements RestModifyView<AccountResource, Input> {
public static class Input {}
private final Provider<ReviewDb> dbProvider;
private final AccountsUpdate.Server accountsUpdate;
private final Provider<IdentifiedUser> self;
private final SetInactiveFlag setInactiveFlag;
@Inject
DeleteActive(
Provider<ReviewDb> dbProvider,
AccountsUpdate.Server accountsUpdate,
Provider<IdentifiedUser> self) {
this.dbProvider = dbProvider;
this.accountsUpdate = accountsUpdate;
DeleteActive(SetInactiveFlag setInactiveFlag, Provider<IdentifiedUser> self) {
this.setInactiveFlag = setInactiveFlag;
this.self = self;
}
@@ -58,27 +49,6 @@ public class DeleteActive implements RestModifyView<AccountResource, Input> {
if (self.get() == rsrc.getUser()) {
throw new ResourceConflictException("cannot deactivate own account");
}
AtomicBoolean alreadyInactive = new AtomicBoolean(false);
Account account =
accountsUpdate
.create()
.update(
dbProvider.get(),
rsrc.getUser().getAccountId(),
a -> {
if (!a.isActive()) {
alreadyInactive.set(true);
} else {
a.setActive(false);
}
});
if (account == null) {
throw new ResourceNotFoundException("account not found");
}
if (alreadyInactive.get()) {
throw new ResourceConflictException("account not active");
}
return Response.none();
return setInactiveFlag.deactivate(rsrc.getUser());
}
}

View File

@@ -19,15 +19,11 @@ import com.google.gerrit.extensions.annotations.RequiresCapability;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.account.PutActive.Input;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.jgit.errors.ConfigInvalidException;
@RequiresCapability(GlobalCapability.MODIFY_ACCOUNT)
@@ -35,35 +31,16 @@ import org.eclipse.jgit.errors.ConfigInvalidException;
public class PutActive implements RestModifyView<AccountResource, Input> {
public static class Input {}
private final Provider<ReviewDb> dbProvider;
private final AccountsUpdate.Server accountsUpdate;
private final SetInactiveFlag setInactiveFlag;
@Inject
PutActive(Provider<ReviewDb> dbProvider, AccountsUpdate.Server accountsUpdate) {
this.dbProvider = dbProvider;
this.accountsUpdate = accountsUpdate;
PutActive(SetInactiveFlag setInactiveFlag) {
this.setInactiveFlag = setInactiveFlag;
}
@Override
public Response<String> apply(AccountResource rsrc, Input input)
throws ResourceNotFoundException, OrmException, IOException, ConfigInvalidException {
AtomicBoolean alreadyActive = new AtomicBoolean(false);
Account account =
accountsUpdate
.create()
.update(
dbProvider.get(),
rsrc.getUser().getAccountId(),
a -> {
if (a.isActive()) {
alreadyActive.set(true);
} else {
a.setActive(true);
}
});
if (account == null) {
throw new ResourceNotFoundException("account not found");
}
return alreadyActive.get() ? Response.ok("") : Response.created("");
return setInactiveFlag.activate(rsrc.getUser());
}
}

View File

@@ -0,0 +1,90 @@
// Copyright (C) 2017 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.account;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.jgit.errors.ConfigInvalidException;
@Singleton
public class SetInactiveFlag {
private final Provider<ReviewDb> dbProvider;
private final AccountsUpdate.Server accountsUpdate;
@Inject
SetInactiveFlag(Provider<ReviewDb> dbProvider, AccountsUpdate.Server accountsUpdate) {
this.dbProvider = dbProvider;
this.accountsUpdate = accountsUpdate;
}
public Response<?> deactivate(IdentifiedUser user)
throws RestApiException, OrmException, IOException, ConfigInvalidException {
AtomicBoolean alreadyInactive = new AtomicBoolean(false);
Account account =
accountsUpdate
.create()
.update(
dbProvider.get(),
user.getAccountId(),
a -> {
if (!a.isActive()) {
alreadyInactive.set(true);
} else {
a.setActive(false);
}
});
if (account == null) {
throw new ResourceNotFoundException("account not found");
}
if (alreadyInactive.get()) {
throw new ResourceConflictException("account not active");
}
return Response.none();
}
public Response<String> activate(IdentifiedUser user)
throws ResourceNotFoundException, OrmException, IOException, ConfigInvalidException {
AtomicBoolean alreadyActive = new AtomicBoolean(false);
Account account =
accountsUpdate
.create()
.update(
dbProvider.get(),
user.getAccountId(),
a -> {
if (a.isActive()) {
alreadyActive.set(true);
} else {
a.setActive(true);
}
});
if (account == null) {
throw new ResourceNotFoundException("account not found");
}
return alreadyActive.get() ? Response.ok("") : Response.created("");
}
}