Skip to content

Commit a69074c

Browse files
committed
Make todoId UUID
1 parent d6db1a0 commit a69074c

File tree

5 files changed

+35
-29
lines changed

5 files changed

+35
-29
lines changed

todo-api/src/main/java/lol/maki/dev/todo/Todo.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,33 @@
66
import am.ik.yavi.arguments.Arguments7;
77
import am.ik.yavi.arguments.Arguments7Validator;
88
import am.ik.yavi.arguments.BooleanValidator;
9+
import am.ik.yavi.arguments.ObjectValidator;
910
import am.ik.yavi.arguments.StringValidator;
1011
import am.ik.yavi.builder.BooleanValidatorBuilder;
12+
import am.ik.yavi.builder.ObjectValidatorBuilder;
1113
import am.ik.yavi.builder.StringValidatorBuilder;
1214
import am.ik.yavi.core.Constraint;
1315
import am.ik.yavi.validator.Yavi;
1416
import com.fasterxml.jackson.annotation.JsonInclude;
1517
import java.time.Instant;
18+
import java.util.UUID;
1619
import java.util.function.Function;
1720
import org.jilt.Builder;
1821

1922
@JsonInclude(JsonInclude.Include.NON_NULL)
20-
public record Todo(String todoId, String todoTitle, boolean finished, Instant createdAt, String createdBy,
23+
public record Todo(UUID todoId, String todoTitle, boolean finished, Instant createdAt, String createdBy,
2124
Instant updatedAt, String updatedBy) {
2225

23-
public static StringValidator<String> todoIdValidator = StringValidatorBuilder
24-
.of("todoId", c -> c.notBlank().lessThanOrEqual(255))
26+
public static ObjectValidator<UUID, UUID> todoIdValidator = ObjectValidatorBuilder
27+
.<UUID>of("todoId", Constraint::notNull)
2528
.build();
2629

2730
public static StringValidator<String> todoTitleValidator = StringValidatorBuilder
2831
.of("todoTitle", c -> c.notBlank().lessThanOrEqual(255))
2932
.build();
3033

31-
public static BooleanValidator<Boolean> finishedValidator = BooleanValidatorBuilder.of("finished", c -> c.notNull())
34+
public static BooleanValidator<Boolean> finishedValidator = BooleanValidatorBuilder
35+
.of("finished", Constraint::notNull)
3236
.build();
3337

3438
private static final Function<String, Arguments2Validator<Instant, String, Arguments2<Instant, String>>> auditInfoValidator = name -> Yavi
@@ -43,18 +47,18 @@ public record Todo(String todoId, String todoTitle, boolean finished, Instant cr
4347
public static final Arguments2Validator<Instant, String, Arguments2<Instant, String>> updatedValidator = auditInfoValidator
4448
.apply("updated");
4549

46-
public static final Arguments7Validator<String, String, Boolean, Instant, String, Instant, String, Todo> validator = Arguments7Validator
50+
public static final Arguments7Validator<UUID, String, Boolean, Instant, String, Instant, String, Todo> validator = Arguments7Validator
4751
.unwrap(todoIdValidator.split(todoTitleValidator)
4852
.split(finishedValidator)
4953
.apply(Arguments::of)
50-
.<Arguments7<String, String, Boolean, Instant, String, Instant, String>>compose(Arguments7::first3)
54+
.<Arguments7<UUID, String, Boolean, Instant, String, Instant, String>>compose(Arguments7::first3)
5155
.combine(createdValidator.compose(args -> Arguments.of(args.arg4(), args.arg5())))
5256
.combine(updatedValidator.compose(Arguments7::last2))
5357
.apply((a1, a2, a3) -> new Todo(a1.arg1(), a1.arg2(), a1.arg3(), a2.arg1(), a2.arg2(), a3.arg1(),
5458
a3.arg2())));
5559

5660
@Builder(className = "TodoBuilder", factoryMethod = "todo", toBuilder = "from", packageName = "lol.maki.dev.todo")
57-
public static Todo create(String todoId, String todoTitle, boolean finished, Instant createdAt, String createdBy,
61+
public static Todo create(UUID todoId, String todoTitle, boolean finished, Instant createdAt, String createdBy,
5862
Instant updatedAt, String updatedBy) {
5963
return validator.validated(todoId, todoTitle, finished, createdAt, createdBy, updatedAt, updatedBy);
6064
}

todo-api/src/main/java/lol/maki/dev/todo/TodoController.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.net.URI;
66
import java.util.List;
77
import java.util.Map;
8+
import java.util.UUID;
89
import org.springframework.http.HttpStatus;
910
import org.springframework.http.ResponseEntity;
1011
import org.springframework.security.core.annotation.AuthenticationPrincipal;
@@ -37,7 +38,7 @@ public ResponseEntity<List<Todo>> getTodos() {
3738
}
3839

3940
@GetMapping(path = "/{todoId}")
40-
public ResponseEntity<Todo> getTodo(@PathVariable("todoId") String todoId) {
41+
public ResponseEntity<Todo> getTodo(@PathVariable("todoId") UUID todoId) {
4142
Todo todo = this.todoService.getTodo(todoId);
4243
return ResponseEntity.ok(todo);
4344
}
@@ -47,21 +48,21 @@ public ResponseEntity<Todo> postTodos(@RequestBody Map<String, Object> request,
4748
UriComponentsBuilder builder) {
4849
String email = jwt.getClaimAsString("email");
4950
Todo created = this.todoService.create((String) request.get("todoTitle"), email);
50-
URI uri = builder.pathSegment("todos", created.todoId()).build().toUri();
51+
URI uri = builder.pathSegment("todos", created.todoId().toString()).build().toUri();
5152
return ResponseEntity.created(uri).body(created);
5253
}
5354

5455
@PatchMapping(path = "/{todoId}")
55-
public ResponseEntity<Todo> patchTodo(@PathVariable("todoId") String todoId,
56-
@RequestBody Map<String, Object> request, @AuthenticationPrincipal Jwt jwt) {
56+
public ResponseEntity<Todo> patchTodo(@PathVariable("todoId") UUID todoId, @RequestBody Map<String, Object> request,
57+
@AuthenticationPrincipal Jwt jwt) {
5758
String email = jwt.getClaimAsString("email");
5859
Todo updated = this.todoService.update(todoId, (String) request.get("todoTitle"),
5960
(Boolean) request.get("finished"), email);
6061
return ResponseEntity.ok(updated);
6162
}
6263

6364
@DeleteMapping(path = "/{todoId}")
64-
public ResponseEntity<Void> deleteTodo(@PathVariable("todoId") String todoId) {
65+
public ResponseEntity<Void> deleteTodo(@PathVariable("todoId") UUID todoId) {
6566
this.todoService.deleteById(todoId);
6667
return ResponseEntity.noContent().build();
6768
}

todo-api/src/main/java/lol/maki/dev/todo/TodoRepository.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
import java.util.List;
77
import java.util.Map;
88
import java.util.Optional;
9-
9+
import java.util.UUID;
1010
import org.springframework.stereotype.Component;
1111

1212
@Component
1313
public class TodoRepository {
1414

15-
private final Map<String, Todo> map = Collections.synchronizedMap(new LinkedHashMap<>());
15+
private final Map<UUID, Todo> map = Collections.synchronizedMap(new LinkedHashMap<>());
1616

17-
public Optional<Todo> findById(String todoId) {
17+
public Optional<Todo> findById(UUID todoId) {
1818
return Optional.ofNullable(this.map.get(todoId));
1919
}
2020

@@ -27,7 +27,7 @@ public Todo save(Todo todo) {
2727
return todo;
2828
}
2929

30-
public void deleteById(String todoId) {
30+
public void deleteById(UUID todoId) {
3131
this.map.remove(todoId);
3232
}
3333

todo-api/src/main/java/lol/maki/dev/todo/TodoService.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.time.Instant;
55
import java.util.List;
66
import java.util.Objects;
7+
import java.util.UUID;
78
import org.springframework.stereotype.Service;
89
import org.springframework.util.IdGenerator;
910

@@ -26,14 +27,14 @@ public List<Todo> getTodos() {
2627
return this.todoRepository.findAll();
2728
}
2829

29-
public Todo getTodo(String todoId) {
30+
public Todo getTodo(UUID todoId) {
3031
return this.todoRepository.findById(todoId).orElseThrow(() -> new NotFoundException(todoId));
3132
}
3233

3334
public Todo create(String todoTitle, String email) {
3435
Instant now = this.clock.instant();
3536
Todo todo = TodoBuilder.todo()
36-
.todoId(this.idGenerator.generateId().toString())
37+
.todoId(this.idGenerator.generateId())
3738
.todoTitle(todoTitle)
3839
.finished(false)
3940
.createdBy(email)
@@ -45,7 +46,7 @@ public Todo create(String todoTitle, String email) {
4546
return this.todoRepository.save(updated);
4647
}
4748

48-
public Todo update(String todoId, String todoTitle, boolean finished, String username) {
49+
public Todo update(UUID todoId, String todoTitle, boolean finished, String username) {
4950
return this.todoRepository.findById(todoId).map(t -> {
5051
TodoBuilder builder = TodoBuilder.from(t);
5152
boolean touched = false;
@@ -65,13 +66,13 @@ public Todo update(String todoId, String todoTitle, boolean finished, String use
6566
}).map(this.todoRepository::save).orElseThrow(() -> new NotFoundException(todoId));
6667
}
6768

68-
public void deleteById(String todoId) {
69+
public void deleteById(UUID todoId) {
6970
this.todoRepository.deleteById(todoId);
7071
}
7172

7273
public static class NotFoundException extends RuntimeException {
7374

74-
public NotFoundException(String todoId) {
75+
public NotFoundException(UUID todoId) {
7576
super("Todo not found: todoId=%s".formatted(todoId));
7677
}
7778

todo-api/src/test/java/lol/maki/dev/todo/TodoApiApplicationTests.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ void shouldCreateTodoWithSufficientScope() {
7171
.toEntity(Todo.class);
7272
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED);
7373
assertThat(response.getBody()).isEqualTo(TodoBuilder.todo()
74-
.todoId("00000000-0000-0000-0000-000000000001")
74+
.todoId(UUID.fromString("00000000-0000-0000-0000-000000000001"))
7575
.todoTitle("Hello World!")
7676
.finished(false)
7777
.createdAt(Instant.parse("2024-11-01T00:00:00Z"))
@@ -92,7 +92,7 @@ void shouldCreateTodoWithSufficientScope() {
9292
.toEntity(Todo.class);
9393
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED);
9494
assertThat(response.getBody()).isEqualTo(TodoBuilder.todo()
95-
.todoId("00000000-0000-0000-0000-000000000002")
95+
.todoId(UUID.fromString("00000000-0000-0000-0000-000000000002"))
9696
.todoTitle("Test Todo!")
9797
.finished(false)
9898
.createdAt(Instant.parse("2024-11-01T00:00:01Z"))
@@ -135,7 +135,7 @@ void shouldRetrieveTodoListWithSufficientScope() {
135135
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
136136
assertThat(response.getBody()).containsExactly(
137137
TodoBuilder.todo()
138-
.todoId("00000000-0000-0000-0000-000000000001")
138+
.todoId(UUID.fromString("00000000-0000-0000-0000-000000000001"))
139139
.todoTitle("Hello World!")
140140
.finished(false)
141141
.createdAt(Instant.parse("2024-11-01T00:00:00Z"))
@@ -144,7 +144,7 @@ void shouldRetrieveTodoListWithSufficientScope() {
144144
.updatedBy("[email protected]")
145145
.build(),
146146
TodoBuilder.todo()
147-
.todoId("00000000-0000-0000-0000-000000000002")
147+
.todoId(UUID.fromString("00000000-0000-0000-0000-000000000002"))
148148
.todoTitle("Test Todo!")
149149
.finished(false)
150150
.createdAt(Instant.parse("2024-11-01T00:00:01Z"))
@@ -182,7 +182,7 @@ void shouldRetrieveSingleTodoWithSufficientScope() {
182182
.toEntity(Todo.class);
183183
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
184184
assertThat(response.getBody()).isEqualTo(TodoBuilder.todo()
185-
.todoId("00000000-0000-0000-0000-000000000001")
185+
.todoId(UUID.fromString("00000000-0000-0000-0000-000000000001"))
186186
.todoTitle("Hello World!")
187187
.finished(false)
188188
.createdAt(Instant.parse("2024-11-01T00:00:00Z"))
@@ -199,7 +199,7 @@ void shouldRetrieveSingleTodoWithSufficientScope() {
199199
.toEntity(Todo.class);
200200
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
201201
assertThat(response.getBody()).isEqualTo(TodoBuilder.todo()
202-
.todoId("00000000-0000-0000-0000-000000000002")
202+
.todoId(UUID.fromString("00000000-0000-0000-0000-000000000002"))
203203
.todoTitle("Test Todo!")
204204
.finished(false)
205205
.createdAt(Instant.parse("2024-11-01T00:00:01Z"))
@@ -262,7 +262,7 @@ void shouldUpdateTodoWithSufficientScope() {
262262
.toEntity(Todo.class);
263263
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
264264
assertThat(response.getBody()).isEqualTo(TodoBuilder.todo()
265-
.todoId("00000000-0000-0000-0000-000000000001")
265+
.todoId(UUID.fromString("00000000-0000-0000-0000-000000000001"))
266266
.todoTitle("Hello World!!")
267267
.finished(true)
268268
.createdAt(Instant.parse("2024-11-01T00:00:00Z"))
@@ -279,7 +279,7 @@ void shouldUpdateTodoWithSufficientScope() {
279279
.toEntity(Todo.class);
280280
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
281281
assertThat(response.getBody()).isEqualTo(TodoBuilder.todo()
282-
.todoId("00000000-0000-0000-0000-000000000001")
282+
.todoId(UUID.fromString("00000000-0000-0000-0000-000000000001"))
283283
.todoTitle("Hello World!!")
284284
.finished(true)
285285
.createdAt(Instant.parse("2024-11-01T00:00:00Z"))

0 commit comments

Comments
 (0)