mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-12 16:35:45 +01:00
Use adapter for collection resources
This commit is contained in:
@@ -4,8 +4,6 @@ import com.webcohesion.enunciate.metadata.rs.ResponseCode;
|
|||||||
import com.webcohesion.enunciate.metadata.rs.ResponseHeader;
|
import com.webcohesion.enunciate.metadata.rs.ResponseHeader;
|
||||||
import com.webcohesion.enunciate.metadata.rs.StatusCodes;
|
import com.webcohesion.enunciate.metadata.rs.StatusCodes;
|
||||||
import com.webcohesion.enunciate.metadata.rs.TypeHint;
|
import com.webcohesion.enunciate.metadata.rs.TypeHint;
|
||||||
import sonia.scm.PageResult;
|
|
||||||
import sonia.scm.api.rest.resources.AbstractManagerResource;
|
|
||||||
import sonia.scm.group.Group;
|
import sonia.scm.group.Group;
|
||||||
import sonia.scm.group.GroupException;
|
import sonia.scm.group.GroupException;
|
||||||
import sonia.scm.group.GroupManager;
|
import sonia.scm.group.GroupManager;
|
||||||
@@ -20,27 +18,26 @@ import javax.ws.rs.Path;
|
|||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
import javax.ws.rs.QueryParam;
|
import javax.ws.rs.QueryParam;
|
||||||
import javax.ws.rs.core.Context;
|
import javax.ws.rs.core.Context;
|
||||||
import javax.ws.rs.core.GenericEntity;
|
|
||||||
import javax.ws.rs.core.Request;
|
import javax.ws.rs.core.Request;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
import javax.ws.rs.core.UriInfo;
|
import javax.ws.rs.core.UriInfo;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
import static sonia.scm.api.v2.resources.ResourceLinks.group;
|
import static sonia.scm.api.v2.resources.ResourceLinks.group;
|
||||||
|
|
||||||
@Produces(VndMediaType.GROUP_COLLECTION)
|
@Produces(VndMediaType.GROUP_COLLECTION)
|
||||||
public class GroupCollectionResource extends AbstractManagerResource<Group, GroupException> {
|
public class GroupCollectionResource {
|
||||||
public static final int DEFAULT_PAGE_SIZE = 10;
|
public static final int DEFAULT_PAGE_SIZE = 10;
|
||||||
private final GroupDtoToGroupMapper dtoToGroupMapper;
|
private final GroupDtoToGroupMapper dtoToGroupMapper;
|
||||||
private final GroupCollectionToDtoMapper groupCollectionToDtoMapper;
|
private final GroupCollectionToDtoMapper groupCollectionToDtoMapper;
|
||||||
|
|
||||||
|
private final ResourceManagerAdapter<Group, GroupDto, GroupException> adapter;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public GroupCollectionResource(GroupManager manager, GroupDtoToGroupMapper dtoToGroupMapper, GroupCollectionToDtoMapper groupCollectionToDtoMapper) {
|
public GroupCollectionResource(GroupManager manager, GroupDtoToGroupMapper dtoToGroupMapper, GroupCollectionToDtoMapper groupCollectionToDtoMapper) {
|
||||||
super(manager);
|
|
||||||
this.dtoToGroupMapper = dtoToGroupMapper;
|
this.dtoToGroupMapper = dtoToGroupMapper;
|
||||||
this.groupCollectionToDtoMapper = groupCollectionToDtoMapper;
|
this.groupCollectionToDtoMapper = groupCollectionToDtoMapper;
|
||||||
|
this.adapter = new ResourceManagerAdapter<>(manager);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -50,7 +47,7 @@ public class GroupCollectionResource extends AbstractManagerResource<Group, Grou
|
|||||||
* @param request the current request
|
* @param request the current request
|
||||||
* @param page the number of the requested page
|
* @param page the number of the requested page
|
||||||
* @param pageSize the page size (default page size is {@value DEFAULT_PAGE_SIZE})
|
* @param pageSize the page size (default page size is {@value DEFAULT_PAGE_SIZE})
|
||||||
* @param sortby sort parameter
|
* @param sortBy sort parameter
|
||||||
* @param desc sort direction desc or aesc
|
* @param desc sort direction desc or aesc
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -62,16 +59,13 @@ public class GroupCollectionResource extends AbstractManagerResource<Group, Grou
|
|||||||
@ResponseCode(code = 403, condition = "forbidden, the current user has no admin privileges"),
|
@ResponseCode(code = 403, condition = "forbidden, the current user has no admin privileges"),
|
||||||
@ResponseCode(code = 500, condition = "internal server error")
|
@ResponseCode(code = 500, condition = "internal server error")
|
||||||
})
|
})
|
||||||
@Override
|
|
||||||
public Response getAll(@Context Request request,
|
public Response getAll(@Context Request request,
|
||||||
@DefaultValue("0") @QueryParam("page") int page,
|
@DefaultValue("0") @QueryParam("page") int page,
|
||||||
@DefaultValue("" + DEFAULT_PAGE_SIZE) @QueryParam("pageSize") int pageSize,
|
@DefaultValue("" + DEFAULT_PAGE_SIZE) @QueryParam("pageSize") int pageSize,
|
||||||
@QueryParam("sortby") String sortby,
|
@QueryParam("sortby") String sortBy,
|
||||||
@DefaultValue("false")
|
@DefaultValue("false")
|
||||||
@QueryParam("desc") boolean desc) {
|
@QueryParam("desc") boolean desc) {
|
||||||
PageResult<Group> pageResult = fetchPage(sortby, desc, page, pageSize);
|
return adapter.getAll(page, pageSize, sortBy, desc, pageResult -> groupCollectionToDtoMapper.map(page, pageSize, pageResult));
|
||||||
|
|
||||||
return Response.ok(groupCollectionToDtoMapper.map(page, pageSize, pageResult)).build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -91,26 +85,6 @@ public class GroupCollectionResource extends AbstractManagerResource<Group, Grou
|
|||||||
@TypeHint(TypeHint.NO_CONTENT.class)
|
@TypeHint(TypeHint.NO_CONTENT.class)
|
||||||
@Consumes(VndMediaType.GROUP)
|
@Consumes(VndMediaType.GROUP)
|
||||||
public Response create(@Context UriInfo uriInfo, GroupDto groupDto) throws IOException, GroupException {
|
public Response create(@Context UriInfo uriInfo, GroupDto groupDto) throws IOException, GroupException {
|
||||||
if (groupDto == null) {
|
return adapter.create(groupDto, () -> dtoToGroupMapper.map(groupDto), group -> group(uriInfo).self(group.getName()));
|
||||||
return Response.status(400).build();
|
|
||||||
}
|
|
||||||
Group group = dtoToGroupMapper.map(groupDto);
|
|
||||||
manager.create(group);
|
|
||||||
return Response.created(URI.create(group(uriInfo).self(group.getName()))).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GenericEntity<Collection<Group>> createGenericEntity(Collection<Group> items) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getId(Group item) {
|
|
||||||
return item.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getPathPart() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,12 +3,16 @@ package sonia.scm.api.v2.resources;
|
|||||||
import de.otto.edison.hal.HalRepresentation;
|
import de.otto.edison.hal.HalRepresentation;
|
||||||
import sonia.scm.Manager;
|
import sonia.scm.Manager;
|
||||||
import sonia.scm.ModelObject;
|
import sonia.scm.ModelObject;
|
||||||
|
import sonia.scm.PageResult;
|
||||||
import sonia.scm.api.rest.resources.AbstractManagerResource;
|
import sonia.scm.api.rest.resources.AbstractManagerResource;
|
||||||
|
|
||||||
import javax.ws.rs.core.GenericEntity;
|
import javax.ws.rs.core.GenericEntity;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public class ResourceManagerAdapter<T extends ModelObject, D extends HalRepresentation, E extends Exception> extends AbstractManagerResource<T, E> {
|
public class ResourceManagerAdapter<T extends ModelObject, D extends HalRepresentation, E extends Exception> extends AbstractManagerResource<T, E> {
|
||||||
|
|
||||||
@@ -31,6 +35,20 @@ public class ResourceManagerAdapter<T extends ModelObject, D extends HalRepresen
|
|||||||
return update(id, changedEntity);
|
return update(id, changedEntity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Response getAll(int page, int pageSize, String sortBy, boolean desc, Function<PageResult<T>, CollectionDto> mappger) {
|
||||||
|
PageResult<T> pageResult = fetchPage(sortBy, desc, page, pageSize);
|
||||||
|
return Response.ok(mappger.apply(pageResult)).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Response create(D dto, Supplier<T> entitySupplyer, Function<T, String> uriCreator) throws IOException, E {
|
||||||
|
if (dto == null) {
|
||||||
|
return Response.status(400).build();
|
||||||
|
}
|
||||||
|
T entity = entitySupplyer.get();
|
||||||
|
manager.create(entity);
|
||||||
|
return Response.created(URI.create(uriCreator.apply(entity))).build();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected GenericEntity<Collection<T>> createGenericEntity(Collection<T> items) {
|
protected GenericEntity<Collection<T>> createGenericEntity(Collection<T> items) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
|
|||||||
@@ -5,8 +5,6 @@ import com.webcohesion.enunciate.metadata.rs.ResponseHeader;
|
|||||||
import com.webcohesion.enunciate.metadata.rs.ResponseHeaders;
|
import com.webcohesion.enunciate.metadata.rs.ResponseHeaders;
|
||||||
import com.webcohesion.enunciate.metadata.rs.StatusCodes;
|
import com.webcohesion.enunciate.metadata.rs.StatusCodes;
|
||||||
import com.webcohesion.enunciate.metadata.rs.TypeHint;
|
import com.webcohesion.enunciate.metadata.rs.TypeHint;
|
||||||
import sonia.scm.PageResult;
|
|
||||||
import sonia.scm.api.rest.resources.AbstractManagerResource;
|
|
||||||
import sonia.scm.user.User;
|
import sonia.scm.user.User;
|
||||||
import sonia.scm.user.UserException;
|
import sonia.scm.user.UserException;
|
||||||
import sonia.scm.user.UserManager;
|
import sonia.scm.user.UserManager;
|
||||||
@@ -20,29 +18,28 @@ import javax.ws.rs.Path;
|
|||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
import javax.ws.rs.QueryParam;
|
import javax.ws.rs.QueryParam;
|
||||||
import javax.ws.rs.core.Context;
|
import javax.ws.rs.core.Context;
|
||||||
import javax.ws.rs.core.GenericEntity;
|
|
||||||
import javax.ws.rs.core.Request;
|
import javax.ws.rs.core.Request;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
import javax.ws.rs.core.UriInfo;
|
import javax.ws.rs.core.UriInfo;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
import static sonia.scm.api.v2.resources.ResourceLinks.user;
|
import static sonia.scm.api.v2.resources.ResourceLinks.user;
|
||||||
|
|
||||||
@Produces(VndMediaType.USER_COLLECTION)
|
@Produces(VndMediaType.USER_COLLECTION)
|
||||||
public class UserCollectionResource extends AbstractManagerResource<User, UserException> {
|
public class UserCollectionResource {
|
||||||
|
|
||||||
private static final int DEFAULT_PAGE_SIZE = 10;
|
private static final int DEFAULT_PAGE_SIZE = 10;
|
||||||
private final UserDtoToUserMapper dtoToUserMapper;
|
private final UserDtoToUserMapper dtoToUserMapper;
|
||||||
private final UserCollectionToDtoMapper userCollectionToDtoMapper;
|
private final UserCollectionToDtoMapper userCollectionToDtoMapper;
|
||||||
|
|
||||||
|
private final ResourceManagerAdapter<User, UserDto, UserException> adapter;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public UserCollectionResource(UserManager manager, UserDtoToUserMapper dtoToUserMapper,
|
public UserCollectionResource(UserManager manager, UserDtoToUserMapper dtoToUserMapper,
|
||||||
UserCollectionToDtoMapper userCollectionToDtoMapper) {
|
UserCollectionToDtoMapper userCollectionToDtoMapper) {
|
||||||
super(manager);
|
|
||||||
this.dtoToUserMapper = dtoToUserMapper;
|
this.dtoToUserMapper = dtoToUserMapper;
|
||||||
this.userCollectionToDtoMapper = userCollectionToDtoMapper;
|
this.userCollectionToDtoMapper = userCollectionToDtoMapper;
|
||||||
|
this.adapter = new ResourceManagerAdapter<>(manager);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -64,16 +61,12 @@ public class UserCollectionResource extends AbstractManagerResource<User, UserEx
|
|||||||
@ResponseCode(code = 403, condition = "forbidden, the current user does not have the \"user\" privilege"),
|
@ResponseCode(code = 403, condition = "forbidden, the current user does not have the \"user\" privilege"),
|
||||||
@ResponseCode(code = 500, condition = "internal server error")
|
@ResponseCode(code = 500, condition = "internal server error")
|
||||||
})
|
})
|
||||||
@Override
|
|
||||||
public Response getAll(@Context Request request,
|
public Response getAll(@Context Request request,
|
||||||
@DefaultValue("0") @QueryParam("page") int page,
|
@DefaultValue("0") @QueryParam("page") int page,
|
||||||
@DefaultValue("" + DEFAULT_PAGE_SIZE) @QueryParam("pageSize") int pageSize,
|
@DefaultValue("" + DEFAULT_PAGE_SIZE) @QueryParam("pageSize") int pageSize,
|
||||||
@QueryParam("sortby") String sortBy,
|
@QueryParam("sortby") String sortBy,
|
||||||
@DefaultValue("false") @QueryParam("desc") boolean desc) {
|
@DefaultValue("false") @QueryParam("desc") boolean desc) {
|
||||||
|
return adapter.getAll(page, pageSize, sortBy, desc, pageResult -> userCollectionToDtoMapper.map(page, pageSize, pageResult));
|
||||||
PageResult<User> pageResult = fetchPage(sortBy, desc, page, pageSize);
|
|
||||||
|
|
||||||
return Response.ok(userCollectionToDtoMapper.map(page, pageSize, pageResult)).build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -94,26 +87,6 @@ public class UserCollectionResource extends AbstractManagerResource<User, UserEx
|
|||||||
@TypeHint(TypeHint.NO_CONTENT.class)
|
@TypeHint(TypeHint.NO_CONTENT.class)
|
||||||
@ResponseHeaders(@ResponseHeader(name = "Location", description = "uri to the created user"))
|
@ResponseHeaders(@ResponseHeader(name = "Location", description = "uri to the created user"))
|
||||||
public Response create(@Context UriInfo uriInfo, UserDto userDto) throws IOException, UserException {
|
public Response create(@Context UriInfo uriInfo, UserDto userDto) throws IOException, UserException {
|
||||||
if (userDto == null) {
|
return adapter.create(userDto, () -> dtoToUserMapper.map(userDto, ""), user -> user(uriInfo).self(user.getName()));
|
||||||
return Response.status(400).build();
|
|
||||||
}
|
|
||||||
User user = dtoToUserMapper.map(userDto, "");
|
|
||||||
manager.create(user);
|
|
||||||
return Response.created(URI.create(user(uriInfo).self(user.getName()))).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GenericEntity<Collection<User>> createGenericEntity(Collection<User> items) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getId(User item) {
|
|
||||||
return item.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getPathPart() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user