
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>
86 lines
3.3 KiB
Java
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();
|
|
}
|
|
}
|