Skip to content

Commit

Permalink
Merge branch 'develop' into TSYSTEMS-211-upgrade-spring-boot-to-3.3.X
Browse files Browse the repository at this point in the history
  • Loading branch information
Leandro13Silva13 committed Feb 7, 2025
2 parents b22b428 + 4f607b2 commit b67bc58
Show file tree
Hide file tree
Showing 13 changed files with 229 additions and 46 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/dockerImage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -183,4 +183,4 @@ jobs:
value: ${{ env.DOCKER_IMAGE_TAG }}
custom-actions: |
- text: View CI
url: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
url: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,9 @@ public class RocketChatService implements MessageClient {
"Could not get users list from Rocket.Chat";
private static final String USER_LIST_GET_FIELD_SELECTION = "{\"_id\":1}";
private static final Integer PAGE_SIZE = 100;
private static final String ERROR_ROOM_NOT_FOUND = "error-room-not-found";
private static final String COULD_NOT_REMOVE_USER_FROM_ROCKET_CHAT_GROUP =
"Could not remove user %s from Rocket.Chat group with id %s";
private final LocalDateTime localDateTime1900 = LocalDateTime.of(1900, 1, 1, 0, 0);

private final LocalDateTime localDateTimeFuture = nowInUtc().plusYears(1L);
Expand Down Expand Up @@ -652,13 +655,7 @@ public void removeUserFromGroup(String rcUserId, String rcGroupId)

GroupResponseDTO response;
try {
RocketChatCredentials technicalUser = rcCredentialHelper.getTechnicalUser();
var header = getStandardHttpHeaders(technicalUser);
var body = new GroupRemoveUserBodyDTO(rcUserId, rcGroupId);
HttpEntity<GroupRemoveUserBodyDTO> request = new HttpEntity<>(body, header);

var url = rocketChatConfig.getApiUrl(ENDPOINT_GROUP_KICK);
response = restTemplate.postForObject(url, request, GroupResponseDTO.class);
response = tryRemoveUserFromGroup(rcUserId, rcGroupId);

} catch (Exception ex) {
log.error(
Expand All @@ -677,6 +674,19 @@ public void removeUserFromGroup(String rcUserId, String rcGroupId)
}
}

private GroupResponseDTO tryRemoveUserFromGroup(String rcUserId, String rcGroupId)
throws RocketChatUserNotInitializedException {
GroupResponseDTO response;
RocketChatCredentials technicalUser = rcCredentialHelper.getTechnicalUser();
var header = getStandardHttpHeaders(technicalUser);
var body = new GroupRemoveUserBodyDTO(rcUserId, rcGroupId);
HttpEntity<GroupRemoveUserBodyDTO> request = new HttpEntity<>(body, header);

var url = rocketChatConfig.getApiUrl(ENDPOINT_GROUP_KICK);
response = restTemplate.postForObject(url, request, GroupResponseDTO.class);
return response;
}

public boolean removeUserFromSession(String chatUserId, String chatId) {
try {
addTechnicalUserToGroup(chatId);
Expand Down Expand Up @@ -1324,4 +1334,30 @@ public boolean saveRoomSettings(String chatId, boolean encrypted) {
return false;
}
}

public void removeUserFromGroupIgnoreGroupNotFound(String rcUserId, String rcGroupId)
throws RocketChatRemoveUserFromGroupException {
{
GroupResponseDTO response;
try {
response = tryRemoveUserFromGroup(rcUserId, rcGroupId);
} catch (Exception ex) {
if (ex.getMessage().contains(ERROR_ROOM_NOT_FOUND)) {
return;
}
log.error(
"Rocket.Chat Error: Could not remove user {} from Rocket.Chat group with id {}. Reason: ",
rcUserId,
rcGroupId,
ex);
throw new RocketChatRemoveUserFromGroupException(
String.format(COULD_NOT_REMOVE_USER_FROM_ROCKET_CHAT_GROUP, rcUserId, rcGroupId));
}

if (response != null && !response.isSuccess()) {
var error = COULD_NOT_REMOVE_USER_FROM_ROCKET_CHAT_GROUP;
throw new RocketChatRemoveUserFromGroupException(String.format(error, rcUserId, rcGroupId));
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import de.caritas.cob.userservice.api.port.out.IdentityClient;
import de.caritas.cob.userservice.api.service.LogService;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import lombok.NonNull;
Expand Down Expand Up @@ -54,16 +55,27 @@ String resolveTypeOfSession(Session session) {
}

void removeConsultantsFromSessionGroups(Session session, List<Consultant> consultants) {
removeConsultantsFromRocketChatGroup(session.getGroupId(), consultants);
removeConsultantsFromRocketChatGroup(session.getFeedbackGroupId(), consultants);
removeConsultantsFromRocketChatGroup(
session.getGroupId(), consultants, rocketChatFacade::removeUserFromGroup);
removeConsultantsFromRocketChatGroup(
session.getFeedbackGroupId(), consultants, rocketChatFacade::removeUserFromGroup);
}

void removeConsultantsFromSessionGroup(String rcGroupId, List<Consultant> consultants) {
removeConsultantsFromRocketChatGroup(rcGroupId, consultants);
removeConsultantsFromRocketChatGroup(
rcGroupId, consultants, rocketChatFacade::removeUserFromGroup);
}

private void removeConsultantsFromRocketChatGroup(
void removeConsultantsFromSessionGroupAndIgnoreGroupNotFound(
String rcGroupId, List<Consultant> consultants) {
removeConsultantsFromRocketChatGroup(
rcGroupId, consultants, rocketChatFacade::removeUserFromGroupIgnoreGroupNotFound);
}

private void removeConsultantsFromRocketChatGroup(
String rcGroupId,
List<Consultant> consultants,
BiConsumer<String, String> removeFromRocketchatGroupMethod) {
if (rcGroupId == null) {
return;
}
Expand All @@ -73,7 +85,7 @@ private void removeConsultantsFromRocketChatGroup(
consultants.stream()
.map(Consultant::getRocketChatId)
.filter(groupMemberList::contains)
.forEach(rcUserId -> rocketChatFacade.removeUserFromGroup(rcUserId, rcGroupId));
.forEach(rcUserId -> removeFromRocketchatGroupMethod.accept(rcUserId, rcGroupId));
rocketChatFacade.leaveFromGroupAsTechnicalUser(rcGroupId);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,13 @@ private void performGroupsRemove(Session session, List<Consultant> consultants)
}

/** Removes the given consultant from Rocket.Chat group of given session. */
public void removeFromGroupAndIgnoreGroupNotFound() {
this.consultantsToRemoveFromSessions.forEach(
((session, consultants) ->
removeConsultantsFromSessionGroupAndIgnoreGroupNotFound(
session.getGroupId(), consultants)));
}

public void removeFromGroup() {
this.consultantsToRemoveFromSessions.forEach(
((session, consultants) ->
Expand Down Expand Up @@ -104,7 +111,7 @@ public void removeFromFeedbackGroupOrRollbackOnFailure() {

private void performGroupRemove(Session session, List<Consultant> consultants) {
try {
removeConsultantsFromSessionGroup(session.getGroupId(), consultants);
removeConsultantsFromSessionGroupAndIgnoreGroupNotFound(session.getGroupId(), consultants);
} catch (Exception e) {
rollback();
throw new InternalServerErrorException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,17 @@ public void removeUserFromGroup(String rcUserId, String groupId) {
}
}

public void removeUserFromGroupIgnoreGroupNotFound(String rcUserId, String groupId) {
try {
this.rocketChatService.removeUserFromGroupIgnoreGroupNotFound(rcUserId, groupId);
} catch (RocketChatRemoveUserFromGroupException e) {
var message =
String.format(
"Could not remove user with id %s from Rocket.Chat group id %s", rcUserId, groupId);
throw new InternalServerErrorException(message, LogService::logInternalServerError);
}
}

/**
* Get all standard members (all users except system user and technical user) of a rocket chat
* group.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
@RequiredArgsConstructor
abstract class DeleteRoomsAndSessionAction {

private static final String USER_SERVICE_DELETE_WORKFLOW_ERROR =
"UserService delete workflow error: ";
protected final @NonNull SessionRepository sessionRepository;
protected final @NonNull SessionDataRepository sessionDataRepository;
protected final @NonNull RocketChatService rocketChatService;
Expand All @@ -29,7 +31,7 @@ void deleteRocketChatGroup(String rcGroupId, List<DeletionWorkflowError> workflo
try {
this.rocketChatService.deleteGroupAsTechnicalUser(rcGroupId);
} catch (RocketChatDeleteGroupException e) {
log.error("UserService delete workflow error: ", e);
log.error(USER_SERVICE_DELETE_WORKFLOW_ERROR, e);
workflowErrors.add(
DeletionWorkflowError.builder()
.deletionSourceType(ASKER)
Expand All @@ -47,7 +49,7 @@ void deleteSessionData(Session session, List<DeletionWorkflowError> workflowErro
var sessionData = this.sessionDataRepository.findBySessionId(session.getId());
this.sessionDataRepository.deleteAll(sessionData);
} catch (Exception e) {
log.error("UserService delete workflow error: ", e);
log.error(USER_SERVICE_DELETE_WORKFLOW_ERROR, e);
workflowErrors.add(
DeletionWorkflowError.builder()
.deletionSourceType(ASKER)
Expand All @@ -63,7 +65,7 @@ protected void deleteSession(Session session, List<DeletionWorkflowError> workfl
try {
this.sessionRepository.delete(session);
} catch (Exception e) {
log.error("UserService delete workflow error: ", e);
log.error(USER_SERVICE_DELETE_WORKFLOW_ERROR, e);
workflowErrors.add(
DeletionWorkflowError.builder()
.deletionSourceType(ASKER)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package de.caritas.cob.userservice.api.workflow.delete.action.asker;

import static de.caritas.cob.userservice.api.helper.CustomLocalDateTime.nowInUtc;
import static de.caritas.cob.userservice.api.workflow.delete.model.DeletionSourceType.ASKER;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import de.caritas.cob.userservice.api.actions.ActionCommand;
import de.caritas.cob.userservice.api.adapters.rocketchat.RocketChatService;
import de.caritas.cob.userservice.api.exception.rocketchat.RocketChatDeleteGroupException;
import de.caritas.cob.userservice.api.model.Session;
import de.caritas.cob.userservice.api.workflow.delete.model.DeletionTargetType;
import de.caritas.cob.userservice.api.workflow.delete.model.DeletionWorkflowError;
import de.caritas.cob.userservice.api.workflow.delete.model.RocketchatRoomDeletionWorkflowDTO;
import de.caritas.cob.userservice.api.workflow.delete.model.SessionDeletionWorkflowDTO;
import java.util.List;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class DeleteSingleRoomAction implements ActionCommand<RocketchatRoomDeletionWorkflowDTO> {

protected final @NonNull RocketChatService rocketChatService;

public DeleteSingleRoomAction(@NonNull RocketChatService rocketChatService) {
this.rocketChatService = rocketChatService;
}

void deleteRocketChatGroup(String rcGroupId, List<DeletionWorkflowError> workflowErrors) {
if (isNotBlank(rcGroupId)) {
try {
this.rocketChatService.deleteGroupAsTechnicalUser(rcGroupId);
} catch (RocketChatDeleteGroupException e) {
log.error("UserService delete workflow error: ", e);
workflowErrors.add(
DeletionWorkflowError.builder()
.deletionSourceType(ASKER)
.deletionTargetType(DeletionTargetType.ROCKET_CHAT)
.identifier(rcGroupId)
.reason("Deletion of Rocket.Chat group failed")
.timestamp(nowInUtc())
.build());
}
}
}

/**
* Deletes the given {@link Session} in the database with the related Rocket.Chat room containing
* all messages and uploads.
*
* @param actionTarget the {@link SessionDeletionWorkflowDTO} with the session to delete
*/
@Override
public void execute(RocketchatRoomDeletionWorkflowDTO actionTarget) {
deleteRocketChatGroup(
actionTarget.getRocketchatRoomId(), actionTarget.getDeletionWorkflowErrors());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package de.caritas.cob.userservice.api.workflow.delete.model;

import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class RocketchatRoomDeletionWorkflowDTO {

private String rocketchatRoomId;
private List<DeletionWorkflowError> deletionWorkflowErrors;
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package de.caritas.cob.userservice.api.workflow.delete.service;

import static de.caritas.cob.userservice.api.helper.CustomLocalDateTime.nowInUtc;
import static de.caritas.cob.userservice.api.workflow.delete.model.DeletionSourceType.ASKER;
import static de.caritas.cob.userservice.api.workflow.delete.model.DeletionTargetType.ALL;
import static org.apache.commons.collections4.CollectionUtils.isNotEmpty;

import de.caritas.cob.userservice.api.model.Session;
Expand Down Expand Up @@ -86,14 +83,8 @@ private List<DeletionWorkflowError> performDeletionWorkflow(
user.ifPresentOrElse(
u -> workflowErrors.addAll(deleteInactiveGroupsOrUser(userInactiveGroupEntry, u)),
() ->
workflowErrors.add(
DeletionWorkflowError.builder()
.deletionSourceType(ASKER)
.deletionTargetType(ALL)
.identifier(userInactiveGroupEntry.getKey())
.reason(USER_NOT_FOUND_REASON)
.timestamp(nowInUtc())
.build()));
workflowErrors.addAll(
performUserSessionDeletionForNonExistingUser(userInactiveGroupEntry.getValue())));

return workflowErrors;
}
Expand All @@ -102,11 +93,14 @@ private List<DeletionWorkflowError> deleteInactiveGroupsOrUser(
Entry<String, List<String>> userInactiveGroupEntry, User user) {

List<Session> userSessionList = sessionRepository.findByUser(user);

if (allSessionsOfUserAreInactive(userInactiveGroupEntry, userSessionList)) {
return deleteUserAccountService.performUserDeletion(user);
}
return perfomUserSessionDeletion(userInactiveGroupEntry, userSessionList);
}

private List<DeletionWorkflowError> perfomUserSessionDeletion(
Entry<String, List<String>> userInactiveGroupEntry, List<Session> userSessionList) {
return userInactiveGroupEntry.getValue().stream()
.map(rcGroupId -> performSessionDeletion(rcGroupId, userSessionList))
.flatMap(Collection::stream)
Expand All @@ -120,18 +114,39 @@ private boolean allSessionsOfUserAreInactive(

private List<DeletionWorkflowError> performSessionDeletion(
String rcGroupId, List<Session> userSessionList) {

List<DeletionWorkflowError> workflowErrors = new ArrayList<>();

Optional<Session> session = findSessionInUserSessionList(rcGroupId, userSessionList);
session.ifPresentOrElse(
s -> workflowErrors.addAll(deleteSessionService.performSessionDeletion(s)),
() ->
workflowErrors.addAll(
deleteSessionService.performRocketchatSessionDeletion(rcGroupId)));

session.ifPresent(s -> workflowErrors.addAll(deleteSessionService.performSessionDeletion(s)));
return workflowErrors;
}

private List<DeletionWorkflowError> performUserSessionDeletionForNonExistingUser(
List<String> rcGroupIds) {
List<DeletionWorkflowError> workflowErrors = new ArrayList<>();
rcGroupIds.forEach(
rcGroupId ->
workflowErrors.addAll(performUserSessionDeletionForNonExistingUser(rcGroupId)));
return workflowErrors;
}

private Collection<? extends DeletionWorkflowError> performUserSessionDeletionForNonExistingUser(
String rcGroupId) {
List<DeletionWorkflowError> workflowErrors = new ArrayList<>();
Optional<Session> session = sessionRepository.findByGroupId(rcGroupId);
session.ifPresent(s -> workflowErrors.addAll(deleteSessionService.performSessionDeletion(s)));
return workflowErrors;
}

private Optional<Session> findSessionInUserSessionList(
String rcGroupId, List<Session> userSessionList) {
return userSessionList.stream().filter(s -> s.getGroupId().equals(rcGroupId)).findFirst();

return userSessionList.stream()
.filter(s -> s.getGroupId() != null && s.getGroupId().equals(rcGroupId))
.findFirst();
}
}
Loading

0 comments on commit b67bc58

Please sign in to comment.