Skip to content

Commit

Permalink
Merge pull request #127 from Onlineberatung/feature_delete_message
Browse files Browse the repository at this point in the history
Feature delete message
  • Loading branch information
webatspeed authored Nov 3, 2022
2 parents b40814a + e91a850 commit c8c52ff
Show file tree
Hide file tree
Showing 10 changed files with 433 additions and 11 deletions.
8 changes: 8 additions & 0 deletions src/main/java/de/caritas/cob/messageservice/Messenger.java
Original file line number Diff line number Diff line change
Expand Up @@ -264,4 +264,12 @@ public MessageResponseDTO postAliasMessage(String rcGroupId, MessageType message
aliasMessageDTO);
return mapper.messageResponseOf(response);
}

public boolean deleteMessage(String rcToken, String rcUserId, String messageId) {
return rocketChatService.deleteMessage(rcToken, rcUserId, messageId);
}

public boolean deleteAttachment(String rcToken, String rcUserId, String attachmentId) {
return rocketChatService.deleteAttachment(rcToken, rcUserId, attachmentId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,29 @@ public ResponseEntity<Void> patchMessage(String rcToken, String rcUserId, String
@Override
public ResponseEntity<Void> deleteMessage(String rcToken, String rcUserId, String messageId,
Boolean deleteAttachment) {
return MessagesApi.super.deleteMessage(rcToken, rcUserId, messageId, deleteAttachment);
var message = messenger
.findMessage(rcToken, rcUserId, messageId)
.map(mapper::messageDtoOf)
.orElse(null);

if (isNull(message)) {
return ResponseEntity.notFound().build();
}

if (!rcUserId.equals(message.getCreatorId())) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
}

if (!messenger.deleteMessage(rcToken, rcUserId, messageId)) {
return ResponseEntity.internalServerError().build();
}

if (deleteAttachment && message.hasFile()
&& !messenger.deleteAttachment(rcToken, rcUserId, message.getFileId())) {
return ResponseEntity.status(HttpStatus.MULTI_STATUS).build();
}

return ResponseEntity.noContent().build();
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package de.caritas.cob.messageservice.api.model.rocket.chat.message;

import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import de.caritas.cob.messageservice.api.model.AliasMessageDTO;
Expand All @@ -11,6 +14,7 @@
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.Setter;

/**
Expand Down Expand Up @@ -72,4 +76,19 @@ public class MessagesDTO {

@ApiModelProperty
private String org;

@JsonIgnore
public @NonNull String getCreatorId() {
return u.get_id();
}

@JsonIgnore
public String getFileId() {
return isNull(file) ? null : file.getId();
}

@JsonIgnore
public boolean hasFile() {
return nonNull(file) && nonNull(file.getId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,29 @@
import de.caritas.cob.messageservice.api.model.jsondeserializer.AliasJsonDeserializer;
import de.caritas.cob.messageservice.api.model.rocket.chat.message.MessagesDTO;
import de.caritas.cob.messageservice.api.model.rocket.chat.message.SendMessageResponseDTO;
import de.caritas.cob.messageservice.api.service.dto.MethodCall;
import de.caritas.cob.messageservice.api.service.dto.Message;
import de.caritas.cob.messageservice.api.service.dto.MethodMessageWithParamList;
import de.caritas.cob.messageservice.api.service.dto.MethodMessageWithParamMap;
import de.caritas.cob.messageservice.api.service.dto.UpdateMessage;
import java.time.Instant;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Random;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@Slf4j
@RequiredArgsConstructor
public class MessageMapper {

@SuppressWarnings("java:S2245")
// Using pseudorandom number generators (PRNGs) is security-sensitive
private static final Random random = new Random();

private final ObjectMapper objectMapper;
private final EncryptionService encryptionService;

Expand Down Expand Up @@ -195,4 +205,40 @@ public MessageType messageTypeOf(AliasMessageDTO alias) {

return null;
}

public MethodCall deleteMessageOf(String messageId) {
var params = Map.of("_id", messageId);

var message = new MethodMessageWithParamMap();
message.setParams(List.of(params));
message.setId(random.nextInt(100));
message.setMethod("deleteMessage");

var deleteMessage = new MethodCall();
try {
var messageString = objectMapper.writeValueAsString(message);
deleteMessage.setMessage(messageString);
} catch (JsonProcessingException e) {
log.error("Serializing {} did not work.", message);
}

return deleteMessage;
}

public MethodCall deleteFileOf(String fileId) {
var message = new MethodMessageWithParamList();
message.setParams(List.of(fileId));
message.setId(random.nextInt(100));
message.setMethod("deleteFileMessage");

var deleteMessage = new MethodCall();
try {
var messageString = objectMapper.writeValueAsString(message);
deleteMessage.setMessage(messageString);
} catch (JsonProcessingException e) {
log.error("Serializing {} did not work.", message);
}

return deleteMessage;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import de.caritas.cob.messageservice.api.model.rocket.chat.message.SendMessageWrapper;
import de.caritas.cob.messageservice.api.service.dto.Message;
import de.caritas.cob.messageservice.api.service.dto.MessageResponse;
import de.caritas.cob.messageservice.api.service.dto.StringifiedMessageResponse;
import de.caritas.cob.messageservice.api.service.dto.UpdateMessage;
import de.caritas.cob.messageservice.api.service.helper.RocketChatCredentialsHelper;
import java.net.URI;
Expand All @@ -41,6 +42,7 @@
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestClientException;
Expand All @@ -54,6 +56,8 @@ public class RocketChatService {

public static final String E2E_ENCRYPTION_TYPE = "e2e";

private static final String ENDPOINT_FILE_DELETE = "/method.call/deleteFileMessage";
private static final String ENDPOINT_MESSAGE_DELETE = "/method.call/deleteMessage";
private static final String ENDPOINT_MESSAGE_GET = "/chat.getMessage?msgId=";
private static final String ENDPOINT_MESSAGE_UPDATE = "/chat.update";

Expand Down Expand Up @@ -395,6 +399,40 @@ public Message findMessage(String rcToken, String rcUserId, String messageId) {
return null;
}

public boolean deleteMessage(String rcToken, String rcUserId, String messageId) {
var url = baseUrl + ENDPOINT_MESSAGE_DELETE;
var deleteMessage = mapper.deleteMessageOf(messageId);
var entity = new HttpEntity<>(deleteMessage, getRocketChatHeader(rcToken, rcUserId));

try {
var response = restTemplate.postForEntity(url, entity, StringifiedMessageResponse.class);
return isSuccessful(response);
} catch (HttpClientErrorException exception) {
log.error("Deleting message failed.", exception);
return false;
}
}

public boolean deleteAttachment(String rcToken, String rcUserId, String attachmentId) {
var url = baseUrl + ENDPOINT_FILE_DELETE;
var deleteFile = mapper.deleteFileOf(attachmentId);
var entity = new HttpEntity<>(deleteFile, getRocketChatHeader(rcToken, rcUserId));

try {
var response = restTemplate.postForEntity(url, entity, StringifiedMessageResponse.class);
return isSuccessful(response);
} catch (HttpClientErrorException exception) {
log.error("Deleting file failed.", exception);
return false;
}
}

private boolean isSuccessful(ResponseEntity<StringifiedMessageResponse> response) {
var body = response.getBody();

return nonNull(body) && body.getSuccess() && !body.getMessage().contains("\"error\"");
}

@SuppressWarnings("java:S5852") // Using slow regular expressions is security-sensitive
private boolean isRcNotFoundResponse(HttpClientErrorException exception) {
return HttpStatus.BAD_REQUEST.equals(exception.getStatusCode())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package de.caritas.cob.messageservice.api.service.dto;

import lombok.Data;

@Data
public class MethodCall {

private String message;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package de.caritas.cob.messageservice.api.service.dto;

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

@Data
public class MethodMessageWithParamList {

private String msg = "method";

private int id;

private String method;

private List<String> params;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package de.caritas.cob.messageservice.api.service.dto;

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

@Data
public class MethodMessageWithParamMap {

private String msg = "method";

private int id;

private String method;

private List<Map<String, String>> params;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package de.caritas.cob.messageservice.api.service.dto;

import lombok.Data;

@Data
public class StringifiedMessageResponse {

private String message;

private Boolean success;
}
Loading

0 comments on commit c8c52ff

Please sign in to comment.