Skip to content

Commit 65dae6d

Browse files
committed
refactor: cel expression creation
1 parent be76661 commit 65dae6d

4 files changed

Lines changed: 35 additions & 43 deletions

File tree

src/main/java/com/metaformsystems/redline/api/controller/EdcDataController.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@
5454

5555
import java.io.IOException;
5656
import java.time.Instant;
57+
import java.util.ArrayList;
5758
import java.util.List;
5859
import java.util.Map;
60+
import java.util.Optional;
5961

6062
@RestController
6163
@Tag(name = "EDC data operations", description = "UI API for uploading and downloading data, managing EDC data transfers, and related operations")
@@ -87,8 +89,8 @@ public ResponseEntity<Void> uploadFile(@PathVariable Long participantId,
8789
@PathVariable Long providerId,
8890
@RequestPart("publicMetadata") Map<String, Object> publicMetadata,
8991
@RequestPart("privateMetadata") Map<String, Object> privateMetadata,
90-
@RequestPart(value = "celExpressions", required = false) List<CelExpression> celExpressions,
91-
@RequestPart(value = "policySet", required = false) PolicySet policySet,
92+
@RequestPart(name = "celExpressions", required = false) Optional<ArrayList<CelExpression>> celExpressions,
93+
@RequestPart(name = "policySet", required = false) PolicySet policySet,
9294
@RequestPart("file") MultipartFile file) {
9395
try {
9496
dataAccessService.uploadFileForParticipant(
@@ -98,7 +100,7 @@ public ResponseEntity<Void> uploadFile(@PathVariable Long participantId,
98100
file.getInputStream(),
99101
file.getContentType(),
100102
file.getOriginalFilename(),
101-
celExpressions,
103+
celExpressions.orElseGet(ArrayList::new),
102104
policySet
103105
);
104106
} catch (IOException e) {

src/main/java/com/metaformsystems/redline/domain/service/DataAccessService.java

Lines changed: 22 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package com.metaformsystems.redline.domain.service;
1717

1818
import com.metaformsystems.redline.api.dto.request.TransferProcessRequest;
19-
import com.metaformsystems.redline.infrastructure.client.management.dto.ContractRequest;
2019
import com.metaformsystems.redline.api.dto.response.FileResource;
2120
import com.metaformsystems.redline.domain.entity.UploadedFile;
2221
import com.metaformsystems.redline.domain.exception.ObjectNotFoundException;
@@ -27,6 +26,7 @@
2726
import com.metaformsystems.redline.infrastructure.client.management.dto.Catalog;
2827
import com.metaformsystems.redline.infrastructure.client.management.dto.CelExpression;
2928
import com.metaformsystems.redline.infrastructure.client.management.dto.ContractNegotiation;
29+
import com.metaformsystems.redline.infrastructure.client.management.dto.ContractRequest;
3030
import com.metaformsystems.redline.infrastructure.client.management.dto.Criterion;
3131
import com.metaformsystems.redline.infrastructure.client.management.dto.NewContractDefinition;
3232
import com.metaformsystems.redline.infrastructure.client.management.dto.NewPolicyDefinition;
@@ -77,23 +77,11 @@ public DataAccessService(DataPlaneApiClient dataPlaneApiClient, WebDidResolver w
7777
}
7878

7979
@Transactional
80-
public void uploadFileForParticipant(Long participantId, Map<String, Object> publicMetadata, Map<String, Object> privateMetadata, InputStream fileStream, String contentType, String originalFilename, List<CelExpression> celExpressions, PolicySet policySet) {
80+
public void uploadFileForParticipant(Long participantId, Map<String, Object> publicMetadata, Map<String, Object> privateMetadata, InputStream fileStream, String contentType, String originalFilename, ArrayList<CelExpression> celExpressions, PolicySet policySet) {
8181

8282
var participant = participantRepository.findById(participantId).orElseThrow(() -> new ObjectNotFoundException("Participant not found with id: " + participantId));
8383
var participantContextId = participant.getParticipantContextId();
8484

85-
86-
//-1. create CEL expressions
87-
if (celExpressions != null) {
88-
celExpressions.forEach(celExpression -> {
89-
try {
90-
managementApiClient.createCelExpression(celExpression);
91-
} catch (WebClientResponseException.Conflict e) {
92-
//do nothing, CEL expression already exists
93-
}
94-
});
95-
}
96-
9785
//0. upload file to data plane
9886
var assetId = UUID.randomUUID().toString();
9987
publicMetadata.put("assetId", assetId);
@@ -102,26 +90,28 @@ public void uploadFileForParticipant(Long participantId, Map<String, Object> pub
10290
var response = dataPlaneApiClient.uploadMultipart(participantContextId, combinedMetadata, fileStream);
10391
var fileId = response.id();
10492

105-
//1. create asset
106-
publicMetadata.put("fileId", fileId);
93+
//1. create CEL expressions
94+
celExpressions.add(CelExpression.Builder.aNewCelExpression()
95+
.id(MEMBERSHIP_EXPRESSION_ID)
96+
.leftOperand("MembershipCredential")
97+
.description("Expression for evaluating membership credential")
98+
.scopes(Set.of("catalog", "contract.negotiation", "transfer.process"))
99+
.expression(MEMBERSHIP_EXPRESSION)
100+
.build());
101+
celExpressions.forEach(celExpression -> {
102+
try {
103+
managementApiClient.createCelExpression(celExpression);
104+
} catch (WebClientResponseException.Conflict e) {
105+
//do nothing, CEL expression already exists
106+
}
107+
});
107108

109+
//2. create asset
110+
publicMetadata.put("fileId", fileId);
108111
var asset = createAsset(assetId, publicMetadata, privateMetadata, contentType, originalFilename);
109112
managementApiClient.createAsset(participantContextId, asset);
110113

111-
// create CEL expression
112-
try {
113-
managementApiClient.createCelExpression(CelExpression.Builder.aNewCelExpression()
114-
.id(MEMBERSHIP_EXPRESSION_ID)
115-
.leftOperand("MembershipCredential")
116-
.description("Expression for evaluating membership credential")
117-
.scopes(Set.of("catalog", "contract.negotiation", "transfer.process"))
118-
.expression(MEMBERSHIP_EXPRESSION)
119-
.build());
120-
} catch (WebClientResponseException.Conflict e) {
121-
//do nothing, CEL expression already exists
122-
}
123-
124-
//2. create policy
114+
//3. create policy
125115
if (policySet != null) {
126116
var constraints = new ArrayList<>(List.of(MEMBERSHIP_CONSTRAINT));
127117
constraints.addAll(policySet.getPermission().getFirst().getConstraint());
@@ -136,7 +126,7 @@ public void uploadFileForParticipant(Long participantId, Map<String, Object> pub
136126
.policy(policySet).build();
137127
managementApiClient.createPolicy(participantContextId, policy);
138128

139-
//3. create contract definition if none exists
129+
//4. create contract definition if none exists
140130
var contractDef = NewContractDefinition.Builder.aNewContractDefinition()
141131
.id(UUID.randomUUID().toString())
142132
.contractPolicyId(policy.getId())
@@ -146,7 +136,7 @@ public void uploadFileForParticipant(Long participantId, Map<String, Object> pub
146136
managementApiClient.createContractDefinition(participantContextId, contractDef);
147137

148138

149-
//2. track uploaded file in DB
139+
//5. track uploaded file in DB
150140
participant.getUploadedFiles().add(new UploadedFile(fileId, originalFilename, contentType, combinedMetadata));
151141
}
152142

src/test/java/com/metaformsystems/redline/api/controller/EdcDataControllerTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,15 +174,15 @@ void shouldUploadFile() throws Exception {
174174
var constraints = new MockPart("constraints", "[{\"leftOperand\":\"purpose\",\"operator\":\"eq\",\"rightOperand\":\"test\"}]".getBytes());
175175
constraints.getHeaders().setContentType(MediaType.APPLICATION_JSON);
176176

177-
// mock create-cel-expression (custom)
178-
mockWebServer.enqueue(new MockResponse().setResponseCode(200));
179-
180177
// Mock the upload response from the dataplane
181178
mockWebServer.enqueue(new MockResponse()
182179
.setResponseCode(200)
183180
.setBody("{\"id\": \"generated-file-id-123\"}")
184181
.addHeader("Content-Type", "application/json"));
185182

183+
// mock create-cel-expression (custom)
184+
mockWebServer.enqueue(new MockResponse().setResponseCode(200));
185+
186186
// mock create-asset
187187
mockWebServer.enqueue(new MockResponse().setResponseCode(200));
188188

src/test/java/com/metaformsystems/redline/domain/service/DataAccessServiceIntegrationTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,14 +163,14 @@ void shouldRequestCatalog_andBypassCacheWithNoCache() {
163163
void shouldUploadFileWithCelExpressionsAndConstraints() {
164164
var participant = createAndSaveParticipant("ctx-upload-1", "did:web:me");
165165

166-
// custom CEL expression
167-
mockWebServer.enqueue(new MockResponse().setResponseCode(200));
168-
169166
// dataplane upload response
170167
mockWebServer.enqueue(new MockResponse()
171168
.setBody("{\"id\": \"generated-file-id-123\"}")
172169
.addHeader("Content-Type", "application/json"));
173170

171+
// custom CEL expression
172+
mockWebServer.enqueue(new MockResponse().setResponseCode(200));
173+
174174
// asset creation
175175
mockWebServer.enqueue(new MockResponse().setResponseCode(200));
176176

@@ -183,13 +183,13 @@ void shouldUploadFileWithCelExpressionsAndConstraints() {
183183
// contract definition
184184
mockWebServer.enqueue(new MockResponse().setResponseCode(200));
185185

186-
var celExpressions = List.of(CelExpression.Builder.aNewCelExpression()
186+
var celExpressions = new ArrayList<>(List.of(CelExpression.Builder.aNewCelExpression()
187187
.id("custom-expression")
188188
.leftOperand("CustomCredential")
189189
.description("Custom expression")
190190
.expression("true")
191191
.scopes(Set.of("catalog"))
192-
.build());
192+
.build()));
193193

194194
var policySet = new PolicySet(List.of(new PolicySet.Permission("use",
195195
List.of(new PolicySet.Constraint("purpose", "eq", "test")))));

0 commit comments

Comments
 (0)