Map members collection for groups

This commit is contained in:
René Pfeuffer
2018-06-12 08:18:29 +02:00
parent 470ebaff7e
commit 853f8d6a45
4 changed files with 68 additions and 36 deletions

View File

@@ -1,43 +1,29 @@
package sonia.scm.api.v2.resources; package sonia.scm.api.v2.resources;
import com.google.inject.Inject;
import de.otto.edison.hal.Link;
import de.otto.edison.hal.Links; import de.otto.edison.hal.Links;
import org.mapstruct.AfterMapping; import org.mapstruct.AfterMapping;
import org.mapstruct.Context; import org.mapstruct.Context;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget; import org.mapstruct.MappingTarget;
import org.mapstruct.Qualifier;
import sonia.scm.PageResult;
import sonia.scm.group.Group; import sonia.scm.group.Group;
import sonia.scm.group.GroupPermissions; import sonia.scm.group.GroupPermissions;
import sonia.scm.user.User;
import sonia.scm.util.AssertUtil; import sonia.scm.util.AssertUtil;
import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.UriInfo;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.time.Instant; import java.time.Instant;
import java.util.List; import java.util.Collection;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static de.otto.edison.hal.Link.link; import static de.otto.edison.hal.Link.link;
import static de.otto.edison.hal.Links.linkingTo; import static de.otto.edison.hal.Links.linkingTo;
import static java.util.Arrays.asList;
@Mapper @Mapper
public abstract class Group2GroupDtoMapper { public abstract class Group2GroupDtoMapper {
public abstract GroupDto groupToGroupDto(Group group, @Context UriInfo uriInfo); public abstract GroupDto groupToGroupDto(Group group, @Context UriInfo uriInfo);
@Inject
private User2UserDtoMapper user2UserDtoMapper;
@AfterMapping @AfterMapping
void appendLinks(Group group, @MappingTarget GroupDto target, @Context UriInfo uriInfo) { void appendLinks(Group group, @MappingTarget GroupDto target, @Context UriInfo uriInfo) {
LinkBuilder groupLinkBuilder = new LinkBuilder(uriInfo, GroupV2Resource.class, GroupSubResource.class); LinkBuilder groupLinkBuilder = new LinkBuilder(uriInfo, GroupV2Resource.class, GroupSubResource.class);
@@ -55,25 +41,17 @@ public abstract class Group2GroupDtoMapper {
target.add(linksBuilder.build()); target.add(linksBuilder.build());
} }
@AfterMapping Collection<MemberDto> mapMembers(Collection<String> members, @Context UriInfo uriInfo) {
void appendUserLinks(Group group, @MappingTarget GroupDto target, @Context UriInfo uriInfo) { return members.stream().map(name -> this.createMember(name, uriInfo)).collect(Collectors.toList());
Links.Builder linksBuilder = linkingTo(); }
private MemberDto createMember(String name, UriInfo uriInfo) {
LinkBuilder userLinkBuilder = new LinkBuilder(uriInfo, UserV2Resource.class, UserSubResource.class); LinkBuilder userLinkBuilder = new LinkBuilder(uriInfo, UserV2Resource.class, UserSubResource.class);
group.getMembers().forEach(name -> linksBuilder.array(Link.link("users", userLinkBuilder.method("getUserSubResource").parameters(name).method("get").parameters().href()))); Links.Builder linksBuilder = linkingTo()
.self(userLinkBuilder.method("getUserSubResource").parameters(name).method("get").parameters().href());
target.add(linksBuilder.build()); MemberDto memberDto = new MemberDto(name);
} memberDto.add(linksBuilder.build());
return memberDto;
@AfterMapping
void embedUsers(Group group, @MappingTarget GroupDto target, @Context UriInfo uriInfo) {
List<UserDto> users = group.getMembers().stream().map(this::createUser).map(u -> user2UserDtoMapper.userToUserDto(u, uriInfo)).collect(Collectors.toList());
target.withEmbedded("users", users);
}
private User createUser(String ich) {
User user = new User(ich);
user.setCreationDate(0L);
return user;
} }
@Mapping(target = "creationDate") @Mapping(target = "creationDate")

View File

@@ -1,5 +1,6 @@
package sonia.scm.api.v2.resources; package sonia.scm.api.v2.resources;
import com.fasterxml.jackson.annotation.JsonInclude;
import de.otto.edison.hal.HalRepresentation; import de.otto.edison.hal.HalRepresentation;
import de.otto.edison.hal.Links; import de.otto.edison.hal.Links;
import lombok.Data; import lombok.Data;
@@ -7,6 +8,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.time.Instant; import java.time.Instant;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@@ -15,9 +17,11 @@ public class GroupDto extends HalRepresentation {
private Instant creationDate; private Instant creationDate;
private String description; private String description;
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private Optional<Instant> lastModified; private Optional<Instant> lastModified;
private String name; private String name;
private String type; private String type;
private Collection<MemberDto> members;
@Override @Override
protected HalRepresentation add(Links links) { protected HalRepresentation add(Links links) {

View File

@@ -0,0 +1,17 @@
package sonia.scm.api.v2.resources;
import de.otto.edison.hal.HalRepresentation;
import de.otto.edison.hal.Links;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data @NoArgsConstructor @AllArgsConstructor
public class MemberDto extends HalRepresentation {
private String name;
@Override
protected HalRepresentation add(Links links) {
return super.add(links);
}
}

View File

@@ -13,7 +13,9 @@ import sonia.scm.group.Group;
import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.UriInfo;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.stream.IntStream;
import static java.util.stream.Collectors.toList;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -42,16 +44,47 @@ public class Group2GroupDtoMapperTest {
} }
@Test @Test
public void shouldMapLinks_forUpdate() { public void shouldMapAttributes() {
Group group = createDefaultGroup(); Group group = createDefaultGroup();
when(subject.isPermitted("user:modify:abc")).thenReturn(true);
GroupDto groupDto = mapper.groupToGroupDto(group, uriInfo); GroupDto groupDto = mapper.groupToGroupDto(group, uriInfo);
assertEquals("expected self link", expectedBaseUri.resolve("abc").toString(), groupDto.getLinks().getLinkBy("self").get().getHref()); assertEquals("abc", groupDto.getName());
assertEquals("abc", groupDto.getName());
}
@Test
public void shouldMapSelfLink() {
Group group = createDefaultGroup();
GroupDto groupDto = mapper.groupToGroupDto(group, uriInfo);
assertEquals("expected self link", expectedBaseUri.resolve("abc").toString(), groupDto.getLinks().getLinkBy("self").get().getHref());
}
@Test
public void shouldMapLink_forUpdate() {
Group group = createDefaultGroup();
when(subject.isPermitted("group:modify:abc")).thenReturn(true);
GroupDto groupDto = mapper.groupToGroupDto(group, uriInfo);
assertEquals("expected update link", expectedBaseUri.resolve("abc").toString(), groupDto.getLinks().getLinkBy("update").get().getHref()); assertEquals("expected update link", expectedBaseUri.resolve("abc").toString(), groupDto.getLinks().getLinkBy("update").get().getHref());
} }
@Test
public void shouldCreateMemberDtos() {
Group group = createDefaultGroup();
group.setMembers(IntStream.range(0, 10).mapToObj(n -> "user" + n).collect(toList()));
GroupDto groupDto = mapper.groupToGroupDto(group, uriInfo);
assertEquals(10, groupDto.getMembers().size());
MemberDto actualMember = groupDto.getMembers().iterator().next();
assertEquals("user0", actualMember.getName());
assertEquals("http://example.com/base/v2/users/user0", actualMember.getLinks().getLinkBy("self").get().getHref());
}
private Group createDefaultGroup() { private Group createDefaultGroup() {
Group group = new Group(); Group group = new Group();
group.setName("abc"); group.setName("abc");