From 17595056e2a4a6b819b371e38265752dd877b45b Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Mon, 9 Sep 2024 19:37:50 +0200 Subject: [PATCH 01/17] Migrate DNA Enmeshed SDK changes to the new repository --- .../enmeshed/EnmeshedOnboardingService.java | 57 +-- .../eu/enmeshed/client/EnmeshedClient.java | 39 +- .../eu/enmeshed/model/AttributeWrapper.java | 6 +- src/main/java/eu/enmeshed/model/AuditLog.java | 32 ++ .../enmeshed/model/attributes/Attribute.java | 15 +- .../values/SimpleStringAttributeValue.java | 6 +- .../model/messaging/Notification.java | 17 + .../NotificationItem.java} | 11 +- ...redAttributeSucceededNotificationItem.java | 15 + .../model/relationships/Relationship.java | 10 +- .../relationships/RelationshipChange.java | 42 -- .../RelationshipChangeRequest.java | 23 - .../RelationshipChangeResponse.java | 23 - .../RelationshipChangeResponseContent.java | 12 - ....java => RelationshipCreationContent.java} | 11 +- .../CreateAttributeRequestItem.java | 2 +- .../model/requestItems/RequestItem.java | 5 + .../model/requestItems/RequestItemGroup.java | 14 +- .../ShareAttributeRequestItem.java | 7 +- .../eu/enmeshed/retryer/CustomRetryer.java | 1 + .../EnmeshedOnboardingServiceTest.java | 447 ++++++++---------- 21 files changed, 340 insertions(+), 455 deletions(-) create mode 100644 src/main/java/eu/enmeshed/model/AuditLog.java create mode 100644 src/main/java/eu/enmeshed/model/messaging/Notification.java rename src/main/java/eu/enmeshed/model/{relationships/RelationshipChangeRequestContent.java => notificationItem/NotificationItem.java} (55%) create mode 100644 src/main/java/eu/enmeshed/model/notificationItem/PeerSharedAttributeSucceededNotificationItem.java delete mode 100644 src/main/java/eu/enmeshed/model/relationships/RelationshipChange.java delete mode 100644 src/main/java/eu/enmeshed/model/relationships/RelationshipChangeRequest.java delete mode 100644 src/main/java/eu/enmeshed/model/relationships/RelationshipChangeResponse.java delete mode 100644 src/main/java/eu/enmeshed/model/relationships/RelationshipChangeResponseContent.java rename src/main/java/eu/enmeshed/model/relationships/{RelationshipCreationChangeRequestContent.java => RelationshipCreationContent.java} (53%) diff --git a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java index 735e0aa..1b03252 100644 --- a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java +++ b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java @@ -1,5 +1,8 @@ package eu.enmeshed; +import static eu.enmeshed.model.Response.Result.ACCEPTED; +import static eu.enmeshed.model.Response.Result.REJECTED; +import static eu.enmeshed.model.relationships.Relationship.Status.PENDING; import static java.util.List.of; import static java.util.Objects.isNull; @@ -16,9 +19,7 @@ import eu.enmeshed.model.relationshipTemplates.RelationshipTemplateContent; import eu.enmeshed.model.relationshipTemplates.RelationshipTemplateCreation; import eu.enmeshed.model.relationships.Relationship; -import eu.enmeshed.model.relationships.RelationshipChange; -import eu.enmeshed.model.relationships.RelationshipChangeRequestContent; -import eu.enmeshed.model.relationships.RelationshipCreationChangeRequestContent; +import eu.enmeshed.model.relationships.RelationshipCreationContent; import eu.enmeshed.model.requestItems.CreateAttributeRequestItem; import eu.enmeshed.model.requestItems.ReadAttributeRequestItem; import eu.enmeshed.model.requestItems.RequestItem; @@ -33,7 +34,6 @@ import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -44,7 +44,6 @@ @Slf4j public class EnmeshedOnboardingService { - private static final Long QR_CODE_VALIDITY_MINUTES_DEFAULT = 60L; private static final Integer QR_CODE_NUMBER_OF_ALLOCATIONS = 1; @@ -65,7 +64,6 @@ public EnmeshedOnboardingService( String connectorDisplayName, List> requiredAttributes, List> optionalAttributes) { - this.enmeshedClient = enmeshedClient; this.requiredAttributes = requiredAttributes; this.optionalAttributes = optionalAttributes; @@ -84,7 +82,6 @@ public EnmeshedOnboardingService( List> requiredAttributes, List> optionalAttributes, List> createAttributes) { - this.enmeshedClient = enmeshedClient; this.requiredAttributes = requiredAttributes; this.optionalAttributes = optionalAttributes; @@ -98,13 +95,8 @@ public EnmeshedOnboardingService( } private AttributeWrapper setupConnectorDisplayName(String connectorDisplayName) { - ResultWrapper> foundAttributes = - enmeshedClient.searchAttributes( - IdentityAttribute.class.getSimpleName(), - identityInfo.getAddress(), - DisplayName.class.getSimpleName()); - + enmeshedClient.searchAttributes(DisplayName.class.getSimpleName()); Optional displayNameAttribute = foundAttributes.getResult().stream() .filter(attribute -> attribute.getContent().getValue() instanceof DisplayName) @@ -130,7 +122,6 @@ private AttributeWrapper setupConnectorDisplayName(String connectorDisplayName) // Attribute not found - Create it! IdentityAttribute identityAttribute = new IdentityAttribute(); - identityAttribute.setOwner(identityInfo.getAddress()); identityAttribute.setValue(DisplayName.builder().value(connectorDisplayName).build()); AttributeWrapper createdDisplayNameAttribute = @@ -152,14 +143,12 @@ public RegistrationData generateQrCodeForRegistrationAsJpg( String displayTextSharedAttributes, String displayTextCreateAttributes, Long qrCodeValidityMinutes) { - RelationshipTemplate relationshipTemplate = createOnboardingRelationshipTemplate( displayTextRequestedAttributes, displayTextSharedAttributes, displayTextCreateAttributes, qrCodeValidityMinutes); - Response qrCodeResponse = enmeshedClient.getQrCodeForRelationshipTemplate(relationshipTemplate.getId()); @@ -216,56 +205,35 @@ public RegistrationResult checkRegistrationState( } Relationship relationship = relationships.get(0); - RelationshipChange relationshipChange = relationship.getChanges().get(0); - - RelationshipChangeRequestContent relationshipChangeRequestContent = - relationshipChange.getRequest().getContent(); - - RelationshipCreationChangeRequestContent relationshipCreationChangeRequestContent = - (RelationshipCreationChangeRequestContent) relationshipChangeRequestContent; - + RelationshipCreationContent creationContent = relationship.getCreationContent(); Map, AttributeValue> attributes = - getSharedSimpleAttributesFromResponseItems( - relationshipCreationChangeRequestContent.getResponse().getItems()); + getSharedSimpleAttributesFromResponseItems(creationContent.getResponse().getItems()); - if (relationshipChange.getStatus() == RelationshipChange.Status.PENDING) { + if (relationship.getStatus() == PENDING) { boolean decision = acceptanceDecider.test(attributes); if (decision) { - enmeshedClient.acceptRelationshipChange( - relationship.getId(), - relationshipChange.getId(), - ContentWrapper.containing(Collections.emptyMap())); + enmeshedClient.acceptRelationship(relationship.getId()); } else { - enmeshedClient.rejectRelationshipChange( - relationship.getId(), - relationshipChange.getId(), - ContentWrapper.containing(Collections.emptyMap())); + enmeshedClient.rejectRelationship(relationship.getId()); } - return checkRegistrationState(relationshipTemplateId, registrationResult -> decision); - } else if (relationshipChange.getStatus() == RelationshipChange.Status.ACCEPTED) { - + } else if (creationContent.getResponse().getResult() == ACCEPTED) { // Request was accepted by User and us - Get the send Attributes and return them return new RegistrationResult( attributes, relationships.get(0).getPeerIdentity().getAddress(), - relationshipChange.getId(), relationship.getId(), true); - } else if (relationshipChange.getStatus() == RelationshipChange.Status.REJECTED) { - + } else if (creationContent.getResponse().getResult() == REJECTED) { // Request was accepted by User and us - Get the send Attributes and return them return new RegistrationResult( attributes, relationships.get(0).getPeerIdentity().getAddress(), - relationshipChange.getId(), relationship.getId(), false); } else { - - // Unknown Relationship State - This shouldn't happen. return null; } } @@ -369,7 +337,6 @@ public record RegistrationData( public record RegistrationResult( Map, AttributeValue> attributes, String enmeshedAddress, - String relationshipChangeId, String relationshipId, boolean accepted) {} } diff --git a/src/main/java/eu/enmeshed/client/EnmeshedClient.java b/src/main/java/eu/enmeshed/client/EnmeshedClient.java index 5816ede..c95eb3c 100644 --- a/src/main/java/eu/enmeshed/client/EnmeshedClient.java +++ b/src/main/java/eu/enmeshed/client/EnmeshedClient.java @@ -19,6 +19,7 @@ import eu.enmeshed.model.messaging.SendMessage; import eu.enmeshed.model.qr.QrCode; import eu.enmeshed.model.relationshipTemplates.RelationshipTemplate; +import eu.enmeshed.model.relationshipTemplates.RelationshipTemplateContent; import eu.enmeshed.model.relationshipTemplates.RelationshipTemplateCreation; import eu.enmeshed.model.relationships.Relationship; import eu.enmeshed.model.request.LocalRequest; @@ -37,7 +38,6 @@ import java.util.List; public interface EnmeshedClient { - ObjectMapper objectMapper = new ObjectMapper() .registerModule(new JavaTimeModule()) @@ -47,13 +47,11 @@ public interface EnmeshedClient { .setDateFormat(new StdDateFormat().withColonInTimeZone(true)); static EnmeshedClient configure(String url, String apiKey) { - return configure(url, apiKey, new Request.Options(), Logger.Level.NONE); } static EnmeshedClient configure( String url, String apiKey, Request.Options options, Logger.Level loggerLevel) { - return Feign.builder() .decoder(new JacksonDecoder(objectMapper)) .encoder(new FormEncoder(new JacksonEncoder(objectMapper))) @@ -77,16 +75,17 @@ static EnmeshedClient configure( /* Attributes */ - @RequestLine("GET /api/v2/Attributes?content.@type={0}&content.owner={1}&content.value.@type={2}") - ResultWrapper> searchAttributes( - @Param("0") String contentType, - @Param("1") String contentOwner, - @Param("2") String contentValueType); + @RequestLine("GET /api/v2/Attributes?content.value.@type={2}") + ResultWrapper> searchAttributes(@Param("2") String contentValueType); @RequestLine("POST /api/v2/Attributes") - @Headers("Content-Type: application/json") + @Headers({"Content-Type: application/json", "Accept: application/json"}) ResultWrapper createAttribute(ContentWrapper attribute); + @RequestLine("GET /api/v2/Attributes/{id}") + @Headers("Content-Type: application/json") + ResultWrapper getAttributeById(@Param("id") String attributeId); + /* Relationship Templates */ @@ -95,6 +94,11 @@ ResultWrapper> searchAttributes( ResultWrapper createOwnRelationshipTemplate( RelationshipTemplateCreation relationshipTemplate); + @RequestLine("POST /api/v2/Requests/Outgoing/Validate") + @Headers("Content-Type: application/json") + Object validateOwnRelationshipTemplate( + ContentWrapper contentWrapper); + @RequestLine("GET /api/v2/RelationshipTemplates/{0}") @Headers("Accept: image/png") Response getQrCodeForRelationshipTemplate(@Param("0") String relationshipTemplateId); @@ -111,19 +115,16 @@ ResultWrapper createRelationshipQrCode( ResultWrapper> searchRelationships( @Param("0") String templateId, @Param("1") String peer, @Param("2") String status); - @RequestLine("PUT /api/v2/Relationships/{0}/Changes/{1}/Accept") + @RequestLine("GET /api/v2/Relationships/{id}") + ResultWrapper getRelationshipsById(@Param("id") String id); + + @RequestLine("PUT /api/v2/Relationships/{id}/Accept") @Headers("Content-Type: application/json") - ResultWrapper acceptRelationshipChange( - @Param("0") String relationshipId, - @Param("1") String changeId, - ContentWrapper dummyBody); + ResultWrapper acceptRelationship(@Param("id") String id); - @RequestLine("PUT /api/v2/Relationships/{0}/Changes/{1}/Reject") + @RequestLine("PUT /api/v2/Relationships/{0}/Reject") @Headers("Content-Type: application/json") - ResultWrapper rejectRelationshipChange( - @Param("0") String relationshipId, - @Param("1") String changeId, - ContentWrapper dummyBody); + ResultWrapper rejectRelationship(@Param("id") String id); /* Messages diff --git a/src/main/java/eu/enmeshed/model/AttributeWrapper.java b/src/main/java/eu/enmeshed/model/AttributeWrapper.java index 33387e7..af34b2c 100644 --- a/src/main/java/eu/enmeshed/model/AttributeWrapper.java +++ b/src/main/java/eu/enmeshed/model/AttributeWrapper.java @@ -15,14 +15,10 @@ @Setter @SuperBuilder public class AttributeWrapper extends ContentWrapper { - private String id; - private ZonedDateTime createdAt; - private AttributeShareInfo shareInfo; - private String succeededBy; - private String succeeds; + private Boolean isDefault; } diff --git a/src/main/java/eu/enmeshed/model/AuditLog.java b/src/main/java/eu/enmeshed/model/AuditLog.java new file mode 100644 index 0000000..2329d56 --- /dev/null +++ b/src/main/java/eu/enmeshed/model/AuditLog.java @@ -0,0 +1,32 @@ +package eu.enmeshed.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.time.ZonedDateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +@Builder +public class AuditLog { + private ZonedDateTime createdAt; + private String createdBy; + private String createdByDevice; + private String Reason; + private Status oldStatus; + private Status newStatus; + + public enum Status { + @JsonProperty("Pending") + PENDING, + @JsonProperty("Active") + ACTIVE, + @JsonProperty("Rejected") + REJECTED + } +} diff --git a/src/main/java/eu/enmeshed/model/attributes/Attribute.java b/src/main/java/eu/enmeshed/model/attributes/Attribute.java index 3c31402..db4f910 100644 --- a/src/main/java/eu/enmeshed/model/attributes/Attribute.java +++ b/src/main/java/eu/enmeshed/model/attributes/Attribute.java @@ -1,5 +1,10 @@ package eu.enmeshed.model.attributes; +import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import eu.enmeshed.model.attributes.values.AttributeValue; @@ -21,15 +26,15 @@ @Getter @Setter @SuperBuilder -public abstract class Attribute { +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(NON_EMPTY) +public class Attribute { + @JsonProperty("@type") + private String type; private String owner; - private List tags; - private ZonedDateTime validFrom; - private ZonedDateTime validTo; - private AttributeValue value; } diff --git a/src/main/java/eu/enmeshed/model/attributes/values/SimpleStringAttributeValue.java b/src/main/java/eu/enmeshed/model/attributes/values/SimpleStringAttributeValue.java index 7c418df..787c6e1 100644 --- a/src/main/java/eu/enmeshed/model/attributes/values/SimpleStringAttributeValue.java +++ b/src/main/java/eu/enmeshed/model/attributes/values/SimpleStringAttributeValue.java @@ -12,6 +12,10 @@ @Setter @SuperBuilder public abstract class SimpleStringAttributeValue extends AttributeValue { - private String value; + + @Override + public String toString() { + return getValue(); + } } diff --git a/src/main/java/eu/enmeshed/model/messaging/Notification.java b/src/main/java/eu/enmeshed/model/messaging/Notification.java new file mode 100644 index 0000000..6491c49 --- /dev/null +++ b/src/main/java/eu/enmeshed/model/messaging/Notification.java @@ -0,0 +1,17 @@ +package eu.enmeshed.model.messaging; + +import eu.enmeshed.model.notificationItem.NotificationItem; +import java.util.List; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@NoArgsConstructor +@Getter +@Setter +@SuperBuilder +public class Notification extends MessageContent { + private String id; + private List items; +} diff --git a/src/main/java/eu/enmeshed/model/relationships/RelationshipChangeRequestContent.java b/src/main/java/eu/enmeshed/model/notificationItem/NotificationItem.java similarity index 55% rename from src/main/java/eu/enmeshed/model/relationships/RelationshipChangeRequestContent.java rename to src/main/java/eu/enmeshed/model/notificationItem/NotificationItem.java index 337f81d..75858e6 100644 --- a/src/main/java/eu/enmeshed/model/relationships/RelationshipChangeRequestContent.java +++ b/src/main/java/eu/enmeshed/model/notificationItem/NotificationItem.java @@ -1,7 +1,8 @@ -package eu.enmeshed.model.relationships; +package eu.enmeshed.model.notificationItem; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; import lombok.NoArgsConstructor; @@ -10,9 +11,13 @@ @Data @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") -@JsonSubTypes({@JsonSubTypes.Type(RelationshipCreationChangeRequestContent.class)}) +@JsonSubTypes({@JsonSubTypes.Type(PeerSharedAttributeSucceededNotificationItem.class)}) +@AllArgsConstructor @NoArgsConstructor @Getter @Setter @SuperBuilder -public abstract class RelationshipChangeRequestContent {} +public abstract class NotificationItem { + private String predecessorId; + private String successorId; +} diff --git a/src/main/java/eu/enmeshed/model/notificationItem/PeerSharedAttributeSucceededNotificationItem.java b/src/main/java/eu/enmeshed/model/notificationItem/PeerSharedAttributeSucceededNotificationItem.java new file mode 100644 index 0000000..a19f418 --- /dev/null +++ b/src/main/java/eu/enmeshed/model/notificationItem/PeerSharedAttributeSucceededNotificationItem.java @@ -0,0 +1,15 @@ +package eu.enmeshed.model.notificationItem; + +import eu.enmeshed.model.attributes.IdentityAttribute; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@NoArgsConstructor +@Getter +@Setter +@SuperBuilder +public class PeerSharedAttributeSucceededNotificationItem extends NotificationItem { + private IdentityAttribute successorContent; +} diff --git a/src/main/java/eu/enmeshed/model/relationships/Relationship.java b/src/main/java/eu/enmeshed/model/relationships/Relationship.java index aec3cda..8ad81c3 100644 --- a/src/main/java/eu/enmeshed/model/relationships/Relationship.java +++ b/src/main/java/eu/enmeshed/model/relationships/Relationship.java @@ -1,6 +1,7 @@ package eu.enmeshed.model.relationships; import com.fasterxml.jackson.annotation.JsonProperty; +import eu.enmeshed.model.AuditLog; import eu.enmeshed.model.IdentityInfo; import eu.enmeshed.model.event.WebhookData; import eu.enmeshed.model.relationshipTemplates.RelationshipTemplate; @@ -17,18 +18,13 @@ @Setter @Builder public class Relationship implements WebhookData { - private String id; - private RelationshipTemplate template; - private Status status; - private String peer; - private IdentityInfo peerIdentity; - - private List changes; + private RelationshipCreationContent creationContent; + private List auditLog; public enum Status { @JsonProperty("Pending") diff --git a/src/main/java/eu/enmeshed/model/relationships/RelationshipChange.java b/src/main/java/eu/enmeshed/model/relationships/RelationshipChange.java deleted file mode 100644 index 074bd4f..0000000 --- a/src/main/java/eu/enmeshed/model/relationships/RelationshipChange.java +++ /dev/null @@ -1,42 +0,0 @@ -package eu.enmeshed.model.relationships; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@Builder -public class RelationshipChange { - - private String id; - - private Type type; - - private Status status; - - private RelationshipChangeRequest request; - - private RelationshipChangeResponse response; - - public enum Type { - @JsonProperty("Creation") - CREATION - } - - public enum Status { - @JsonProperty("Pending") - PENDING, - - @JsonProperty("Rejected") - REJECTED, - - @JsonProperty("Accepted") - ACCEPTED - } -} diff --git a/src/main/java/eu/enmeshed/model/relationships/RelationshipChangeRequest.java b/src/main/java/eu/enmeshed/model/relationships/RelationshipChangeRequest.java deleted file mode 100644 index 71d33a1..0000000 --- a/src/main/java/eu/enmeshed/model/relationships/RelationshipChangeRequest.java +++ /dev/null @@ -1,23 +0,0 @@ -package eu.enmeshed.model.relationships; - -import eu.enmeshed.model.ContentWrapper; -import java.time.ZonedDateTime; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@SuperBuilder -public class RelationshipChangeRequest extends ContentWrapper { - - private String createdBy; - - private String createdByDevice; - - private ZonedDateTime createdAt; -} diff --git a/src/main/java/eu/enmeshed/model/relationships/RelationshipChangeResponse.java b/src/main/java/eu/enmeshed/model/relationships/RelationshipChangeResponse.java deleted file mode 100644 index bbd99db..0000000 --- a/src/main/java/eu/enmeshed/model/relationships/RelationshipChangeResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package eu.enmeshed.model.relationships; - -import eu.enmeshed.model.ContentWrapper; -import java.time.ZonedDateTime; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@SuperBuilder -public class RelationshipChangeResponse extends ContentWrapper { - - private String createdBy; - - private String createdByDevice; - - private ZonedDateTime createdAt; -} diff --git a/src/main/java/eu/enmeshed/model/relationships/RelationshipChangeResponseContent.java b/src/main/java/eu/enmeshed/model/relationships/RelationshipChangeResponseContent.java deleted file mode 100644 index 71d08d0..0000000 --- a/src/main/java/eu/enmeshed/model/relationships/RelationshipChangeResponseContent.java +++ /dev/null @@ -1,12 +0,0 @@ -package eu.enmeshed.model.relationships; - -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@NoArgsConstructor -@Getter -@Setter -@Builder -public class RelationshipChangeResponseContent {} diff --git a/src/main/java/eu/enmeshed/model/relationships/RelationshipCreationChangeRequestContent.java b/src/main/java/eu/enmeshed/model/relationships/RelationshipCreationContent.java similarity index 53% rename from src/main/java/eu/enmeshed/model/relationships/RelationshipCreationChangeRequestContent.java rename to src/main/java/eu/enmeshed/model/relationships/RelationshipCreationContent.java index 33f2507..c04abac 100644 --- a/src/main/java/eu/enmeshed/model/relationships/RelationshipCreationChangeRequestContent.java +++ b/src/main/java/eu/enmeshed/model/relationships/RelationshipCreationContent.java @@ -1,18 +1,21 @@ package eu.enmeshed.model.relationships; +import static com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; import eu.enmeshed.model.Response; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import lombok.experimental.SuperBuilder; @AllArgsConstructor @NoArgsConstructor @Getter @Setter -@SuperBuilder -public class RelationshipCreationChangeRequestContent extends RelationshipChangeRequestContent { - +@Builder +@JsonTypeInfo(use = NAME, property = "@type") +public class RelationshipCreationContent { private Response response; } diff --git a/src/main/java/eu/enmeshed/model/requestItems/CreateAttributeRequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/CreateAttributeRequestItem.java index fbc06d3..f69990b 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/CreateAttributeRequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/CreateAttributeRequestItem.java @@ -16,7 +16,6 @@ @Setter @SuperBuilder public class CreateAttributeRequestItem extends RequestItem { - private Attribute attribute; public static CreateAttributeRequestItem fromWrapper( @@ -29,6 +28,7 @@ public static CreateAttributeRequestItem fromWrapper( private static RelationshipAttribute relationshipAttribute(AttributeWrapper wrapper) { return RelationshipAttribute.builder() + .type(RelationshipAttribute.class.getSimpleName()) .owner(wrapper.getContent().getOwner()) .key("AllowCertificateRequest") .confidentiality(RelationshipAttribute.Confidentiality.PRIVATE) diff --git a/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java index 9a32248..e433e4c 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java @@ -1,5 +1,8 @@ package eu.enmeshed.model.requestItems; +import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; + +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import java.util.Map; @@ -11,6 +14,7 @@ import lombok.experimental.SuperBuilder; @Data +@JsonInclude(NON_EMPTY) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") @JsonSubTypes({ @JsonSubTypes.Type(RequestItemGroup.class), @@ -21,6 +25,7 @@ @JsonSubTypes.Type(CreateAttributeRequestItem.class), @JsonSubTypes.Type(FreeTextRequestItem.class), @JsonSubTypes.Type(ProposeAttributeRequestItem.class), + @JsonSubTypes.Type(RequestItemGroup.class) }) @AllArgsConstructor @NoArgsConstructor diff --git a/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java b/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java index 9f95769..079a45e 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java +++ b/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java @@ -1,17 +1,27 @@ package eu.enmeshed.model.requestItems; +import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import java.util.List; +import java.util.Map; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; -// @AllArgsConstructor @NoArgsConstructor @Getter @Setter @SuperBuilder +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") +@JsonInclude(NON_EMPTY) public class RequestItemGroup extends RequestItem { - private List items; + private String title; + private String description; + private Map metadata; + private Boolean mustBeAccepted; + private Boolean requireManualDecision; } diff --git a/src/main/java/eu/enmeshed/model/requestItems/ShareAttributeRequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/ShareAttributeRequestItem.java index 14bc8e0..864c2c1 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/ShareAttributeRequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/ShareAttributeRequestItem.java @@ -2,6 +2,7 @@ import eu.enmeshed.model.AttributeWrapper; import eu.enmeshed.model.attributes.Attribute; +import eu.enmeshed.model.attributes.IdentityAttribute; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -14,17 +15,17 @@ @Setter @SuperBuilder public class ShareAttributeRequestItem extends RequestItem { - private Attribute attribute; - private String sourceAttributeId; public static ShareAttributeRequestItem fromWrapper( AttributeWrapper wrapper, boolean mustBeAccepted) { + Attribute content = wrapper.getContent(); + content.setType(IdentityAttribute.class.getSimpleName()); return ShareAttributeRequestItem.builder() .mustBeAccepted(mustBeAccepted) - .attribute(wrapper.getContent()) + .attribute(content) .sourceAttributeId(wrapper.getId()) .build(); } diff --git a/src/main/java/eu/enmeshed/retryer/CustomRetryer.java b/src/main/java/eu/enmeshed/retryer/CustomRetryer.java index ed970c0..9d120e3 100644 --- a/src/main/java/eu/enmeshed/retryer/CustomRetryer.java +++ b/src/main/java/eu/enmeshed/retryer/CustomRetryer.java @@ -46,6 +46,7 @@ public void continueOrPropagate(RetryableException e) { @Override public Retryer clone() { + return new CustomRetryer(backoff, maxAttempts); } } diff --git a/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java b/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java index 4920925..c24d53b 100644 --- a/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java +++ b/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java @@ -16,7 +16,6 @@ import eu.enmeshed.model.attributes.Attribute; import eu.enmeshed.model.attributes.IdentityAttribute; import eu.enmeshed.model.attributes.values.AttributeValue; -import eu.enmeshed.model.attributes.values.identity.BirthDate; import eu.enmeshed.model.attributes.values.identity.BirthYear; import eu.enmeshed.model.attributes.values.identity.DisplayName; import eu.enmeshed.model.attributes.values.identity.EMailAddress; @@ -26,9 +25,7 @@ import eu.enmeshed.model.relationshipTemplates.RelationshipTemplateContent; import eu.enmeshed.model.relationshipTemplates.RelationshipTemplateCreation; import eu.enmeshed.model.relationships.Relationship; -import eu.enmeshed.model.relationships.RelationshipChange; -import eu.enmeshed.model.relationships.RelationshipChangeRequest; -import eu.enmeshed.model.relationships.RelationshipCreationChangeRequestContent; +import eu.enmeshed.model.relationships.RelationshipCreationContent; import eu.enmeshed.model.requestItems.CreateAttributeRequestItem; import eu.enmeshed.model.requestItems.ReadAttributeRequestItem; import eu.enmeshed.model.requestItems.RequestItem; @@ -73,7 +70,7 @@ public class EnmeshedOnboardingServiceTest { EnmeshedOnboardingService enmeshedService; @Test - void itShouldProvideIdentityInfoAndReuseConfiguredDisplayNameIfSet() { + void shouldProvideIdentityInfoAndReuseConfiguredDisplayNameIfSet() { when(enmeshedClientMock.getIdentityInfo()) .thenReturn(ResultWrapper.containing(TEST_IDENTITY_INFO)); @@ -88,7 +85,7 @@ void itShouldProvideIdentityInfoAndReuseConfiguredDisplayNameIfSet() { .build()) .build(); - when(enmeshedClientMock.searchAttributes(anyString(), anyString(), anyString())) + when(enmeshedClientMock.searchAttributes(anyString())) .thenReturn(ResultWrapper.containing(List.of(wrappedDisplayNameAttribute))); enmeshedService = @@ -122,7 +119,7 @@ void itShouldProvideIdentityInfoAndConfigureItsDisplayNameIfNotSet() { when(enmeshedClientMock.createAttribute(attributeCreateRequestCaptor.capture())) .thenReturn(ResultWrapper.containing(wrappedDisplayNameAttribute)); - when(enmeshedClientMock.searchAttributes(anyString(), anyString(), anyString())) + when(enmeshedClientMock.searchAttributes(anyString())) .thenReturn(ResultWrapper.containing(Collections.emptyList())); enmeshedService = @@ -141,9 +138,7 @@ void itShouldProvideIdentityInfoAndConfigureItsDisplayNameIfNotSet() { Assertions.assertEquals( CONNECTOR_DISPLAY_NAME, ((DisplayName) attributeCreateRequestCaptor.getValue().getContent().getValue()).getValue()); - Assertions.assertEquals( - TEST_IDENTITY_INFO.getAddress(), - attributeCreateRequestCaptor.getValue().getContent().getOwner()); + Assertions.assertNull(attributeCreateRequestCaptor.getValue().getContent().getOwner()); } @Test @@ -247,7 +242,7 @@ void itShouldReturnRegistrationData() { } @Test - void itShouldReturnNullIfRelationshipTemplateCouldNotBeFound() { + void shouldReturnNullIfRelationshipTemplateCouldNotBeFound() { String relationshipTemplateId = "RLTXXX"; enmeshedService = getServiceInstance(); @@ -261,10 +256,9 @@ void itShouldReturnNullIfRelationshipTemplateCouldNotBeFound() { } @Test - void itShouldReturnRegistrationDataIfRelationshipTemplateCouldBeFound() { + void shouldReturnRegistrationDataIfRelationshipTemplateCouldBeFound() { String relationshipTemplateId = "RLT_XXX"; - String relationshipChangeId = "RCH_XXX"; String relationshipId = "REL_XXX"; String userGivenName = "Max"; String userSurname = "Muster"; @@ -281,94 +275,65 @@ void itShouldReturnRegistrationDataIfRelationshipTemplateCouldBeFound() { .template(RelationshipTemplate.builder().id(relationshipTemplateId).build()) .peerIdentity(IdentityInfo.builder().address(userAddress).build()) .peer(userAddress) - .changes( - List.of( - RelationshipChange.builder() - .id(relationshipChangeId) - .type(RelationshipChange.Type.CREATION) - .status(RelationshipChange.Status.ACCEPTED) - .request( - RelationshipChangeRequest.builder() - .content( - RelationshipCreationChangeRequestContent.builder() - .response( - Response.builder() - .items( - List.of( - ResponseItemGroup.builder() - .result( - ResponseItem.Result - .ACCEPTED) - .items( - List.of( - ReadAttributeAcceptResponseItem - .builder() - .result( - ResponseItem - .Result - .ACCEPTED) - .attribute( - IdentityAttribute - .builder() - .value( - GivenName - .builder() - .value( - userGivenName) - .build()) - .build()) - .build(), - ReadAttributeAcceptResponseItem - .builder() - .result( - ResponseItem - .Result - .ACCEPTED) - .attribute( - IdentityAttribute - .builder() - .value( - Surname - .builder() - .value( - userSurname) - .build()) - .build()) - .build(), - ReadAttributeAcceptResponseItem - .builder() - .result( - ResponseItem - .Result - .ACCEPTED) - .attribute( - IdentityAttribute - .builder() - .value( - BirthYear - .builder() - .value( - userBirthyear) - .build()) - .build()) - .build())) - .build())) - .requestId("REQ_ID") - .result( - eu.enmeshed.model.Response.Result - .ACCEPTED) - .build()) - .build()) - .build()) - .build())) + .creationContent( + RelationshipCreationContent.builder() + .response( + Response.builder() + .items( + List.of( + ResponseItemGroup.builder() + .result(ResponseItem.Result.ACCEPTED) + .items( + List.of( + ReadAttributeAcceptResponseItem + .builder() + .result( + ResponseItem.Result.ACCEPTED) + .attribute( + IdentityAttribute.builder() + .value( + GivenName.builder() + .value( + userGivenName) + .build()) + .build()) + .build(), + ReadAttributeAcceptResponseItem + .builder() + .result( + ResponseItem.Result.ACCEPTED) + .attribute( + IdentityAttribute.builder() + .value( + Surname.builder() + .value(userSurname) + .build()) + .build()) + .build(), + ReadAttributeAcceptResponseItem + .builder() + .result( + ResponseItem.Result.ACCEPTED) + .attribute( + IdentityAttribute.builder() + .value( + BirthYear.builder() + .value( + userBirthyear) + .build()) + .build()) + .build())) + .build())) + .requestId("REQ_ID") + .result(Response.Result.ACCEPTED) + .build()) + .build()) .build()))); - EnmeshedOnboardingService.RegistrationResult registrationResult = enmeshedService.checkRegistrationState(relationshipTemplateId); Assertions.assertEquals(userAddress, registrationResult.enmeshedAddress()); Assertions.assertEquals(relationshipId, registrationResult.relationshipId()); - Assertions.assertEquals(relationshipChangeId, registrationResult.relationshipChangeId()); Assertions.assertEquals( userGivenName, ((GivenName) registrationResult.attributes().get(GivenName.class)).getValue()); @@ -384,63 +349,63 @@ void itShouldReturnRegistrationDataIfRelationshipTemplateCouldBeFound() { .verify(enmeshedClientMock) .searchRelationships(eq(relationshipTemplateId), any(), any()); - verify(enmeshedClientMock, never()).acceptRelationshipChange(anyString(), anyString(), any()); + verify(enmeshedClientMock, never()).acceptRelationship(anyString()); } @Test - void itShouldAcceptTheIncomingRequestAndReturnSentData() { + void shouldAcceptTheIncomingRequestAndReturnSentData() { String relationshipTemplateId = "RLT_XXX"; - String relationshipChangeId = "RCH_XXX"; String relationshipId = "REL_XXX"; String userGivenName = "Max"; String userSurname = "Muster"; String userAddress = "ADDR_XXX"; - int userBirthDay = 12; - int userBirthMonth = 12; int userBirthYear = 1999; enmeshedService = getServiceInstance(); - RelationshipChangeRequest relationshipChangeRequest = - RelationshipChangeRequest.builder() - .content( - RelationshipCreationChangeRequestContent.builder() - .response( - Response.builder() - .items( - List.of( - ReadAttributeAcceptResponseItem.builder() - .result(ResponseItem.Result.ACCEPTED) - .attribute( - IdentityAttribute.builder() - .value( - GivenName.builder() - .value(userGivenName) - .build()) - .build()) - .build(), - ReadAttributeAcceptResponseItem.builder() - .result(ResponseItem.Result.ACCEPTED) - .attribute( - IdentityAttribute.builder() - .value(Surname.builder().value(userSurname).build()) - .build()) - .build(), - ReadAttributeAcceptResponseItem.builder() - .result(ResponseItem.Result.ACCEPTED) - .attribute( - IdentityAttribute.builder() - .value( - BirthDate.builder() - .day(userBirthDay) - .month(userBirthMonth) - .year(userBirthYear) - .build()) - .build()) - .build())) - .requestId("REQ_ID") - .result(Response.Result.ACCEPTED) - .build()) + RelationshipCreationContent creationContent = + RelationshipCreationContent.builder() + .response( + Response.builder() + .items( + List.of( + ResponseItemGroup.builder() + .result(ResponseItem.Result.ACCEPTED) + .items( + List.of( + ReadAttributeAcceptResponseItem.builder() + .result(ResponseItem.Result.ACCEPTED) + .attribute( + IdentityAttribute.builder() + .value( + GivenName.builder() + .value(userGivenName) + .build()) + .build()) + .build(), + ReadAttributeAcceptResponseItem.builder() + .result(ResponseItem.Result.ACCEPTED) + .attribute( + IdentityAttribute.builder() + .value( + Surname.builder() + .value(userSurname) + .build()) + .build()) + .build(), + ReadAttributeAcceptResponseItem.builder() + .result(ResponseItem.Result.ACCEPTED) + .attribute( + IdentityAttribute.builder() + .value( + BirthYear.builder() + .value(userBirthYear) + .build()) + .build()) + .build())) + .build())) + .requestId("REQ_ID") + .result(Response.Result.ACCEPTED) .build()) .build(); @@ -453,14 +418,8 @@ void itShouldAcceptTheIncomingRequestAndReturnSentData() { .template(RelationshipTemplate.builder().id(relationshipTemplateId).build()) .peerIdentity(IdentityInfo.builder().address(userAddress).build()) .peer(userAddress) - .changes( - List.of( - RelationshipChange.builder() - .id(relationshipChangeId) - .type(RelationshipChange.Type.CREATION) - .status(RelationshipChange.Status.PENDING) - .request(relationshipChangeRequest) - .build())) + .status(Relationship.Status.PENDING) + .creationContent(creationContent) .build()))) .thenReturn( ResultWrapper.containing( @@ -470,31 +429,21 @@ void itShouldAcceptTheIncomingRequestAndReturnSentData() { .template(RelationshipTemplate.builder().id(relationshipTemplateId).build()) .peerIdentity(IdentityInfo.builder().address(userAddress).build()) .peer(userAddress) - .changes( - List.of( - RelationshipChange.builder() - .id(relationshipChangeId) - .type(RelationshipChange.Type.CREATION) - .status(RelationshipChange.Status.ACCEPTED) - .request(relationshipChangeRequest) - .build())) + .creationContent(creationContent) .build()))); EnmeshedOnboardingService.RegistrationResult registrationResult = enmeshedService.checkRegistrationState(relationshipTemplateId); - BirthDate birthDate = (BirthDate) registrationResult.attributes().get(BirthDate.class); + BirthYear birthYear = (BirthYear) registrationResult.attributes().get(BirthYear.class); Assertions.assertEquals(userAddress, registrationResult.enmeshedAddress()); Assertions.assertEquals(relationshipId, registrationResult.relationshipId()); - Assertions.assertEquals(relationshipChangeId, registrationResult.relationshipChangeId()); Assertions.assertEquals( userGivenName, ((GivenName) registrationResult.attributes().get(GivenName.class)).getValue()); Assertions.assertEquals( userSurname, ((Surname) registrationResult.attributes().get(Surname.class)).getValue()); - Assertions.assertEquals(userBirthDay, birthDate.getDay()); - Assertions.assertEquals(userBirthMonth, birthDate.getMonth()); - Assertions.assertEquals(userBirthYear, birthDate.getYear()); + Assertions.assertEquals(userBirthYear, birthYear.getValue()); Assertions.assertTrue(registrationResult.accepted()); Assertions.assertEquals(3, registrationResult.attributes().size()); @@ -503,9 +452,7 @@ void itShouldAcceptTheIncomingRequestAndReturnSentData() { inOrder .verify(enmeshedClientMock) .searchRelationships(eq(relationshipTemplateId), any(), any()); - inOrder - .verify(enmeshedClientMock) - .acceptRelationshipChange(eq(relationshipId), eq(relationshipChangeId), any()); + inOrder.verify(enmeshedClientMock).acceptRelationship(eq(relationshipId)); inOrder.verify(enmeshedClientMock).sync(); inOrder .verify(enmeshedClientMock) @@ -513,44 +460,48 @@ void itShouldAcceptTheIncomingRequestAndReturnSentData() { } @Test - void itShouldRejectTheIncomingRequestAndReturnSentData() { + void shouldRejectTheIncomingRequestAndReturnSentData() { String relationshipTemplateId = "RLT_XXX"; - String relationshipChangeId = "RCH_XXX"; String relationshipId = "REL_XXX"; String userGivenName = "Max"; String userSurname = "Muster"; String userAddress = "ADDR_XXX"; enmeshedService = getServiceInstance(); - RelationshipChangeRequest relationshipChangeRequest = - RelationshipChangeRequest.builder() - .content( - RelationshipCreationChangeRequestContent.builder() - .response( - Response.builder() - .items( - List.of( - ReadAttributeAcceptResponseItem.builder() - .result(ResponseItem.Result.ACCEPTED) - .attribute( - IdentityAttribute.builder() - .value( - GivenName.builder() - .value(userGivenName) - .build()) - .build()) - .build(), - ReadAttributeAcceptResponseItem.builder() - .result(ResponseItem.Result.ACCEPTED) - .attribute( - IdentityAttribute.builder() - .value(Surname.builder().value(userSurname).build()) - .build()) - .build())) - .requestId("REQ_ID") - .result(Response.Result.ACCEPTED) - .build()) + RelationshipCreationContent creationContent = + RelationshipCreationContent.builder() + .response( + Response.builder() + .items( + List.of( + ResponseItemGroup.builder() + .result(ResponseItem.Result.ACCEPTED) + .items( + List.of( + ReadAttributeAcceptResponseItem.builder() + .result(ResponseItem.Result.ACCEPTED) + .attribute( + IdentityAttribute.builder() + .value( + GivenName.builder() + .value(userGivenName) + .build()) + .build()) + .build(), + ReadAttributeAcceptResponseItem.builder() + .result(ResponseItem.Result.ACCEPTED) + .attribute( + IdentityAttribute.builder() + .value( + Surname.builder() + .value(userSurname) + .build()) + .build()) + .build())) + .build())) + .requestId("REQ_ID") + .result(Response.Result.REJECTED) .build()) .build(); @@ -563,14 +514,8 @@ void itShouldRejectTheIncomingRequestAndReturnSentData() { .template(RelationshipTemplate.builder().id(relationshipTemplateId).build()) .peerIdentity(IdentityInfo.builder().address(userAddress).build()) .peer(userAddress) - .changes( - List.of( - RelationshipChange.builder() - .id(relationshipChangeId) - .type(RelationshipChange.Type.CREATION) - .status(RelationshipChange.Status.PENDING) - .request(relationshipChangeRequest) - .build())) + .status(Relationship.Status.PENDING) + .creationContent(creationContent) .build()))) .thenReturn( ResultWrapper.containing( @@ -580,14 +525,8 @@ void itShouldRejectTheIncomingRequestAndReturnSentData() { .template(RelationshipTemplate.builder().id(relationshipTemplateId).build()) .peerIdentity(IdentityInfo.builder().address(userAddress).build()) .peer(userAddress) - .changes( - List.of( - RelationshipChange.builder() - .id(relationshipChangeId) - .type(RelationshipChange.Type.CREATION) - .status(RelationshipChange.Status.REJECTED) - .request(relationshipChangeRequest) - .build())) + .status(Relationship.Status.REJECTED) + .creationContent(creationContent) .build()))); EnmeshedOnboardingService.RegistrationResult registrationResult = @@ -595,7 +534,6 @@ void itShouldRejectTheIncomingRequestAndReturnSentData() { Assertions.assertEquals(userAddress, registrationResult.enmeshedAddress()); Assertions.assertEquals(relationshipId, registrationResult.relationshipId()); - Assertions.assertEquals(relationshipChangeId, registrationResult.relationshipChangeId()); Assertions.assertEquals( userGivenName, ((GivenName) registrationResult.attributes().get(GivenName.class)).getValue()); @@ -608,9 +546,7 @@ void itShouldRejectTheIncomingRequestAndReturnSentData() { inOrder .verify(enmeshedClientMock) .searchRelationships(eq(relationshipTemplateId), any(), any()); - inOrder - .verify(enmeshedClientMock) - .rejectRelationshipChange(eq(relationshipId), eq(relationshipChangeId), any()); + inOrder.verify(enmeshedClientMock).rejectRelationship(eq(relationshipId)); inOrder.verify(enmeshedClientMock).sync(); inOrder .verify(enmeshedClientMock) @@ -618,7 +554,7 @@ void itShouldRejectTheIncomingRequestAndReturnSentData() { } @Test - void itShouldPassTheSentAttributesToAcceptanceDecider() { + void shouldPassTheSentAttributesToAcceptanceDecider() { String relationshipTemplateId = "RLT_XXX"; String relationshipChangeId = "RCH_XXX"; @@ -628,34 +564,39 @@ void itShouldPassTheSentAttributesToAcceptanceDecider() { String userAddress = "ADDR_XXX"; enmeshedService = getServiceInstance(); - RelationshipChangeRequest relationshipChangeRequest = - RelationshipChangeRequest.builder() - .content( - RelationshipCreationChangeRequestContent.builder() - .response( - Response.builder() - .items( - List.of( - ReadAttributeAcceptResponseItem.builder() - .result(ResponseItem.Result.ACCEPTED) - .attribute( - IdentityAttribute.builder() - .value( - GivenName.builder() - .value(userGivenName) - .build()) - .build()) - .build(), - ReadAttributeAcceptResponseItem.builder() - .result(ResponseItem.Result.ACCEPTED) - .attribute( - IdentityAttribute.builder() - .value(Surname.builder().value(userSurname).build()) - .build()) - .build())) - .requestId("REQ_ID") - .result(Response.Result.ACCEPTED) - .build()) + RelationshipCreationContent creationContent = + RelationshipCreationContent.builder() + .response( + Response.builder() + .items( + List.of( + ResponseItemGroup.builder() + .result(ResponseItem.Result.ACCEPTED) + .items( + List.of( + ReadAttributeAcceptResponseItem.builder() + .result(ResponseItem.Result.ACCEPTED) + .attribute( + IdentityAttribute.builder() + .value( + GivenName.builder() + .value(userGivenName) + .build()) + .build()) + .build(), + ReadAttributeAcceptResponseItem.builder() + .result(ResponseItem.Result.ACCEPTED) + .attribute( + IdentityAttribute.builder() + .value( + Surname.builder() + .value(userSurname) + .build()) + .build()) + .build())) + .build())) + .requestId("REQ_ID") + .result(Response.Result.REJECTED) .build()) .build(); @@ -668,14 +609,7 @@ void itShouldPassTheSentAttributesToAcceptanceDecider() { .template(RelationshipTemplate.builder().id(relationshipTemplateId).build()) .peerIdentity(IdentityInfo.builder().address(userAddress).build()) .peer(userAddress) - .changes( - List.of( - RelationshipChange.builder() - .id(relationshipChangeId) - .type(RelationshipChange.Type.CREATION) - .status(RelationshipChange.Status.PENDING) - .request(relationshipChangeRequest) - .build())) + .creationContent(creationContent) .build()))) .thenReturn( ResultWrapper.containing( @@ -685,14 +619,7 @@ void itShouldPassTheSentAttributesToAcceptanceDecider() { .template(RelationshipTemplate.builder().id(relationshipTemplateId).build()) .peerIdentity(IdentityInfo.builder().address(userAddress).build()) .peer(userAddress) - .changes( - List.of( - RelationshipChange.builder() - .id(relationshipChangeId) - .type(RelationshipChange.Type.CREATION) - .status(RelationshipChange.Status.ACCEPTED) - .request(relationshipChangeRequest) - .build())) + .creationContent(creationContent) .build()))); enmeshedService.checkRegistrationState( @@ -723,7 +650,7 @@ private EnmeshedOnboardingService getServiceInstance() { .build()) .build(); - when(enmeshedClientMock.searchAttributes(anyString(), anyString(), anyString())) + when(enmeshedClientMock.searchAttributes(anyString())) .thenReturn(ResultWrapper.containing(List.of(wrappedDisplayNameAttribute))); return new EnmeshedOnboardingService( From 7c3ac559c7ce7916364dbb69130395ea8df70591 Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Tue, 10 Sep 2024 15:53:42 +0200 Subject: [PATCH 02/17] Update code related to the PR comments --- .../enmeshed/EnmeshedOnboardingService.java | 24 +++++++++---------- .../eu/enmeshed/client/EnmeshedClient.java | 10 ++------ .../enmeshed/model/attributes/Attribute.java | 4 +--- .../model/messaging/Notification.java | 4 ++++ .../model/relationships/Relationship.java | 3 +-- .../RelationshipAuditLog.java} | 4 ++-- .../model/requestItems/RequestItem.java | 4 +--- .../model/requestItems/RequestItemGroup.java | 5 +--- .../eu/enmeshed/retryer/CustomRetryer.java | 8 +++---- 9 files changed, 27 insertions(+), 39 deletions(-) rename src/main/java/eu/enmeshed/model/{AuditLog.java => relationships/RelationshipAuditLog.java} (88%) diff --git a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java index 1b03252..06ad79c 100644 --- a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java +++ b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java @@ -1,11 +1,5 @@ package eu.enmeshed; -import static eu.enmeshed.model.Response.Result.ACCEPTED; -import static eu.enmeshed.model.Response.Result.REJECTED; -import static eu.enmeshed.model.relationships.Relationship.Status.PENDING; -import static java.util.List.of; -import static java.util.Objects.isNull; - import eu.enmeshed.client.EnmeshedClient; import eu.enmeshed.model.AttributeWrapper; import eu.enmeshed.model.ContentWrapper; @@ -37,6 +31,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; import lombok.Getter; @@ -67,7 +62,7 @@ public EnmeshedOnboardingService( this.enmeshedClient = enmeshedClient; this.requiredAttributes = requiredAttributes; this.optionalAttributes = optionalAttributes; - this.createAttributes = of(); + this.createAttributes = List.of(); // Get IdentifyInfo identityInfo = enmeshedClient.getIdentityInfo().getResult(); @@ -209,7 +204,7 @@ public RegistrationResult checkRegistrationState( Map, AttributeValue> attributes = getSharedSimpleAttributesFromResponseItems(creationContent.getResponse().getItems()); - if (relationship.getStatus() == PENDING) { + if (relationship.getStatus() == Relationship.Status.PENDING) { boolean decision = acceptanceDecider.test(attributes); if (decision) { @@ -218,7 +213,8 @@ public RegistrationResult checkRegistrationState( enmeshedClient.rejectRelationship(relationship.getId()); } return checkRegistrationState(relationshipTemplateId, registrationResult -> decision); - } else if (creationContent.getResponse().getResult() == ACCEPTED) { + } else if (creationContent.getResponse().getResult() + == eu.enmeshed.model.Response.Result.ACCEPTED) { // Request was accepted by User and us - Get the send Attributes and return them return new RegistrationResult( attributes, @@ -226,7 +222,8 @@ public RegistrationResult checkRegistrationState( relationship.getId(), true); - } else if (creationContent.getResponse().getResult() == REJECTED) { + } else if (creationContent.getResponse().getResult() + == eu.enmeshed.model.Response.Result.REJECTED) { // Request was accepted by User and us - Get the send Attributes and return them return new RegistrationResult( attributes, @@ -278,7 +275,8 @@ private RelationshipTemplate createOnboardingRelationshipTemplate( RequestItemGroup.builder() .title(displayTextSharedAttributes) .mustBeAccepted(true) - .items(of(ShareAttributeRequestItem.fromWrapper(connectorDisplayNameAttribute, true))) + .items( + List.of(ShareAttributeRequestItem.fromWrapper(connectorDisplayNameAttribute, true))) .build(); RequestItemGroup requestedAttributesGroup = @@ -319,7 +317,9 @@ private RelationshipTemplate createOnboardingRelationshipTemplate( .build(); Long qrCodeValidityTime = - isNull(qrCodeValidityMinutes) ? QR_CODE_VALIDITY_MINUTES_DEFAULT : qrCodeValidityMinutes; + Objects.isNull(qrCodeValidityMinutes) + ? QR_CODE_VALIDITY_MINUTES_DEFAULT + : qrCodeValidityMinutes; RelationshipTemplateCreation relationShipTemplateCreation = RelationshipTemplateCreation.builder() diff --git a/src/main/java/eu/enmeshed/client/EnmeshedClient.java b/src/main/java/eu/enmeshed/client/EnmeshedClient.java index c95eb3c..5919dde 100644 --- a/src/main/java/eu/enmeshed/client/EnmeshedClient.java +++ b/src/main/java/eu/enmeshed/client/EnmeshedClient.java @@ -19,7 +19,6 @@ import eu.enmeshed.model.messaging.SendMessage; import eu.enmeshed.model.qr.QrCode; import eu.enmeshed.model.relationshipTemplates.RelationshipTemplate; -import eu.enmeshed.model.relationshipTemplates.RelationshipTemplateContent; import eu.enmeshed.model.relationshipTemplates.RelationshipTemplateCreation; import eu.enmeshed.model.relationships.Relationship; import eu.enmeshed.model.request.LocalRequest; @@ -94,11 +93,6 @@ static EnmeshedClient configure( ResultWrapper createOwnRelationshipTemplate( RelationshipTemplateCreation relationshipTemplate); - @RequestLine("POST /api/v2/Requests/Outgoing/Validate") - @Headers("Content-Type: application/json") - Object validateOwnRelationshipTemplate( - ContentWrapper contentWrapper); - @RequestLine("GET /api/v2/RelationshipTemplates/{0}") @Headers("Accept: image/png") Response getQrCodeForRelationshipTemplate(@Param("0") String relationshipTemplateId); @@ -116,7 +110,7 @@ ResultWrapper> searchRelationships( @Param("0") String templateId, @Param("1") String peer, @Param("2") String status); @RequestLine("GET /api/v2/Relationships/{id}") - ResultWrapper getRelationshipsById(@Param("id") String id); + ResultWrapper getRelationshipById(@Param("id") String id); @RequestLine("PUT /api/v2/Relationships/{id}/Accept") @Headers("Content-Type: application/json") @@ -166,7 +160,7 @@ ResultWrapper acceptIncomingRequestById( */ @Retryable @RequestLine("POST /api/v2/Files/Own") - @Headers({"Content-Type: multipart/form-data", "accept: application/json"}) + @Headers({"Content-Type: multipart/form-data"}) ResultWrapper uploadNewOwnFile(FileUploadRequest fileUploadRequest); @Retryable diff --git a/src/main/java/eu/enmeshed/model/attributes/Attribute.java b/src/main/java/eu/enmeshed/model/attributes/Attribute.java index db4f910..052cbc4 100644 --- a/src/main/java/eu/enmeshed/model/attributes/Attribute.java +++ b/src/main/java/eu/enmeshed/model/attributes/Attribute.java @@ -1,7 +1,5 @@ package eu.enmeshed.model.attributes; -import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; - import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; @@ -27,7 +25,7 @@ @Setter @SuperBuilder @JsonIgnoreProperties(ignoreUnknown = true) -@JsonInclude(NON_EMPTY) +@JsonInclude(JsonInclude.Include.NON_EMPTY) public class Attribute { @JsonProperty("@type") private String type; diff --git a/src/main/java/eu/enmeshed/model/messaging/Notification.java b/src/main/java/eu/enmeshed/model/messaging/Notification.java index 6491c49..e78ebc9 100644 --- a/src/main/java/eu/enmeshed/model/messaging/Notification.java +++ b/src/main/java/eu/enmeshed/model/messaging/Notification.java @@ -1,5 +1,6 @@ package eu.enmeshed.model.messaging; +import com.fasterxml.jackson.annotation.JsonProperty; import eu.enmeshed.model.notificationItem.NotificationItem; import java.util.List; import lombok.Getter; @@ -12,6 +13,9 @@ @Setter @SuperBuilder public class Notification extends MessageContent { + @JsonProperty("@type") + private String type; + private String id; private List items; } diff --git a/src/main/java/eu/enmeshed/model/relationships/Relationship.java b/src/main/java/eu/enmeshed/model/relationships/Relationship.java index 8ad81c3..f72d1bd 100644 --- a/src/main/java/eu/enmeshed/model/relationships/Relationship.java +++ b/src/main/java/eu/enmeshed/model/relationships/Relationship.java @@ -1,7 +1,6 @@ package eu.enmeshed.model.relationships; import com.fasterxml.jackson.annotation.JsonProperty; -import eu.enmeshed.model.AuditLog; import eu.enmeshed.model.IdentityInfo; import eu.enmeshed.model.event.WebhookData; import eu.enmeshed.model.relationshipTemplates.RelationshipTemplate; @@ -24,7 +23,7 @@ public class Relationship implements WebhookData { private String peer; private IdentityInfo peerIdentity; private RelationshipCreationContent creationContent; - private List auditLog; + private List auditLog; public enum Status { @JsonProperty("Pending") diff --git a/src/main/java/eu/enmeshed/model/AuditLog.java b/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java similarity index 88% rename from src/main/java/eu/enmeshed/model/AuditLog.java rename to src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java index 2329d56..a6a8749 100644 --- a/src/main/java/eu/enmeshed/model/AuditLog.java +++ b/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java @@ -1,4 +1,4 @@ -package eu.enmeshed.model; +package eu.enmeshed.model.relationships; import com.fasterxml.jackson.annotation.JsonProperty; import java.time.ZonedDateTime; @@ -13,7 +13,7 @@ @Getter @Setter @Builder -public class AuditLog { +public class RelationshipAuditLog { private ZonedDateTime createdAt; private String createdBy; private String createdByDevice; diff --git a/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java index e433e4c..f3f52b4 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java @@ -1,7 +1,5 @@ package eu.enmeshed.model.requestItems; -import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; - import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; @@ -14,7 +12,7 @@ import lombok.experimental.SuperBuilder; @Data -@JsonInclude(NON_EMPTY) +@JsonInclude(JsonInclude.Include.NON_EMPTY) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") @JsonSubTypes({ @JsonSubTypes.Type(RequestItemGroup.class), diff --git a/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java b/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java index 079a45e..b73e27d 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java +++ b/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java @@ -1,7 +1,5 @@ package eu.enmeshed.model.requestItems; -import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; - import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonTypeInfo; import java.util.List; @@ -16,12 +14,11 @@ @Setter @SuperBuilder @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") -@JsonInclude(NON_EMPTY) +@JsonInclude(JsonInclude.Include.NON_EMPTY) public class RequestItemGroup extends RequestItem { private List items; private String title; private String description; private Map metadata; - private Boolean mustBeAccepted; private Boolean requireManualDecision; } diff --git a/src/main/java/eu/enmeshed/retryer/CustomRetryer.java b/src/main/java/eu/enmeshed/retryer/CustomRetryer.java index 9d120e3..626a297 100644 --- a/src/main/java/eu/enmeshed/retryer/CustomRetryer.java +++ b/src/main/java/eu/enmeshed/retryer/CustomRetryer.java @@ -1,9 +1,8 @@ package eu.enmeshed.retryer; -import static java.time.ZonedDateTime.now; - import feign.RetryableException; import feign.Retryer; +import java.time.ZonedDateTime; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -23,7 +22,7 @@ public CustomRetryer(long backoff, int maxAttempts) { } public void continueOrPropagate(RetryableException e) { - var startTime = now().toInstant().toEpochMilli(); + var startTime = ZonedDateTime.now().toInstant().toEpochMilli(); log.info( "Retry, attempt number {}. Response status: {}. Start time: {}", attempt, @@ -33,7 +32,7 @@ public void continueOrPropagate(RetryableException e) { log.error( "The maximum of retry attempts exceeded, attempt number: {}, time taken (millis) {}", attempt, - now().toInstant().toEpochMilli() - startTime, + ZonedDateTime.now().toInstant().toEpochMilli() - startTime, e); throw e; } @@ -46,7 +45,6 @@ public void continueOrPropagate(RetryableException e) { @Override public Retryer clone() { - return new CustomRetryer(backoff, maxAttempts); } } From 4ed3d20c18466eb8c206dbe337416a81da1de698 Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Tue, 10 Sep 2024 16:21:33 +0200 Subject: [PATCH 03/17] Remove "Accept: application/json" from the header --- src/main/java/eu/enmeshed/client/EnmeshedClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/eu/enmeshed/client/EnmeshedClient.java b/src/main/java/eu/enmeshed/client/EnmeshedClient.java index 5919dde..7f071b8 100644 --- a/src/main/java/eu/enmeshed/client/EnmeshedClient.java +++ b/src/main/java/eu/enmeshed/client/EnmeshedClient.java @@ -78,7 +78,7 @@ static EnmeshedClient configure( ResultWrapper> searchAttributes(@Param("2") String contentValueType); @RequestLine("POST /api/v2/Attributes") - @Headers({"Content-Type: application/json", "Accept: application/json"}) + @Headers({"Content-Type: application/json"}) ResultWrapper createAttribute(ContentWrapper attribute); @RequestLine("GET /api/v2/Attributes/{id}") From 2965aca1cf0a09b68534d048bb0cbf7755e93b20 Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Tue, 10 Sep 2024 19:30:47 +0200 Subject: [PATCH 04/17] Update models --- .../model/relationships/Relationship.java | 31 +++++++------- .../relationships/RelationshipAuditLog.java | 42 ++++++++++++------- .../relationships/RelationshipStaus.java | 18 ++++++++ 3 files changed, 60 insertions(+), 31 deletions(-) create mode 100644 src/main/java/eu/enmeshed/model/relationships/RelationshipStaus.java diff --git a/src/main/java/eu/enmeshed/model/relationships/Relationship.java b/src/main/java/eu/enmeshed/model/relationships/Relationship.java index f72d1bd..e88e039 100644 --- a/src/main/java/eu/enmeshed/model/relationships/Relationship.java +++ b/src/main/java/eu/enmeshed/model/relationships/Relationship.java @@ -17,22 +17,19 @@ @Setter @Builder public class Relationship implements WebhookData { - private String id; - private RelationshipTemplate template; - private Status status; - private String peer; - private IdentityInfo peerIdentity; - private RelationshipCreationContent creationContent; - private List auditLog; + private String id; + private RelationshipTemplate template; + private RelationshipStaus status; + private String peer; + private IdentityInfo peerIdentity; + private RelationshipCreationContent creationContent; + private List auditLog; + private PeerDeletionInfo peerDeletionInfo; - public enum Status { - @JsonProperty("Pending") - PENDING, - - @JsonProperty("Active") - ACTIVE, - - @JsonProperty("Rejected") - REJECTED - } + public enum PeerDeletionInfo { + @JsonProperty("ToBeDeleted") + TO_BE_DELETED, + @JsonProperty("Deleted") + DELETED + } } diff --git a/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java b/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java index a6a8749..5c5a8c2 100644 --- a/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java +++ b/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java @@ -14,19 +14,33 @@ @Setter @Builder public class RelationshipAuditLog { - private ZonedDateTime createdAt; - private String createdBy; - private String createdByDevice; - private String Reason; - private Status oldStatus; - private Status newStatus; + private ZonedDateTime createdAt; + private String createdBy; + private String createdByDevice; + private Reason reason; + private RelationshipStaus oldStatus; + private RelationshipStaus newStatus; - public enum Status { - @JsonProperty("Pending") - PENDING, - @JsonProperty("Active") - ACTIVE, - @JsonProperty("Rejected") - REJECTED - } + public enum Reason { + @JsonProperty("Creation") + CREATION, + @JsonProperty("AcceptanceOfCreation") + ACCEPTANCE_OF_CREATION, + @JsonProperty("RejectionOfCreation") + REJECTION_OF_CREATION, + @JsonProperty("RevocationOfCreation") + REVOCATION_OF_CREATION, + @JsonProperty("Termination") + TERMINATION, + @JsonProperty("ReactivationRequested") + REACTIVATION_REQUESTED, + @JsonProperty("AcceptanceOfReactivation") + ACCEPTANCE_OF_REACTIVATION, + @JsonProperty("RejectionOfReactivation") + REJECTION_OF_REACTIVATION, + @JsonProperty("RevocationOfReactivation") + REVOCATION_OF_REACTIVATION, + @JsonProperty("Decomposition") + DECOMPOSITION + } } diff --git a/src/main/java/eu/enmeshed/model/relationships/RelationshipStaus.java b/src/main/java/eu/enmeshed/model/relationships/RelationshipStaus.java new file mode 100644 index 0000000..51212b5 --- /dev/null +++ b/src/main/java/eu/enmeshed/model/relationships/RelationshipStaus.java @@ -0,0 +1,18 @@ +package eu.enmeshed.model.relationships; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public enum RelationshipStaus { + @JsonProperty("Pending") + PENDING, + @JsonProperty("Active") + ACTIVE, + @JsonProperty("Rejected") + REJECTED, + @JsonProperty("Revoked") + REVOKED, + @JsonProperty("Terminated") + TERMINATED, + @JsonProperty("DeletionProposed") + DELETION_PROPOSED +} From 9e10870b157c88bd199ff1ce0b02b77c08230315 Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Tue, 10 Sep 2024 19:31:01 +0200 Subject: [PATCH 05/17] Fix compilation issues --- src/main/java/eu/enmeshed/EnmeshedOnboardingService.java | 3 ++- .../java/eu/enmeshed/EnmeshedOnboardingServiceTest.java | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java index 06ad79c..184cc2d 100644 --- a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java +++ b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java @@ -14,6 +14,7 @@ import eu.enmeshed.model.relationshipTemplates.RelationshipTemplateCreation; import eu.enmeshed.model.relationships.Relationship; import eu.enmeshed.model.relationships.RelationshipCreationContent; +import eu.enmeshed.model.relationships.RelationshipStaus; import eu.enmeshed.model.requestItems.CreateAttributeRequestItem; import eu.enmeshed.model.requestItems.ReadAttributeRequestItem; import eu.enmeshed.model.requestItems.RequestItem; @@ -204,7 +205,7 @@ public RegistrationResult checkRegistrationState( Map, AttributeValue> attributes = getSharedSimpleAttributesFromResponseItems(creationContent.getResponse().getItems()); - if (relationship.getStatus() == Relationship.Status.PENDING) { + if (relationship.getStatus() == RelationshipStaus.PENDING) { boolean decision = acceptanceDecider.test(attributes); if (decision) { diff --git a/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java b/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java index c24d53b..8d709f8 100644 --- a/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java +++ b/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java @@ -26,6 +26,7 @@ import eu.enmeshed.model.relationshipTemplates.RelationshipTemplateCreation; import eu.enmeshed.model.relationships.Relationship; import eu.enmeshed.model.relationships.RelationshipCreationContent; +import eu.enmeshed.model.relationships.RelationshipStaus; import eu.enmeshed.model.requestItems.CreateAttributeRequestItem; import eu.enmeshed.model.requestItems.ReadAttributeRequestItem; import eu.enmeshed.model.requestItems.RequestItem; @@ -418,7 +419,7 @@ void shouldAcceptTheIncomingRequestAndReturnSentData() { .template(RelationshipTemplate.builder().id(relationshipTemplateId).build()) .peerIdentity(IdentityInfo.builder().address(userAddress).build()) .peer(userAddress) - .status(Relationship.Status.PENDING) + .status(RelationshipStaus.PENDING) .creationContent(creationContent) .build()))) .thenReturn( @@ -514,7 +515,7 @@ void shouldRejectTheIncomingRequestAndReturnSentData() { .template(RelationshipTemplate.builder().id(relationshipTemplateId).build()) .peerIdentity(IdentityInfo.builder().address(userAddress).build()) .peer(userAddress) - .status(Relationship.Status.PENDING) + .status(RelationshipStaus.PENDING) .creationContent(creationContent) .build()))) .thenReturn( @@ -525,7 +526,7 @@ void shouldRejectTheIncomingRequestAndReturnSentData() { .template(RelationshipTemplate.builder().id(relationshipTemplateId).build()) .peerIdentity(IdentityInfo.builder().address(userAddress).build()) .peer(userAddress) - .status(Relationship.Status.REJECTED) + .status(RelationshipStaus.REJECTED) .creationContent(creationContent) .build()))); From 07433a205601fd5df2330539d762f4d5a0813cfc Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Wed, 11 Sep 2024 12:24:25 +0200 Subject: [PATCH 06/17] Fix typo in the model name --- src/main/java/eu/enmeshed/EnmeshedOnboardingService.java | 4 ++-- .../eu/enmeshed/model/relationships/Relationship.java | 2 +- .../model/relationships/RelationshipAuditLog.java | 4 ++-- .../{RelationshipStaus.java => RelationshipStatus.java} | 2 +- .../java/eu/enmeshed/EnmeshedOnboardingServiceTest.java | 8 ++++---- 5 files changed, 10 insertions(+), 10 deletions(-) rename src/main/java/eu/enmeshed/model/relationships/{RelationshipStaus.java => RelationshipStatus.java} (91%) diff --git a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java index 184cc2d..186651e 100644 --- a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java +++ b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java @@ -14,7 +14,7 @@ import eu.enmeshed.model.relationshipTemplates.RelationshipTemplateCreation; import eu.enmeshed.model.relationships.Relationship; import eu.enmeshed.model.relationships.RelationshipCreationContent; -import eu.enmeshed.model.relationships.RelationshipStaus; +import eu.enmeshed.model.relationships.RelationshipStatus; import eu.enmeshed.model.requestItems.CreateAttributeRequestItem; import eu.enmeshed.model.requestItems.ReadAttributeRequestItem; import eu.enmeshed.model.requestItems.RequestItem; @@ -205,7 +205,7 @@ public RegistrationResult checkRegistrationState( Map, AttributeValue> attributes = getSharedSimpleAttributesFromResponseItems(creationContent.getResponse().getItems()); - if (relationship.getStatus() == RelationshipStaus.PENDING) { + if (relationship.getStatus() == RelationshipStatus.PENDING) { boolean decision = acceptanceDecider.test(attributes); if (decision) { diff --git a/src/main/java/eu/enmeshed/model/relationships/Relationship.java b/src/main/java/eu/enmeshed/model/relationships/Relationship.java index e88e039..f0df95f 100644 --- a/src/main/java/eu/enmeshed/model/relationships/Relationship.java +++ b/src/main/java/eu/enmeshed/model/relationships/Relationship.java @@ -19,7 +19,7 @@ public class Relationship implements WebhookData { private String id; private RelationshipTemplate template; - private RelationshipStaus status; + private RelationshipStatus status; private String peer; private IdentityInfo peerIdentity; private RelationshipCreationContent creationContent; diff --git a/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java b/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java index 5c5a8c2..5a5c4c2 100644 --- a/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java +++ b/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java @@ -18,8 +18,8 @@ public class RelationshipAuditLog { private String createdBy; private String createdByDevice; private Reason reason; - private RelationshipStaus oldStatus; - private RelationshipStaus newStatus; + private RelationshipStatus oldStatus; + private RelationshipStatus newStatus; public enum Reason { @JsonProperty("Creation") diff --git a/src/main/java/eu/enmeshed/model/relationships/RelationshipStaus.java b/src/main/java/eu/enmeshed/model/relationships/RelationshipStatus.java similarity index 91% rename from src/main/java/eu/enmeshed/model/relationships/RelationshipStaus.java rename to src/main/java/eu/enmeshed/model/relationships/RelationshipStatus.java index 51212b5..8a51926 100644 --- a/src/main/java/eu/enmeshed/model/relationships/RelationshipStaus.java +++ b/src/main/java/eu/enmeshed/model/relationships/RelationshipStatus.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; -public enum RelationshipStaus { +public enum RelationshipStatus { @JsonProperty("Pending") PENDING, @JsonProperty("Active") diff --git a/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java b/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java index 8d709f8..2ce422c 100644 --- a/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java +++ b/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java @@ -26,7 +26,7 @@ import eu.enmeshed.model.relationshipTemplates.RelationshipTemplateCreation; import eu.enmeshed.model.relationships.Relationship; import eu.enmeshed.model.relationships.RelationshipCreationContent; -import eu.enmeshed.model.relationships.RelationshipStaus; +import eu.enmeshed.model.relationships.RelationshipStatus; import eu.enmeshed.model.requestItems.CreateAttributeRequestItem; import eu.enmeshed.model.requestItems.ReadAttributeRequestItem; import eu.enmeshed.model.requestItems.RequestItem; @@ -419,7 +419,7 @@ void shouldAcceptTheIncomingRequestAndReturnSentData() { .template(RelationshipTemplate.builder().id(relationshipTemplateId).build()) .peerIdentity(IdentityInfo.builder().address(userAddress).build()) .peer(userAddress) - .status(RelationshipStaus.PENDING) + .status(RelationshipStatus.PENDING) .creationContent(creationContent) .build()))) .thenReturn( @@ -515,7 +515,7 @@ void shouldRejectTheIncomingRequestAndReturnSentData() { .template(RelationshipTemplate.builder().id(relationshipTemplateId).build()) .peerIdentity(IdentityInfo.builder().address(userAddress).build()) .peer(userAddress) - .status(RelationshipStaus.PENDING) + .status(RelationshipStatus.PENDING) .creationContent(creationContent) .build()))) .thenReturn( @@ -526,7 +526,7 @@ void shouldRejectTheIncomingRequestAndReturnSentData() { .template(RelationshipTemplate.builder().id(relationshipTemplateId).build()) .peerIdentity(IdentityInfo.builder().address(userAddress).build()) .peer(userAddress) - .status(RelationshipStaus.REJECTED) + .status(RelationshipStatus.REJECTED) .creationContent(creationContent) .build()))); From 3324c222684b2010dd2b03d58f77036a6593ff3e Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Wed, 11 Sep 2024 17:42:13 +0200 Subject: [PATCH 07/17] Update classes and tests according to the PR comments --- .../eu/enmeshed/EnmeshedMessagingService.java | 1 - .../enmeshed/EnmeshedOnboardingService.java | 8 +--- .../eu/enmeshed/client/EnmeshedClient.java | 4 +- .../java/eu/enmeshed/model/event/Webhook.java | 2 +- .../enmeshed/model/event/WebhookTrigger.java | 2 +- .../model/event/WebhookTriggerNames.java | 5 +- .../Notification.java | 3 +- .../notificationItem/NotificationItem.java | 9 +--- ...redAttributeSucceededNotificationItem.java | 6 ++- .../model/relationships/Relationship.java | 28 +++++------ .../relationships/RelationshipAuditLog.java | 46 ------------------- .../RelationshipAuditLogEntry.java | 46 +++++++++++++++++++ .../CreateAttributeRequestItem.java | 5 +- .../ProposeAttributeRequestItem.java | 1 - .../ReadAttributeRequestItem.java | 1 - .../model/requestItems/RequestItem.java | 6 --- .../model/requestItems/RequestItemGroup.java | 1 - .../ShareAttributeRequestItem.java | 1 - .../EnmeshedMessagingServiceTest.java | 7 --- .../EnmeshedOnboardingServiceTest.java | 9 ---- 20 files changed, 76 insertions(+), 115 deletions(-) rename src/main/java/eu/enmeshed/model/{messaging => notification}/Notification.java (83%) delete mode 100644 src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java create mode 100644 src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLogEntry.java diff --git a/src/main/java/eu/enmeshed/EnmeshedMessagingService.java b/src/main/java/eu/enmeshed/EnmeshedMessagingService.java index ca4b862..4e633c9 100644 --- a/src/main/java/eu/enmeshed/EnmeshedMessagingService.java +++ b/src/main/java/eu/enmeshed/EnmeshedMessagingService.java @@ -82,7 +82,6 @@ public String sendAuthenticationRequest( AuthenticationRequestItem.builder() .title(displayTitle) .description(displayText) - .mustBeAccepted(mandatory) .requireManualDecision(true) .metadata(metadata) .build())) diff --git a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java index 186651e..e232e04 100644 --- a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java +++ b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java @@ -275,16 +275,12 @@ private RelationshipTemplate createOnboardingRelationshipTemplate( RequestItemGroup sharedAttributesGroup = RequestItemGroup.builder() .title(displayTextSharedAttributes) - .mustBeAccepted(true) .items( List.of(ShareAttributeRequestItem.fromWrapper(connectorDisplayNameAttribute, true))) .build(); RequestItemGroup requestedAttributesGroup = - RequestItemGroup.builder() - .title(displayTextRequestedAttributes) - .mustBeAccepted(true) - .build(); + RequestItemGroup.builder().title(displayTextRequestedAttributes).build(); List readAttributeItems = new ArrayList<>(); requiredAttributes.stream() @@ -296,7 +292,7 @@ private RelationshipTemplate createOnboardingRelationshipTemplate( requestedAttributesGroup.setItems(readAttributeItems); RequestItemGroup createAttributeGroup = - RequestItemGroup.builder().title(displayTextCreateAttributes).mustBeAccepted(true).build(); + RequestItemGroup.builder().title(displayTextCreateAttributes).build(); List createAttributeItems = new ArrayList<>(); createAttributes.stream() .map( diff --git a/src/main/java/eu/enmeshed/client/EnmeshedClient.java b/src/main/java/eu/enmeshed/client/EnmeshedClient.java index 7f071b8..0d781a3 100644 --- a/src/main/java/eu/enmeshed/client/EnmeshedClient.java +++ b/src/main/java/eu/enmeshed/client/EnmeshedClient.java @@ -74,8 +74,8 @@ static EnmeshedClient configure( /* Attributes */ - @RequestLine("GET /api/v2/Attributes?content.value.@type={2}") - ResultWrapper> searchAttributes(@Param("2") String contentValueType); + @RequestLine("GET /api/v2/Attributes?content.value.@type={type}") + ResultWrapper> searchAttributes(@Param("type") String contentValueType); @RequestLine("POST /api/v2/Attributes") @Headers({"Content-Type: application/json"}) diff --git a/src/main/java/eu/enmeshed/model/event/Webhook.java b/src/main/java/eu/enmeshed/model/event/Webhook.java index bb2c582..934110e 100644 --- a/src/main/java/eu/enmeshed/model/event/Webhook.java +++ b/src/main/java/eu/enmeshed/model/event/Webhook.java @@ -28,7 +28,7 @@ public class Webhook { WebhookTriggerNames.Consumption.OUTGOING_REQUEST_CREATED, WebhookTriggerNames.Consumption.OUTGOING_REQUEST_CREATED_AND_COMPLETED, WebhookTriggerNames.Consumption - .OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CHANGE_CREATED_AND_COMPLETED + .OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CREATED_AND_COMPLETED }), @JsonSubTypes.Type( value = LocalAttribute.class, diff --git a/src/main/java/eu/enmeshed/model/event/WebhookTrigger.java b/src/main/java/eu/enmeshed/model/event/WebhookTrigger.java index b13c076..8d7b871 100644 --- a/src/main/java/eu/enmeshed/model/event/WebhookTrigger.java +++ b/src/main/java/eu/enmeshed/model/event/WebhookTrigger.java @@ -32,7 +32,7 @@ public enum WebhookTrigger { @JsonProperty( WebhookTriggerNames.Consumption - .OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CHANGE_CREATED_AND_COMPLETED) + .OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CREATED_AND_COMPLETED) CONSUMPTION__OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CHANGE_CREATED_AND_COMPLETED, @JsonProperty(WebhookTriggerNames.Consumption.OUTGOING_REQUEST_STATUS_CHANGED) diff --git a/src/main/java/eu/enmeshed/model/event/WebhookTriggerNames.java b/src/main/java/eu/enmeshed/model/event/WebhookTriggerNames.java index 8edbad5..e1febd9 100644 --- a/src/main/java/eu/enmeshed/model/event/WebhookTriggerNames.java +++ b/src/main/java/eu/enmeshed/model/event/WebhookTriggerNames.java @@ -14,9 +14,8 @@ public abstract static class Consumption { public static final String OUTGOING_REQUEST_CREATED = "consumption.outgoingRequestCreated"; public static final String OUTGOING_REQUEST_CREATED_AND_COMPLETED = "consumption.outgoingRequestCreatedAndCompleted"; - public static final String - OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CHANGE_CREATED_AND_COMPLETED = - "consumption.outgoingRequestFromRelationshipCreationChangeCreatedAndCompleted"; + public static final String OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CREATED_AND_COMPLETED = + "consumption.outgoingRequestFromRelationshipCreationCreatedAndCompleted"; public static final String OUTGOING_REQUEST_STATUS_CHANGED = "consumption.outgoingRequestStatusChanged"; public static final String RELATIONSHIP_TEMPLATE_PROCESSED = diff --git a/src/main/java/eu/enmeshed/model/messaging/Notification.java b/src/main/java/eu/enmeshed/model/notification/Notification.java similarity index 83% rename from src/main/java/eu/enmeshed/model/messaging/Notification.java rename to src/main/java/eu/enmeshed/model/notification/Notification.java index e78ebc9..26cbc12 100644 --- a/src/main/java/eu/enmeshed/model/messaging/Notification.java +++ b/src/main/java/eu/enmeshed/model/notification/Notification.java @@ -1,6 +1,7 @@ -package eu.enmeshed.model.messaging; +package eu.enmeshed.model.notification; import com.fasterxml.jackson.annotation.JsonProperty; +import eu.enmeshed.model.messaging.MessageContent; import eu.enmeshed.model.notificationItem.NotificationItem; import java.util.List; import lombok.Getter; diff --git a/src/main/java/eu/enmeshed/model/notificationItem/NotificationItem.java b/src/main/java/eu/enmeshed/model/notificationItem/NotificationItem.java index 75858e6..b0a85bd 100644 --- a/src/main/java/eu/enmeshed/model/notificationItem/NotificationItem.java +++ b/src/main/java/eu/enmeshed/model/notificationItem/NotificationItem.java @@ -2,22 +2,15 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; @Data @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") @JsonSubTypes({@JsonSubTypes.Type(PeerSharedAttributeSucceededNotificationItem.class)}) -@AllArgsConstructor -@NoArgsConstructor @Getter @Setter @SuperBuilder -public abstract class NotificationItem { - private String predecessorId; - private String successorId; -} +public abstract class NotificationItem {} diff --git a/src/main/java/eu/enmeshed/model/notificationItem/PeerSharedAttributeSucceededNotificationItem.java b/src/main/java/eu/enmeshed/model/notificationItem/PeerSharedAttributeSucceededNotificationItem.java index a19f418..9e3f47f 100644 --- a/src/main/java/eu/enmeshed/model/notificationItem/PeerSharedAttributeSucceededNotificationItem.java +++ b/src/main/java/eu/enmeshed/model/notificationItem/PeerSharedAttributeSucceededNotificationItem.java @@ -1,15 +1,17 @@ package eu.enmeshed.model.notificationItem; import eu.enmeshed.model.attributes.IdentityAttribute; +import eu.enmeshed.model.attributes.RelationshipAttribute; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; -@NoArgsConstructor @Getter @Setter @SuperBuilder public class PeerSharedAttributeSucceededNotificationItem extends NotificationItem { private IdentityAttribute successorContent; + private RelationshipAttribute attribute; + private String predecessorId; + private String successorId; } diff --git a/src/main/java/eu/enmeshed/model/relationships/Relationship.java b/src/main/java/eu/enmeshed/model/relationships/Relationship.java index f0df95f..5698d7c 100644 --- a/src/main/java/eu/enmeshed/model/relationships/Relationship.java +++ b/src/main/java/eu/enmeshed/model/relationships/Relationship.java @@ -17,19 +17,19 @@ @Setter @Builder public class Relationship implements WebhookData { - private String id; - private RelationshipTemplate template; - private RelationshipStatus status; - private String peer; - private IdentityInfo peerIdentity; - private RelationshipCreationContent creationContent; - private List auditLog; - private PeerDeletionInfo peerDeletionInfo; + private String id; + private RelationshipTemplate template; + private RelationshipStatus status; + private String peer; + private IdentityInfo peerIdentity; + private RelationshipCreationContent creationContent; + private List auditLog; + private PeerDeletionInfo peerDeletionInfo; - public enum PeerDeletionInfo { - @JsonProperty("ToBeDeleted") - TO_BE_DELETED, - @JsonProperty("Deleted") - DELETED - } + public enum PeerDeletionInfo { + @JsonProperty("ToBeDeleted") + TO_BE_DELETED, + @JsonProperty("Deleted") + DELETED + } } diff --git a/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java b/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java deleted file mode 100644 index 5a5c4c2..0000000 --- a/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLog.java +++ /dev/null @@ -1,46 +0,0 @@ -package eu.enmeshed.model.relationships; - -import com.fasterxml.jackson.annotation.JsonProperty; -import java.time.ZonedDateTime; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@Builder -public class RelationshipAuditLog { - private ZonedDateTime createdAt; - private String createdBy; - private String createdByDevice; - private Reason reason; - private RelationshipStatus oldStatus; - private RelationshipStatus newStatus; - - public enum Reason { - @JsonProperty("Creation") - CREATION, - @JsonProperty("AcceptanceOfCreation") - ACCEPTANCE_OF_CREATION, - @JsonProperty("RejectionOfCreation") - REJECTION_OF_CREATION, - @JsonProperty("RevocationOfCreation") - REVOCATION_OF_CREATION, - @JsonProperty("Termination") - TERMINATION, - @JsonProperty("ReactivationRequested") - REACTIVATION_REQUESTED, - @JsonProperty("AcceptanceOfReactivation") - ACCEPTANCE_OF_REACTIVATION, - @JsonProperty("RejectionOfReactivation") - REJECTION_OF_REACTIVATION, - @JsonProperty("RevocationOfReactivation") - REVOCATION_OF_REACTIVATION, - @JsonProperty("Decomposition") - DECOMPOSITION - } -} diff --git a/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLogEntry.java b/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLogEntry.java new file mode 100644 index 0000000..767f5a5 --- /dev/null +++ b/src/main/java/eu/enmeshed/model/relationships/RelationshipAuditLogEntry.java @@ -0,0 +1,46 @@ +package eu.enmeshed.model.relationships; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.time.ZonedDateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +@Builder +public class RelationshipAuditLogEntry { + private ZonedDateTime createdAt; + private String createdBy; + private String createdByDevice; + private Reason reason; + private RelationshipStatus oldStatus; + private RelationshipStatus newStatus; + + public enum Reason { + @JsonProperty("Creation") + CREATION, + @JsonProperty("AcceptanceOfCreation") + ACCEPTANCE_OF_CREATION, + @JsonProperty("RejectionOfCreation") + REJECTION_OF_CREATION, + @JsonProperty("RevocationOfCreation") + REVOCATION_OF_CREATION, + @JsonProperty("Termination") + TERMINATION, + @JsonProperty("ReactivationRequested") + REACTIVATION_REQUESTED, + @JsonProperty("AcceptanceOfReactivation") + ACCEPTANCE_OF_REACTIVATION, + @JsonProperty("RejectionOfReactivation") + REJECTION_OF_REACTIVATION, + @JsonProperty("RevocationOfReactivation") + REVOCATION_OF_REACTIVATION, + @JsonProperty("Decomposition") + DECOMPOSITION + } +} diff --git a/src/main/java/eu/enmeshed/model/requestItems/CreateAttributeRequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/CreateAttributeRequestItem.java index f69990b..f8220d7 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/CreateAttributeRequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/CreateAttributeRequestItem.java @@ -20,10 +20,7 @@ public class CreateAttributeRequestItem extends RequestItem { public static CreateAttributeRequestItem fromWrapper( AttributeWrapper wrapper, boolean mustBeAccepted) { - return CreateAttributeRequestItem.builder() - .attribute(relationshipAttribute(wrapper)) - .mustBeAccepted(mustBeAccepted) - .build(); + return CreateAttributeRequestItem.builder().attribute(relationshipAttribute(wrapper)).build(); } private static RelationshipAttribute relationshipAttribute(AttributeWrapper wrapper) { diff --git a/src/main/java/eu/enmeshed/model/requestItems/ProposeAttributeRequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/ProposeAttributeRequestItem.java index 8aa922f..a668df5 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/ProposeAttributeRequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/ProposeAttributeRequestItem.java @@ -24,7 +24,6 @@ public static ProposeAttributeRequestItem withIdentit Class attributeType, boolean mustBeAccepted) { return ProposeAttributeRequestItem.builder() - .mustBeAccepted(mustBeAccepted) .query( Map.of("@type", "IdentityAttributeQuery", "valueType", attributeType.getSimpleName())) .build(); diff --git a/src/main/java/eu/enmeshed/model/requestItems/ReadAttributeRequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/ReadAttributeRequestItem.java index 5d25c53..b139ec8 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/ReadAttributeRequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/ReadAttributeRequestItem.java @@ -21,7 +21,6 @@ public static ReadAttributeRequestItem withIdentityAt Class attributeType, boolean mustBeAccepted) { return ReadAttributeRequestItem.builder() - .mustBeAccepted(mustBeAccepted) .query( Map.of("@type", "IdentityAttributeQuery", "valueType", attributeType.getSimpleName())) .build(); diff --git a/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java index f3f52b4..2117af1 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java @@ -31,14 +31,8 @@ @Setter @SuperBuilder public abstract class RequestItem { - private String title; - private String description; - private Map metadata; - - private Boolean mustBeAccepted; - private Boolean requireManualDecision; } diff --git a/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java b/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java index b73e27d..af1436f 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java +++ b/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java @@ -20,5 +20,4 @@ public class RequestItemGroup extends RequestItem { private String title; private String description; private Map metadata; - private Boolean requireManualDecision; } diff --git a/src/main/java/eu/enmeshed/model/requestItems/ShareAttributeRequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/ShareAttributeRequestItem.java index 864c2c1..e4d5c44 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/ShareAttributeRequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/ShareAttributeRequestItem.java @@ -24,7 +24,6 @@ public static ShareAttributeRequestItem fromWrapper( content.setType(IdentityAttribute.class.getSimpleName()); return ShareAttributeRequestItem.builder() - .mustBeAccepted(mustBeAccepted) .attribute(content) .sourceAttributeId(wrapper.getId()) .build(); diff --git a/src/test/java/eu/enmeshed/EnmeshedMessagingServiceTest.java b/src/test/java/eu/enmeshed/EnmeshedMessagingServiceTest.java index 94d12c0..432df2b 100644 --- a/src/test/java/eu/enmeshed/EnmeshedMessagingServiceTest.java +++ b/src/test/java/eu/enmeshed/EnmeshedMessagingServiceTest.java @@ -136,8 +136,6 @@ void testSendMessage() throws EnmeshedMessagingService.SendMessageFailedExceptio .getItems() .get(0) .getRequireManualDecision()); - Assertions.assertTrue( - requestWrapperArgumentCaptor.getValue().getContent().getItems().get(0).getMustBeAccepted()); // Test sent message Assertions.assertNull(sendMessageArgumentCaptor.getValue().getAttachments()); @@ -151,7 +149,6 @@ void testSendMessage() throws EnmeshedMessagingService.SendMessageFailedExceptio Assertions.assertInstanceOf(AuthenticationRequestItem.class, sentRequest.getItems().get(0)); Assertions.assertEquals(TEST_AUTH_TITLE, sentRequest.getItems().get(0).getTitle()); Assertions.assertEquals(TEST_AUTH_TEXT, sentRequest.getItems().get(0).getDescription()); - Assertions.assertTrue(sentRequest.getItems().get(0).getMustBeAccepted()); Assertions.assertTrue(sentRequest.getItems().get(0).getRequireManualDecision()); } @@ -281,7 +278,6 @@ void testResponseAccepted() { List.of( AuthenticationRequestItem.builder() .requireManualDecision(true) - .mustBeAccepted(true) .description(TEST_AUTH_TEXT) .title(TEST_AUTH_TITLE) .build())) @@ -337,7 +333,6 @@ void testResponseRejected() { List.of( AuthenticationRequestItem.builder() .requireManualDecision(true) - .mustBeAccepted(true) .description(TEST_AUTH_TEXT) .title(TEST_AUTH_TITLE) .build())) @@ -388,7 +383,6 @@ void testResponseExpired() { List.of( AuthenticationRequestItem.builder() .requireManualDecision(true) - .mustBeAccepted(true) .description(TEST_AUTH_TEXT) .title(TEST_AUTH_TITLE) .build())) @@ -431,7 +425,6 @@ void testResponseNotDecided() { List.of( AuthenticationRequestItem.builder() .requireManualDecision(true) - .mustBeAccepted(true) .description(TEST_AUTH_TEXT) .title(TEST_AUTH_TITLE) .build())) diff --git a/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java b/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java index 2ce422c..979983a 100644 --- a/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java +++ b/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java @@ -201,7 +201,6 @@ void itShouldReturnRegistrationData() { relationshipTemplateCreationArgumentCaptor.getValue().getContent().getOnNewRelationship(); // Shared Items - Assertions.assertTrue(itemList.items().get(0).getItems().get(0).getMustBeAccepted()); Assertions.assertEquals(testDisplayNameSharedAttributes, itemList.items().get(0).getTitle()); Assertions.assertEquals( CONNECTOR_DISPLAY_NAME, @@ -210,35 +209,28 @@ void itShouldReturnRegistrationData() { .getAttribute() .getValue()) .getValue()); - Assertions.assertTrue(itemList.items().get(0).getItems().get(0).getMustBeAccepted()); // Required Items Assertions.assertEquals(testDisplayNameRequestedAttributes, itemList.items().get(1).getTitle()); - Assertions.assertTrue(itemList.items().get(1).getItems().get(0).getMustBeAccepted()); Assertions.assertEquals( REQUIRED_ATTRIBUTES.get(0).getSimpleName(), ((ReadAttributeRequestItem) itemList.items().get(1).getItems().get(0)) .getQuery() .get("valueType")); - Assertions.assertTrue(itemList.items().get(1).getItems().get(0).getMustBeAccepted()); Assertions.assertEquals( REQUIRED_ATTRIBUTES.get(1).getSimpleName(), ((ReadAttributeRequestItem) itemList.items().get(1).getItems().get(1)) .getQuery() .get("valueType")); - Assertions.assertTrue(itemList.items().get(1).getItems().get(1).getMustBeAccepted()); // Optional Items - Assertions.assertFalse(itemList.items().get(1).getItems().get(2).getMustBeAccepted()); Assertions.assertEquals( OPTIONAL_ATTRIBUTES.get(0).getSimpleName(), ((ReadAttributeRequestItem) itemList.items().get(1).getItems().get(2)) .getQuery() .get("valueType")); - Assertions.assertFalse(itemList.items().get(1).getItems().get(2).getMustBeAccepted()); // Created Items - Assertions.assertTrue(itemList.items().get(2).getItems().get(0).getMustBeAccepted()); Assertions.assertEquals(CREATE_ATTRIBUTES.get(0).getSimpleName(), "CreateAttributeRequestItem"); } @@ -558,7 +550,6 @@ void shouldRejectTheIncomingRequestAndReturnSentData() { void shouldPassTheSentAttributesToAcceptanceDecider() { String relationshipTemplateId = "RLT_XXX"; - String relationshipChangeId = "RCH_XXX"; String relationshipId = "REL_XXX"; String userGivenName = "Max"; String userSurname = "Muster"; From 16db7a8d347a74c59343aabccc4d036263901ce5 Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Wed, 11 Sep 2024 18:07:34 +0200 Subject: [PATCH 08/17] Create PeerDeletionInfo class --- .../model/relationships/Relationship.java | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/main/java/eu/enmeshed/model/relationships/Relationship.java b/src/main/java/eu/enmeshed/model/relationships/Relationship.java index 5698d7c..f3ff484 100644 --- a/src/main/java/eu/enmeshed/model/relationships/Relationship.java +++ b/src/main/java/eu/enmeshed/model/relationships/Relationship.java @@ -7,6 +7,7 @@ import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.Data; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -17,19 +18,24 @@ @Setter @Builder public class Relationship implements WebhookData { - private String id; - private RelationshipTemplate template; - private RelationshipStatus status; - private String peer; - private IdentityInfo peerIdentity; - private RelationshipCreationContent creationContent; - private List auditLog; - private PeerDeletionInfo peerDeletionInfo; + private String id; + private RelationshipTemplate template; + private RelationshipStatus status; + private String peer; + private IdentityInfo peerIdentity; + private RelationshipCreationContent creationContent; + private List auditLog; + private PeerDeletionInfo peerDeletionInfo; - public enum PeerDeletionInfo { - @JsonProperty("ToBeDeleted") - TO_BE_DELETED, - @JsonProperty("Deleted") - DELETED - } + @Data + public static class PeerDeletionInfo { + PeerDeletionStatus peerDeletionStatus; + } + + public enum PeerDeletionStatus { + @JsonProperty("ToBeDeleted") + TO_BE_DELETED, + @JsonProperty("Deleted") + DELETED + } } From 83dc861f3c71c12ef24be800b6914fd637e4a283 Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Thu, 12 Sep 2024 10:14:49 +0200 Subject: [PATCH 09/17] Remove RelationshipChange from RequestSourceType --- .../java/eu/enmeshed/model/request/RequestResponseSource.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/enmeshed/model/request/RequestResponseSource.java b/src/main/java/eu/enmeshed/model/request/RequestResponseSource.java index 373b1f2..fbb0884 100644 --- a/src/main/java/eu/enmeshed/model/request/RequestResponseSource.java +++ b/src/main/java/eu/enmeshed/model/request/RequestResponseSource.java @@ -22,7 +22,7 @@ public enum RequestSourceType { @JsonProperty("Message") MESSAGE, - @JsonProperty("RelationshipChange") - RELATIONSHIP_CHANGE + @JsonProperty("RelationshipTemplate") + RELATIONSHIP_TEMPLATE } } From 3bc5964dbfee69a8820aaa873f78b0d5fab9b454 Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Thu, 12 Sep 2024 10:23:07 +0200 Subject: [PATCH 10/17] Update readme --- README_dev.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README_dev.md b/README_dev.md index 55df72c..0d3bc81 100644 --- a/README_dev.md +++ b/README_dev.md @@ -133,7 +133,7 @@ Workflow: - The Service checks whether there is an inbound request from the connecting peer - It will return `null` if no request was made by the peer - It will accept the inbound request if there is any - - It will return the shared attributes, the EnmeshedAddress, the RelationshipChangeId and the RelationShipId on + - It will return the shared attributes, the EnmeshedAddress, the RelationShipId and the RelationshipCreationContent on success - Connection between Connector and Enmeshed Wallet app is now set up. @@ -235,3 +235,5 @@ record AuthenticationStatus( - add expired flag to AuthenticationStatus - 0.6.0 - add possibility to attach Metadata to Authentication-Requests +- 0.8.0 + - update SDK to Connector V5 From cdb08e3f4220978d1691d40e316bd4f64af93139 Mon Sep 17 00:00:00 2001 From: mbaboshyn <35178181+mbaboshyn@users.noreply.github.com> Date: Thu, 12 Sep 2024 10:25:35 +0200 Subject: [PATCH 11/17] Update README_dev.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Julian König <33655937+jkoenig134@users.noreply.github.com> --- README_dev.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_dev.md b/README_dev.md index 0d3bc81..1a6b489 100644 --- a/README_dev.md +++ b/README_dev.md @@ -133,7 +133,7 @@ Workflow: - The Service checks whether there is an inbound request from the connecting peer - It will return `null` if no request was made by the peer - It will accept the inbound request if there is any - - It will return the shared attributes, the EnmeshedAddress, the RelationShipId and the RelationshipCreationContent on + - It will return the shared attributes, the EnmeshedAddress, the RelationshipId and the RelationshipCreationContent on success - Connection between Connector and Enmeshed Wallet app is now set up. From 65345a38aea0f1ab77d0f011edbbaae89dc696ea Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Thu, 12 Sep 2024 11:11:19 +0200 Subject: [PATCH 12/17] Update Changelog --- README_dev.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_dev.md b/README_dev.md index 1a6b489..55c4e28 100644 --- a/README_dev.md +++ b/README_dev.md @@ -235,5 +235,5 @@ record AuthenticationStatus( - add expired flag to AuthenticationStatus - 0.6.0 - add possibility to attach Metadata to Authentication-Requests -- 0.8.0 +- 1.0.0 - update SDK to Connector V5 From 8f0dbe1bfb2525b04b133f1b9a8115f2be499922 Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Thu, 12 Sep 2024 12:09:37 +0200 Subject: [PATCH 13/17] Change WebhookTriggerNames property --- src/main/java/eu/enmeshed/model/event/WebhookTrigger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/eu/enmeshed/model/event/WebhookTrigger.java b/src/main/java/eu/enmeshed/model/event/WebhookTrigger.java index 8d7b871..2a3a95a 100644 --- a/src/main/java/eu/enmeshed/model/event/WebhookTrigger.java +++ b/src/main/java/eu/enmeshed/model/event/WebhookTrigger.java @@ -33,7 +33,7 @@ public enum WebhookTrigger { @JsonProperty( WebhookTriggerNames.Consumption .OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CREATED_AND_COMPLETED) - CONSUMPTION__OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CHANGE_CREATED_AND_COMPLETED, + CONSUMPTION__OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CREATED_AND_COMPLETED, @JsonProperty(WebhookTriggerNames.Consumption.OUTGOING_REQUEST_STATUS_CHANGED) CONSUMPTION__OUTGOING_REQUEST_STATUS_CHANGED, From f8bc6b519c7334f1e14f2e754960e916046fb79d Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Thu, 12 Sep 2024 12:10:08 +0200 Subject: [PATCH 14/17] Remove RelationshipAttribute and change successorContent to attribute --- .../PeerSharedAttributeSucceededNotificationItem.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/enmeshed/model/notificationItem/PeerSharedAttributeSucceededNotificationItem.java b/src/main/java/eu/enmeshed/model/notificationItem/PeerSharedAttributeSucceededNotificationItem.java index 9e3f47f..25a27b1 100644 --- a/src/main/java/eu/enmeshed/model/notificationItem/PeerSharedAttributeSucceededNotificationItem.java +++ b/src/main/java/eu/enmeshed/model/notificationItem/PeerSharedAttributeSucceededNotificationItem.java @@ -1,7 +1,6 @@ package eu.enmeshed.model.notificationItem; -import eu.enmeshed.model.attributes.IdentityAttribute; -import eu.enmeshed.model.attributes.RelationshipAttribute; +import eu.enmeshed.model.attributes.Attribute; import lombok.Getter; import lombok.Setter; import lombok.experimental.SuperBuilder; @@ -10,8 +9,7 @@ @Setter @SuperBuilder public class PeerSharedAttributeSucceededNotificationItem extends NotificationItem { - private IdentityAttribute successorContent; - private RelationshipAttribute attribute; + private Attribute successorContent; private String predecessorId; private String successorId; } From 53436c7b0c0f14cfa35b84c766bf591beb61341a Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Fri, 13 Sep 2024 13:11:25 +0200 Subject: [PATCH 15/17] Resolve issues with mustBeAccepted field --- .../eu/enmeshed/EnmeshedMessagingService.java | 1 + .../enmeshed/EnmeshedOnboardingService.java | 6 ++-- .../model/relationships/Relationship.java | 32 +++++++++---------- .../model/request/LocalRequestResponse.java | 2 -- .../CreateAttributeRequestItem.java | 5 ++- .../ProposeAttributeRequestItem.java | 1 + .../ReadAttributeRequestItem.java | 1 + .../model/requestItems/RequestItem.java | 4 +-- .../model/requestItems/RequestItemGroup.java | 2 +- .../ShareAttributeRequestItem.java | 1 + .../EnmeshedMessagingServiceTest.java | 4 +++ .../EnmeshedOnboardingServiceTest.java | 6 +++- 12 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/main/java/eu/enmeshed/EnmeshedMessagingService.java b/src/main/java/eu/enmeshed/EnmeshedMessagingService.java index 4e633c9..ca4b862 100644 --- a/src/main/java/eu/enmeshed/EnmeshedMessagingService.java +++ b/src/main/java/eu/enmeshed/EnmeshedMessagingService.java @@ -82,6 +82,7 @@ public String sendAuthenticationRequest( AuthenticationRequestItem.builder() .title(displayTitle) .description(displayText) + .mustBeAccepted(mandatory) .requireManualDecision(true) .metadata(metadata) .build())) diff --git a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java index e232e04..c85a847 100644 --- a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java +++ b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java @@ -205,7 +205,8 @@ public RegistrationResult checkRegistrationState( Map, AttributeValue> attributes = getSharedSimpleAttributesFromResponseItems(creationContent.getResponse().getItems()); - if (relationship.getStatus() == RelationshipStatus.PENDING) { + RelationshipStatus status = relationship.getStatus(); + if (status == RelationshipStatus.PENDING) { boolean decision = acceptanceDecider.test(attributes); if (decision) { @@ -223,8 +224,7 @@ public RegistrationResult checkRegistrationState( relationship.getId(), true); - } else if (creationContent.getResponse().getResult() - == eu.enmeshed.model.Response.Result.REJECTED) { + } else if (status == RelationshipStatus.REJECTED) { // Request was accepted by User and us - Get the send Attributes and return them return new RegistrationResult( attributes, diff --git a/src/main/java/eu/enmeshed/model/relationships/Relationship.java b/src/main/java/eu/enmeshed/model/relationships/Relationship.java index f3ff484..b2f6fc9 100644 --- a/src/main/java/eu/enmeshed/model/relationships/Relationship.java +++ b/src/main/java/eu/enmeshed/model/relationships/Relationship.java @@ -18,24 +18,24 @@ @Setter @Builder public class Relationship implements WebhookData { - private String id; - private RelationshipTemplate template; - private RelationshipStatus status; - private String peer; - private IdentityInfo peerIdentity; - private RelationshipCreationContent creationContent; - private List auditLog; - private PeerDeletionInfo peerDeletionInfo; + private String id; + private RelationshipTemplate template; + private RelationshipStatus status; + private String peer; + private IdentityInfo peerIdentity; + private RelationshipCreationContent creationContent; + private List auditLog; + private PeerDeletionInfo peerDeletionInfo; - @Data - public static class PeerDeletionInfo { - PeerDeletionStatus peerDeletionStatus; - } + @Data + public static class PeerDeletionInfo { + PeerDeletionStatus status; public enum PeerDeletionStatus { - @JsonProperty("ToBeDeleted") - TO_BE_DELETED, - @JsonProperty("Deleted") - DELETED + @JsonProperty("ToBeDeleted") + TO_BE_DELETED, + @JsonProperty("Deleted") + DELETED } + } } diff --git a/src/main/java/eu/enmeshed/model/request/LocalRequestResponse.java b/src/main/java/eu/enmeshed/model/request/LocalRequestResponse.java index b898db1..21c6127 100644 --- a/src/main/java/eu/enmeshed/model/request/LocalRequestResponse.java +++ b/src/main/java/eu/enmeshed/model/request/LocalRequestResponse.java @@ -15,8 +15,6 @@ @Setter @SuperBuilder public class LocalRequestResponse extends ContentWrapper { - ZonedDateTime createdAt; - RequestResponseSource source; } diff --git a/src/main/java/eu/enmeshed/model/requestItems/CreateAttributeRequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/CreateAttributeRequestItem.java index f8220d7..f69990b 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/CreateAttributeRequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/CreateAttributeRequestItem.java @@ -20,7 +20,10 @@ public class CreateAttributeRequestItem extends RequestItem { public static CreateAttributeRequestItem fromWrapper( AttributeWrapper wrapper, boolean mustBeAccepted) { - return CreateAttributeRequestItem.builder().attribute(relationshipAttribute(wrapper)).build(); + return CreateAttributeRequestItem.builder() + .attribute(relationshipAttribute(wrapper)) + .mustBeAccepted(mustBeAccepted) + .build(); } private static RelationshipAttribute relationshipAttribute(AttributeWrapper wrapper) { diff --git a/src/main/java/eu/enmeshed/model/requestItems/ProposeAttributeRequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/ProposeAttributeRequestItem.java index a668df5..8aa922f 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/ProposeAttributeRequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/ProposeAttributeRequestItem.java @@ -24,6 +24,7 @@ public static ProposeAttributeRequestItem withIdentit Class attributeType, boolean mustBeAccepted) { return ProposeAttributeRequestItem.builder() + .mustBeAccepted(mustBeAccepted) .query( Map.of("@type", "IdentityAttributeQuery", "valueType", attributeType.getSimpleName())) .build(); diff --git a/src/main/java/eu/enmeshed/model/requestItems/ReadAttributeRequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/ReadAttributeRequestItem.java index b139ec8..5d25c53 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/ReadAttributeRequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/ReadAttributeRequestItem.java @@ -21,6 +21,7 @@ public static ReadAttributeRequestItem withIdentityAt Class attributeType, boolean mustBeAccepted) { return ReadAttributeRequestItem.builder() + .mustBeAccepted(mustBeAccepted) .query( Map.of("@type", "IdentityAttributeQuery", "valueType", attributeType.getSimpleName())) .build(); diff --git a/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java index 2117af1..807bf40 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java @@ -22,8 +22,7 @@ @JsonSubTypes.Type(ConsentRequestItem.class), @JsonSubTypes.Type(CreateAttributeRequestItem.class), @JsonSubTypes.Type(FreeTextRequestItem.class), - @JsonSubTypes.Type(ProposeAttributeRequestItem.class), - @JsonSubTypes.Type(RequestItemGroup.class) + @JsonSubTypes.Type(ProposeAttributeRequestItem.class) }) @AllArgsConstructor @NoArgsConstructor @@ -35,4 +34,5 @@ public abstract class RequestItem { private String description; private Map metadata; private Boolean requireManualDecision; + private Boolean mustBeAccepted; } diff --git a/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java b/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java index af1436f..d3ce78d 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java +++ b/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java @@ -15,7 +15,7 @@ @SuperBuilder @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") @JsonInclude(JsonInclude.Include.NON_EMPTY) -public class RequestItemGroup extends RequestItem { +public class RequestItemGroup { private List items; private String title; private String description; diff --git a/src/main/java/eu/enmeshed/model/requestItems/ShareAttributeRequestItem.java b/src/main/java/eu/enmeshed/model/requestItems/ShareAttributeRequestItem.java index e4d5c44..864c2c1 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/ShareAttributeRequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/ShareAttributeRequestItem.java @@ -24,6 +24,7 @@ public static ShareAttributeRequestItem fromWrapper( content.setType(IdentityAttribute.class.getSimpleName()); return ShareAttributeRequestItem.builder() + .mustBeAccepted(mustBeAccepted) .attribute(content) .sourceAttributeId(wrapper.getId()) .build(); diff --git a/src/test/java/eu/enmeshed/EnmeshedMessagingServiceTest.java b/src/test/java/eu/enmeshed/EnmeshedMessagingServiceTest.java index 432df2b..cba7b9f 100644 --- a/src/test/java/eu/enmeshed/EnmeshedMessagingServiceTest.java +++ b/src/test/java/eu/enmeshed/EnmeshedMessagingServiceTest.java @@ -278,6 +278,7 @@ void testResponseAccepted() { List.of( AuthenticationRequestItem.builder() .requireManualDecision(true) + .mustBeAccepted(true) .description(TEST_AUTH_TEXT) .title(TEST_AUTH_TITLE) .build())) @@ -333,6 +334,7 @@ void testResponseRejected() { List.of( AuthenticationRequestItem.builder() .requireManualDecision(true) + .mustBeAccepted(true) .description(TEST_AUTH_TEXT) .title(TEST_AUTH_TITLE) .build())) @@ -383,6 +385,7 @@ void testResponseExpired() { List.of( AuthenticationRequestItem.builder() .requireManualDecision(true) + .mustBeAccepted(true) .description(TEST_AUTH_TEXT) .title(TEST_AUTH_TITLE) .build())) @@ -425,6 +428,7 @@ void testResponseNotDecided() { List.of( AuthenticationRequestItem.builder() .requireManualDecision(true) + .mustBeAccepted(true) .description(TEST_AUTH_TEXT) .title(TEST_AUTH_TITLE) .build())) diff --git a/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java b/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java index 979983a..fe46de6 100644 --- a/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java +++ b/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java @@ -201,6 +201,7 @@ void itShouldReturnRegistrationData() { relationshipTemplateCreationArgumentCaptor.getValue().getContent().getOnNewRelationship(); // Shared Items + Assertions.assertTrue(itemList.items().get(0).getItems().get(0).getMustBeAccepted()); Assertions.assertEquals(testDisplayNameSharedAttributes, itemList.items().get(0).getTitle()); Assertions.assertEquals( CONNECTOR_DISPLAY_NAME, @@ -209,8 +210,8 @@ void itShouldReturnRegistrationData() { .getAttribute() .getValue()) .getValue()); - // Required Items + Assertions.assertTrue(itemList.items().get(1).getItems().get(0).getMustBeAccepted()); Assertions.assertEquals(testDisplayNameRequestedAttributes, itemList.items().get(1).getTitle()); Assertions.assertEquals( REQUIRED_ATTRIBUTES.get(0).getSimpleName(), @@ -222,8 +223,10 @@ void itShouldReturnRegistrationData() { ((ReadAttributeRequestItem) itemList.items().get(1).getItems().get(1)) .getQuery() .get("valueType")); + Assertions.assertTrue(itemList.items().get(1).getItems().get(1).getMustBeAccepted()); // Optional Items + Assertions.assertFalse(itemList.items().get(1).getItems().get(2).getMustBeAccepted()); Assertions.assertEquals( OPTIONAL_ATTRIBUTES.get(0).getSimpleName(), ((ReadAttributeRequestItem) itemList.items().get(1).getItems().get(2)) @@ -231,6 +234,7 @@ void itShouldReturnRegistrationData() { .get("valueType")); // Created Items + Assertions.assertTrue(itemList.items().get(2).getItems().get(0).getMustBeAccepted()); Assertions.assertEquals(CREATE_ATTRIBUTES.get(0).getSimpleName(), "CreateAttributeRequestItem"); } From b98b5f0dcf8dd7f6816c057a913237813f3f766e Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Fri, 13 Sep 2024 13:22:56 +0200 Subject: [PATCH 16/17] Check active relation status --- src/main/java/eu/enmeshed/EnmeshedOnboardingService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java index c85a847..3e8122f 100644 --- a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java +++ b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java @@ -215,8 +215,7 @@ public RegistrationResult checkRegistrationState( enmeshedClient.rejectRelationship(relationship.getId()); } return checkRegistrationState(relationshipTemplateId, registrationResult -> decision); - } else if (creationContent.getResponse().getResult() - == eu.enmeshed.model.Response.Result.ACCEPTED) { + } else if (status == RelationshipStatus.ACTIVE) { // Request was accepted by User and us - Get the send Attributes and return them return new RegistrationResult( attributes, From 8fde0aaf42dd25c0949eca2bd336e02646058052 Mon Sep 17 00:00:00 2001 From: Max Baboshin Date: Fri, 13 Sep 2024 13:40:09 +0200 Subject: [PATCH 17/17] Rename PeerDeletionStatus --- .../java/eu/enmeshed/model/relationships/Relationship.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/enmeshed/model/relationships/Relationship.java b/src/main/java/eu/enmeshed/model/relationships/Relationship.java index b2f6fc9..516f36a 100644 --- a/src/main/java/eu/enmeshed/model/relationships/Relationship.java +++ b/src/main/java/eu/enmeshed/model/relationships/Relationship.java @@ -29,9 +29,9 @@ public class Relationship implements WebhookData { @Data public static class PeerDeletionInfo { - PeerDeletionStatus status; + Status status; - public enum PeerDeletionStatus { + public enum Status { @JsonProperty("ToBeDeleted") TO_BE_DELETED, @JsonProperty("Deleted")