Skip to content

Commit d3f1dc7

Browse files
committed
WIP for #672
1 parent 56d8ad1 commit d3f1dc7

File tree

2 files changed

+98
-17
lines changed

2 files changed

+98
-17
lines changed

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

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ public ResponseEntity<Map<String, ConnectionStatusResponse>> connectionStatus(@R
260260
user -> user.getCrmContactId(),
261261
user -> new ConnectionStatusResponse(
262262
user.getName(), user.getEmail(), user.getSchacHomeOrganization(), user.getUid(),
263-
"Paired", "paired"
263+
CRMStatusCode.Paired.getStatus(), CRMStatusCode.Paired.getStatusCode()
264264
)
265265
));
266266
return ResponseEntity.ok(responseMap);
@@ -269,19 +269,26 @@ public ResponseEntity<Map<String, ConnectionStatusResponse>> connectionStatus(@R
269269
.stream()
270270
.collect(Collectors.toMap(
271271
invitation -> invitation.getCrmContactId(),
272-
invitation -> userRepository.findByCrmContactIdAndOrganisation(crmOrganisationId, organisation)
273-
.map(user -> new ConnectionStatusResponse(
274-
user.getName(), user.getEmail(), user.getSchacHomeOrganization(), user.getUid(),
275-
"In process", "in_process"
276-
)).orElse(new ConnectionStatusResponse(
277-
null, invitation.getEmail(), null, null,
278-
"In process", "in_process"
279-
))
272+
invitation -> {
273+
CRMStatusCode crmStatusCode = crmStatusCode(invitation);
274+
return userRepository.findByCrmContactIdAndOrganisation(invitation.getCrmContactId(), organisation)
275+
.map(user -> new ConnectionStatusResponse(
276+
user.getName(), user.getEmail(), user.getSchacHomeOrganization(), user.getUid(),
277+
crmStatusCode.getStatus(), crmStatusCode.getStatusCode()
278+
)).orElse(new ConnectionStatusResponse(
279+
null, invitation.getEmail(), null, null,
280+
crmStatusCode.getStatus(), crmStatusCode.getStatusCode()
281+
));
282+
}
280283
));
281284
return ResponseEntity.ok(responseMap);
282285
}
283286
}
284287

288+
private CRMStatusCode crmStatusCode(Invitation invitation) {
289+
return invitation.getExpiryDate().isBefore(Instant.now()) ? CRMStatusCode.NotPaired : CRMStatusCode.InProcess;
290+
}
291+
285292
@PostMapping(value = "/crm/api/v1/invite/resend", produces = MediaType.APPLICATION_JSON_VALUE)
286293
@Operation(summary = "Resend an invitation",
287294
description = "Resend an invitation based on the CRM OrganisationID and CRM ContactID")
@@ -426,18 +433,12 @@ private List<Role> convertCrmRolesToInviteRoles(CRMContact crmContact, List<CRMR
426433
return newCrmRoles.stream()
427434
.map(crmRole -> roleRepository.findByCrmRoleIdAndOrganisation(
428435
crmRole.getRoleId(), organisation)
429-
.or(() -> this.createRole(crmContact.getOrganisation(), crmRole)))
436+
.or(() -> this.createRole(crmContact.getOrganisation(), crmRole, organisation)))
430437
.flatMap(Optional::stream)
431438
.toList();
432439
}
433440

