mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-12 00:15:44 +01:00
Extract base class for collection mappers
This commit is contained in:
@@ -1,11 +1,15 @@
|
||||
package sonia.scm.api.v2.resources;
|
||||
|
||||
import de.otto.edison.hal.HalRepresentation;
|
||||
import sonia.scm.ModelObject;
|
||||
import sonia.scm.util.AssertUtil;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.Optional;
|
||||
|
||||
class BaseMapper {
|
||||
abstract class BaseMapper<T extends ModelObject, D extends HalRepresentation> {
|
||||
|
||||
public abstract D map(T user);
|
||||
|
||||
Instant mapTime(Long epochMilli) {
|
||||
AssertUtil.assertIsNotNull(epochMilli);
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
package sonia.scm.api.v2.resources;
|
||||
|
||||
import de.otto.edison.hal.Embedded;
|
||||
import de.otto.edison.hal.HalRepresentation;
|
||||
import de.otto.edison.hal.Links;
|
||||
import de.otto.edison.hal.paging.NumberedPaging;
|
||||
import de.otto.edison.hal.paging.PagingRel;
|
||||
import sonia.scm.ModelObject;
|
||||
import sonia.scm.PageResult;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
|
||||
import static com.damnhandy.uri.template.UriTemplate.fromTemplate;
|
||||
import static de.otto.edison.hal.Embedded.embeddedBuilder;
|
||||
import static de.otto.edison.hal.Link.link;
|
||||
import static de.otto.edison.hal.Links.linkingTo;
|
||||
import static de.otto.edison.hal.paging.NumberedPaging.zeroBasedNumberedPaging;
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
abstract class BasicCollectionToDtoMapper<E extends ModelObject, D extends HalRepresentation> {
|
||||
|
||||
private final String collectionName;
|
||||
private final BaseMapper<E, D> entityToDtoMapper;
|
||||
|
||||
@Inject
|
||||
public BasicCollectionToDtoMapper(String collectionName, BaseMapper<E, D> entityToDtoMapper) {
|
||||
this.collectionName = collectionName;
|
||||
this.entityToDtoMapper = entityToDtoMapper;
|
||||
}
|
||||
|
||||
public CollectionDto map(int pageNumber, int pageSize, PageResult<E> pageResult) {
|
||||
NumberedPaging paging = zeroBasedNumberedPaging(pageNumber, pageSize, pageResult.getOverallCount());
|
||||
List<D> dtos = pageResult.getEntities().stream().map(entityToDtoMapper::map).collect(toList());
|
||||
|
||||
CollectionDto collectionDto = new CollectionDto(
|
||||
createLinks(paging),
|
||||
embedDtos(dtos)
|
||||
);
|
||||
collectionDto.setPage(pageNumber);
|
||||
return collectionDto;
|
||||
}
|
||||
|
||||
private Links createLinks(NumberedPaging page) {
|
||||
String baseUrl = createSelfLink();
|
||||
|
||||
Links.Builder linksBuilder = linkingTo()
|
||||
.with(page.links(
|
||||
fromTemplate(baseUrl + "{?page,pageSize}"),
|
||||
EnumSet.allOf(PagingRel.class)));
|
||||
if (isCreatePermitted()) {
|
||||
linksBuilder.single(link("create", createCreateLink()));
|
||||
}
|
||||
return linksBuilder.build();
|
||||
}
|
||||
|
||||
abstract boolean isCreatePermitted();
|
||||
|
||||
abstract String createCreateLink();
|
||||
|
||||
abstract String createSelfLink();
|
||||
|
||||
private Embedded embedDtos(List<D> dtos) {
|
||||
return embeddedBuilder()
|
||||
.with(collectionName, dtos)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
@@ -6,12 +6,12 @@ import de.otto.edison.hal.Links;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class UserCollectionDto extends HalRepresentation {
|
||||
public class CollectionDto extends HalRepresentation {
|
||||
|
||||
private int page;
|
||||
private int pageTotal;
|
||||
|
||||
public UserCollectionDto(Links links, Embedded embedded) {
|
||||
public CollectionDto(Links links, Embedded embedded) {
|
||||
super(links, embedded);
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package sonia.scm.api.v2.resources;
|
||||
|
||||
import de.otto.edison.hal.Embedded;
|
||||
import de.otto.edison.hal.HalRepresentation;
|
||||
import de.otto.edison.hal.Links;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class GroupCollectionDto extends HalRepresentation {
|
||||
|
||||
private int page;
|
||||
private int pageTotal;
|
||||
|
||||
public GroupCollectionDto(Links links, Embedded embedded) {
|
||||
super(links, embedded);
|
||||
}
|
||||
}
|
||||
@@ -1,64 +1,34 @@
|
||||
package sonia.scm.api.v2.resources;
|
||||
|
||||
import de.otto.edison.hal.Embedded;
|
||||
import de.otto.edison.hal.Links;
|
||||
import de.otto.edison.hal.paging.NumberedPaging;
|
||||
import de.otto.edison.hal.paging.PagingRel;
|
||||
import sonia.scm.PageResult;
|
||||
import sonia.scm.group.Group;
|
||||
import sonia.scm.group.GroupPermissions;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
|
||||
import static com.damnhandy.uri.template.UriTemplate.fromTemplate;
|
||||
import static de.otto.edison.hal.Embedded.embeddedBuilder;
|
||||
import static de.otto.edison.hal.Link.link;
|
||||
import static de.otto.edison.hal.Links.linkingTo;
|
||||
import static de.otto.edison.hal.paging.NumberedPaging.zeroBasedNumberedPaging;
|
||||
import static java.util.stream.Collectors.toList;
|
||||
import static sonia.scm.api.v2.resources.ResourceLinks.groupCollection;
|
||||
|
||||
public class GroupCollectionToDtoMapper {
|
||||
public class GroupCollectionToDtoMapper extends BasicCollectionToDtoMapper<Group, GroupDto> {
|
||||
|
||||
private final GroupToGroupDtoMapper groupToDtoMapper;
|
||||
private final UriInfoStore uriInfoStore;
|
||||
|
||||
@Inject
|
||||
public GroupCollectionToDtoMapper(GroupToGroupDtoMapper groupToDtoMapper, UriInfoStore uriInfoStore) {
|
||||
this.groupToDtoMapper = groupToDtoMapper;
|
||||
super("groups", groupToDtoMapper);
|
||||
this.uriInfoStore = uriInfoStore;
|
||||
}
|
||||
|
||||
public GroupCollectionDto map(int pageNumber, int pageSize, PageResult<Group> pageResult) {
|
||||
NumberedPaging paging = zeroBasedNumberedPaging(pageNumber, pageSize, pageResult.getOverallCount());
|
||||
List<GroupDto> dtos = pageResult.getEntities().stream().map(groupToDtoMapper::map).collect(toList());
|
||||
|
||||
GroupCollectionDto groupCollectionDto = new GroupCollectionDto(
|
||||
createLinks(paging),
|
||||
embedDtos(dtos)
|
||||
);
|
||||
groupCollectionDto.setPage(pageNumber);
|
||||
return groupCollectionDto;
|
||||
@Override
|
||||
String createCreateLink() {
|
||||
return groupCollection(uriInfoStore.get()).create();
|
||||
}
|
||||
|
||||
private Links createLinks(NumberedPaging page) {
|
||||
String baseUrl = groupCollection(uriInfoStore.get()).self();
|
||||
|
||||
Links.Builder linksBuilder = linkingTo()
|
||||
.with(page.links(
|
||||
fromTemplate(baseUrl + "{?page,pageSize}"),
|
||||
EnumSet.allOf(PagingRel.class)));
|
||||
if (GroupPermissions.create().isPermitted()) {
|
||||
linksBuilder.single(link("create", groupCollection(uriInfoStore.get()).create()));
|
||||
}
|
||||
return linksBuilder.build();
|
||||
@Override
|
||||
String createSelfLink() {
|
||||
return groupCollection(uriInfoStore.get()).self();
|
||||
}
|
||||
|
||||
private Embedded embedDtos(List<GroupDto> dtos) {
|
||||
return embeddedBuilder()
|
||||
.with("groups", dtos)
|
||||
.build();
|
||||
@Override
|
||||
boolean isCreatePermitted() {
|
||||
return GroupPermissions.create().isPermitted();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,13 +17,11 @@ import static sonia.scm.api.v2.resources.ResourceLinks.group;
|
||||
import static sonia.scm.api.v2.resources.ResourceLinks.user;
|
||||
|
||||
@Mapper
|
||||
public abstract class GroupToGroupDtoMapper extends BaseMapper {
|
||||
public abstract class GroupToGroupDtoMapper extends BaseMapper<Group, GroupDto> {
|
||||
|
||||
@Inject
|
||||
private UriInfoStore uriInfoStore;
|
||||
|
||||
public abstract GroupDto map(Group group);
|
||||
|
||||
@AfterMapping
|
||||
void appendLinks(Group group, @MappingTarget GroupDto target) {
|
||||
Links.Builder linksBuilder = linkingTo().self(group(uriInfoStore.get()).self(target.getName()));
|
||||
|
||||
@@ -1,64 +1,34 @@
|
||||
package sonia.scm.api.v2.resources;
|
||||
|
||||
import de.otto.edison.hal.Embedded;
|
||||
import de.otto.edison.hal.Links;
|
||||
import de.otto.edison.hal.paging.NumberedPaging;
|
||||
import de.otto.edison.hal.paging.PagingRel;
|
||||
import sonia.scm.PageResult;
|
||||
import sonia.scm.user.User;
|
||||
import sonia.scm.user.UserPermissions;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
|
||||
import static com.damnhandy.uri.template.UriTemplate.fromTemplate;
|
||||
import static de.otto.edison.hal.Embedded.embeddedBuilder;
|
||||
import static de.otto.edison.hal.Link.link;
|
||||
import static de.otto.edison.hal.Links.linkingTo;
|
||||
import static de.otto.edison.hal.paging.NumberedPaging.zeroBasedNumberedPaging;
|
||||
import static java.util.stream.Collectors.toList;
|
||||
import static sonia.scm.api.v2.resources.ResourceLinks.userCollection;
|
||||
|
||||
public class UserCollectionToDtoMapper {
|
||||
public class UserCollectionToDtoMapper extends BasicCollectionToDtoMapper<User, UserDto> {
|
||||
|
||||
private final UserToUserDtoMapper userToDtoMapper;
|
||||
private final UriInfoStore uriInfoStore;
|
||||
|
||||
@Inject
|
||||
public UserCollectionToDtoMapper(UserToUserDtoMapper userToDtoMapper, UriInfoStore uriInfoStore) {
|
||||
this.userToDtoMapper = userToDtoMapper;
|
||||
super("users", userToDtoMapper);
|
||||
this.uriInfoStore = uriInfoStore;
|
||||
}
|
||||
|
||||
public UserCollectionDto map(int pageNumber, int pageSize, PageResult<User> pageResult) {
|
||||
NumberedPaging paging = zeroBasedNumberedPaging(pageNumber, pageSize, pageResult.getOverallCount());
|
||||
List<UserDto> dtos = pageResult.getEntities().stream().map(userToDtoMapper::map).collect(toList());
|
||||
|
||||
UserCollectionDto userCollectionDto = new UserCollectionDto(
|
||||
createLinks(paging),
|
||||
embedDtos(dtos)
|
||||
);
|
||||
userCollectionDto.setPage(pageNumber);
|
||||
return userCollectionDto;
|
||||
@Override
|
||||
String createCreateLink() {
|
||||
return userCollection(uriInfoStore.get()).create();
|
||||
}
|
||||
|
||||
private Links createLinks(NumberedPaging page) {
|
||||
String baseUrl = userCollection(uriInfoStore.get()).self();
|
||||
|
||||
Links.Builder linksBuilder = linkingTo()
|
||||
.with(page.links(
|
||||
fromTemplate(baseUrl + "{?page,pageSize}"),
|
||||
EnumSet.allOf(PagingRel.class)));
|
||||
if (UserPermissions.create().isPermitted()) {
|
||||
linksBuilder.single(link("create", userCollection(uriInfoStore.get()).create()));
|
||||
}
|
||||
return linksBuilder.build();
|
||||
@Override
|
||||
String createSelfLink() {
|
||||
return userCollection(uriInfoStore.get()).self();
|
||||
}
|
||||
|
||||
private Embedded embedDtos(List<UserDto> dtos) {
|
||||
return embeddedBuilder()
|
||||
.with("users", dtos)
|
||||
.build();
|
||||
@Override
|
||||
boolean isCreatePermitted() {
|
||||
return UserPermissions.create().isPermitted();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,13 +15,11 @@ import static de.otto.edison.hal.Links.linkingTo;
|
||||
import static sonia.scm.api.v2.resources.ResourceLinks.user;
|
||||
|
||||
@Mapper
|
||||
public abstract class UserToUserDtoMapper extends BaseMapper {
|
||||
public abstract class UserToUserDtoMapper extends BaseMapper<User, UserDto> {
|
||||
|
||||
@Inject
|
||||
private UriInfoStore uriInfoStore;
|
||||
|
||||
public abstract UserDto map(User user);
|
||||
|
||||
@AfterMapping
|
||||
void removePassword(@MappingTarget UserDto target) {
|
||||
target.setPassword(UserResource.DUMMY_PASSWORT);
|
||||
|
||||
Reference in New Issue
Block a user