Skip to content

Commit 1556faf

Browse files
committed
Provide request ID
1 parent 0760bf3 commit 1556faf

File tree

2 files changed

+33
-5
lines changed

2 files changed

+33
-5
lines changed

project-management/src/main/java/life/qbic/projectmanagement/application/api/AsyncProjectService.java

+30-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package life.qbic.projectmanagement.application.api;
22

3+
import java.util.UUID;
34
import reactor.core.publisher.Mono;
45

56
/**
@@ -62,6 +63,24 @@ sealed interface UpdateResponseBody permits ProjectDesign {
6263

6364
}
6465

66+
/**
67+
* Cacheable requests provide a unique identifier so cache implementations can unambiguously
68+
* manage the requests.
69+
*
70+
* @since 1.9.0
71+
*/
72+
sealed interface CacheableRequest permits ProjectUpdateRequest {
73+
74+
/**
75+
* Returns an ID that is unique to the request.
76+
*
77+
* @return the id
78+
* @since 1.9.0
79+
*/
80+
String requestId();
81+
82+
}
83+
6584
/**
6685
* Container for passing information in an {@link UpdateRequestBody} or
6786
* {@link UpdateResponseBody}.
@@ -82,8 +101,17 @@ record ProjectDesign(String title, String objective) implements UpdateRequestBod
82101
* @param requestBody the information to be updated.
83102
* @since 1.9.0
84103
*/
85-
record ProjectUpdateRequest(String projectId, UpdateRequestBody requestBody) {
104+
record ProjectUpdateRequest(String projectId, UpdateRequestBody requestBody, String id) implements
105+
CacheableRequest {
86106

107+
public ProjectUpdateRequest(String projectId, UpdateRequestBody requestBody) {
108+
this(projectId, requestBody, UUID.randomUUID().toString());
109+
}
110+
111+
@Override
112+
public String requestId() {
113+
return id;
114+
}
87115
}
88116

89117
/**
@@ -93,7 +121,7 @@ record ProjectUpdateRequest(String projectId, UpdateRequestBody requestBody) {
93121
* @param responseBody the information that was updated.
94122
* @since 1.9.0
95123
*/
96-
record ProjectUpdateResponse(String projectId, UpdateResponseBody responseBody) {
124+
record ProjectUpdateResponse(String projectId, UpdateResponseBody responseBody, String requestId) {
97125

98126
}
99127

project-management/src/main/java/life/qbic/projectmanagement/application/api/AsyncProjectServiceImpl.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public Mono<ProjectUpdateResponse> update(@NonNull ProjectUpdateRequest request)
4040
case ProjectDesign design:
4141
return
4242
withSecurityContext(SecurityContextHolder.getContext(),
43-
() -> updateProjectDesign(projectId, design)).subscribeOn(scheduler);
43+
() -> updateProjectDesign(projectId, design, request.requestId())).subscribeOn(scheduler);
4444
default:
4545
return Mono.error(new UnknownRequestException("Invalid request body"));
4646
}
@@ -59,13 +59,13 @@ private Mono<ProjectUpdateResponse> withSecurityContext(SecurityContext sctx,
5959
}).contextWrite(rcontext);
6060
}
6161

62-
private Mono<ProjectUpdateResponse> updateProjectDesign(String projectId, ProjectDesign design) {
62+
private Mono<ProjectUpdateResponse> updateProjectDesign(String projectId, ProjectDesign design, String requestId) {
6363
return Mono.create(sink -> {
6464
try {
6565
var id = ProjectId.parse(projectId);
6666
projectService.updateTitle(id, design.title());
6767
projectService.updateObjective(id, design.objective());
68-
sink.success(new ProjectUpdateResponse(projectId, design));
68+
sink.success(new ProjectUpdateResponse(projectId, design, requestId));
6969
} catch (IllegalArgumentException e) {
7070
sink.error(new RequestFailedException("Invalid project id: " + projectId));
7171
} catch (org.springframework.security.access.AccessDeniedException e) {

0 commit comments

Comments
 (0)