diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/User2UserDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/User2UserDtoMapper.java index c2bce60820..b7ac65b07f 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/User2UserDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/User2UserDtoMapper.java @@ -10,6 +10,7 @@ import javax.ws.rs.core.UriInfo; import java.time.Instant; import java.util.HashMap; import java.util.Map; +import java.util.Optional; @Mapper public abstract class User2UserDtoMapper { @@ -35,8 +36,16 @@ public abstract class User2UserDtoMapper { target.setLinks(links); } - @Mappings({@Mapping(target = "lastModified"), @Mapping(target = "creationDate")}) + @Mapping(target = "creationDate") Instant mapTime(Long epochMilli) { - return epochMilli == null? null: Instant.ofEpochMilli(epochMilli); + // TODO assert parameter not null + return Instant.ofEpochMilli(epochMilli); + } + + @Mapping(target = "lastModified") + Optional mapOptionalTime(Long epochMilli) { + return Optional + .ofNullable(epochMilli) + .map(Instant::ofEpochMilli); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDto.java index 9bd42d0a87..4e90e0e68f 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDto.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDto.java @@ -5,6 +5,7 @@ import lombok.Data; import javax.xml.bind.annotation.XmlElement; import java.time.Instant; import java.util.Map; +import java.util.Optional; @Data public class UserDto { @@ -12,7 +13,7 @@ public class UserDto { private boolean admin; private Instant creationDate; private String displayName; - private Instant lastModified; + private Optional lastModified; private String mail; private String name; private String password; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDto2UserMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDto2UserMapper.java index 30b0f16e82..b5573eaa4b 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDto2UserMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDto2UserMapper.java @@ -2,10 +2,14 @@ package sonia.scm.api.v2.resources; import com.google.inject.Inject; import org.apache.shiro.authc.credential.PasswordService; -import org.mapstruct.*; +import org.mapstruct.Context; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Named; import sonia.scm.user.User; import java.time.Instant; +import java.util.Optional; import static sonia.scm.api.rest.resources.UserResource.DUMMY_PASSWORT; @@ -31,8 +35,14 @@ public abstract class UserDto2UserMapper { } } - @Mappings({@Mapping(target = "lastModified"), @Mapping(target = "creationDate")}) + @Mapping(target = "creationDate") Long mapTime(Instant instant) { - return instant == null? null: instant.toEpochMilli(); + // TODO assert parameter not null + return instant.toEpochMilli(); + } + + @Mapping(target = "lastModified") + Long mapOptionalTime(Optional instant) { + return instant.map(Instant::toEpochMilli).orElse(null); } } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/User2UserDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/User2UserDtoMapperTest.java index 63a82520cb..b23dd7db0f 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/User2UserDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/User2UserDtoMapperTest.java @@ -39,8 +39,7 @@ public class User2UserDtoMapperTest { @Test public void shouldMapLinks_forAdmin() { - User user = new User(); - user.setName("abc"); + User user = createDefaultUser(); when(subject.hasRole("admin")).thenReturn(true); UserDto userDto = mapper.userToUserDto(user, uriInfo); @@ -51,10 +50,16 @@ public class User2UserDtoMapperTest { assertEquals("expected map with create baseUri", expextedBaseUri, userDto.getLinks().get("create").getHref()); } - @Test - public void shouldMapLinks_forNormalUser() { + private User createDefaultUser() { User user = new User(); user.setName("abc"); + user.setCreationDate(1L); + return user; + } + + @Test + public void shouldMapLinks_forNormalUser() { + User user = createDefaultUser(); when(subject.hasRole("user")).thenReturn(true); UserDto userDto = mapper.userToUserDto(user, uriInfo); @@ -67,8 +72,7 @@ public class User2UserDtoMapperTest { @Test public void shouldMapFields() { - User user = new User(); - user.setName("abc"); + User user = createDefaultUser(); UserDto userDto = mapper.userToUserDto(user, uriInfo); @@ -77,9 +81,8 @@ public class User2UserDtoMapperTest { @Test public void shouldRemovePassword() { - User user = new User(); + User user = createDefaultUser(); user.setPassword("password"); - user.setName("abc"); UserDto userDto = mapper.userToUserDto(user, uriInfo); @@ -88,8 +91,7 @@ public class User2UserDtoMapperTest { @Test public void shouldMapTimes() { - User user = new User(); - user.setName("abc"); + User user = createDefaultUser(); Instant expectedCreationDate = Instant.ofEpochSecond(6666666); Instant expectedModificationDate = expectedCreationDate.plusSeconds(1); user.setCreationDate(expectedCreationDate.toEpochMilli()); @@ -98,6 +100,6 @@ public class User2UserDtoMapperTest { UserDto userDto = mapper.userToUserDto(user, uriInfo); assertEquals(expectedCreationDate, userDto.getCreationDate()); - assertEquals(expectedModificationDate, userDto.getLastModified()); + assertEquals(expectedModificationDate, userDto.getLastModified().get()); } } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserDto2UserMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserDto2UserMapperTest.java index 08b9fe604f..8067846cbd 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserDto2UserMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserDto2UserMapperTest.java @@ -8,8 +8,10 @@ import org.mockito.Mock; import sonia.scm.user.User; import java.time.Instant; +import java.util.Optional; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; @@ -22,8 +24,7 @@ public class UserDto2UserMapperTest { @Test public void shouldMapFields() { - UserDto dto = new UserDto(); - dto.setName("abc"); + UserDto dto = createDefaultDto(); User user = mapper.userDtoToUser(dto, "original password"); assertEquals("abc" , user.getName()); } @@ -32,7 +33,7 @@ public class UserDto2UserMapperTest { public void shouldEncodePassword() { when(passwordService.encryptPassword("unencrypted")).thenReturn("encrypted"); - UserDto dto = new UserDto(); + UserDto dto = createDefaultDto(); dto.setPassword("unencrypted"); User user = mapper.userDtoToUser(dto, "original password"); assertEquals("encrypted" , user.getPassword()); @@ -40,21 +41,28 @@ public class UserDto2UserMapperTest { @Test public void shouldMapTimes() { - UserDto dto = new UserDto(); - dto.setName("abc"); + UserDto dto = createDefaultDto(); Instant expectedCreationDate = Instant.ofEpochMilli(66666660000L); - Instant expectedModificationDate = null; + Optional expectedModificationDate = Optional.empty(); dto.setCreationDate(expectedCreationDate); dto.setLastModified(expectedModificationDate); User user = mapper.userDtoToUser(dto, "original password"); assertEquals((Long) expectedCreationDate.toEpochMilli(), user.getCreationDate()); - assertEquals(null, user.getLastModified()); + assertNull(user.getLastModified()); } @Before public void init() { initMocks(this); } + + private UserDto createDefaultDto() { + UserDto dto = new UserDto(); + dto.setName("abc"); + dto.setCreationDate(Instant.now()); + dto.setLastModified(Optional.empty()); + return dto; + } } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserV2ResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserV2ResourceTest.java index d3c332231c..75ecb313f8 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserV2ResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserV2ResourceTest.java @@ -79,6 +79,7 @@ public class UserV2ResourceTest { User user = new User(); user.setName("Neo"); user.setPassword("redpill"); + user.setCreationDate(System.currentTimeMillis()); return user; } }