Skip to content
This repository was archived by the owner on May 9, 2019. It is now read-only.

Commit 44be056

Browse files
committed
Modify createdAt in user
1 parent 6dd40ad commit 44be056

File tree

11 files changed

+61
-64
lines changed

11 files changed

+61
-64
lines changed

user-api/src/main/java/com/example/auction/user/api/User.java

+2-8
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,10 @@
1313
public final class User {
1414

1515
private final UUID id;
16-
private final Timestamp createdAt;
16+
private final Instant createdAt;
1717
private final String name;
1818
private final String email;
1919

20-
@JsonCreator
21-
public User(@JsonProperty("id") UUID id, @JsonProperty("createdAt") Timestamp createdAt , @JsonProperty("name") String name, @JsonProperty("email") String email) {
22-
this.id = id;
23-
this.createdAt = createdAt;
24-
this.name = name;
25-
this.email = email;
26-
}
20+
2721

2822
}

user-api/src/main/java/com/example/auction/user/api/UserRegistration.java

+1-6
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@ public final class UserRegistration {
1111
private final String email;
1212
private final String password;
1313

14-
@JsonCreator
15-
public UserRegistration( @JsonProperty("name") String name, @JsonProperty("email") String email, @JsonProperty("password") String password) {
16-
this.name = name;
17-
this.email = email;
18-
this.password = password;
19-
}
14+
2015

2116
}

