@Interpod:
A co sądzicie o takim rozwiązania?
@GetMapping(value = "/api/message/{id}")
public
HttpEntity<? extends MessageDTO> getMessage(
@ApiParam(value = "Message type", required = true) @RequestParam MessageType messageType,
@ApiParam(value = "The message ID", required = true) @PathVariable Long id
) {
return messageService.getMessage(id, authorizationService.getUserId(), messageType)
.map(message -> {
if(messageType == MessageType.RECEIVED) {
return ResponseEntity.ok().body(converterMessageToReceivedMessageDTO.convert(message));
} else /* if(messageType == MessageType.SENT) */ {
return ResponseEntity.ok().body(converterMessageToSentMessageDTO.convert(message));
}
}).orElseGet(() -> ResponseEntity.notFound().build());
}
Musi być podział na dwa typy wiadomości, wysłaną i odebraną, bo np. przy odebranej odbiorca może zobaczyć swoją datę przeczytania, ale z punktu nadawcy nie właściwe jest, aby on widział również datę przeczytania. To taka tajemnica niedostępna dla nadawcy.
Z obiektami zrobiłem to tak:
@Data
public class MessageDTO {
private Long id;
private String sender;
private String recipient;
private String subject;
private String text;
private Date dateOfRead;
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ReceivedMessageDTO extends MessageDTO {} // Przy odbiorcy usuwam pole 'recipient' dzięki @JsonIclude
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SentMessageDTO extends MessageDTO {} // Przy nadawcy usuwam pole 'dateOfRead' i 'sender' dzięki @JsonIclud
PS: Trochę nie pasują mi te obiekty. Macie pomysł jak zrobić to lepiej? Albo np. przyjmowany MessageType zadeklarować jako Optional i w razie jego braku zaprogramować ustalenie typu i dopiero przejść do bloku return.