diff --git a/.travis.yml b/.travis.yml index 9f8bc9279..526343f24 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ before_install: install: - git clone https://github.com/FAForever/faf-stack.git faf-stack && pushd faf-stack - && git checkout 2169c0c + && git checkout fc3551f && cp -r config.template config && popd - docker-compose -f faf-stack/docker-compose.yml up -d faf-db diff --git a/src/main/java/com/faforever/api/data/domain/Login.java b/src/main/java/com/faforever/api/data/domain/Login.java index 48a83d89c..5717ab754 100644 --- a/src/main/java/com/faforever/api/data/domain/Login.java +++ b/src/main/java/com/faforever/api/data/domain/Login.java @@ -12,6 +12,7 @@ import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Transient; +import java.time.OffsetDateTime; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; @@ -28,6 +29,7 @@ public abstract class Login extends AbstractEntity implements OwnableEntity { private Set userNotes; private LobbyGroup lobbyGroup; private String recentIpAddress; + private OffsetDateTime lastLogin; public Login() { this.bans = new HashSet<>(0); @@ -57,6 +59,12 @@ public String getRecentIpAddress() { return recentIpAddress; } + @Column(name = "last_login") + @ReadPermission(expression = IsEntityOwner.EXPRESSION + " OR " + IsModerator.EXPRESSION) + public OffsetDateTime getLastLogin() { + return lastLogin; + } + @Column(name = "user_agent") public String getUserAgent() { return userAgent; diff --git a/src/main/java/com/faforever/api/user/UserService.java b/src/main/java/com/faforever/api/user/UserService.java index 9f98109e7..7774b1613 100644 --- a/src/main/java/com/faforever/api/user/UserService.java +++ b/src/main/java/com/faforever/api/user/UserService.java @@ -140,6 +140,7 @@ void activate(String token, String ipAddress) { user.setPassword(password); user.setEmail(email); user.setLogin(username); + user.setRecentIpAddress(ipAddress); user = userRepository.save(user); diff --git a/src/main/resources/config/application.yml b/src/main/resources/config/application.yml index 58011fe02..3654908a9 100644 --- a/src/main/resources/config/application.yml +++ b/src/main/resources/config/application.yml @@ -9,7 +9,7 @@ faf-api: challonge: key: ${CHALLONGE_KEY:} database: - schema-version: ${DATABASE_SCHEMA_VERSION:58} + schema-version: ${DATABASE_SCHEMA_VERSION:59} mautic: base-url: ${MAUTIC_BASE_URL:false} client-id: ${MAUTIC_CLIENT_ID:false} diff --git a/src/test/java/com/faforever/api/user/UserServiceTest.java b/src/test/java/com/faforever/api/user/UserServiceTest.java index 422f00c67..35126d2b5 100644 --- a/src/test/java/com/faforever/api/user/UserServiceTest.java +++ b/src/test/java/com/faforever/api/user/UserServiceTest.java @@ -174,13 +174,14 @@ public void registerUsernameReserved() throws Exception { @Test public void activate() throws Exception { + final String TEST_IP_ADDRESS = "127.0.0.1"; when(fafTokenService.resolveToken(FafTokenType.REGISTRATION, TOKEN_VALUE)).thenReturn(ImmutableMap.of( UserService.KEY_USERNAME, TEST_USERNAME, UserService.KEY_EMAIL, TEST_CURRENT_EMAIL, UserService.KEY_PASSWORD, fafPasswordEncoder.encode(TEST_NEW_PASSWORD) )); - instance.activate(TOKEN_VALUE, "127.0.0.1"); + instance.activate(TOKEN_VALUE, TEST_IP_ADDRESS); ArgumentCaptor captor = ArgumentCaptor.forClass(User.class); verify(userRepository).save(captor.capture()); @@ -191,6 +192,7 @@ public void activate() throws Exception { assertThat(user.getLogin(), is(TEST_USERNAME)); assertThat(user.getEmail(), is(TEST_CURRENT_EMAIL)); assertThat(user.getPassword(), is(fafPasswordEncoder.encode(TEST_NEW_PASSWORD))); + assertThat(user.getRecentIpAddress(), is(TEST_IP_ADDRESS)); verify(mauticService).createOrUpdateContact(eq(TEST_NEW_EMAIL), eq(String.valueOf(TEST_USERID)), eq(TEST_USERNAME), eq("127.0.0.1"), any(OffsetDateTime.class)); }