Skip to content

Commit 8550793

Browse files
committed
Fix for duplicate CRM roles
1 parent 35adc9b commit 8550793

2 files changed

Lines changed: 54 additions & 0 deletions

File tree

server/src/main/java/invite/crm/CRMController.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,15 @@
5858
import java.time.LocalDateTime;
5959
import java.time.Period;
6060
import java.time.format.DateTimeFormatter;
61+
import java.util.ArrayList;
6162
import java.util.Collections;
6263
import java.util.Comparator;
6364
import java.util.HashMap;
65+
import java.util.LinkedHashMap;
6466
import java.util.List;
6567
import java.util.Map;
6668
import java.util.NoSuchElementException;
69+
import java.util.Objects;
6770
import java.util.Optional;
6871
import java.util.Set;
6972
import java.util.function.Predicate;
@@ -145,6 +148,13 @@ public CRMController(@Value("${crm.collab-person-prefix}") String collabPersonPr
145148
public ResponseEntity<String> contact(@RequestBody CRMContact crmContact) {
146149
LOG.debug("POST /api/external/v1/crm: " + crmContact);
147150

151+
List<CRMRole> distinctRoles = crmContact.getRoles().stream()
152+
.filter(Objects::nonNull)
153+
.collect(Collectors.toMap(CRMRole::getRoleId, r -> r, (a, b) -> a, LinkedHashMap::new))
154+
.values().stream()
155+
.collect(Collectors.toCollection(ArrayList::new));
156+
crmContact.setRoles(distinctRoles);
157+
148158
boolean created;
149159
CRMOrganisation crmOrganisation = crmContact.getOrganisation();
150160
Organisation organisation = organisationRepository.findByCrmOrganisationId(crmOrganisation.getOrganisationId())

server/src/test/java/invite/crm/CRMControllerTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,50 @@ void sendInvitationUnknownOrganisation() {
11421142
.statusCode(HttpStatus.NOT_FOUND.value());
11431143
}
11441144

1145+
@Test
1146+
void contactDeduplicateRoles() throws JsonProcessingException {
1147+
CRMRole crmRole = new CRMRole("roleId", "BVW", "Super");
1148+
CRMRole duplicateRole = new CRMRole("roleId", "BVW", "Super");
1149+
String crmContactID = UUID.randomUUID().toString();
1150+
String crmOrganisationID = UUID.randomUUID().toString();
1151+
CRMContact crmContact = new CRMContact(
1152+
"new_user",
1153+
"hardewijk.org",
1154+
true,
1155+
crmContactID,
1156+
"John",
1157+
"from",
1158+
"Doe",
1159+
"jdoe@example.com",
1160+
new CRMOrganisation(crmOrganisationID, "abbrec", "Inc. Corporated"),
1161+
List.of(crmRole, duplicateRole, duplicateRole)
1162+
);
1163+
1164+
stubForManageProviderByEntityID(EntityType.OIDC10_RP, "https://calendar");
1165+
stubForManageProviderByEntityID(EntityType.SAML20_SP, "https://storage");
1166+
stubForManageProvisioning(List.of("5"));
1167+
stubForCreateScimRole();
1168+
stubForCreateScimUser();
1169+
stubForUpdateScimRole();
1170+
1171+
String response = given()
1172+
.when()
1173+
.accept(ContentType.JSON)
1174+
.header(API_KEY_HEADER, "secret")
1175+
.contentType(ContentType.JSON)
1176+
.body(crmContact)
1177+
.post("/crm/profile")
1178+
.then()
1179+
.extract()
1180+
.asString();
1181+
assertEquals("created", response);
1182+
1183+
Organisation organisation = organisationRepository.findByCrmOrganisationId(crmOrganisationID)
1184+
.orElseThrow(() -> new NotFoundException("Organisation not found: " + crmOrganisationID));
1185+
User user = userRepository.findByCrmContactIdAndOrganisation(crmContactID, organisation).get();
1186+
assertEquals(1, user.getUserRoles().size());
1187+
}
1188+
11451189
private void seedCRMData() {
11461190
Organisation organisation = organisationRepository.findByCrmOrganisationId(CRM_ORGANIZATION_ID).get();
11471191
Role role = new Role();

0 commit comments

Comments
 (0)