Added DELETE/POST endpoint for watched projects
Added DELETE and POST endpoints for removing, adding and updating watched projects. This is an effort towards migrating to PolyGerrit UI. Change-Id: I6203af9ed0fd6448fc1395512bc3ffdca93c5c18
This commit is contained in:

committed by
Edwin Kempin

parent
e56cf3af23
commit
bed6d98869
@@ -1478,6 +1478,101 @@ The result is sorted by project name in ascending order.
|
|||||||
]
|
]
|
||||||
----
|
----
|
||||||
|
|
||||||
|
[[set-watched-projects]]
|
||||||
|
=== Add/Update a List of Watched Project Entities
|
||||||
|
--
|
||||||
|
'POST /accounts/link:#account-id[\{account-id\}]/watched.projects'
|
||||||
|
--
|
||||||
|
|
||||||
|
Add new projects to watch or update existing watched projects.
|
||||||
|
Projects that are already watched by a user will be updated with
|
||||||
|
the provided configuration. All other projects in the request
|
||||||
|
will be watched using the provided configuration. The posted body
|
||||||
|
can contain link:#project-watch-info[ProjectWatchInfo] entities.
|
||||||
|
Omitted boolean values will be set to false.
|
||||||
|
|
||||||
|
.Request
|
||||||
|
----
|
||||||
|
POST /a/accounts/self/watched.projects HTTP/1.0
|
||||||
|
Content-Type: application/json;charset=UTF-8
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"project": "Test Project 1",
|
||||||
|
"notify_new_changes": true,
|
||||||
|
"notify_new_patch_sets": true,
|
||||||
|
"notify_all_comments": true,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
----
|
||||||
|
|
||||||
|
As result the watched projects of the user are returned as a list of
|
||||||
|
link:#project-watch-info[ProjectWatchInfo] entities.
|
||||||
|
The result is sorted by project name in ascending order.
|
||||||
|
|
||||||
|
.Response
|
||||||
|
----
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Content-Disposition: attachment
|
||||||
|
Content-Type: application/json; charset=UTF-8
|
||||||
|
|
||||||
|
)]}'
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"project": "Test Project 1",
|
||||||
|
"notify_new_changes": true,
|
||||||
|
"notify_new_patch_sets": true,
|
||||||
|
"notify_all_comments": true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"project": "Test Project 2",
|
||||||
|
"notify_new_changes": true,
|
||||||
|
"notify_new_patch_sets": true,
|
||||||
|
"notify_all_comments": true,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
----
|
||||||
|
|
||||||
|
[[delete-watched-projects]]
|
||||||
|
=== Delete Watched Projects
|
||||||
|
--
|
||||||
|
'POST /accounts/link:#account-id[\{account-id\}]/watched.projects:delete'
|
||||||
|
--
|
||||||
|
|
||||||
|
Projects posted to this endpoint will no longer be watched. The posted body
|
||||||
|
can contain an array of project names as strings.
|
||||||
|
|
||||||
|
.Request
|
||||||
|
----
|
||||||
|
POST /a/accounts/self/watched.projects:delete HTTP/1.0
|
||||||
|
Content-Type: application/json;charset=UTF-8
|
||||||
|
|
||||||
|
[
|
||||||
|
"Test Project 1"
|
||||||
|
]
|
||||||
|
----
|
||||||
|
|
||||||
|
As result the watched projects of the user are returned as a list of
|
||||||
|
link:#project-watch-info[ProjectWatchInfo] entities.
|
||||||
|
The result is sorted by project name in ascending order.
|
||||||
|
|
||||||
|
.Response
|
||||||
|
----
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Content-Disposition: attachment
|
||||||
|
Content-Type: application/json; charset=UTF-8
|
||||||
|
|
||||||
|
)]}'
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"project": "Test Project 2",
|
||||||
|
"notify_new_changes": true,
|
||||||
|
"notify_new_patch_sets": true,
|
||||||
|
"notify_all_comments": true,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
----
|
||||||
|
|
||||||
[[get-starred-changes]]
|
[[get-starred-changes]]
|
||||||
=== Get Starred Changes
|
=== Get Starred Changes
|
||||||
--
|
--
|
||||||
|
@@ -0,0 +1,169 @@
|
|||||||
|
// 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.acceptance.rest.account;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.gerrit.acceptance.AbstractDaemonTest;
|
||||||
|
import com.google.gerrit.extensions.client.ProjectWatchInfo;
|
||||||
|
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class WatchedProjectsIT extends AbstractDaemonTest {
|
||||||
|
|
||||||
|
private static final String NEW_PROJECT_NAME = "newProjectAccess";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setAndGetWatchedProjects() throws Exception {
|
||||||
|
String projectName1 = createProject(NEW_PROJECT_NAME).get();
|
||||||
|
String projectName2 = createProject(NEW_PROJECT_NAME + "2").get();
|
||||||
|
|
||||||
|
List<ProjectWatchInfo> projectsToWatch = new ArrayList<>(2);
|
||||||
|
|
||||||
|
ProjectWatchInfo pwi = new ProjectWatchInfo();
|
||||||
|
pwi.project = projectName1;
|
||||||
|
pwi.notifyAbandonedChanges = true;
|
||||||
|
pwi.notifyNewChanges = true;
|
||||||
|
pwi.notifyAllComments = true;
|
||||||
|
projectsToWatch.add(pwi);
|
||||||
|
|
||||||
|
pwi = new ProjectWatchInfo();
|
||||||
|
pwi.project = projectName2;
|
||||||
|
pwi.filter = "branch:master";
|
||||||
|
pwi.notifySubmittedChanges = true;
|
||||||
|
pwi.notifyNewPatchSets = true;
|
||||||
|
projectsToWatch.add(pwi);
|
||||||
|
|
||||||
|
List<ProjectWatchInfo> persistedWatchedProjects =
|
||||||
|
gApi.accounts().self().setWatchedProjects(projectsToWatch);
|
||||||
|
assertThat(persistedWatchedProjects)
|
||||||
|
.containsAllIn(projectsToWatch).inOrder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setAndDeleteWatchedProjects() throws Exception {
|
||||||
|
String projectName1 = createProject(NEW_PROJECT_NAME).get();
|
||||||
|
String projectName2 = createProject(NEW_PROJECT_NAME + "2").get();
|
||||||
|
|
||||||
|
List<ProjectWatchInfo> projectsToWatch = new LinkedList<>();
|
||||||
|
|
||||||
|
ProjectWatchInfo pwi = new ProjectWatchInfo();
|
||||||
|
pwi.project = projectName1;
|
||||||
|
pwi.notifyAbandonedChanges = true;
|
||||||
|
pwi.notifyNewChanges = true;
|
||||||
|
pwi.notifyAllComments = true;
|
||||||
|
projectsToWatch.add(pwi);
|
||||||
|
|
||||||
|
pwi = new ProjectWatchInfo();
|
||||||
|
pwi.project = projectName2;
|
||||||
|
pwi.filter = "branch:master";
|
||||||
|
pwi.notifySubmittedChanges = true;
|
||||||
|
pwi.notifyNewPatchSets = true;
|
||||||
|
projectsToWatch.add(pwi);
|
||||||
|
|
||||||
|
// Persist watched projects
|
||||||
|
gApi.accounts().self().setWatchedProjects(projectsToWatch);
|
||||||
|
|
||||||
|
List<String> d = Lists.newArrayList(projectName2);
|
||||||
|
gApi.accounts().self().deleteWatchedProjects(d);
|
||||||
|
projectsToWatch.remove(pwi);
|
||||||
|
|
||||||
|
List<ProjectWatchInfo> persistedWatchedProjects =
|
||||||
|
gApi.accounts().self().getWatchedProjects();
|
||||||
|
|
||||||
|
assertThat(persistedWatchedProjects).doesNotContain(pwi);
|
||||||
|
assertThat(persistedWatchedProjects).containsAllIn(projectsToWatch);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void watchNonExistingProject() throws Exception {
|
||||||
|
String projectName = NEW_PROJECT_NAME + "3";
|
||||||
|
|
||||||
|
List<ProjectWatchInfo> projectsToWatch = new ArrayList<>(2);
|
||||||
|
|
||||||
|
ProjectWatchInfo pwi = new ProjectWatchInfo();
|
||||||
|
pwi.project = projectName;
|
||||||
|
pwi.notifyAbandonedChanges = true;
|
||||||
|
pwi.notifyNewChanges = true;
|
||||||
|
pwi.notifyAllComments = true;
|
||||||
|
projectsToWatch.add(pwi);
|
||||||
|
|
||||||
|
exception.expect(UnprocessableEntityException.class);
|
||||||
|
gApi.accounts().self().setWatchedProjects(projectsToWatch);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteNonExistingProject() throws Exception {
|
||||||
|
String projectName = project.get();
|
||||||
|
|
||||||
|
// Let another user watch a project
|
||||||
|
setApiUser(admin);
|
||||||
|
List<ProjectWatchInfo> projectsToWatch = new LinkedList<>();
|
||||||
|
|
||||||
|
ProjectWatchInfo pwi = new ProjectWatchInfo();
|
||||||
|
pwi.project = projectName;
|
||||||
|
pwi.notifyAbandonedChanges = true;
|
||||||
|
pwi.notifyNewChanges = true;
|
||||||
|
pwi.notifyAllComments = true;
|
||||||
|
projectsToWatch.add(pwi);
|
||||||
|
|
||||||
|
gApi.accounts().self().setWatchedProjects(projectsToWatch);
|
||||||
|
|
||||||
|
// Try to delete a watched project using a different user
|
||||||
|
List<String> d = Lists.newArrayList(projectName);
|
||||||
|
gApi.accounts().self().deleteWatchedProjects(d);
|
||||||
|
|
||||||
|
setApiUser(user);
|
||||||
|
exception.expect(UnprocessableEntityException.class);
|
||||||
|
gApi.accounts().self().deleteWatchedProjects(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void modifyProjectWatchUsingOmittedValues() throws Exception {
|
||||||
|
String projectName = project.get();
|
||||||
|
|
||||||
|
// Let another user watch a project
|
||||||
|
setApiUser(admin);
|
||||||
|
List<ProjectWatchInfo> projectsToWatch = new LinkedList<>();
|
||||||
|
|
||||||
|
ProjectWatchInfo pwi = new ProjectWatchInfo();
|
||||||
|
pwi.project = projectName;
|
||||||
|
pwi.notifyAbandonedChanges = true;
|
||||||
|
pwi.notifyNewChanges = true;
|
||||||
|
pwi.notifyAllComments = true;
|
||||||
|
projectsToWatch.add(pwi);
|
||||||
|
|
||||||
|
// Persist a defined state
|
||||||
|
gApi.accounts().self().setWatchedProjects(projectsToWatch);
|
||||||
|
|
||||||
|
// Omit previously set value - will set it to false on the server
|
||||||
|
// The response will not carry this field then as we omit sending
|
||||||
|
// false values in JSON
|
||||||
|
pwi.notifyNewChanges = null;
|
||||||
|
|
||||||
|
// Perform update
|
||||||
|
gApi.accounts().self().setWatchedProjects(projectsToWatch);
|
||||||
|
|
||||||
|
List<ProjectWatchInfo> watchedProjects =
|
||||||
|
gApi.accounts().self().getWatchedProjects();
|
||||||
|
|
||||||
|
assertThat(watchedProjects).containsAllIn(projectsToWatch);
|
||||||
|
}
|
||||||
|
}
|
@@ -45,6 +45,10 @@ public interface AccountApi {
|
|||||||
throws RestApiException;
|
throws RestApiException;
|
||||||
|
|
||||||
List<ProjectWatchInfo> getWatchedProjects() throws RestApiException;
|
List<ProjectWatchInfo> getWatchedProjects() throws RestApiException;
|
||||||
|
List<ProjectWatchInfo> setWatchedProjects(List<ProjectWatchInfo> in)
|
||||||
|
throws RestApiException;
|
||||||
|
void deleteWatchedProjects(List<String> in)
|
||||||
|
throws RestApiException;
|
||||||
|
|
||||||
void starChange(String id) throws RestApiException;
|
void starChange(String id) throws RestApiException;
|
||||||
void unstarChange(String id) throws RestApiException;
|
void unstarChange(String id) throws RestApiException;
|
||||||
@@ -113,6 +117,18 @@ public interface AccountApi {
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ProjectWatchInfo> setWatchedProjects(
|
||||||
|
List<ProjectWatchInfo> in) throws RestApiException {
|
||||||
|
throw new NotImplementedException();
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteWatchedProjects(List<String> in)
|
||||||
|
throws RestApiException {
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void starChange(String id) throws RestApiException {
|
public void starChange(String id) throws RestApiException {
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
|
@@ -14,6 +14,8 @@
|
|||||||
|
|
||||||
package com.google.gerrit.extensions.client;
|
package com.google.gerrit.extensions.client;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
public class ProjectWatchInfo {
|
public class ProjectWatchInfo {
|
||||||
public String project;
|
public String project;
|
||||||
public String filter;
|
public String filter;
|
||||||
@@ -23,4 +25,26 @@ public class ProjectWatchInfo {
|
|||||||
public Boolean notifyAllComments;
|
public Boolean notifyAllComments;
|
||||||
public Boolean notifySubmittedChanges;
|
public Boolean notifySubmittedChanges;
|
||||||
public Boolean notifyAbandonedChanges;
|
public Boolean notifyAbandonedChanges;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (obj instanceof ProjectWatchInfo) {
|
||||||
|
ProjectWatchInfo w = (ProjectWatchInfo) obj;
|
||||||
|
return Objects.equals(project, w.project)
|
||||||
|
&& Objects.equals(filter, w.filter)
|
||||||
|
&& Objects.equals(notifyNewChanges, w.notifyNewChanges)
|
||||||
|
&& Objects.equals(notifyNewPatchSets, w.notifyNewPatchSets)
|
||||||
|
&& Objects.equals(notifyAllComments, w.notifyAllComments)
|
||||||
|
&& Objects.equals(notifySubmittedChanges, w.notifySubmittedChanges)
|
||||||
|
&& Objects.equals(notifyAbandonedChanges, w.notifyAbandonedChanges);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects
|
||||||
|
.hash(project, filter, notifyNewChanges, notifyNewPatchSets,
|
||||||
|
notifyAllComments, notifySubmittedChanges, notifyAbandonedChanges);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,77 @@
|
|||||||
|
// 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.account;
|
||||||
|
|
||||||
|
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.AccountProjectWatch;
|
||||||
|
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||||
|
import com.google.gerrit.server.IdentifiedUser;
|
||||||
|
import com.google.gwtorm.server.OrmException;
|
||||||
|
import com.google.gwtorm.server.ResultSet;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import com.google.inject.Provider;
|
||||||
|
import com.google.inject.Singleton;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
public class DeleteWatchedProjects
|
||||||
|
implements RestModifyView<AccountResource, List<String>> {
|
||||||
|
|
||||||
|
private final Provider<ReviewDb> dbProvider;
|
||||||
|
private final Provider<IdentifiedUser> self;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
DeleteWatchedProjects(Provider<ReviewDb> dbProvider,
|
||||||
|
Provider<IdentifiedUser> self) {
|
||||||
|
this.dbProvider = dbProvider;
|
||||||
|
this.self = self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Response<?> apply(
|
||||||
|
AccountResource rsrc, List<String> input)
|
||||||
|
throws UnprocessableEntityException, OrmException, AuthException {
|
||||||
|
if (self.get() != rsrc.getUser()) {
|
||||||
|
throw new AuthException("It is not allowed to edit project watches "
|
||||||
|
+ "of other users");
|
||||||
|
}
|
||||||
|
ResultSet<AccountProjectWatch> watchedProjects =
|
||||||
|
dbProvider.get().accountProjectWatches()
|
||||||
|
.byAccount(rsrc.getUser().getAccountId());
|
||||||
|
HashMap<String, AccountProjectWatch> watchedProjectsMap = new HashMap<>();
|
||||||
|
for (AccountProjectWatch watchedProject : watchedProjects) {
|
||||||
|
watchedProjectsMap
|
||||||
|
.put(watchedProject.getProjectNameKey().get(), watchedProject);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input != null) {
|
||||||
|
List<AccountProjectWatch.Key> keysToDelete = new LinkedList<>();
|
||||||
|
for (String projectKeyToDelete : input) {
|
||||||
|
if (!watchedProjectsMap.containsKey(projectKeyToDelete))
|
||||||
|
throw new UnprocessableEntityException(projectKeyToDelete
|
||||||
|
+ " is not currently watched by this user.");
|
||||||
|
keysToDelete.add(watchedProjectsMap.get(projectKeyToDelete).getKey());
|
||||||
|
}
|
||||||
|
dbProvider.get().accountProjectWatches().deleteKeys(keysToDelete);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response.none();
|
||||||
|
}
|
||||||
|
}
|
@@ -57,6 +57,9 @@ public class Module extends RestApiModule {
|
|||||||
child(ACCOUNT_KIND, "sshkeys").to(SshKeys.class);
|
child(ACCOUNT_KIND, "sshkeys").to(SshKeys.class);
|
||||||
post(ACCOUNT_KIND, "sshkeys").to(AddSshKey.class);
|
post(ACCOUNT_KIND, "sshkeys").to(AddSshKey.class);
|
||||||
get(ACCOUNT_KIND, "watched.projects").to(GetWatchedProjects.class);
|
get(ACCOUNT_KIND, "watched.projects").to(GetWatchedProjects.class);
|
||||||
|
post(ACCOUNT_KIND, "watched.projects").to(PostWatchedProjects.class);
|
||||||
|
post(ACCOUNT_KIND, "watched.projects:delete")
|
||||||
|
.to(DeleteWatchedProjects.class);
|
||||||
|
|
||||||
get(SSH_KEY_KIND).to(GetSshKey.class);
|
get(SSH_KEY_KIND).to(GetSshKey.class);
|
||||||
delete(SSH_KEY_KIND).to(DeleteSshKey.class);
|
delete(SSH_KEY_KIND).to(DeleteSshKey.class);
|
||||||
|
@@ -0,0 +1,102 @@
|
|||||||
|
// 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.account;
|
||||||
|
|
||||||
|
import com.google.gerrit.extensions.client.ProjectWatchInfo;
|
||||||
|
import com.google.gerrit.extensions.restapi.AuthException;
|
||||||
|
import com.google.gerrit.extensions.restapi.BadRequestException;
|
||||||
|
import com.google.gerrit.extensions.restapi.RestApiException;
|
||||||
|
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.AccountProjectWatch;
|
||||||
|
import com.google.gerrit.reviewdb.client.Project;
|
||||||
|
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||||
|
import com.google.gerrit.server.IdentifiedUser;
|
||||||
|
import com.google.gerrit.server.project.ProjectsCollection;
|
||||||
|
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.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
public class PostWatchedProjects
|
||||||
|
implements RestModifyView<AccountResource, List<ProjectWatchInfo>> {
|
||||||
|
private final Provider<IdentifiedUser> self;
|
||||||
|
private GetWatchedProjects getWatchedProjects;
|
||||||
|
private Provider<ReviewDb> dbProvider;
|
||||||
|
private ProjectsCollection projectsCollection;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public PostWatchedProjects(GetWatchedProjects getWatchedProjects,
|
||||||
|
Provider<ReviewDb> dbProvider,
|
||||||
|
ProjectsCollection projectsCollection,
|
||||||
|
Provider<IdentifiedUser> self) {
|
||||||
|
this.getWatchedProjects = getWatchedProjects;
|
||||||
|
this.dbProvider = dbProvider;
|
||||||
|
this.projectsCollection = projectsCollection;
|
||||||
|
this.self = self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ProjectWatchInfo> apply(AccountResource rsrc,
|
||||||
|
List<ProjectWatchInfo> input)
|
||||||
|
throws OrmException, RestApiException, IOException {
|
||||||
|
if (self.get() != rsrc.getUser()) {
|
||||||
|
throw new AuthException("not allowed to edit project watches");
|
||||||
|
}
|
||||||
|
List<AccountProjectWatch> accountProjectWatchList =
|
||||||
|
getAccountProjectWatchList(input, rsrc.getUser().getAccountId());
|
||||||
|
dbProvider.get().accountProjectWatches().upsert(accountProjectWatchList);
|
||||||
|
return getWatchedProjects.apply(rsrc);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<AccountProjectWatch> getAccountProjectWatchList(
|
||||||
|
List<ProjectWatchInfo> input, Account.Id accountId)
|
||||||
|
throws UnprocessableEntityException, BadRequestException, IOException {
|
||||||
|
List<AccountProjectWatch> watchedProjects = new LinkedList<>();
|
||||||
|
for (ProjectWatchInfo a : input) {
|
||||||
|
if (a.project == null) {
|
||||||
|
throw new BadRequestException("project name must be specified");
|
||||||
|
}
|
||||||
|
|
||||||
|
Project.NameKey projectKey =
|
||||||
|
projectsCollection.parse(a.project).getNameKey();
|
||||||
|
|
||||||
|
AccountProjectWatch.Key key =
|
||||||
|
new AccountProjectWatch.Key(accountId, projectKey, a.filter);
|
||||||
|
AccountProjectWatch apw = new AccountProjectWatch(key);
|
||||||
|
apw.setNotify(AccountProjectWatch.NotifyType.ABANDONED_CHANGES,
|
||||||
|
toBoolean(a.notifyAbandonedChanges));
|
||||||
|
apw.setNotify(AccountProjectWatch.NotifyType.ALL_COMMENTS,
|
||||||
|
toBoolean(a.notifyAllComments));
|
||||||
|
apw.setNotify(AccountProjectWatch.NotifyType.NEW_CHANGES,
|
||||||
|
toBoolean(a.notifyNewChanges));
|
||||||
|
apw.setNotify(AccountProjectWatch.NotifyType.NEW_PATCHSETS,
|
||||||
|
toBoolean(a.notifyNewPatchSets));
|
||||||
|
apw.setNotify(AccountProjectWatch.NotifyType.SUBMITTED_CHANGES,
|
||||||
|
toBoolean(a.notifySubmittedChanges));
|
||||||
|
watchedProjects.add(apw);
|
||||||
|
}
|
||||||
|
return watchedProjects;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean toBoolean(Boolean b) {
|
||||||
|
return b == null ? false : b;
|
||||||
|
}
|
||||||
|
}
|
@@ -41,10 +41,12 @@ import com.google.gerrit.server.account.GetEditPreferences;
|
|||||||
import com.google.gerrit.server.account.GetPreferences;
|
import com.google.gerrit.server.account.GetPreferences;
|
||||||
import com.google.gerrit.server.account.GetSshKeys;
|
import com.google.gerrit.server.account.GetSshKeys;
|
||||||
import com.google.gerrit.server.account.GetWatchedProjects;
|
import com.google.gerrit.server.account.GetWatchedProjects;
|
||||||
|
import com.google.gerrit.server.account.DeleteWatchedProjects;
|
||||||
import com.google.gerrit.server.account.SetDiffPreferences;
|
import com.google.gerrit.server.account.SetDiffPreferences;
|
||||||
import com.google.gerrit.server.account.SetEditPreferences;
|
import com.google.gerrit.server.account.SetEditPreferences;
|
||||||
import com.google.gerrit.server.account.SetPreferences;
|
import com.google.gerrit.server.account.SetPreferences;
|
||||||
import com.google.gerrit.server.account.SshKeys;
|
import com.google.gerrit.server.account.SshKeys;
|
||||||
|
import com.google.gerrit.server.account.PostWatchedProjects;
|
||||||
import com.google.gerrit.server.account.StarredChanges;
|
import com.google.gerrit.server.account.StarredChanges;
|
||||||
import com.google.gerrit.server.change.ChangeResource;
|
import com.google.gerrit.server.change.ChangeResource;
|
||||||
import com.google.gerrit.server.change.ChangesCollection;
|
import com.google.gerrit.server.change.ChangesCollection;
|
||||||
@@ -74,6 +76,8 @@ public class AccountApiImpl implements AccountApi {
|
|||||||
private final GetEditPreferences getEditPreferences;
|
private final GetEditPreferences getEditPreferences;
|
||||||
private final SetEditPreferences setEditPreferences;
|
private final SetEditPreferences setEditPreferences;
|
||||||
private final GetWatchedProjects getWatchedProjects;
|
private final GetWatchedProjects getWatchedProjects;
|
||||||
|
private final PostWatchedProjects postWatchedProjects;
|
||||||
|
private final DeleteWatchedProjects deleteWatchedProjects;
|
||||||
private final StarredChanges.Create starredChangesCreate;
|
private final StarredChanges.Create starredChangesCreate;
|
||||||
private final StarredChanges.Delete starredChangesDelete;
|
private final StarredChanges.Delete starredChangesDelete;
|
||||||
private final CreateEmail.Factory createEmailFactory;
|
private final CreateEmail.Factory createEmailFactory;
|
||||||
@@ -94,6 +98,8 @@ public class AccountApiImpl implements AccountApi {
|
|||||||
GetEditPreferences getEditPreferences,
|
GetEditPreferences getEditPreferences,
|
||||||
SetEditPreferences setEditPreferences,
|
SetEditPreferences setEditPreferences,
|
||||||
GetWatchedProjects getWatchedProjects,
|
GetWatchedProjects getWatchedProjects,
|
||||||
|
PostWatchedProjects postWatchedProjects,
|
||||||
|
DeleteWatchedProjects deleteWatchedProjects,
|
||||||
StarredChanges.Create starredChangesCreate,
|
StarredChanges.Create starredChangesCreate,
|
||||||
StarredChanges.Delete starredChangesDelete,
|
StarredChanges.Delete starredChangesDelete,
|
||||||
CreateEmail.Factory createEmailFactory,
|
CreateEmail.Factory createEmailFactory,
|
||||||
@@ -114,6 +120,8 @@ public class AccountApiImpl implements AccountApi {
|
|||||||
this.getEditPreferences = getEditPreferences;
|
this.getEditPreferences = getEditPreferences;
|
||||||
this.setEditPreferences = setEditPreferences;
|
this.setEditPreferences = setEditPreferences;
|
||||||
this.getWatchedProjects = getWatchedProjects;
|
this.getWatchedProjects = getWatchedProjects;
|
||||||
|
this.postWatchedProjects = postWatchedProjects;
|
||||||
|
this.deleteWatchedProjects = deleteWatchedProjects;
|
||||||
this.starredChangesCreate = starredChangesCreate;
|
this.starredChangesCreate = starredChangesCreate;
|
||||||
this.starredChangesDelete = starredChangesDelete;
|
this.starredChangesDelete = starredChangesDelete;
|
||||||
this.createEmailFactory = createEmailFactory;
|
this.createEmailFactory = createEmailFactory;
|
||||||
@@ -205,6 +213,26 @@ public class AccountApiImpl implements AccountApi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ProjectWatchInfo> setWatchedProjects(
|
||||||
|
List<ProjectWatchInfo> in) throws RestApiException {
|
||||||
|
try {
|
||||||
|
return postWatchedProjects.apply(account, in);
|
||||||
|
} catch (OrmException | IOException e) {
|
||||||
|
throw new RestApiException("Cannot update watched projects", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteWatchedProjects(List<String> in)
|
||||||
|
throws RestApiException {
|
||||||
|
try {
|
||||||
|
deleteWatchedProjects.apply(account, in);
|
||||||
|
} catch (OrmException e) {
|
||||||
|
throw new RestApiException("Cannot delete watched projects", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void starChange(String id) throws RestApiException {
|
public void starChange(String id) throws RestApiException {
|
||||||
try {
|
try {
|
||||||
|
Reference in New Issue
Block a user