434-
private Optional<Role> createRole(CRMOrganisation crmOrganisation, CRMRole crmRole) {
435-
Organisation organisation = organisationRepository.findByCrmOrganisationId(crmOrganisation.getOrganisationId())
436-
.orElseGet(() -> organisationRepository.save(new Organisation(
437-
crmOrganisation.getOrganisationId(),
438-
crmOrganisation.getName(),
439-
crmOrganisation.getAbbrev()
440-
)));
441+
private Optional<Role> createRole(CRMOrganisation crmOrganisation, CRMRole crmRole, Organisation organisation) {
441442
CrmConfigEntry crmConfigEntry = this.crmConfig.get(crmRole.getSabCode());
442443
if (crmConfigEntry == null) {
443444
throw new InvalidInputException("CRM sabCode is not configured: " + crmRole.getSabCode());

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

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,86 @@ void resendInviteMail() throws Exception {
455455
assertEquals("Invitation for Mail at SURFconext Invite", mailMessage.getSubject());
456456
}
457457

458+
@Test
459+
void connectionStatusWithInvitationExistingUser() {
460+
Invitation invitation = invitationRepository.findByHash(Authority.GUEST.name()).get();
461+
invitation.setCrmContactId(CRM_CONTACT_ID);
462+
invitation.setCrmOrganisationId(CRM_ORGANIZATION_ID);
463+
//This will cause the CRMStatusCode.NotPaired
464+
invitation.setExpiryDate(Instant.now().minus(600, ChronoUnit.DAYS));
465+
invitationRepository.save(invitation);
466+
467+
Map<String, ConnectionStatusResponse> response = given()
468+
.when()
469+
.accept(ContentType.JSON)
470+
.header(API_KEY_HEADER, "secret")
471+
.contentType(ContentType.JSON)
472+
.body(new ConnectionStatus(CRM_ORGANIZATION_ID, false))
473+
.get("/crm/api/v1/profiles")
474+
.as(new TypeRef<>() {
475+
});
476+
assertEquals(1, response.size());
477+
ConnectionStatusResponse connectionStatusResponse = response.get(CRM_CONTACT_ID);
478+
assertEquals("gb@kb.nl", connectionStatusResponse.email());
479+
assertEquals("George Best", connectionStatusResponse.fullname());
480+
assertEquals(CRMStatusCode.NotPaired.getStatusCode(), connectionStatusResponse.statusCode());
481+
}
482+
483+
@Test
484+
void connectionStatusWithInvitationNewUser() {
485+
Invitation invitation = invitationRepository.findByHash(Authority.GUEST.name()).get();
486+
//No user with this contactID exists
487+
String crmContactId = UUID.randomUUID().toString();
488+
invitation.setCrmContactId(crmContactId);
489+
invitation.setCrmOrganisationId(CRM_ORGANIZATION_ID);
490+
invitationRepository.save(invitation);
491+
492+
Map<String, ConnectionStatusResponse> response = given()
493+
.when()
494+
.accept(ContentType.JSON)
495+
.header(API_KEY_HEADER, "secret")
496+
.contentType(ContentType.JSON)
497+
.body(new ConnectionStatus(CRM_ORGANIZATION_ID, false))
498+
.get("/crm/api/v1/profiles")
499+
.as(new TypeRef<>() {
500+
});
501+
assertEquals(1, response.size());
502+
ConnectionStatusResponse connectionStatusResponse = response.get(crmContactId);
503+
assertEquals(invitation.getEmail(), connectionStatusResponse.email());
504+
assertNull(connectionStatusResponse.fullname());
505+
assertEquals(CRMStatusCode.InProcess.getStatusCode(), connectionStatusResponse.statusCode());
506+
}
507+
508+
@Test
509+
void connectionStatusWithUser() {
510+
Map<String, ConnectionStatusResponse> response = given()
511+
.when()
512+
.accept(ContentType.JSON)
513+
.header(API_KEY_HEADER, "secret")
514+
.contentType(ContentType.JSON)
515+
.body(new ConnectionStatus(CRM_ORGANIZATION_ID, true))
516+
.get("/crm/api/v1/profiles")
517+
.as(new TypeRef<>() {
518+
});
519+
assertEquals(1, response.size());
520+
ConnectionStatusResponse connectionStatusResponse = response.get(CRM_CONTACT_ID);
521+
assertEquals(CRMStatusCode.Paired.getStatusCode(), connectionStatusResponse.statusCode());
522+
}
523+
524+
@Test
525+
void connectionStatusWithUnknownOrganisation() {
526+
Map<String, ConnectionStatusResponse> response = given()
527+
.when()
528+
.accept(ContentType.JSON)
529+
.header(API_KEY_HEADER, "secret")
530+
.contentType(ContentType.JSON)
531+
.body(new ConnectionStatus("nope", true))
532+
.get("/crm/api/v1/profiles")
533+
.as(new TypeRef<>() {
534+
});
535+
assertEquals(0, response.size());
536+
}
537+
458538
@Test
459539
void profileWithUidIdp() {
460540
this.seedCRMData();

0 commit comments

Comments
 (0)