Skip to content

Commit be4afd1

Browse files
committed
WIP for #672
1 parent 3e45fff commit be4afd1

File tree

5 files changed

+75
-1
lines changed

5 files changed

+75
-1
lines changed

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import invite.config.HashGenerator;
77
import invite.exception.InvalidInputException;
88
import invite.exception.NotFoundException;
9+
import invite.logging.AccessLogger;
10+
import invite.logging.Event;
911
import invite.mail.MailBox;
1012
import invite.manage.EntityType;
1113
import invite.manage.Manage;
@@ -50,6 +52,10 @@
5052
import org.springframework.web.bind.annotation.RestController;
5153

5254
import java.io.IOException;
55+
import java.time.Instant;
56+
import java.time.LocalDateTime;
57+
import java.time.Period;
58+
import java.time.format.DateTimeFormatter;
5359
import java.util.Collections;
5460
import java.util.List;
5561
import java.util.Map;
@@ -276,6 +282,34 @@ public ResponseEntity<Map<String, ConnectionStatusResponse>> connectionStatus(@R
276282
}
277283
}
278284

285+
@PostMapping(value = "/crm/api/v1/invite/resend", produces = MediaType.APPLICATION_JSON_VALUE)
286+
@Operation(summary = "Resend an invitation",
287+
description = "Resend an invitation based on the CRM OrganisationID and CRM ContactID")
288+
@SecurityRequirement(name = API_HEADER_SCHEME_NAME)
289+
@PreAuthorize("hasRole('CRM')")
290+
public ResponseEntity<ResendInvitationResponse> resendInvitation(@RequestBody ResendInvitation resendInvitation) {
291+
List<Invitation> invitations = invitationRepository.findByCrmContactIdAndCrmOrganisationId(resendInvitation.crmContatcId(),
292+
resendInvitation.crmOrganisationId());
293+
invitations.forEach(invitation -> {
294+
List<Role> requestedRoles = invitation.getRoles().stream()
295+
.map(InvitationRole::getRole).toList();
296+
List<GroupedProviders> groupedProviders = manage.getGroupedProviders(requestedRoles);
297+
298+
mailBox.sendInviteMail(provisionable,
299+
invitation,
300+
groupedProviders,
301+
invitation.getLanguage(),
302+
Optional.empty());
303+
invitation.setExpiryDate(Instant.now().plus(Period.ofDays(14)));
304+
invitationRepository.save(invitation);
305+
306+
AccessLogger.invitation(LOG, Event.Resend, invitation);
307+
308+
});
309+
String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"));
310+
return ResponseEntity.ok(new ResendInvitationResponse(timestamp, 200, "ok", "Resend invitation"));
311+
}
312+
279313
private ProfileResponse crmUserNotFoundOrNoRoles() {
280314
return new ProfileResponse("Could not find any profiles with the given search parameters", 50, List.of());
281315
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package invite.crm;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
5+
public record ResendInvitation(@JsonProperty("org_id") String crmOrganisationId,
6+
@JsonProperty("guid") String crmContatcId) {
7+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package invite.crm;
2+
3+
public record ResendInvitationResponse(String timestamp, int status, String key, String message) {
4+
}

server/src/main/resources/application.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,9 @@ manage:
234234
springdoc:
235235
pathsToMatch:
236236
- "/api/external/v1/**"
237-
- "/api/internal/v1/crm"
237+
- "/crm/profile"
238+
- "/api/profile"
239+
- "/crm/api/v1/**"
238240
api-docs:
239241
enabled: true
240242
path: "/ui/api-docs"

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.junit.jupiter.api.Test;
2121
import org.springframework.http.HttpStatus;
2222

23+
import java.time.Instant;
24+
import java.time.temporal.ChronoUnit;
2325
import java.util.List;
2426
import java.util.Map;
2527
import java.util.Optional;
@@ -428,6 +430,31 @@ void scopeInviteRoleToUniqueCRMRoleIdAndOrganizationId() throws JsonProcessingEx
428430
assertEquals(2, roles.size());
429431
}
430432

433+
@Test
434+
void resendInviteMail() throws Exception {
435+
Invitation invitation = invitationRepository.findByHash(Authority.GUEST.name()).get();
436+
invitation.setExpiryDate(Instant.now().minus(5, ChronoUnit.DAYS));
437+
invitation.setCrmContactId(CRM_CONTACT_ID);
438+
invitation.setCrmOrganisationId(CRM_ORGANIZATION_ID);
439+
invitationRepository.save(invitation);
440+
441+
super.stubForManageProviderById(EntityType.OIDC10_RP, "5");
442+
ResendInvitationResponse resendInvitationResponse = given()
443+
.when()
444+
.accept(ContentType.JSON)
445+
.header(API_KEY_HEADER, "secret")
446+
.contentType(ContentType.JSON)
447+
.body(new ResendInvitation(CRM_ORGANIZATION_ID, CRM_CONTACT_ID))
448+
.post("/crm/api/v1/invite/resend")
449+
.as(new TypeRef<>() {
450+
});
451+
Invitation savedInvitation = invitationRepository.findByHash(Authority.GUEST.name()).get();
452+
assertTrue(savedInvitation.getExpiryDate().isAfter(Instant.now().plus(13, ChronoUnit.DAYS)));
453+
454+
MimeMessageParser mailMessage = mailMessage();
455+
assertEquals("Invitation for Mail at SURFconext Invite", mailMessage.getSubject());
456+
}
457+
431458
@Test
432459
void profileWithUidIdp() {
433460
this.seedCRMData();

0 commit comments

Comments
 (0)