diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/policies/application/mapper/PolicyMapper.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/policies/application/mapper/PolicyMapper.java index 4c5f99344d..742cc853be 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/policies/application/mapper/PolicyMapper.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/policies/application/mapper/PolicyMapper.java @@ -60,7 +60,7 @@ private static List mapToPermissions(List EdcPolicyPermission.builder() // https://github.com/eclipse-tractusx/traceability-foss/issues/978 here we need to make sure that the USE is lowercase in the object. .action(permission.action().name().toLowerCase()) - .edcPolicyPermissionConstraints(mapToConstraint(permission.constraints())) + .edcPolicyPermissionConstraints(mapToConstraint(permission.constraint())) .build() ).toList(); } @@ -79,7 +79,7 @@ private static List mapToConstraintExpr .leftOperand(constraint.leftOperand()) .rightOperand(constraint.rightOperand()) .operator(EdcOperator.builder() - .operatorId("odrl:" + constraint.operatorTypeResponse().getCode()) + .operatorId("odrl:" + constraint.operator().operatorType().getCode()) .build()) .build()) .toList(); diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/policies/infrastructure/PolicyClient.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/policies/infrastructure/PolicyClient.java index 5d423d19cb..9edb9b8b0d 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/policies/infrastructure/PolicyClient.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/policies/infrastructure/PolicyClient.java @@ -44,6 +44,7 @@ import policies.response.ConstraintsResponse; import policies.response.CreatePolicyResponse; import policies.response.IrsPolicyResponse; +import policies.response.OperatorResponse; import policies.response.OperatorTypeResponse; import policies.response.PermissionResponse; import policies.response.PolicyResponse; @@ -137,8 +138,8 @@ public void createPolicyFromAppConfig() { Context context = Context.getDefault(); String policyId = UUID.randomUUID().toString(); - ConstraintResponse constraint = new ConstraintResponse(traceabilityProperties.getLeftOperand(), OperatorTypeResponse.EQ, traceabilityProperties.getRightOperand()); - ConstraintResponse constraintSecond = new ConstraintResponse(traceabilityProperties.getLeftOperandSecond(), OperatorTypeResponse.EQ, traceabilityProperties.getRightOperandSecond()); + ConstraintResponse constraint = new ConstraintResponse(traceabilityProperties.getLeftOperand(), new OperatorResponse(OperatorTypeResponse.EQ), traceabilityProperties.getRightOperand()); + ConstraintResponse constraintSecond = new ConstraintResponse(traceabilityProperties.getLeftOperandSecond(),new OperatorResponse(OperatorTypeResponse.EQ), traceabilityProperties.getRightOperandSecond()); ConstraintsResponse constraints = ConstraintsResponse.builder() .and(List.of(constraint, constraintSecond)) @@ -146,7 +147,7 @@ public void createPolicyFromAppConfig() { PermissionResponse permission = PermissionResponse.builder() .action(PolicyTypeResponse.USE) - .constraints(constraints) + .constraint(constraints) .build(); PolicyResponse policy = new PolicyResponse(policyId, Instant.now().atOffset(ZoneOffset.UTC), validUntil, List.of(permission),null); diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/policies/infrastructure/PolicyRepositoryImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/policies/infrastructure/PolicyRepositoryImpl.java index 6ed64ff23f..0bafbfd3e9 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/policies/infrastructure/PolicyRepositoryImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/policies/infrastructure/PolicyRepositoryImpl.java @@ -149,7 +149,7 @@ private boolean checkConstraint(IrsPolicyResponse irsPolicy, String rightOperand } private Stream getConstraintsStream(PermissionResponse permission) { - ConstraintsResponse constraint = permission.constraints(); + ConstraintsResponse constraint = permission.constraint(); if (constraint == null) { return Stream.empty(); } diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/PolicyRepositoryImplTest.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/PolicyRepositoryImplTest.java index 57ef288d3a..03fd4a2129 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/PolicyRepositoryImplTest.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/assets/infrastructure/base/irs/PolicyRepositoryImplTest.java @@ -39,6 +39,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import policies.response.OperatorResponse; import policies.response.OperatorTypeResponse; import policies.response.PermissionResponse; import policies.response.PolicyResponse; @@ -92,8 +93,8 @@ void givenPolicyExist_whenCreateIrsPolicyIfMissing_thenDoNotCreateApplicationCon // given OffsetDateTime validUntil = OffsetDateTime.parse("2023-07-03T16:01:05.309Z"); OffsetDateTime createdOn = OffsetDateTime.now(); - ConstraintResponse constraint = new ConstraintResponse("leftOperand1", OperatorTypeResponse.EQ, "test"); - ConstraintResponse constraintSecond = new ConstraintResponse("leftOperand2", OperatorTypeResponse.EQ, "test2"); + ConstraintResponse constraint = new ConstraintResponse("leftOperand1", new OperatorResponse(OperatorTypeResponse.EQ), "test"); + ConstraintResponse constraintSecond = new ConstraintResponse("leftOperand2", new OperatorResponse(OperatorTypeResponse.EQ), "test2"); PolicyResponse policy = new PolicyResponse("1", createdOn, validUntil, List.of(new PermissionResponse(PolicyTypeResponse.USE, new ConstraintsResponse(List.of(constraint, constraintSecond), List.of()))),null); Payload payload = new Payload(null, "1", policy); final IrsPolicyResponse existingPolicy = new IrsPolicyResponse(validUntil, payload); @@ -117,8 +118,8 @@ void givenOutdatedPolicyExist_whenCreatePolicyBasedOnAppConfig_thenUpdateIt() { // given OffsetDateTime validUntil = OffsetDateTime.parse("2023-07-03T16:01:05.309Z"); OffsetDateTime createdOn = OffsetDateTime.now(); - ConstraintResponse constraint = new ConstraintResponse("leftOperand1", OperatorTypeResponse.EQ, "test"); - ConstraintResponse constraintSecond = new ConstraintResponse("leftOperand2", OperatorTypeResponse.EQ, "test2"); + ConstraintResponse constraint = new ConstraintResponse("leftOperand1", new OperatorResponse(OperatorTypeResponse.EQ), "test"); + ConstraintResponse constraintSecond = new ConstraintResponse("leftOperand2", new OperatorResponse(OperatorTypeResponse.EQ), "test2"); PolicyResponse policy = new PolicyResponse("test", createdOn, validUntil, List.of(new PermissionResponse(PolicyTypeResponse.USE, new ConstraintsResponse(List.of(constraint, constraintSecond), List.of()))),null); Payload payload = new Payload(null, "test", policy); @@ -144,8 +145,8 @@ void test_getPolicyConstraints() { // GIVEN OffsetDateTime validUntil = OffsetDateTime.now(); OffsetDateTime createdOn = OffsetDateTime.now(); - List andConstraints = List.of(new ConstraintResponse("leftOperand", OperatorTypeResponse.EQ, "rightOperand")); - List orConstraints = List.of(new ConstraintResponse("leftOperand", OperatorTypeResponse.EQ, "rightOperand")); + List andConstraints = List.of(new ConstraintResponse("leftOperand", new OperatorResponse(OperatorTypeResponse.EQ), "rightOperand")); + List orConstraints = List.of(new ConstraintResponse("leftOperand", new OperatorResponse(OperatorTypeResponse.EQ), "rightOperand")); ConstraintsResponse constraints = new ConstraintsResponse(andConstraints, orConstraints); PolicyResponse policy = new PolicyResponse("test", createdOn, validUntil, List.of(new PermissionResponse(PolicyTypeResponse.USE, constraints)), null); diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/testdata/PolicyTestDataFactory.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/testdata/PolicyTestDataFactory.java index 58cec479ac..d5e5e1a18c 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/testdata/PolicyTestDataFactory.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/testdata/PolicyTestDataFactory.java @@ -30,6 +30,7 @@ import policies.response.IrsPolicyResponse; import policies.request.Payload; import org.jetbrains.annotations.NotNull; +import policies.response.OperatorResponse; import policies.response.OperatorTypeResponse; import policies.response.PermissionResponse; import policies.response.PolicyResponse; @@ -55,9 +56,9 @@ public static IrsPolicyResponse createIrsPolicyResponse(String policyId, OffsetD .permissions(List.of( PermissionResponse.builder() .action(PolicyTypeResponse.USE) - .constraints(ConstraintsResponse.builder() - .and(List.of(new ConstraintResponse(andLeftOperand,OperatorTypeResponse.EQ, andRightOperand))) - .or(List.of(new ConstraintResponse(orLeftOperand, OperatorTypeResponse.EQ, orRightOperand))) + .constraint(ConstraintsResponse.builder() + .and(List.of(new ConstraintResponse(andLeftOperand, new OperatorResponse(OperatorTypeResponse.EQ), andRightOperand))) + .or(List.of(new ConstraintResponse(orLeftOperand, new OperatorResponse(OperatorTypeResponse.EQ), orRightOperand))) .build()) .build())) .build()) diff --git a/tx-models/src/main/java/policies/response/ConstraintResponse.java b/tx-models/src/main/java/policies/response/ConstraintResponse.java index 031f617506..3ff1805a97 100644 --- a/tx-models/src/main/java/policies/response/ConstraintResponse.java +++ b/tx-models/src/main/java/policies/response/ConstraintResponse.java @@ -40,8 +40,10 @@ public record ConstraintResponse( @JsonAlias({"odrl:leftOperand"}) String leftOperand, + @Schema - OperatorTypeResponse operatorTypeResponse, + @JsonAlias({"odrl:operator"}) + OperatorResponse operator, @Schema( implementation = String.class, example = "string" @@ -63,7 +65,7 @@ public static Constraint toDomain(ConstraintResponse constraintResponse){ if (constraintResponse == null) { return null; } - Operator operator = new Operator(toDomain(constraintResponse.operatorTypeResponse)); + Operator operator = new Operator(OperatorResponse.toDomain(constraintResponse.operator.operatorType())); return new Constraint( constraintResponse.leftOperand(), @@ -71,15 +73,4 @@ public static Constraint toDomain(ConstraintResponse constraintResponse){ constraintResponse.rightOperand() ); } - - public static OperatorType toDomain(OperatorTypeResponse operatorTypeResponse) { - if (operatorTypeResponse == null) { - return null; - } - - return Arrays.stream(OperatorType.values()) - .filter(type -> type.getCode().equals(operatorTypeResponse.code)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException("Unknown code: " + operatorTypeResponse.code)); - } } diff --git a/tx-models/src/main/java/policies/response/OperatorResponse.java b/tx-models/src/main/java/policies/response/OperatorResponse.java new file mode 100644 index 0000000000..3a10e74b50 --- /dev/null +++ b/tx-models/src/main/java/policies/response/OperatorResponse.java @@ -0,0 +1,30 @@ +package policies.response; + +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import org.eclipse.tractusx.irs.edc.client.policy.OperatorType; + +import java.util.Arrays; +@Builder +@Schema +public record OperatorResponse( + @JsonProperty("@id") + @Schema( + implementation = OperatorType.class, + example = "odrl:eq" + ) + OperatorTypeResponse operatorType +) { + public static OperatorType toDomain(OperatorTypeResponse operatorTypeResponse) { + if (operatorTypeResponse == null) { + return null; + } + + return Arrays.stream(OperatorType.values()) + .filter(type -> type.getCode().equals(operatorTypeResponse.code)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("Unknown code: " + operatorTypeResponse.code)); + } +} diff --git a/tx-models/src/main/java/policies/response/OperatorTypeResponse.java b/tx-models/src/main/java/policies/response/OperatorTypeResponse.java index 316a075248..16c9427def 100644 --- a/tx-models/src/main/java/policies/response/OperatorTypeResponse.java +++ b/tx-models/src/main/java/policies/response/OperatorTypeResponse.java @@ -19,9 +19,14 @@ package policies.response; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Getter; +import org.eclipse.tractusx.irs.edc.client.policy.OperatorType; + +import java.util.NoSuchElementException; +import java.util.stream.Stream; @JsonSerialize( @@ -64,4 +69,20 @@ public enum OperatorTypeResponse { this.label = label; } + @JsonCreator + public static OperatorTypeResponse fromValue(String value) { + String operator; + if (value.startsWith("odrl:")) { + operator = value.substring(5); + } else { + operator = value; + } + + return (OperatorTypeResponse) Stream.of(values()).filter((operatorType) -> { + return operatorType.code.equals(operator); + }).findFirst().orElseThrow(() -> { + return new NoSuchElementException("Unsupported OperatorType: " + operator); + }); + } + } diff --git a/tx-models/src/main/java/policies/response/PermissionResponse.java b/tx-models/src/main/java/policies/response/PermissionResponse.java index 3b1c1bd83b..83df338b5c 100644 --- a/tx-models/src/main/java/policies/response/PermissionResponse.java +++ b/tx-models/src/main/java/policies/response/PermissionResponse.java @@ -39,7 +39,7 @@ public record PermissionResponse( @Schema @JsonAlias({"odrl:constraint"}) - ConstraintsResponse constraints + ConstraintsResponse constraint ) { public static PolicyType toDomain(PolicyTypeResponse response){ @@ -62,7 +62,7 @@ public static Permission toDomain(PermissionResponse permissionResponse) { } return Permission.builder() .action(toDomain(permissionResponse.action)) - .constraint(ConstraintsResponse.toDomain(permissionResponse.constraints)) + .constraint(ConstraintsResponse.toDomain(permissionResponse.constraint)) .build(); } }