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;
import com.google.inject.Inject;
import de.otto.edison.hal.Link;
import de.otto.edison.hal.Links;
import org.mapstruct.AfterMapping;
import org.mapstruct.Context;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.Qualifier;
import sonia.scm.PageResult;
import sonia.scm.group.Group;
import sonia.scm.group.GroupPermissions;
import sonia.scm.user.User;
import sonia.scm.util.AssertUtil;
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.util.List;
import java.util.Collection;
import java.util.Optional;
import java.util.stream.Collectors;
import static de.otto.edison.hal.Link.link;
import static de.otto.edison.hal.Links.linkingTo;
import static java.util.Arrays.asList;
@Mapper
public abstract class Group2GroupDtoMapper {
public abstract GroupDto groupToGroupDto(Group group, @Context UriInfo uriInfo);
@Inject
private User2UserDtoMapper user2UserDtoMapper;
@AfterMapping
void appendLinks(Group group, @MappingTarget GroupDto target, @Context UriInfo uriInfo) {
LinkBuilder groupLinkBuilder = new LinkBuilder(uriInfo, GroupV2Resource.class, GroupSubResource.class);
@@ -55,25 +41,17 @@ public abstract class Group2GroupDtoMapper {
target.add(linksBuilder.build());
}
@AfterMapping
void appendUserLinks(Group group, @MappingTarget GroupDto target, @Context UriInfo uriInfo) {
Links.Builder linksBuilder = linkingTo();
Collection<MemberDto> mapMembers(Collection<String> members, @Context UriInfo uriInfo) {
return members.stream().map(name -> this.createMember(name, uriInfo)).collect(Collectors.toList());
}
private MemberDto createMember(String name, UriInfo uriInfo) {
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())));
target.add(linksBuilder.build());
}
@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;
Links.Builder linksBuilder = linkingTo()
.self(userLinkBuilder.method("getUserSubResource").parameters(name).method("get").parameters().href());
MemberDto memberDto = new MemberDto(name);
memberDto.add(linksBuilder.build());
return memberDto;
}
@Mapping(target = "creationDate")

View File

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