user-impl/src/main/java/com/example/auction/user/impl/PUser.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
public final class PUser implements Jsonable {
1212

1313
private final UUID id;
14-
private final Timestamp createdAt;
14+
private final Instant createdAt;
1515
private final String name;
1616
private final String email;
1717
private final String passwordHash;

user-impl/src/main/java/com/example/auction/user/impl/PUserCommand.java

+13-16
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,33 @@
55
import lombok.Value;
66
import org.mindrot.jbcrypt.BCrypt;
77

8-
import java.sql.Timestamp;
9-
import java.time.Instant;
108
import java.util.Optional;
11-
import java.util.UUID;
129

1310
public interface PUserCommand extends Jsonable {
1411
@Value
1512
final class CreatePUser implements PUserCommand, PersistentEntity.ReplyType<PUser> {
16-
private final Timestamp createdAt;
1713
private final String name;
1814
private final String email;
1915
private final String passwordHash;
2016
}
21-
public static String hashPassword(String password_plaintext) {
22-
String salt = BCrypt.gensalt(12);
23-
String hashed_password = BCrypt.hashpw(password_plaintext, salt);
2417

25-
return (hashed_password);
26-
}
18+
public static String hashPassword(String password_plaintext) {
19+
String salt = BCrypt.gensalt(12);
20+
String hashed_password = BCrypt.hashpw(password_plaintext, salt);
2721

28-
public static boolean checkPassword(String password_plaintext, String stored_hash) {
29-
boolean password_verified = false;
22+
return (hashed_password);
23+
}
24+
25+
public static boolean checkPassword(String password_plaintext, String stored_hash) {
26+
boolean password_verified = false;
3027

31-
if (null == stored_hash)
32-
throw new java.lang.IllegalArgumentException("Invalid hash provided for comparison");
28+
if (null == stored_hash)
29+
throw new java.lang.IllegalArgumentException("Invalid hash provided for comparison");
3330

34-
password_verified = BCrypt.checkpw(password_plaintext, stored_hash);
31+
password_verified = BCrypt.checkpw(password_plaintext, stored_hash);
3532

36-
return (password_verified);
37-
}
33+
return (password_verified);
34+
}
3835

3936

4037
enum GetPUser implements PUserCommand, PersistentEntity.ReplyType<Optional<PUser>> {

user-impl/src/main/java/com/example/auction/user/impl/PUserEntity.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.example.auction.user.impl.PUserEvent.PUserCreated;
66
import com.lightbend.lagom.javadsl.persistence.PersistentEntity;
77

8+
import java.time.Instant;
89
import java.util.Optional;
910
import java.util.UUID;
1011
import java.util.function.Function;
@@ -30,7 +31,7 @@ private Behavior created(PUser user) {
3031
);
3132

3233
b.setReadOnlyCommandHandler(CreatePUser.class, (create, ctx) ->
33-
ctx.invalidCommand("User already exists.")
34+
ctx.invalidCommand("User already exists.")
3435
);
3536

3637
return b.build();
@@ -45,7 +46,7 @@ private Behavior notCreated() {
4546

4647
b.setCommandHandler(CreatePUser.class, (create, ctx) -> {
4748

48-
PUser user = new PUser(UUID.fromString(entityId()),create.getCreatedAt(), create.getName(), create.getEmail(), create.getPasswordHash());
49+
PUser user = new PUser(UUID.fromString(entityId()), Instant.now(), create.getName(), create.getEmail(), create.getPasswordHash());
4950
return ctx.thenPersist(new PUserCreated(user), (e) -> ctx.reply(user));
5051
});
5152

user-impl/src/main/java/com/example/auction/user/impl/UserRepository.java

+17-9
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.datastax.driver.core.BoundStatement;
55
import com.datastax.driver.core.PreparedStatement;
66
import com.datastax.driver.core.Row;
7+
import com.datastax.driver.core.Session;
8+
import com.datastax.driver.extras.codecs.jdk8.InstantCodec;
79
import com.example.auction.pagination.PaginatedSequence;
810
import com.example.auction.user.api.User;
911
import com.lightbend.lagom.javadsl.persistence.AggregateEventTag;
@@ -16,7 +18,6 @@
1618

1719
import javax.inject.Inject;
1820
import javax.inject.Singleton;
19-
import java.sql.Timestamp;
2021
import java.util.Arrays;
2122
import java.util.List;
2223
import java.util.Optional;
@@ -58,7 +59,7 @@ private CompletionStage<Integer> countUsers() {
5859
return session
5960
.selectOne(
6061
"SELECT COUNT(*) FROM UserInfo" +
61-
"ORDER BY createdAt DESC "
62+
"ORDER BY createdAt DESC "
6263
)
6364
.thenApply(row -> (int) row.get().getLong("count"));
6465
}
@@ -84,7 +85,7 @@ private static User convertUserSummary(Row user) {
8485
return new User(
8586

8687
user.getUUID("UserId"),
87-
(Timestamp) user.getTimestamp("createdAt"),
88+
user.get("createdAt", InstantCodec.instance),
8889
user.getString("Name"),
8990

9091
user.getString("email")
@@ -115,6 +116,10 @@ public ReadSideHandler<PUserEvent> buildHandler() {
115116
.build();
116117
}
117118

119+
private void registerCodec(Session session, InstantCodec codec) {
120+
session.getCluster().getConfiguration().getCodecRegistry().register(codec);
121+
}
122+
118123
@Override
119124
public PSequence<AggregateEventTag<PUserEvent>> aggregateTags() {
120125
return PUserEvent.TAG.allTags();
@@ -125,20 +130,23 @@ private CompletionStage<Done> createTables() {
125130
session.executeCreateTable(
126131
"CREATE TABLE IF NOT EXISTS UserInfo (" +
127132
"UserId UUID , " +
128-
"createdAt Timestamp , " +
133+
"createdAt timestamp , " +
129134
"Name text, " +
130-
"email text " +
131-
"PRIMARY KEY (createdAt, userId) " +
135+
"email text, " +
136+
"PRIMARY KEY (userId, createdAt) " +
132137
")" +
133-
"WITH CLUSTERING ORDER BY (createdAt DESC)"
138+
"WITH CLUSTERING ORDER BY (createdAt DESC)"
134139
)
135140

136141
);
137142
}
138143

139144
private CompletionStage<Done> prepareStatements() {
140-
return
141-
prepareInsertUserStatement();
145+
return doAll(
146+
session.underlying()
147+
.thenAccept(s -> registerCodec(s, InstantCodec.instance))
148+
.thenApply(x -> Done.getInstance()),
149+
prepareInsertUserStatement());
142150

143151

144152
}

user-impl/src/main/java/com/example/auction/user/impl/UserServiceImpl.java

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.example.auction.user.impl;
22

33
import akka.NotUsed;
4-
import com.datastax.driver.core.utils.UUIDs;
54
import com.example.auction.pagination.PaginatedSequence;
65
import com.example.auction.user.api.User;
76
import com.example.auction.user.api.UserRegistration;
@@ -12,14 +11,14 @@
1211
import com.lightbend.lagom.javadsl.persistence.PersistentEntityRegistry;
1312

1413
import javax.inject.Inject;
15-
import java.sql.Timestamp;
14+
import java.time.Instant;
1615
import java.util.Optional;
1716
import java.util.UUID;
1817

1918
public class UserServiceImpl implements UserService {
2019

2120
private final PersistentEntityRegistry registry;
22-
private static final Integer DEFAULT_PAGE_SIZE = 10;
21+
private static final Integer DEFAULT_PAGE_SIZE = 10;
2322
private final UserRepository userRepository;
2423

2524
@Inject
@@ -34,11 +33,11 @@ public UserServiceImpl(PersistentEntityRegistry registry, UserRepository userRep
3433
public ServiceCall<UserRegistration, User> createUser() {
3534
return user -> {
3635
UUID uuid = UUID.randomUUID();
37-
Timestamp createdAt =new Timestamp(System.currentTimeMillis());
36+
Instant createdAt = Instant.now();
3837
String password = PUserCommand.hashPassword(user.getPassword());
39-
PUser createdUser = new PUser(uuid,createdAt, user.getName(), user.getEmail(), password);
38+
PUser createdUser = new PUser(uuid, createdAt, user.getName(), user.getEmail(), password);
4039
return entityRef(uuid)
41-
.ask(new PUserCommand.CreatePUser(createdAt,user.getName(), user.getEmail(), password))
40+
.ask(new PUserCommand.CreatePUser(user.getName(), user.getEmail(), password))
4241
.thenApply(done -> Mappers.toApi(createdUser));
4342
};
4443
}

user-impl/src/test/java/com/example/auction/user/impl/UserEntityTest.java

+12-8
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22

33
import akka.actor.ActorSystem;
44
import akka.testkit.JavaTestKit;
5-
import com.datastax.driver.core.utils.UUIDs;
65
import com.example.auction.user.impl.PUserCommand.CreatePUser;
76
import com.lightbend.lagom.javadsl.testkit.PersistentEntityTestDriver;
87
import com.lightbend.lagom.javadsl.testkit.PersistentEntityTestDriver.Outcome;
98
import org.junit.*;
109

11-
import java.sql.Timestamp;
10+
import java.time.Instant;
1211
import java.util.Collections;
1312
import java.util.Optional;
1413
import java.util.UUID;
@@ -33,14 +32,14 @@ public static void shutdownActorSystem() {
3332
}
3433

3534
private final UUID id = UUID.randomUUID();
36-
private final Timestamp createdAt = new Timestamp(System.currentTimeMillis());
35+
private final Instant createdAt = Instant.now();
3736
private final String name = "admin";
3837
private final String email = "[email protected]";
3938

4039
private final String password = PUserCommand.hashPassword("admin");
4140

4241

43-
private final PUser user = new PUser(id,createdAt, name, email, password);
42+
private final PUser user = new PUser(id, Instant.now(), name, email, password);
4443

4544

4645
@Before
@@ -59,16 +58,21 @@ public void noIssues() {
5958
@Test
6059
public void testCreateUser() {
6160
Outcome<PUserEvent, Optional<PUser>> outcome = driver.run(
62-
new CreatePUser(user.getCreatedAt(),user.getName(), user.getEmail(), user.getPasswordHash()));
63-
assertEquals(user, outcome.getReplies().get(0));
61+
new CreatePUser(user.getName(), user.getEmail(), user.getPasswordHash()));
62+
63+
assertEquals(name, ((PUserEvent.PUserCreated) outcome.events().get(0)).getUser().getName());
64+
assertEquals(email, ((PUserEvent.PUserCreated) outcome.events().get(0)).getUser().getEmail());
65+
assertEquals(id, ((PUserEvent.PUserCreated) outcome.events().get(0)).getUser().getId());
66+
assertEquals(password, ((PUserEvent.PUserCreated) outcome.events().get(0)).getUser().getPasswordHash());
67+
6468
assertEquals(Collections.emptyList(), driver.getAllIssues());
6569
}
6670

6771
@Test
6872
public void testRejectDuplicateCreate() {
69-
driver.run(new CreatePUser(user.getCreatedAt(),user.getName(), user.getEmail(), user.getPasswordHash()));
73+
driver.run(new CreatePUser(user.getName(), user.getEmail(), user.getPasswordHash()));
7074
Outcome<PUserEvent, Optional<PUser>> outcome = driver.run(
71-
new CreatePUser(user.getCreatedAt(),user.getName(), user.getEmail(), user.getPasswordHash()));
75+
new CreatePUser(user.getName(), user.getEmail(), user.getPasswordHash()));
7276
assertEquals(PUserEntity.InvalidCommandException.class, outcome.getReplies().get(0).getClass());
7377
assertEquals(Collections.emptyList(), outcome.events());
7478
assertEquals(Collections.emptyList(), driver.getAllIssues());

user-impl/src/test/java/com/example/auction/user/impl/UserRepositoryTest.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import org.junit.BeforeClass;
1515
import org.junit.Test;
1616

17-
import java.sql.Timestamp;
17+
import java.time.Instant;
1818
import java.util.UUID;
1919
import java.util.concurrent.ExecutionException;
2020
import java.util.concurrent.TimeoutException;
@@ -48,14 +48,14 @@ public static void afterAll() {
4848
}
4949

5050
private ReadSideTestDriver testDriver = testServer.injector().instanceOf(ReadSideTestDriver.class);
51-
private UserRepository UserRepository = testServer.injector().instanceOf(UserRepository.class);
51+
private UserRepository userRepository = testServer.injector().instanceOf(UserRepository.class);
5252
private AtomicInteger offset;
5353

5454
private final UUID userId = UUID.randomUUID();
5555
private final String name = "admin";
5656
private final String email = "[email protected]";
5757
private final String password = PUserCommand.hashPassword("admin");
58-
private final Timestamp createdAt = new Timestamp(System.currentTimeMillis());
58+
private final Instant createdAt = Instant.now();
5959

6060
private final PUser userCreated = new PUser(userId, createdAt, name, email, password);
6161

@@ -66,7 +66,7 @@ public void restartOffset() {
6666

6767

6868
public PaginatedSequence<User> shouldGetUsers() throws InterruptedException, ExecutionException, TimeoutException {
69-
return Await.result(UserRepository.getUsers(0, 10));
69+
return Await.result(userRepository.getUsers(0, 10));
7070
}
7171

7272
@Test
@@ -87,15 +87,15 @@ public void shouldPaginateUserRetrieval() throws InterruptedException, Execution
8787
feed(new PUserEvent.PUserCreated(buildFixture(createdAt, i)));
8888
}
8989

90-
PaginatedSequence<User> createdUsers = Await.result(UserRepository.getUsers(1, 10));
90+
PaginatedSequence<User> createdUsers = Await.result(userRepository.getUsers(1, 10));
9191
assertEquals(25, createdUsers.getCount());
9292
assertEquals(10, createdUsers.getItems().size());
9393
// default ordering is time DESC so page 2 of size 10 over a set of 25 returns item ids 5-14. On that seq, the fifth item is id=10
9494
assertEquals("user10", createdUsers.getItems().get(4).getName());
9595

9696
}
9797

98-
private PUser buildFixture(Timestamp createdAt, int i) {
98+
private PUser buildFixture(Instant createdAt, int i) {
9999

100100
return new PUser(UUID.randomUUID(), createdAt, name + i, email + i, password);
101101
}

user-impl/src/test/java/com/example/auction/user/impl/UserServiceImplTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public void shouldBeAbleToCreateUsers() throws Exception {
2525
User createdUser = userService.createUser().invoke(userRegistration).toCompletableFuture().get(10, SECONDS);
2626
assertEquals(name, createdUser.getName());
2727
assertEquals(email, createdUser.getEmail());
28-
assertEquals(createdUser, userService.getUser(createdUser.getId()).invoke().toCompletableFuture().get(10, SECONDS));
28+
2929
});
3030
}
3131

Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
play.http.secret.key = "somesecret"
22
online-auction.instruction.show = true
3-
lagom.persistence.read-side.global-prepare-timeout = 60s
43
//TODO: reenable the play26 default filters and configure them appropriately
54
play.filters.enabled = []

0 commit comments

Comments
 (0)