Search in sources :

Example 1 with Invite

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);
}
Also used : Invite(uk.gov.pay.adminusers.model.Invite)

Example 2 with 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())));
}
Also used : Logger(org.slf4j.Logger) RandomIdGenerator.randomUuid(uk.gov.pay.adminusers.app.util.RandomIdGenerator.randomUuid) LoggerFactory(org.slf4j.LoggerFactory) TelephoneNumberUtility(uk.gov.pay.adminusers.utils.telephonenumber.TelephoneNumberUtility) AdminUsersExceptions.internalServerError(uk.gov.pay.adminusers.service.AdminUsersExceptions.internalServerError) AdminUsersExceptions.conflictingEmail(uk.gov.pay.adminusers.service.AdminUsersExceptions.conflictingEmail) InviteEntity(uk.gov.pay.adminusers.persistence.entity.InviteEntity) Function(java.util.function.Function) Invite(uk.gov.pay.adminusers.model.Invite) UserEntity(uk.gov.pay.adminusers.persistence.entity.UserEntity) String.format(java.lang.String.format) Transactional(com.google.inject.persist.Transactional) UserDao(uk.gov.pay.adminusers.persistence.dao.UserDao) Collectors.toUnmodifiableList(java.util.stream.Collectors.toUnmodifiableList) LinksConfig(uk.gov.pay.adminusers.app.config.LinksConfig) InviteServiceRequest(uk.gov.pay.adminusers.model.InviteServiceRequest) Inject(javax.inject.Inject) SERVICE(uk.gov.pay.adminusers.model.InviteType.SERVICE) List(java.util.List) InviteDao(uk.gov.pay.adminusers.persistence.dao.InviteDao) Optional(java.util.Optional) RoleDao(uk.gov.pay.adminusers.persistence.dao.RoleDao) InviteEntity(uk.gov.pay.adminusers.persistence.entity.InviteEntity) UserEntity(uk.gov.pay.adminusers.persistence.entity.UserEntity) Transactional(com.google.inject.persist.Transactional)

Example 3 with Invite

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()));
        }
    });
}
Also used : ServiceEntity(uk.gov.pay.adminusers.persistence.entity.ServiceEntity) ServiceRoleEntity(uk.gov.pay.adminusers.persistence.entity.ServiceRoleEntity) UserEntity(uk.gov.pay.adminusers.persistence.entity.UserEntity) Invite(uk.gov.pay.adminusers.model.Invite) InviteCompleteResponse(uk.gov.pay.adminusers.model.InviteCompleteResponse) Transactional(com.google.inject.persist.Transactional)

Example 4 with Invite

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));
}
Also used : RoleEntity(uk.gov.pay.adminusers.persistence.entity.RoleEntity) InviteEntity(uk.gov.pay.adminusers.persistence.entity.InviteEntity) Invite(uk.gov.pay.adminusers.model.Invite) Test(org.junit.jupiter.api.Test)

Example 5 with Invite

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"));
}
Also used : RoleEntity(uk.gov.pay.adminusers.persistence.entity.RoleEntity) InviteServiceRequest(uk.gov.pay.adminusers.model.InviteServiceRequest) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) Invite(uk.gov.pay.adminusers.model.Invite) Test(org.junit.jupiter.api.Test)

Aggregations

Invite (uk.gov.pay.adminusers.model.Invite)20 Test (org.junit.jupiter.api.Test)15 InviteEntity (uk.gov.pay.adminusers.persistence.entity.InviteEntity)13 InviteServiceRequest (uk.gov.pay.adminusers.model.InviteServiceRequest)7 InviteUserRequest (uk.gov.pay.adminusers.model.InviteUserRequest)7 ArgumentMatchers.anyString (org.mockito.ArgumentMatchers.anyString)5 RoleEntity (uk.gov.pay.adminusers.persistence.entity.RoleEntity)5 ServiceEntity (uk.gov.pay.adminusers.persistence.entity.ServiceEntity)5 UserEntity (uk.gov.pay.adminusers.persistence.entity.UserEntity)4 Transactional (com.google.inject.persist.Transactional)3 List (java.util.List)3 Optional (java.util.Optional)3 Logger (org.slf4j.Logger)3 LoggerFactory (org.slf4j.LoggerFactory)3 Inject (com.google.inject.Inject)2 String.format (java.lang.String.format)2 Collectors.toUnmodifiableList (java.util.stream.Collectors.toUnmodifiableList)2 LinksConfig (uk.gov.pay.adminusers.app.config.LinksConfig)2 RandomIdGenerator.randomUuid (uk.gov.pay.adminusers.app.util.RandomIdGenerator.randomUuid)2 JsonNode (com.fasterxml.jackson.databind.JsonNode)1