From 146b2a5a3410f4564f7ba195bfa62356719e29ba Mon Sep 17 00:00:00 2001 From: Sven Krause Date: Mon, 3 Jan 2022 15:11:41 +0100 Subject: [PATCH] add listCategories at ProjectApi and RepositoryApi --- .../domain/category/CategoriesHolder.java | 12 +++++++ .../rest/domain/category/Category.java | 20 ++++++++++++ .../category/ProjectCategoriesPage.java | 26 +++++++++++++++ .../rest/domain/category/ProjectCategory.java | 21 ++++++++++++ .../rest/domain/category/ProjectHolder.java | 12 +++++++ .../category/RepositoryCategoriesPage.java | 26 +++++++++++++++ .../domain/category/RepositoryCategory.java | 32 +++++++++++++++++++ .../bitbucket/rest/features/ProjectApi.java | 9 ++++++ .../rest/features/RepositoryApi.java | 10 ++++++ .../rest/features/ProjectApiMockTest.java | 23 +++++++++++++ .../rest/features/RepositoryApiMockTest.java | 24 ++++++++++++++ src/test/resources/project-categories.json | 19 +++++++++++ src/test/resources/repository-categories.json | 22 +++++++++++++ 13 files changed, 256 insertions(+) create mode 100644 src/main/java/com/cdancy/bitbucket/rest/domain/category/CategoriesHolder.java create mode 100644 src/main/java/com/cdancy/bitbucket/rest/domain/category/Category.java create mode 100644 src/main/java/com/cdancy/bitbucket/rest/domain/category/ProjectCategoriesPage.java create mode 100644 src/main/java/com/cdancy/bitbucket/rest/domain/category/ProjectCategory.java create mode 100644 src/main/java/com/cdancy/bitbucket/rest/domain/category/ProjectHolder.java create mode 100644 src/main/java/com/cdancy/bitbucket/rest/domain/category/RepositoryCategoriesPage.java create mode 100644 src/main/java/com/cdancy/bitbucket/rest/domain/category/RepositoryCategory.java create mode 100644 src/test/resources/project-categories.json create mode 100644 src/test/resources/repository-categories.json diff --git a/src/main/java/com/cdancy/bitbucket/rest/domain/category/CategoriesHolder.java b/src/main/java/com/cdancy/bitbucket/rest/domain/category/CategoriesHolder.java new file mode 100644 index 00000000..6129624e --- /dev/null +++ b/src/main/java/com/cdancy/bitbucket/rest/domain/category/CategoriesHolder.java @@ -0,0 +1,12 @@ +package com.cdancy.bitbucket.rest.domain.category; + +import java.util.List; + +/** + * This interface should NOT be applied to "option" like classes and/or used in instances where this is applied to + * outgoing http traffic. This interface should ONLY be used for classes modeled after incoming http traffic. + */ +public interface CategoriesHolder { + + List categories(); +} diff --git a/src/main/java/com/cdancy/bitbucket/rest/domain/category/Category.java b/src/main/java/com/cdancy/bitbucket/rest/domain/category/Category.java new file mode 100644 index 00000000..0e02fe79 --- /dev/null +++ b/src/main/java/com/cdancy/bitbucket/rest/domain/category/Category.java @@ -0,0 +1,20 @@ +package com.cdancy.bitbucket.rest.domain.category; + +import org.jclouds.json.SerializedNames; + +import com.google.auto.value.AutoValue; + +@AutoValue +public abstract class Category { + + public abstract int id(); + public abstract String title(); + + Category() { + } + + @SerializedNames({"id", "title"}) + public static Category create(final int id, final String title) { + return new AutoValue_Category(id, title); + } +} diff --git a/src/main/java/com/cdancy/bitbucket/rest/domain/category/ProjectCategoriesPage.java b/src/main/java/com/cdancy/bitbucket/rest/domain/category/ProjectCategoriesPage.java new file mode 100644 index 00000000..895a6a42 --- /dev/null +++ b/src/main/java/com/cdancy/bitbucket/rest/domain/category/ProjectCategoriesPage.java @@ -0,0 +1,26 @@ +package com.cdancy.bitbucket.rest.domain.category; + +import org.jclouds.json.SerializedNames; + +import com.google.auto.value.AutoValue; + +@AutoValue +public abstract class ProjectCategoriesPage { + + /** + * will contain error messages, if the call fails. + */ + public abstract String message(); + + /** + * the categories assigned to the project + */ + public abstract ProjectCategory result(); + + ProjectCategoriesPage() {} + + @SerializedNames({"message", "result"}) + public static ProjectCategoriesPage create(final String message, final ProjectCategory result) { + return new AutoValue_ProjectCategoriesPage(message, result); + } +} diff --git a/src/main/java/com/cdancy/bitbucket/rest/domain/category/ProjectCategory.java b/src/main/java/com/cdancy/bitbucket/rest/domain/category/ProjectCategory.java new file mode 100644 index 00000000..a1eeb928 --- /dev/null +++ b/src/main/java/com/cdancy/bitbucket/rest/domain/category/ProjectCategory.java @@ -0,0 +1,21 @@ +package com.cdancy.bitbucket.rest.domain.category; + +import java.util.List; + +import org.jclouds.json.SerializedNames; + +import com.google.auto.value.AutoValue; + +@AutoValue +public abstract class ProjectCategory implements ProjectHolder, CategoriesHolder { + + ProjectCategory() {} + + @SerializedNames({"projectId", "projectKey", "projectName", "categories"}) + public static ProjectCategory create(final String projectId, + final String projectKey, + final String projectName, + final List categories) { + return new AutoValue_ProjectCategory(projectId, projectKey, projectName, categories); + } +} diff --git a/src/main/java/com/cdancy/bitbucket/rest/domain/category/ProjectHolder.java b/src/main/java/com/cdancy/bitbucket/rest/domain/category/ProjectHolder.java new file mode 100644 index 00000000..3b37902d --- /dev/null +++ b/src/main/java/com/cdancy/bitbucket/rest/domain/category/ProjectHolder.java @@ -0,0 +1,12 @@ +package com.cdancy.bitbucket.rest.domain.category; + +/** + * This interface should NOT be applied to "option" like classes and/or used in instances where this is applied to + * outgoing http traffic. This interface should ONLY be used for classes modeled after incoming http traffic. + */ +public interface ProjectHolder { + + String projectId(); + String projectKey(); + String projectName(); +} diff --git a/src/main/java/com/cdancy/bitbucket/rest/domain/category/RepositoryCategoriesPage.java b/src/main/java/com/cdancy/bitbucket/rest/domain/category/RepositoryCategoriesPage.java new file mode 100644 index 00000000..76a6930d --- /dev/null +++ b/src/main/java/com/cdancy/bitbucket/rest/domain/category/RepositoryCategoriesPage.java @@ -0,0 +1,26 @@ +package com.cdancy.bitbucket.rest.domain.category; + +import org.jclouds.json.SerializedNames; + +import com.google.auto.value.AutoValue; + +@AutoValue +public abstract class RepositoryCategoriesPage { + + /** + * will contain error messages, if the call fails. + */ + public abstract String message(); + + /** + * the categories assigned to the project/repository + */ + public abstract RepositoryCategory result(); + + RepositoryCategoriesPage() {} + + @SerializedNames({"message", "result"}) + public static RepositoryCategoriesPage create(final String message, final RepositoryCategory result) { + return new AutoValue_RepositoryCategoriesPage(message, result); + } +} diff --git a/src/main/java/com/cdancy/bitbucket/rest/domain/category/RepositoryCategory.java b/src/main/java/com/cdancy/bitbucket/rest/domain/category/RepositoryCategory.java new file mode 100644 index 00000000..e1a53c38 --- /dev/null +++ b/src/main/java/com/cdancy/bitbucket/rest/domain/category/RepositoryCategory.java @@ -0,0 +1,32 @@ +package com.cdancy.bitbucket.rest.domain.category; + +import java.util.List; + +import org.jclouds.json.SerializedNames; + +import com.google.auto.value.AutoValue; + +@AutoValue +public abstract class RepositoryCategory implements ProjectHolder, CategoriesHolder { + + public abstract String repositoryId(); + + public abstract String repositoryName(); + + public abstract String repositorySlug(); + + RepositoryCategory() {} + + @SerializedNames({ "projectId", "projectKey", "projectName", "categories", "repositoryId", "repositoryName", "repositorySlug" }) + public static RepositoryCategory create(final String projectId, + final String projectKey, + final String projectName, + final List categories, + final String repositoryId, + final String repositoryName, + final String repositorySlug) { + return new AutoValue_RepositoryCategory(projectId, projectKey, projectName, + categories, + repositoryId, repositoryName, repositorySlug); + } +} diff --git a/src/main/java/com/cdancy/bitbucket/rest/features/ProjectApi.java b/src/main/java/com/cdancy/bitbucket/rest/features/ProjectApi.java index 86954785..3dfd0a33 100644 --- a/src/main/java/com/cdancy/bitbucket/rest/features/ProjectApi.java +++ b/src/main/java/com/cdancy/bitbucket/rest/features/ProjectApi.java @@ -18,6 +18,7 @@ package com.cdancy.bitbucket.rest.features; import com.cdancy.bitbucket.rest.annotations.Documentation; +import com.cdancy.bitbucket.rest.domain.category.ProjectCategoriesPage; import com.cdancy.bitbucket.rest.domain.common.RequestStatus; import javax.inject.Named; import javax.ws.rs.Consumes; @@ -148,4 +149,12 @@ RequestStatus deletePermissionsByGroup(@PathParam("project") String project, ProjectPermissionsPage listPermissionsByGroup(@PathParam("project") String project, @Nullable @QueryParam("start") Integer start, @Nullable @QueryParam("limit") Integer limit); + + @Named("project:list-categories") + @Documentation({"https://communardo.atlassian.net/wiki/spaces/KB/pages/27687460/REST+API+for+Categories+for+Bitbucket"}) + @Consumes(MediaType.APPLICATION_JSON) + @Path("/categories/latest/project/{project}") + @Fallback(BitbucketFallbacks.ProjectPermissionsPageOnError.class) + @GET + ProjectCategoriesPage listCategories(@PathParam("project") String project); } diff --git a/src/main/java/com/cdancy/bitbucket/rest/features/RepositoryApi.java b/src/main/java/com/cdancy/bitbucket/rest/features/RepositoryApi.java index 1478bf1c..2e26745f 100644 --- a/src/main/java/com/cdancy/bitbucket/rest/features/RepositoryApi.java +++ b/src/main/java/com/cdancy/bitbucket/rest/features/RepositoryApi.java @@ -18,6 +18,7 @@ package com.cdancy.bitbucket.rest.features; import com.cdancy.bitbucket.rest.annotations.Documentation; +import com.cdancy.bitbucket.rest.domain.category.RepositoryCategoriesPage; import com.cdancy.bitbucket.rest.domain.common.RequestStatus; import com.cdancy.bitbucket.rest.domain.labels.LabelsPage; import com.cdancy.bitbucket.rest.domain.repository.PermissionsPage; @@ -206,6 +207,15 @@ PermissionsPage listPermissionsByGroup(@PathParam("project") String project, @Nullable @QueryParam("start") Integer start, @Nullable @QueryParam("limit") Integer limit); + @Named("repository:list-categories") + @Documentation({"https://communardo.atlassian.net/wiki/spaces/KB/pages/27687460/REST+API+for+Categories+for+Bitbucket"}) + @Consumes(MediaType.APPLICATION_JSON) + @Path("/categories/latest/project/{project}/repository/{repositorySlug}") + @Fallback(BitbucketFallbacks.RepositoryOnError.class) + @GET + RepositoryCategoriesPage listCategories(@PathParam("project") String project, + @PathParam("repositorySlug") String repoSlug); + @Named("repository:getLabels") @Documentation({"https://developer.atlassian.com/static/rest/bitbucket-server/latest/bitbucket-rest.html#idp273"}) @Consumes(MediaType.APPLICATION_JSON) diff --git a/src/test/java/com/cdancy/bitbucket/rest/features/ProjectApiMockTest.java b/src/test/java/com/cdancy/bitbucket/rest/features/ProjectApiMockTest.java index 1f25e1df..00dc8edd 100644 --- a/src/test/java/com/cdancy/bitbucket/rest/features/ProjectApiMockTest.java +++ b/src/test/java/com/cdancy/bitbucket/rest/features/ProjectApiMockTest.java @@ -21,6 +21,7 @@ import java.util.Map; +import com.cdancy.bitbucket.rest.domain.category.ProjectCategoriesPage; import com.cdancy.bitbucket.rest.domain.project.ProjectPermissionsPage; import org.testng.annotations.Test; @@ -516,4 +517,26 @@ public void testListPermissionByGroupOnError() throws Exception { server.shutdown(); } } + + public void testListCategories() throws Exception { + final MockWebServer server = mockWebServer(); + server.enqueue(new MockResponse().setBody(payloadFromResource("/project-categories.json")).setResponseCode(200)); + final BitbucketApi baseApi = api(server.getUrl("/")); + final ProjectApi api = baseApi.projectApi(); + try { + final ProjectCategoriesPage projectCategoriesPage = api.listCategories(projectKey); + assertThat(projectCategoriesPage).isNotNull(); + assertThat(projectCategoriesPage.result()).isNotNull(); + assertThat(projectCategoriesPage.result().categories()).hasSize(2); + assertThat(projectCategoriesPage.result().projectKey()).isEqualTo(projectKey); + assertThat(projectCategoriesPage.result().categories().get(0).title()).isEqualTo("cat1"); + assertThat(projectCategoriesPage.result().categories().get(1).title()).isEqualTo("cat2"); + assertSent(server, + getMethod, + "/rest/categories/latest/project/" + projectKey); + } finally { + baseApi.close(); + server.shutdown(); + } + } } diff --git a/src/test/java/com/cdancy/bitbucket/rest/features/RepositoryApiMockTest.java b/src/test/java/com/cdancy/bitbucket/rest/features/RepositoryApiMockTest.java index 61b7cc6b..e9941492 100644 --- a/src/test/java/com/cdancy/bitbucket/rest/features/RepositoryApiMockTest.java +++ b/src/test/java/com/cdancy/bitbucket/rest/features/RepositoryApiMockTest.java @@ -19,6 +19,7 @@ import com.cdancy.bitbucket.rest.BitbucketApi; import com.cdancy.bitbucket.rest.BitbucketApiMetadata; +import com.cdancy.bitbucket.rest.domain.category.RepositoryCategoriesPage; import com.cdancy.bitbucket.rest.domain.common.RequestStatus; import com.cdancy.bitbucket.rest.domain.labels.LabelsPage; import com.cdancy.bitbucket.rest.domain.repository.MergeConfig; @@ -860,4 +861,27 @@ public void testGetLabels() throws Exception { server.shutdown(); } } + + public void testListCategories() throws Exception { + final MockWebServer server = mockWebServer(); + server.enqueue(new MockResponse().setBody(payloadFromResource("/repository-categories.json")).setResponseCode(200)); + final BitbucketApi baseApi = api(server.getUrl("/")); + final RepositoryApi api = baseApi.repositoryApi(); + try { + final RepositoryCategoriesPage repositoryCategoriesPage = api.listCategories(projectKey, repoKey); + assertThat(repositoryCategoriesPage).isNotNull(); + assertThat(repositoryCategoriesPage.result()).isNotNull(); + assertThat(repositoryCategoriesPage.result().categories()).hasSize(2); + assertThat(repositoryCategoriesPage.result().projectKey()).isEqualTo(projectKey); + assertThat(repositoryCategoriesPage.result().repositorySlug()).isEqualTo(repoKey); + assertThat(repositoryCategoriesPage.result().categories().get(0).title()).isEqualTo("cat1"); + assertThat(repositoryCategoriesPage.result().categories().get(1).title()).isEqualTo("cat2"); + assertSent(server, + getMethod, + "/rest/categories/latest/project/" + projectKey + "/repository/" + repoKey); + } finally { + baseApi.close(); + server.shutdown(); + } + } } diff --git a/src/test/resources/project-categories.json b/src/test/resources/project-categories.json new file mode 100644 index 00000000..6dd361b7 --- /dev/null +++ b/src/test/resources/project-categories.json @@ -0,0 +1,19 @@ +{ + "message": "", + "result": { + "projectId": 1, + "projectKey": "PRJ", + "projectName": "ProjectName", + "publicRepository": false, + "categories": [ + { + "id": 1, + "title": "cat1" + }, + { + "id": 2, + "title": "cat2" + } + ] + } +} \ No newline at end of file diff --git a/src/test/resources/repository-categories.json b/src/test/resources/repository-categories.json new file mode 100644 index 00000000..d90cc82c --- /dev/null +++ b/src/test/resources/repository-categories.json @@ -0,0 +1,22 @@ +{ + "message": "", + "result": { + "repositoryId": 1, + "repositoryName": "repoName", + "repositorySlug": "my-repo", + "categories": [ + { + "id": 1, + "title": "cat1" + }, + { + "id": 2, + "title": "cat2" + } + ], + "projectId": 1, + "projectKey": "PRJ", + "projectName": "ProjectName", + "publicRepository": false + } +} \ No newline at end of file