diff --git a/src/main/java/de/assecutor/votianlt/controller/MessageApiController.java b/src/main/java/de/assecutor/votianlt/controller/MessageApiController.java index ffdb3d4..c43ee7c 100644 --- a/src/main/java/de/assecutor/votianlt/controller/MessageApiController.java +++ b/src/main/java/de/assecutor/votianlt/controller/MessageApiController.java @@ -1,7 +1,7 @@ package de.assecutor.votianlt.controller; import de.assecutor.votianlt.model.Message; -import de.assecutor.votianlt.model.MessageDirection; +import de.assecutor.votianlt.model.MessageOrigin; import de.assecutor.votianlt.service.MessageService; import lombok.extern.slf4j.Slf4j; import org.bson.types.ObjectId; @@ -173,20 +173,20 @@ public class MessageApiController { } /** - * Get messages by direction (incoming/outgoing) - * GET /api/messages/direction/{direction} + * Get messages by origin (incoming/outgoing/server) + * GET /api/messages/origin/{origin} */ - @GetMapping("/direction/{direction}") - public ResponseEntity> getMessagesByDirection(@PathVariable String direction) { + @GetMapping("/origin/{origin}") + public ResponseEntity> getMessagesByOrigin(@PathVariable String origin) { try { - MessageDirection messageDirection = MessageDirection.valueOf(direction.toUpperCase()); - List messages = messageService.getMessagesByDirection(messageDirection); + MessageOrigin messageOrigin = MessageOrigin.valueOf(origin.toUpperCase()); + List messages = messageService.getMessagesByOrigin(messageOrigin); return ResponseEntity.ok(messages); } catch (IllegalArgumentException e) { - log.error("Invalid direction: {}", direction); + log.error("Invalid origin: {}", origin); return ResponseEntity.badRequest().build(); } catch (Exception e) { - log.error("Error retrieving messages by direction {}: {}", direction, e.getMessage(), e); + log.error("Error retrieving messages by origin {}: {}", origin, e.getMessage(), e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } diff --git a/src/main/java/de/assecutor/votianlt/dto/ChatMessageOutboundPayload.java b/src/main/java/de/assecutor/votianlt/dto/ChatMessageOutboundPayload.java index da344c6..3dc2cea 100644 --- a/src/main/java/de/assecutor/votianlt/dto/ChatMessageOutboundPayload.java +++ b/src/main/java/de/assecutor/votianlt/dto/ChatMessageOutboundPayload.java @@ -1,7 +1,7 @@ package de.assecutor.votianlt.dto; import de.assecutor.votianlt.model.Message; -import de.assecutor.votianlt.model.MessageDirection; +import de.assecutor.votianlt.model.MessageOrigin; import de.assecutor.votianlt.model.MessageType; import java.time.LocalDateTime; @@ -13,7 +13,7 @@ public record ChatMessageOutboundPayload( String sender, String receiver, String content, - MessageDirection direction, + MessageOrigin origin, MessageType messageType, LocalDateTime createdAt, String jobId, @@ -27,7 +27,7 @@ public record ChatMessageOutboundPayload( message.getSender(), message.getReceiver(), message.getContent(), - message.getDirection(), + message.getOrigin(), message.getMessageType(), message.getCreatedAt(), message.getJobIdAsString(), diff --git a/src/main/java/de/assecutor/votianlt/model/Message.java b/src/main/java/de/assecutor/votianlt/model/Message.java index 3445358..3440b5c 100644 --- a/src/main/java/de/assecutor/votianlt/model/Message.java +++ b/src/main/java/de/assecutor/votianlt/model/Message.java @@ -49,10 +49,10 @@ public class Message { private LocalDateTime createdAt; /** - * Direction of the message: INCOMING (from client) or OUTGOING (to client) + * Origin of the message: INCOMING (from client), OUTGOING (to client), or SERVER (from server) */ - @Field("direction") - private MessageDirection direction; + @Field("origin") + private MessageOrigin origin; /** * Type of message: JOB_RELATED or GENERAL @@ -87,11 +87,11 @@ public class Message { /** * Constructor for general messages */ - public Message(String content, String sender, String receiver, MessageDirection direction) { + public Message(String content, String sender, String receiver, MessageOrigin origin) { this.content = content; this.sender = sender; this.receiver = receiver; - this.direction = direction; + this.origin = origin; this.messageType = MessageType.GENERAL; this.createdAt = LocalDateTime.now(); this.isRead = false; @@ -100,12 +100,12 @@ public class Message { /** * Constructor for job-related messages */ - public Message(String content, String sender, String receiver, MessageDirection direction, + public Message(String content, String sender, String receiver, MessageOrigin origin, ObjectId jobId, String jobNumber) { this.content = content; this.sender = sender; this.receiver = receiver; - this.direction = direction; + this.origin = origin; this.messageType = MessageType.JOB_RELATED; this.jobId = jobId; this.jobNumber = jobNumber; diff --git a/src/main/java/de/assecutor/votianlt/model/MessageDirection.java b/src/main/java/de/assecutor/votianlt/model/MessageOrigin.java similarity index 55% rename from src/main/java/de/assecutor/votianlt/model/MessageDirection.java rename to src/main/java/de/assecutor/votianlt/model/MessageOrigin.java index c7a6ed3..81e1105 100644 --- a/src/main/java/de/assecutor/votianlt/model/MessageDirection.java +++ b/src/main/java/de/assecutor/votianlt/model/MessageOrigin.java @@ -1,9 +1,9 @@ package de.assecutor.votianlt.model; /** - * Enum representing the direction of a message + * Enum representing the origin of a message */ -public enum MessageDirection { +public enum MessageOrigin { /** * Message received from a client (app user) */ @@ -12,5 +12,10 @@ public enum MessageDirection { /** * Message sent to a client (app user) */ - OUTGOING + OUTGOING, + + /** + * Message sent from the server + */ + SERVER } diff --git a/src/main/java/de/assecutor/votianlt/pages/view/MessageDetailsView.java b/src/main/java/de/assecutor/votianlt/pages/view/MessageDetailsView.java index d75c407..d95bc10 100644 --- a/src/main/java/de/assecutor/votianlt/pages/view/MessageDetailsView.java +++ b/src/main/java/de/assecutor/votianlt/pages/view/MessageDetailsView.java @@ -20,7 +20,7 @@ import com.vaadin.flow.router.Route; import com.vaadin.flow.router.RouteParameters; import de.assecutor.votianlt.model.AppUser; import de.assecutor.votianlt.model.Message; -import de.assecutor.votianlt.model.MessageDirection; +import de.assecutor.votianlt.model.MessageOrigin; import de.assecutor.votianlt.model.MessageType; import de.assecutor.votianlt.pages.service.AppUserService; import de.assecutor.votianlt.service.MessageService; @@ -148,6 +148,7 @@ public class MessageDetailsView extends Main implements BeforeEnterObserver { messagesScroller.setScrollDirection(Scroller.ScrollDirection.VERTICAL); messagesScroller.setHeightFull(); messagesScroller.getStyle().set("flex", "1 1 auto"); + messagesScroller.getStyle().set("background-color", "#f0f0f0"); contentLayout.add(messagesScroller); contentLayout.setFlexGrow(1, messagesScroller); @@ -188,7 +189,7 @@ public class MessageDetailsView extends Main implements BeforeEnterObserver { separator.getStyle().set("margin", "20px 0"); Span dateSpan = new Span(date.format(DATE_FORMATTER)); - dateSpan.getStyle().set("background-color", "#e0e0e0"); + dateSpan.getStyle().set("background-color", "#f0f0f0"); dateSpan.getStyle().set("padding", "5px 15px"); dateSpan.getStyle().set("border-radius", "15px"); dateSpan.getStyle().set("font-size", "12px"); @@ -405,7 +406,7 @@ public class MessageDetailsView extends Main implements BeforeEnterObserver { } String content = Optional.ofNullable(message.getContent()).orElse("(kein Inhalt)"); - if (message.getDirection() == MessageDirection.INCOMING) { + if (message.getOrigin() == MessageOrigin.INCOMING) { messagesContainer.add(createIncomingMessage(content, timestamp)); } else { messagesContainer.add(createOutgoingMessage(content, timestamp)); @@ -425,7 +426,7 @@ public class MessageDetailsView extends Main implements BeforeEnterObserver { if (scrollAnchor == null) { scrollAnchor = new Div(); scrollAnchor.setId("scroll-anchor"); - scrollAnchor.getStyle().set("height", "1px"); + scrollAnchor.getStyle().set("height", "5px"); } if (scrollAnchor.getParent().isEmpty()) { messagesContainer.add(scrollAnchor); diff --git a/src/main/java/de/assecutor/votianlt/pages/view/MessagesView.java b/src/main/java/de/assecutor/votianlt/pages/view/MessagesView.java index e915b5a..7675c64 100644 --- a/src/main/java/de/assecutor/votianlt/pages/view/MessagesView.java +++ b/src/main/java/de/assecutor/votianlt/pages/view/MessagesView.java @@ -18,7 +18,7 @@ import com.vaadin.flow.router.Route; import de.assecutor.votianlt.dto.ClientMessageSummary; import de.assecutor.votianlt.model.AppUser; import de.assecutor.votianlt.model.Message; -import de.assecutor.votianlt.model.MessageDirection; +import de.assecutor.votianlt.model.MessageOrigin; import de.assecutor.votianlt.pages.service.AppUserService; import de.assecutor.votianlt.service.MessageService; import jakarta.annotation.security.RolesAllowed; @@ -210,7 +210,7 @@ public class MessagesView extends Main { String preview = Optional.ofNullable(latest.getContent()).filter(s -> !s.isBlank()).orElse("(kein Inhalt)"); int totalMessages = conversation.size(); int unreadCount = (int) conversation.stream() - .filter(msg -> msg.getDirection() == MessageDirection.INCOMING && !msg.isRead()) + .filter(msg -> msg.getOrigin() == MessageOrigin.INCOMING && !msg.isRead()) .count(); summary.setTotalMessages(summary.getTotalMessages() + totalMessages); @@ -243,7 +243,7 @@ public class MessagesView extends Main { if (message == null) { return null; } - if (message.getDirection() == MessageDirection.INCOMING) { + if (message.getOrigin() == MessageOrigin.INCOMING) { return message.getSender(); } return message.getReceiver(); diff --git a/src/main/java/de/assecutor/votianlt/pages/view/UserMessagesView.java b/src/main/java/de/assecutor/votianlt/pages/view/UserMessagesView.java index d593bb1..079757a 100644 --- a/src/main/java/de/assecutor/votianlt/pages/view/UserMessagesView.java +++ b/src/main/java/de/assecutor/votianlt/pages/view/UserMessagesView.java @@ -17,7 +17,7 @@ import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import de.assecutor.votianlt.model.AppUser; import de.assecutor.votianlt.model.Message; -import de.assecutor.votianlt.model.MessageDirection; +import de.assecutor.votianlt.model.MessageOrigin; import de.assecutor.votianlt.model.MessageType; import de.assecutor.votianlt.pages.service.AppUserService; import de.assecutor.votianlt.service.MessageService; @@ -131,7 +131,7 @@ public class UserMessagesView extends Main implements HasUrlParameter { Message latest = sortedMessages.isEmpty() ? null : sortedMessages.get(sortedMessages.size() - 1); int unreadCount = (int) sortedMessages.stream() - .filter(message -> message.getDirection() == MessageDirection.INCOMING && !message.isRead()) + .filter(message -> message.getOrigin() == MessageOrigin.INCOMING && !message.isRead()) .count(); int messageCount = sortedMessages.size(); LocalDateTime lastMessageTime = latest != null ? latest.getCreatedAt() : null; @@ -173,7 +173,7 @@ public class UserMessagesView extends Main implements HasUrlParameter { messages.sort(Comparator.comparing(Message::getCreatedAt, Comparator.nullsLast(LocalDateTime::compareTo))); Message latest = messages.get(messages.size() - 1); int unreadCount = (int) messages.stream() - .filter(message -> message.getDirection() == MessageDirection.INCOMING && !message.isRead()) + .filter(message -> message.getOrigin() == MessageOrigin.INCOMING && !message.isRead()) .count(); String conversationTitle = "Auftrag " + jobKey; diff --git a/src/main/java/de/assecutor/votianlt/repository/MessageRepository.java b/src/main/java/de/assecutor/votianlt/repository/MessageRepository.java index e36696e..f7f173b 100644 --- a/src/main/java/de/assecutor/votianlt/repository/MessageRepository.java +++ b/src/main/java/de/assecutor/votianlt/repository/MessageRepository.java @@ -1,7 +1,7 @@ package de.assecutor.votianlt.repository; import de.assecutor.votianlt.model.Message; -import de.assecutor.votianlt.model.MessageDirection; +import de.assecutor.votianlt.model.MessageOrigin; import de.assecutor.votianlt.model.MessageType; import org.bson.types.ObjectId; import org.springframework.data.mongodb.repository.MongoRepository; @@ -38,9 +38,9 @@ public interface MessageRepository extends MongoRepository { List findByReceiverAndMessageTypeOrderByCreatedAtDesc(String receiver, MessageType messageType); /** - * Find all messages by direction (incoming/outgoing) + * Find all messages by origin (incoming/outgoing/server) */ - List findByDirectionOrderByCreatedAtDesc(MessageDirection direction); + List findByOriginOrderByCreatedAtDesc(MessageOrigin origin); /** * Find all messages between two users (in both directions) diff --git a/src/main/java/de/assecutor/votianlt/service/MessageService.java b/src/main/java/de/assecutor/votianlt/service/MessageService.java index 7821e7d..6c193cc 100644 --- a/src/main/java/de/assecutor/votianlt/service/MessageService.java +++ b/src/main/java/de/assecutor/votianlt/service/MessageService.java @@ -1,7 +1,7 @@ package de.assecutor.votianlt.service; import de.assecutor.votianlt.model.Message; -import de.assecutor.votianlt.model.MessageDirection; +import de.assecutor.votianlt.model.MessageOrigin; import de.assecutor.votianlt.model.MessageType; import de.assecutor.votianlt.dto.ChatMessageInboundPayload; import de.assecutor.votianlt.dto.ChatMessageOutboundPayload; @@ -38,7 +38,7 @@ public class MessageService { * Send a general message to a client via MQTT */ public Message sendGeneralMessageToClient(String content, String sender, String receiver) { - Message message = new Message(content, sender, receiver, MessageDirection.OUTGOING); + Message message = new Message(content, sender, receiver, MessageOrigin.SERVER); message = saveMessage(message); publishMessageToMqtt(message, receiver); return message; @@ -49,7 +49,7 @@ public class MessageService { */ public Message sendJobMessageToClient(String content, String sender, String receiver, ObjectId jobId, String jobNumber) { - Message message = new Message(content, sender, receiver, MessageDirection.OUTGOING, jobId, jobNumber); + Message message = new Message(content, sender, receiver, MessageOrigin.SERVER, jobId, jobNumber); message = saveMessage(message); publishMessageToMqtt(message, receiver); return message; @@ -62,10 +62,10 @@ public class MessageService { Message message; if (payload.hasJobContext()) { message = new Message(payload.content(), payload.sender(), payload.receiver(), - MessageDirection.INCOMING, payload.jobId(), payload.jobNumber()); + MessageOrigin.INCOMING, payload.jobId(), payload.jobNumber()); } else { message = new Message(payload.content(), payload.sender(), payload.receiver(), - MessageDirection.INCOMING); + MessageOrigin.INCOMING); } return saveMessage(message); } @@ -156,10 +156,10 @@ public class MessageService { } /** - * Get messages by direction + * Get messages by origin */ - public List getMessagesByDirection(MessageDirection direction) { - return messageRepository.findByDirectionOrderByCreatedAtDesc(direction); + public List getMessagesByOrigin(MessageOrigin origin) { + return messageRepository.findByOriginOrderByCreatedAtDesc(origin); } /**