Files
gerrit/java/com/google/gerrit/server/restapi/account/DeleteWatchedProjects.java
Edwin Kempin 1df95271ad Allow to update accounts and project watches atomically
AccountsUpdate now also supports to update project watches. This means
account properties and project watches can now be updated in the same
transaction.

WatchConfig.Accessor is removed so that project watch updates can only
be done through AccountsUpdate. For reading project watches a new
method is added to Accounts. In the future we would rather like to
change the Accounts#get(Account.Id) method to return AccountState
instead of Account so that this get method can be used to retrieve the
account as well as the project watches. Once this is done the
getProjectWatches method will be removed again.

Reading and writing project watches is now done via AccountConfig. On
load we always read the watch.config file, but parsing it is done
lazily when the project watches are accessed for the first time. Most
callers that load accounts are not interested in project watches and
this avoids unneeded parsing effort for them.

Change-Id: I8cd441eee3f65817a3653610c5d3bb62b0bfea5e
Signed-off-by: Edwin Kempin <ekempin@google.com>
2018-01-09 09:29:31 +01:00

86 lines
3.3 KiB
Java

// Copyright (C) 2016 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.restapi.account;
import static java.util.stream.Collectors.toList;
import com.google.gerrit.extensions.client.ProjectWatchInfo;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountResource;
import com.google.gerrit.server.account.AccountsUpdate;
import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
import com.google.gerrit.server.permissions.GlobalPermission;
import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.gerrit.server.permissions.PermissionBackendException;
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.List;
import java.util.Objects;
import org.eclipse.jgit.errors.ConfigInvalidException;
@Singleton
public class DeleteWatchedProjects
implements RestModifyView<AccountResource, List<ProjectWatchInfo>> {
private final Provider<IdentifiedUser> self;
private final PermissionBackend permissionBackend;
private final AccountsUpdate.User accountsUpdate;
@Inject
DeleteWatchedProjects(
Provider<IdentifiedUser> self,
PermissionBackend permissionBackend,
AccountsUpdate.User accountsUpdate) {
this.self = self;
this.permissionBackend = permissionBackend;
this.accountsUpdate = accountsUpdate;
}
@Override
public Response<?> apply(AccountResource rsrc, List<ProjectWatchInfo> input)
throws AuthException, UnprocessableEntityException, OrmException, IOException,
ConfigInvalidException, PermissionBackendException {
if (self.get() != rsrc.getUser()) {
permissionBackend.user(self).check(GlobalPermission.ADMINISTRATE_SERVER);
}
if (input == null) {
return Response.none();
}
Account.Id accountId = rsrc.getUser().getAccountId();
accountsUpdate
.create()
.update(
"Delete Project Watches via API",
accountId,
u ->
u.deleteProjectWatches(
input
.stream()
.filter(Objects::nonNull)
.map(w -> ProjectWatchKey.create(new Project.NameKey(w.project), w.filter))
.collect(toList())));
return Response.none();
}
}