diff --git a/README_dev.md b/README_dev.md index 55df72c..55c4e28 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 +- 1.0.0 + - update SDK to Connector V5 diff --git a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java index 735e0aa..3e8122f 100644 --- a/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java +++ b/src/main/java/eu/enmeshed/EnmeshedOnboardingService.java @@ -1,8 +1,5 @@ package eu.enmeshed; -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; @@ -16,9 +13,8 @@ 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.relationships.RelationshipStatus; import eu.enmeshed.model.requestItems.CreateAttributeRequestItem; import eu.enmeshed.model.requestItems.ReadAttributeRequestItem; import eu.enmeshed.model.requestItems.RequestItem; @@ -33,10 +29,10 @@ 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; +import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; import lombok.Getter; @@ -44,7 +40,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,11 +60,10 @@ public EnmeshedOnboardingService( String connectorDisplayName, List> requiredAttributes, List> optionalAttributes) { - this.enmeshedClient = enmeshedClient; this.requiredAttributes = requiredAttributes; this.optionalAttributes = optionalAttributes; - this.createAttributes = of(); + this.createAttributes = List.of(); // Get IdentifyInfo identityInfo = enmeshedClient.getIdentityInfo().getResult(); @@ -84,7 +78,6 @@ public EnmeshedOnboardingService( List> requiredAttributes, List> optionalAttributes, List> createAttributes) { - this.enmeshedClient = enmeshedClient; this.requiredAttributes = requiredAttributes; this.optionalAttributes = optionalAttributes; @@ -98,13 +91,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 +118,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 +139,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 +201,36 @@ 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) { + RelationshipStatus status = relationship.getStatus(); + if (status == RelationshipStatus.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 (status == RelationshipStatus.ACTIVE) { // 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 (status == RelationshipStatus.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; } } @@ -309,15 +274,12 @@ private RelationshipTemplate createOnboardingRelationshipTemplate( RequestItemGroup sharedAttributesGroup = RequestItemGroup.builder() .title(displayTextSharedAttributes) - .mustBeAccepted(true) - .items(of(ShareAttributeRequestItem.fromWrapper(connectorDisplayNameAttribute, 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() @@ -329,7 +291,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( @@ -351,7 +313,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() @@ -369,7 +333,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..0d781a3 100644 --- a/src/main/java/eu/enmeshed/client/EnmeshedClient.java +++ b/src/main/java/eu/enmeshed/client/EnmeshedClient.java @@ -37,7 +37,6 @@ import java.util.List; public interface EnmeshedClient { - ObjectMapper objectMapper = new ObjectMapper() .registerModule(new JavaTimeModule()) @@ -47,13 +46,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 +74,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={type}") + ResultWrapper> searchAttributes(@Param("type") String contentValueType); @RequestLine("POST /api/v2/Attributes") - @Headers("Content-Type: application/json") + @Headers({"Content-Type: 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 */ @@ -111,19 +109,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 getRelationshipById(@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 @@ -165,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/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/attributes/Attribute.java b/src/main/java/eu/enmeshed/model/attributes/Attribute.java index 3c31402..052cbc4 100644 --- a/src/main/java/eu/enmeshed/model/attributes/Attribute.java +++ b/src/main/java/eu/enmeshed/model/attributes/Attribute.java @@ -1,5 +1,8 @@ package eu.enmeshed.model.attributes; +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 +24,15 @@ @Getter @Setter @SuperBuilder -public abstract class Attribute { +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.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/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..2a3a95a 100644 --- a/src/main/java/eu/enmeshed/model/event/WebhookTrigger.java +++ b/src/main/java/eu/enmeshed/model/event/WebhookTrigger.java @@ -32,8 +32,8 @@ public enum WebhookTrigger { @JsonProperty( WebhookTriggerNames.Consumption - .OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CHANGE_CREATED_AND_COMPLETED) - CONSUMPTION__OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CHANGE_CREATED_AND_COMPLETED, + .OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CREATED_AND_COMPLETED) + CONSUMPTION__OUTGOING_REQUEST_FROM_RELATIONSHIP_CREATION_CREATED_AND_COMPLETED, @JsonProperty(WebhookTriggerNames.Consumption.OUTGOING_REQUEST_STATUS_CHANGED) 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/notification/Notification.java b/src/main/java/eu/enmeshed/model/notification/Notification.java new file mode 100644 index 0000000..26cbc12 --- /dev/null +++ b/src/main/java/eu/enmeshed/model/notification/Notification.java @@ -0,0 +1,22 @@ +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; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@NoArgsConstructor +@Getter +@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/RelationshipChangeRequestContent.java b/src/main/java/eu/enmeshed/model/notificationItem/NotificationItem.java similarity index 57% rename from src/main/java/eu/enmeshed/model/relationships/RelationshipChangeRequestContent.java rename to src/main/java/eu/enmeshed/model/notificationItem/NotificationItem.java index 337f81d..b0a85bd 100644 --- a/src/main/java/eu/enmeshed/model/relationships/RelationshipChangeRequestContent.java +++ b/src/main/java/eu/enmeshed/model/notificationItem/NotificationItem.java @@ -1,18 +1,16 @@ -package eu.enmeshed.model.relationships; +package eu.enmeshed.model.notificationItem; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; 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(RelationshipCreationChangeRequestContent.class)}) -@NoArgsConstructor +@JsonSubTypes({@JsonSubTypes.Type(PeerSharedAttributeSucceededNotificationItem.class)}) @Getter @Setter @SuperBuilder -public abstract class RelationshipChangeRequestContent {} +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 new file mode 100644 index 0000000..25a27b1 --- /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.Attribute; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@Getter +@Setter +@SuperBuilder +public class PeerSharedAttributeSucceededNotificationItem extends NotificationItem { + private Attribute successorContent; + 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 aec3cda..516f36a 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,27 +18,24 @@ @Setter @Builder public class Relationship implements WebhookData { - private String id; - private RelationshipTemplate template; - - private Status status; - + private RelationshipStatus status; private String peer; - private IdentityInfo peerIdentity; - - private List changes; - - public enum Status { - @JsonProperty("Pending") - PENDING, - - @JsonProperty("Active") - ACTIVE, - - @JsonProperty("Rejected") - REJECTED + private RelationshipCreationContent creationContent; + private List auditLog; + private PeerDeletionInfo peerDeletionInfo; + + @Data + public static class PeerDeletionInfo { + Status status; + + public enum Status { + @JsonProperty("ToBeDeleted") + TO_BE_DELETED, + @JsonProperty("Deleted") + DELETED + } } } 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/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/relationships/RelationshipStatus.java b/src/main/java/eu/enmeshed/model/relationships/RelationshipStatus.java new file mode 100644 index 0000000..8a51926 --- /dev/null +++ b/src/main/java/eu/enmeshed/model/relationships/RelationshipStatus.java @@ -0,0 +1,18 @@ +package eu.enmeshed.model.relationships; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public enum RelationshipStatus { + @JsonProperty("Pending") + PENDING, + @JsonProperty("Active") + ACTIVE, + @JsonProperty("Rejected") + REJECTED, + @JsonProperty("Revoked") + REVOKED, + @JsonProperty("Terminated") + TERMINATED, + @JsonProperty("DeletionProposed") + DELETION_PROPOSED +} 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/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 } } 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..807bf40 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java +++ b/src/main/java/eu/enmeshed/model/requestItems/RequestItem.java @@ -1,5 +1,6 @@ package eu.enmeshed.model.requestItems; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import java.util.Map; @@ -11,6 +12,7 @@ import lombok.experimental.SuperBuilder; @Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") @JsonSubTypes({ @JsonSubTypes.Type(RequestItemGroup.class), @@ -20,7 +22,7 @@ @JsonSubTypes.Type(ConsentRequestItem.class), @JsonSubTypes.Type(CreateAttributeRequestItem.class), @JsonSubTypes.Type(FreeTextRequestItem.class), - @JsonSubTypes.Type(ProposeAttributeRequestItem.class), + @JsonSubTypes.Type(ProposeAttributeRequestItem.class) }) @AllArgsConstructor @NoArgsConstructor @@ -28,14 +30,9 @@ @Setter @SuperBuilder public abstract class RequestItem { - private String title; - private String description; - private Map metadata; - - private Boolean mustBeAccepted; - 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 9f95769..d3ce78d 100644 --- a/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java +++ b/src/main/java/eu/enmeshed/model/requestItems/RequestItemGroup.java @@ -1,17 +1,23 @@ package eu.enmeshed.model.requestItems; +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 -public class RequestItemGroup extends RequestItem { - +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class RequestItemGroup { private List items; + private String title; + private String description; + private Map metadata; } 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..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; } diff --git a/src/test/java/eu/enmeshed/EnmeshedMessagingServiceTest.java b/src/test/java/eu/enmeshed/EnmeshedMessagingServiceTest.java index 94d12c0..cba7b9f 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()); } diff --git a/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java b/src/test/java/eu/enmeshed/EnmeshedOnboardingServiceTest.java index 4920925..fe46de6 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,8 @@ 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.relationships.RelationshipStatus; import eu.enmeshed.model.requestItems.CreateAttributeRequestItem; import eu.enmeshed.model.requestItems.ReadAttributeRequestItem; import eu.enmeshed.model.requestItems.RequestItem; @@ -73,7 +71,7 @@ public class EnmeshedOnboardingServiceTest { EnmeshedOnboardingService enmeshedService; @Test - void itShouldProvideIdentityInfoAndReuseConfiguredDisplayNameIfSet() { + void shouldProvideIdentityInfoAndReuseConfiguredDisplayNameIfSet() { when(enmeshedClientMock.getIdentityInfo()) .thenReturn(ResultWrapper.containing(TEST_IDENTITY_INFO)); @@ -88,7 +86,7 @@ void itShouldProvideIdentityInfoAndReuseConfiguredDisplayNameIfSet() { .build()) .build(); - when(enmeshedClientMock.searchAttributes(anyString(), anyString(), anyString())) + when(enmeshedClientMock.searchAttributes(anyString())) .thenReturn(ResultWrapper.containing(List.of(wrappedDisplayNameAttribute))); enmeshedService = @@ -122,7 +120,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 +139,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 @@ -214,17 +210,14 @@ 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(testDisplayNameRequestedAttributes, itemList.items().get(1).getTitle()); 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)) @@ -239,7 +232,6 @@ void itShouldReturnRegistrationData() { ((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()); @@ -247,7 +239,7 @@ void itShouldReturnRegistrationData() { } @Test - void itShouldReturnNullIfRelationshipTemplateCouldNotBeFound() { + void shouldReturnNullIfRelationshipTemplateCouldNotBeFound() { String relationshipTemplateId = "RLTXXX"; enmeshedService = getServiceInstance(); @@ -261,10 +253,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 +272,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 +346,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 +415,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(RelationshipStatus.PENDING) + .creationContent(creationContent) .build()))) .thenReturn( ResultWrapper.containing( @@ -470,31 +426,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 +449,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 +457,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 +511,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(RelationshipStatus.PENDING) + .creationContent(creationContent) .build()))) .thenReturn( ResultWrapper.containing( @@ -580,14 +522,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(RelationshipStatus.REJECTED) + .creationContent(creationContent) .build()))); EnmeshedOnboardingService.RegistrationResult registrationResult = @@ -595,7 +531,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 +543,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,44 +551,48 @@ void itShouldRejectTheIncomingRequestAndReturnSentData() { } @Test - void itShouldPassTheSentAttributesToAcceptanceDecider() { + void shouldPassTheSentAttributesToAcceptanceDecider() { 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(); @@ -668,14 +605,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 +615,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 +646,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(