Skip to content

Commit

Permalink
fix: newly created consultants should be added to existing enquiries …
Browse files Browse the repository at this point in the history
…of their agencies
  • Loading branch information
tkuzynow committed May 6, 2024
1 parent 9434aca commit b170008
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import de.caritas.cob.userservice.api.adapters.keycloak.dto.KeycloakCreateUserResponseDTO;
import de.caritas.cob.userservice.api.adapters.rocketchat.RocketChatService;
import de.caritas.cob.userservice.api.adapters.web.dto.ConsultantAdminResponseDTO;
import de.caritas.cob.userservice.api.adapters.web.dto.ConsultantSessionResponseDTO;
import de.caritas.cob.userservice.api.adapters.web.dto.CreateConsultantDTO;
import de.caritas.cob.userservice.api.adapters.web.dto.NotificationsSettingsDTO;
import de.caritas.cob.userservice.api.adapters.web.dto.UserDTO;
Expand All @@ -24,6 +25,7 @@
import de.caritas.cob.userservice.api.exception.httpresponses.DistributedTransactionException;
import de.caritas.cob.userservice.api.exception.httpresponses.DistributedTransactionInfo;
import de.caritas.cob.userservice.api.exception.httpresponses.customheader.HttpStatusExceptionReason;
import de.caritas.cob.userservice.api.exception.rocketchat.RocketChatAddUserToGroupException;
import de.caritas.cob.userservice.api.facade.rollback.RollbackFacade;
import de.caritas.cob.userservice.api.helper.AuthenticatedUser;
import de.caritas.cob.userservice.api.helper.UserHelper;
Expand All @@ -34,8 +36,10 @@
import de.caritas.cob.userservice.api.service.ConsultantImportService.ImportRecord;
import de.caritas.cob.userservice.api.service.ConsultantService;
import de.caritas.cob.userservice.api.service.appointment.AppointmentService;
import de.caritas.cob.userservice.api.service.session.SessionService;
import de.caritas.cob.userservice.api.tenant.TenantContext;
import de.caritas.cob.userservice.tenantadminservice.generated.web.model.TenantDTO;
import java.util.List;
import java.util.Set;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -72,6 +76,8 @@ public class CreateConsultantSaga {

private final @NonNull AppointmentService appointmentService;

private final @NonNull SessionService sessionService;

private Consultant createNewConsultantWithoutAppointment(
CreateConsultantDTO createConsultantDTO) {
assertLicensesNotExceeded();
Expand Down Expand Up @@ -184,8 +190,38 @@ private Consultant createNewConsultant(
String rocketChatUserId =
createRocketChatUserOrRollback(consultantCreationInput, keycloakUserId, password);

return createConsultantInMariaDBOrRollback(
consultantCreationInput, keycloakUserId, rocketChatUserId);
var consultant =
createConsultantInMariaDBOrRollback(
consultantCreationInput, keycloakUserId, rocketChatUserId);

tryAssignConsultantToExistingSessions(consultant);
return consultant;
}

private void tryAssignConsultantToExistingSessions(Consultant consultant) {
// This is not transactional on purpose.
// If the consultant could not be added to all existing enquiries, he can still work, without
// access to the enquiry, that can be picked up by another consultant from the team.
var registeredEnquiries = sessionService.getRegisteredEnquiriesForConsultant(consultant);
tryAssignConsultantToRocketchatGroup(consultant, registeredEnquiries);
var archivedEnquiries = sessionService.getArchivedSessionsForConsultant(consultant);
tryAssignConsultantToRocketchatGroup(consultant, archivedEnquiries);
}

private void tryAssignConsultantToRocketchatGroup(
Consultant consultant, List<ConsultantSessionResponseDTO> enquiries) {
enquiries.forEach(
session -> {
try {
rocketChatService.addUserToGroup(
consultant.getRocketChatId(), session.getSession().getGroupId());
} catch (RocketChatAddUserToGroupException e) {
log.error(
"Unable to add user with id {} to group with id {}",
consultant.getRocketChatId(),
session.getSession().getGroupId());
}
});
}

private void updateKeycloakPasswordOrRollback(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,6 @@ private String createRocketChatGroupForSession(
Session session, RocketChatCredentials rocketChatCredentials) {

try {

Optional<GroupResponseDTO> rcGroupDTO =
rocketChatService.createPrivateGroup(
rocketChatRoomNameGenerator.generateGroupName(session), rocketChatCredentials);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,26 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.google.common.collect.Lists;
import de.caritas.cob.userservice.api.UserServiceApplication;
import de.caritas.cob.userservice.api.adapters.keycloak.KeycloakService;
import de.caritas.cob.userservice.api.adapters.keycloak.dto.KeycloakCreateUserResponseDTO;
import de.caritas.cob.userservice.api.adapters.rocketchat.RocketChatService;
import de.caritas.cob.userservice.api.adapters.web.dto.ConsultantDTO;
import de.caritas.cob.userservice.api.adapters.web.dto.ConsultantSessionResponseDTO;
import de.caritas.cob.userservice.api.adapters.web.dto.CreateConsultantDTO;
import de.caritas.cob.userservice.api.adapters.web.dto.SessionDTO;
import de.caritas.cob.userservice.api.admin.service.tenant.TenantAdminService;
import de.caritas.cob.userservice.api.exception.httpresponses.BadRequestException;
import de.caritas.cob.userservice.api.exception.httpresponses.CustomValidationHttpStatusException;
import de.caritas.cob.userservice.api.exception.httpresponses.DistributedTransactionException;
import de.caritas.cob.userservice.api.exception.rocketchat.RocketChatAddUserToGroupException;
import de.caritas.cob.userservice.api.exception.rocketchat.RocketChatLoginException;
import de.caritas.cob.userservice.api.facade.rollback.RollbackFacade;
import de.caritas.cob.userservice.api.model.Consultant;
import de.caritas.cob.userservice.api.service.ConsultantImportService.ImportRecord;
import de.caritas.cob.userservice.api.service.appointment.AppointmentService;
import de.caritas.cob.userservice.api.service.session.SessionService;
import de.caritas.cob.userservice.tenantadminservice.generated.web.model.Settings;
import de.caritas.cob.userservice.tenantadminservice.generated.web.model.TenantDTO;
import org.jeasy.random.EasyRandom;
Expand Down Expand Up @@ -71,6 +76,8 @@ public class CreateConsultantSagaIT {

@MockBean private AppointmentService appointmentService;

@MockBean private SessionService sessionService;

private final EasyRandom easyRandom = new EasyRandom();

@Before
Expand All @@ -80,7 +87,7 @@ public void setup() {

@Test
public void createNewConsultant_Should_returnExpectedCreatedConsultant_When_inputDataIsCorrect()
throws RocketChatLoginException {
throws RocketChatLoginException, RocketChatAddUserToGroupException {
when(rocketChatService.getUserID(anyString(), anyString(), anyBoolean()))
.thenReturn(DUMMY_RC_ID);
when(keycloakService.createKeycloakUser(any(), anyString(), any()))
Expand All @@ -90,6 +97,11 @@ public void createNewConsultant_Should_returnExpectedCreatedConsultant_When_inpu
createConsultantDTO.setEmail(VALID_EMAILADDRESS);
createConsultantDTO.setIsGroupchatConsultant(false);

when(sessionService.getRegisteredEnquiriesForConsultant(any()))
.thenReturn(
Lists.newArrayList(
new ConsultantSessionResponseDTO().session(new SessionDTO().groupId("groupId"))));

var consultantAdminResponseDTO =
this.createConsultantSaga.createNewConsultant(createConsultantDTO);

Expand All @@ -105,6 +117,9 @@ public void createNewConsultant_Should_returnExpectedCreatedConsultant_When_inpu
assertThat(consultant.getFirstname(), notNullValue());
assertThat(consultant.getLastname(), notNullValue());
assertThat(consultant.getEmail(), notNullValue());

verify(rocketChatService).getUserID(anyString(), anyString(), anyBoolean());
verify(rocketChatService).addUserToGroup(Mockito.anyString(), Mockito.eq("groupId"));
}

@Test
Expand Down

0 comments on commit b170008

Please sign in to comment.