Skip to content

Commit 7b7b4a5

Browse files
committed
Fixes #578
And quarantees no change requests for idempotent saves
1 parent c118074 commit 7b7b4a5

4 files changed

Lines changed: 34 additions & 12 deletions

File tree

client/src/pages/ApplicationDetail.jsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import "./ApplicationDetail.scss";
22
import "../styles/access_card.scss";
33
import React, {useEffect, useState} from "react";
44
import {
5-
cancelServiceProviderConnectionRequest, cancelServiceProviderDisconnectionRequest,
5+
cancelServiceProviderConnectionRequest,
6+
cancelServiceProviderDisconnectionRequest,
67
connectServiceProviderToIdentityProvider,
78
disconnectServiceProviderToIdentityProvider,
89
getPolicyByServiceProviderEntityId,
@@ -467,10 +468,10 @@ const ApplicationDetail = ({anonymous, refreshUser}) => {
467468
message={I18n.t("appAccess.requestedAccessNotification")}/>
468469
}
469470
{pendingDisconnect && <Alert alertType={AlertType.Warning}
470-
asChild={true}
471-
children={<a href="/" onClick={e => cancelDisconnectionRequest(true, e)}>
472-
{I18n.t("appAccess.cancelRequest")}</a>}
473-
message={I18n.t("appAccess.requestedDisconnectNotification")}/>
471+
asChild={true}
472+
children={<a href="/" onClick={e => cancelDisconnectionRequest(true, e)}>
473+
{I18n.t("appAccess.cancelRequest")}</a>}
474+
message={I18n.t("appAccess.requestedDisconnectNotification")}/>
474475
}
475476
<div className={`app-access ${readOnly ? "read-only" : ""}`} onClick={e => readOnly && stopEvent(e)}>
476477
{showPolicyDetails &&
@@ -495,7 +496,7 @@ const ApplicationDetail = ({anonymous, refreshUser}) => {
495496
<InfoBlock className="no-gap">
496497
<div className="grouped">
497498
<div>
498-
<h3>{I18n.t("appAccess.users", {name: providerOrganizationName(I18n.locale, serviceProvider)})}</h3>
499+
<h3>{I18n.t("appAccess.users", {name: currentOrganization.name})}</h3>
499500
<p>{I18n.t("appAccess.config")}</p>
500501
</div>
501502
<Button type={ButtonType.Primary}
@@ -507,7 +508,7 @@ const ApplicationDetail = ({anonymous, refreshUser}) => {
507508
</div>
508509
<div className="access-card large">
509510
<h4>{I18n.t(`appAccess.${isEmpty(policies) ? "everyBody" : "notEveryBody"}`,
510-
{name: providerOrganizationName(I18n.locale, serviceProvider)})}</h4>
511+
{name: currentOrganization.name})}</h4>
511512
{!isEmpty(policies) &&
512513
<Chip type={ChipType.Status_info}
513514
label={I18n.t("appAccess.policies", {nbr: policies.length})}

server/src/main/java/access/api/ConnectionController.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@
5050
import static access.SwaggerOpenIdConfig.API_TOKENS_SCHEME_NAME;
5151
import static access.SwaggerOpenIdConfig.OPEN_ID_SCHEME_NAME;
5252
import static access.api.Results.deleteResult;
53-
import static access.manage.ManageData.getData;
54-
import static access.manage.ManageData.getMetaDataFields;
53+
import static access.manage.ManageData.*;
5554

5655
@RestController
5756
@RequestMapping(value = {"/api/v1/connections"}, produces = MediaType.APPLICATION_JSON_VALUE)
@@ -271,15 +270,25 @@ public ResponseEntity<List<Map<String, Object>>> identityProvidersByAllowedConne
271270
return ResponseEntity.ok(identityProviders);
272271
}
273272

273+
private List<ChangeRequest> filterExistingChangeRequestDuplicates(List<Map<String, Object>> existingChangeRequests, List<ChangeRequest> newChangeRequests) {
274+
if (isEmpty(existingChangeRequests) && !isEmpty(newChangeRequests)) {
275+
return newChangeRequests;
276+
}
277+
return newChangeRequests.stream()
278+
.filter(changeRequest ->
279+
existingChangeRequests.stream().noneMatch(changeRequestMap -> changeRequest.matches(changeRequestMap))
280+
).toList();
281+
}
274282

275283
@SuppressWarnings("unchecked")
276284
private Connection productionReadyChangeRequests(Connection connection, User user) {
277285
Environment environment = connection.getEnvironment();
278286
String changeRequestURL = manage.changeRequestURL(environment, connection);
279287
Map<String, Object> provider = manage.providerByConnection(connection);
280288
connection.updateRemoteManageData(provider);
281-
282-
List<ChangeRequest> changeRequests = connectionProviderConverter.deduceChangeRequests(connection, provider);
289+
List<Map<String, Object>> existingChangeRequests = manage.getChangeRequests(Environment.PROD, connection);
290+
List<ChangeRequest> allChangeRequests = connectionProviderConverter.deduceChangeRequests(connection, provider);
291+
List<ChangeRequest> changeRequests = filterExistingChangeRequestDuplicates(existingChangeRequests, allChangeRequests);
283292
if (!changeRequests.isEmpty()) {
284293
String entityId = (String) ((Map) provider.get("data")).get("entityid");
285294
String summary = String.format("Data change requested by %s for %s with entityID %s",

server/src/main/java/access/manage/ChangeRequest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33

44
import access.model.EntityType;
5+
import com.fasterxml.jackson.annotation.JsonIgnore;
56
import lombok.Getter;
67
import lombok.NoArgsConstructor;
78
import lombok.Setter;
89

910

1011
import java.io.Serializable;
1112
import java.util.Map;
13+
import java.util.Objects;
1214

1315
@NoArgsConstructor
1416
@Getter
@@ -62,4 +64,14 @@ public void setAuditData(Map<String, Object> auditData) {
6264
this.auditData = auditData;
6365
this.note = auditData != null ? (String) auditData.get("notes") : null;
6466
}
67+
68+
@JsonIgnore
69+
public boolean matches(Map<String, Object> changeRequestMap) {
70+
String pathUpdateTypeString = this.pathUpdateType != null ? this.pathUpdateType.name() : null;
71+
String requestTypeString = this.requestType != null ? this.requestType.name() : null;
72+
return Objects.equals(changeRequestMap.get("pathUpdateType"), pathUpdateTypeString) &&
73+
Objects.equals(changeRequestMap.get("requestType"), requestTypeString) &&
74+
Objects.equals(changeRequestMap.get("pathUpdates"), pathUpdates) ;
75+
76+
}
6577
}

server/src/test/java/access/manage/ConnectionProviderConverterTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ void deduceChangeRequests() {
4242
List<ChangeRequest> changeRequests = connectionProviderConverter.deduceChangeRequests(connection, provider);
4343
assertEquals(1, changeRequests.size());
4444
ChangeRequest changeRequest = changeRequests.getFirst();
45-
assertEquals(19, changeRequest.getPathUpdates().size());
45+
assertEquals(18, changeRequest.getPathUpdates().size());
4646
}
4747

4848
@SneakyThrows

0 commit comments

Comments
 (0)