use of uk.gov.pay.adminusers.model.Invite in project pay-adminusers by alphagov.
the class ServiceInviteCreator method constructInviteAndSendEmail.
private Invite constructInviteAndSendEmail(InviteServiceRequest inviteServiceRequest, InviteEntity inviteEntity, Function<InviteEntity, Void> saveOrUpdate) {
String inviteUrl = format("%s/%s", linksConfig.getSelfserviceInvitesUrl(), inviteEntity.getCode());
Optional.ofNullable(inviteServiceRequest.getTelephoneNumber()).map(TelephoneNumberUtility::formatToE164).ifPresent(inviteEntity::setTelephoneNumber);
Optional.ofNullable(inviteServiceRequest.getPassword()).map(passwordHasher::hash).ifPresent(inviteEntity::setPassword);
saveOrUpdate.apply(inviteEntity);
sendServiceInviteNotification(inviteEntity, inviteUrl);
Invite invite = inviteEntity.toInvite();
invite.setInviteLink(inviteUrl);
return linksBuilder.decorate(invite);
}
use of uk.gov.pay.adminusers.model.Invite in project pay-adminusers by alphagov.
the class ServiceInviteCreator method doInvite.
@Transactional
public Invite doInvite(InviteServiceRequest inviteServiceRequest) {
String requestEmail = inviteServiceRequest.getEmail();
Optional<UserEntity> anExistingUser = userDao.findByEmail(requestEmail);
if (anExistingUser.isPresent()) {
UserEntity user = anExistingUser.get();
if (user.isDisabled()) {
sendUserDisabledNotification(requestEmail, user.getExternalId());
} else {
sendUserExistsNotification(requestEmail, user.getExternalId());
}
throw conflictingEmail(requestEmail);
}
List<InviteEntity> exitingInvites = inviteDao.findByEmail(requestEmail);
List<InviteEntity> existingValidServiceInvitesForSameEmail = exitingInvites.stream().filter(inviteEntity -> !inviteEntity.isDisabled() && !inviteEntity.isExpired()).filter(InviteEntity::isServiceType).collect(toUnmodifiableList());
if (!existingValidServiceInvitesForSameEmail.isEmpty()) {
InviteEntity foundInvite = existingValidServiceInvitesForSameEmail.get(0);
return constructInviteAndSendEmail(inviteServiceRequest, foundInvite, inviteEntity -> {
inviteDao.merge(inviteEntity);
return null;
});
}
return roleDao.findByRoleName(inviteServiceRequest.getRoleName()).map(roleEntity -> {
InviteEntity inviteEntity = new InviteEntity(requestEmail, randomUuid(), inviteServiceRequest.getOtpKey(), roleEntity);
inviteEntity.setType(SERVICE);
return constructInviteAndSendEmail(inviteServiceRequest, inviteEntity, inviteToPersist -> {
inviteDao.persist(inviteToPersist);
return null;
});
}).orElseThrow(() -> internalServerError(format("Role [%s] not a valid role for creating a invite service request", inviteServiceRequest.getRoleName())));
}
use of uk.gov.pay.adminusers.model.Invite in project pay-adminusers by alphagov.
the class ServiceInviteCompleter method complete.
/**
* Completes a service invite.
* ie. it creates and persists a user from an invite or/and subscribe a user to an existing service
* and if it is a service invite also creates a default service.
* It then disables the invite.
*/
@Override
@Transactional
public Optional<InviteCompleteResponse> complete(String inviteCode) {
return inviteDao.findByCode(inviteCode).map(inviteEntity -> {
if (inviteEntity.isExpired() || inviteEntity.isDisabled()) {
throw inviteLockedException(inviteEntity.getCode());
}
if (userDao.findByEmail(inviteEntity.getEmail()).isPresent()) {
throw conflictingEmail(inviteEntity.getEmail());
}
if (inviteEntity.isServiceType()) {
UserEntity userEntity = inviteEntity.mapToUserEntity();
ServiceEntity serviceEntity = ServiceEntity.from(Service.from());
if (!data.getGatewayAccountIds().isEmpty()) {
serviceEntity.addGatewayAccountIds(data.getGatewayAccountIds().toArray(new String[0]));
}
serviceDao.persist(serviceEntity);
ServiceRoleEntity serviceRoleEntity = new ServiceRoleEntity(serviceEntity, inviteEntity.getRole());
userEntity.addServiceRole(serviceRoleEntity);
userDao.merge(userEntity);
inviteEntity.setService(serviceEntity);
inviteEntity.setDisabled(true);
inviteDao.merge(inviteEntity);
Invite invite = linksBuilder.addUserLink(userEntity.toUser(), inviteEntity.toInvite());
InviteCompleteResponse response = new InviteCompleteResponse(invite);
response.setServiceExternalId(serviceEntity.getExternalId());
response.setUserExternalId(userEntity.getExternalId());
return response;
} else {
throw internalServerError(format("Attempting to complete a service invite for a non service invite of type. invite-code = %s", inviteEntity.getCode()));
}
});
}
use of uk.gov.pay.adminusers.model.Invite in project pay-adminusers by alphagov.
the class InviteFinderTest method shouldFindAllActiveInvites.
@Test
public void shouldFindAllActiveInvites() {
String externalServiceId = "sdfuhsdyftgdfa";
String firstEmail = "user1@mail.test";
String secondEmail = "user2@mail.test";
InviteEntity firstInviteEntity = new InviteEntity(firstEmail, randomUuid(), OTP_KEY, mock(RoleEntity.class));
InviteEntity secondInviteEntity = new InviteEntity(secondEmail, randomUuid(), OTP_KEY, mock(RoleEntity.class));
InviteEntity disabledInviteEntity = new InviteEntity("email@email.test", randomUuid(), "otp-key", mock(RoleEntity.class));
disabledInviteEntity.setDisabled(true);
InviteEntity expiredInviteEntity = new InviteEntity("email@email.test", randomUuid(), "otp-key", mock(RoleEntity.class));
expiredInviteEntity.setExpiryDate(ZonedDateTime.now().minusMinutes(1));
when(mockUserDao.findByEmail(firstEmail)).thenReturn(Optional.empty());
when(mockUserDao.findByEmail(secondEmail)).thenReturn(Optional.empty());
when(mockInviteDao.findAllByServiceId(externalServiceId)).thenReturn(List.of(firstInviteEntity, secondInviteEntity, disabledInviteEntity, expiredInviteEntity));
List<Invite> invites = inviteFinder.findAllActiveInvites(externalServiceId);
assertThat(invites.size(), is(2));
Invite firstInvite = invites.get(0);
assertThat(firstInvite.getEmail(), is(firstEmail));
Invite secondInvite = invites.get(1);
assertThat(secondInvite.getEmail(), is(secondEmail));
}
use of uk.gov.pay.adminusers.model.Invite in project pay-adminusers by alphagov.
the class ServiceInviteCreatorTest method shouldSuccess_serviceInvite_IfEmailDoesNotConflict.
@Test
public void shouldSuccess_serviceInvite_IfEmailDoesNotConflict() {
String email = "email@example.gov.uk";
InviteServiceRequest request = new InviteServiceRequest("password", email, "01134960000");
RoleEntity roleEntity = new RoleEntity(Role.role(2, "admin", "Adminstrator"));
when(userDao.findByEmail(email)).thenReturn(Optional.empty());
when(inviteDao.findByEmail(email)).thenReturn(emptyList());
when(roleDao.findByRoleName("admin")).thenReturn(Optional.of(roleEntity));
when(notificationService.sendServiceInviteEmail(eq(email), anyString())).thenReturn("done");
when(linksConfig.getSelfserviceInvitesUrl()).thenReturn("http://selfservice/invites");
when(linksConfig.getSelfserviceUrl()).thenReturn("http://selfservice");
when(passwordHasher.hash("password")).thenReturn("encrypted-password");
Invite invite = serviceInviteCreator.doInvite(request);
verify(inviteDao, times(1)).persist(persistedInviteEntity.capture());
assertThat(invite.getEmail(), is(request.getEmail()));
assertThat(invite.getTelephoneNumber(), is("+441134960000"));
assertThat(invite.getType(), is("service"));
assertThat(invite.getLinks().get(0).getHref(), matchesPattern("^http://selfservice/invites/[0-9a-z]{32}$"));
assertThat(persistedInviteEntity.getValue().getPassword(), is("encrypted-password"));
}
Aggregations