Add links map

This commit is contained in:
René Pfeuffer
2018-05-28 14:13:47 +02:00
parent 61c2e942be
commit 6ac0765788
5 changed files with 66 additions and 10 deletions

View File

@@ -0,0 +1,17 @@
package sonia.scm.api.rest.resources;
import lombok.Data;
import javax.xml.bind.annotation.XmlRootElement;
import java.net.URI;
@Data
@XmlRootElement
public class Link {
private URI href;
public Link(URI href) {
this.href = href;
}
}

View File

@@ -2,6 +2,9 @@ package sonia.scm.api.rest.resources;
import lombok.Data; import lombok.Data;
import javax.xml.bind.annotation.XmlElement;
import java.util.Map;
@Data @Data
public class UserDto { public class UserDto {
private boolean active; private boolean active;
@@ -13,4 +16,7 @@ public class UserDto {
private String name; private String name;
private String password; private String password;
private String type; private String type;
@XmlElement(name = "_links")
private Map<String, Link> links;
} }

View File

@@ -1,14 +1,26 @@
package sonia.scm.api.rest.resources; package sonia.scm.api.rest.resources;
import org.mapstruct.AfterMapping;
import org.mapstruct.Context;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
import sonia.scm.user.User; import sonia.scm.user.User;
import javax.ws.rs.core.UriInfo;
import java.util.LinkedHashMap;
import java.util.Map;
@Mapper @Mapper
public interface UserMapper { public abstract class UserMapper {
UserMapper INSTANCE = Mappers.getMapper( UserMapper.class ); public static UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
@Mapping(source = "name", target = "name") abstract public UserDto userToUserDto(User user, @Context UriInfo uriInfo);
UserDto userToUserDto(User user);
@AfterMapping
public void appendLinks(User source, @MappingTarget UserDto target, @Context UriInfo uriInfo) {
Map<String, Link> links = new LinkedHashMap<>();
links.put("self", new Link(uriInfo.getAbsolutePath()));
target.setLinks(links);
}
} }

View File

@@ -6,7 +6,6 @@ import com.webcohesion.enunciate.metadata.rs.ResponseCode;
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 org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import sonia.scm.Manager;
import sonia.scm.security.Role; import sonia.scm.security.Role;
import sonia.scm.user.User; import sonia.scm.user.User;
import sonia.scm.user.UserException; import sonia.scm.user.UserException;
@@ -57,13 +56,12 @@ public class UserNewResource extends AbstractManagerResource<User, UserException
@ResponseCode(code = 500, condition = "internal server error") @ResponseCode(code = 500, condition = "internal server error")
}) })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Override public Response get(@Context Request request, @Context UriInfo uriInfo, @PathParam("id") String id)
public Response get(@Context Request request, @PathParam("id") String id)
{ {
if (SecurityUtils.getSubject().hasRole(Role.ADMIN)) if (SecurityUtils.getSubject().hasRole(Role.ADMIN))
{ {
User user = manager.get(id); User user = manager.get(id);
UserDto userDto = UserMapper.INSTANCE.userToUserDto(user); UserDto userDto = UserMapper.INSTANCE.userToUserDto(user, uriInfo);
return Response.ok(userDto).build(); return Response.ok(userDto).build();
} }
else else

View File

@@ -0,0 +1,23 @@
package sonia.scm.api.rest.resources;
import org.junit.Test;
import sonia.scm.user.User;
import javax.ws.rs.core.UriInfo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.mock;
public class UserMapperTest {
@Test
public void shouldMapLinks() {
User user = new User();
user.setName("abc");
UserDto userDto = UserMapper.INSTANCE.userToUserDto(user, mock(UriInfo.class));
assertEquals("abc" , userDto.getName());
assertNotNull("expected map with links", userDto.getLinks());
}
}