diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexDtoGenerator.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexDtoGenerator.java index b7a7415853..b0e39c197a 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexDtoGenerator.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexDtoGenerator.java @@ -1,6 +1,5 @@ package sonia.scm.api.v2.resources; -import de.otto.edison.hal.Link; import de.otto.edison.hal.Links; import org.apache.shiro.SecurityUtils; import sonia.scm.config.ConfigurationPermissions; @@ -9,6 +8,8 @@ import sonia.scm.user.UserPermissions; import javax.inject.Inject; +import static de.otto.edison.hal.Link.link; + public class IndexDtoGenerator { private final ResourceLinks resourceLinks; @@ -20,25 +21,27 @@ public class IndexDtoGenerator { public IndexDto generate() { Links.Builder builder = Links.linkingTo(); + builder.self(resourceLinks.index().self()); + builder.single(link("uiPlugins", resourceLinks.uiPluginCollection().self())); if (SecurityUtils.getSubject().isAuthenticated()) { builder.single( - Link.link("me", resourceLinks.me().self()), - Link.link("logout", resourceLinks.authentication().logout()) + link("me", resourceLinks.me().self()), + link("logout", resourceLinks.authentication().logout()) ); if (UserPermissions.list().isPermitted()) { - builder.single(Link.link("users", resourceLinks.userCollection().self())); + builder.single(link("users", resourceLinks.userCollection().self())); } if (GroupPermissions.list().isPermitted()) { - builder.single(Link.link("groups", resourceLinks.groupCollection().self())); + builder.single(link("groups", resourceLinks.groupCollection().self())); } if (ConfigurationPermissions.list().isPermitted()) { - builder.single(Link.link("config", resourceLinks.config().self())); + builder.single(link("config", resourceLinks.config().self())); } - builder.single(Link.link("repositories", resourceLinks.repositoryCollection().self())); + builder.single(link("repositories", resourceLinks.repositoryCollection().self())); } else { builder.single( - Link.link("formLogin", resourceLinks.authentication().formLogin()), - Link.link("jsonLogin", resourceLinks.authentication().jsonLogin()) + link("formLogin", resourceLinks.authentication().formLogin()), + link("jsonLogin", resourceLinks.authentication().jsonLogin()) ); } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexResource.java index f9aa568251..088558c7dc 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexResource.java @@ -20,6 +20,7 @@ public class IndexResource { } @GET + @Path("") @Produces(VndMediaType.INDEX) @TypeHint(IndexDto.class) public IndexDto getIndex() { diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java index 02d7a3d53d..488577618c 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java @@ -440,7 +440,6 @@ class ResourceLinks { } } - public UIPluginLinks uiPlugin() { return new UIPluginLinks(scmPathInfoStore.get()); } @@ -496,4 +495,21 @@ class ResourceLinks { return loginLinkBuilder.method("logout").parameters().href(); } } + + public IndexLinks index() { + return new IndexLinks(scmPathInfoStore.get()); + } + + static class IndexLinks { + private final LinkBuilder indexLinkBuilder; + + IndexLinks(ScmPathInfo pathInfo) { + indexLinkBuilder = new LinkBuilder(pathInfo, IndexResource.class); + } + + String self() { + return indexLinkBuilder.method("getIndex").parameters().href(); + } + } + } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IndexResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IndexResourceTest.java index 73bff79991..00c6b39313 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IndexResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IndexResourceTest.java @@ -26,6 +26,36 @@ public class IndexResourceTest { Assertions.assertThat(index.getLinks().getLinkBy("jsonLogin")).matches(Optional::isPresent); } + @Test + public void shouldRenderSelfLinkForUnauthenticatedRequest() { + IndexDto index = indexResource.getIndex(); + + Assertions.assertThat(index.getLinks().getLinkBy("self")).matches(Optional::isPresent); + } + + @Test + public void shouldRenderUiPluginsLinkForUnauthenticatedRequest() { + IndexDto index = indexResource.getIndex(); + + Assertions.assertThat(index.getLinks().getLinkBy("uiPlugins")).matches(Optional::isPresent); + } + + @Test + @SubjectAware(username = "trillian", password = "secret") + public void shouldRenderSelfLinkForAuthenticatedRequest() { + IndexDto index = indexResource.getIndex(); + + Assertions.assertThat(index.getLinks().getLinkBy("self")).matches(Optional::isPresent); + } + + @Test + @SubjectAware(username = "trillian", password = "secret") + public void shouldRenderUiPluginsLinkForAuthenticatedRequest() { + IndexDto index = indexResource.getIndex(); + + Assertions.assertThat(index.getLinks().getLinkBy("uiPlugins")).matches(Optional::isPresent); + } + @Test @SubjectAware(username = "trillian", password = "secret") public void shouldRenderMeUrlForAuthenticatedRequest() { diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java index 2e2c1ae586..eed46a1f6e 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ResourceLinksMock.java @@ -35,6 +35,7 @@ public class ResourceLinksMock { when(resourceLinks.uiPluginCollection()).thenReturn(new ResourceLinks.UIPluginCollectionLinks(uriInfo)); when(resourceLinks.uiPlugin()).thenReturn(new ResourceLinks.UIPluginLinks(uriInfo)); when(resourceLinks.authentication()).thenReturn(new ResourceLinks.AuthenticationLinks(uriInfo)); + when(resourceLinks.index()).thenReturn(new ResourceLinks.IndexLinks(uriInfo)); return resourceLinks; }