From a4c72098b302a3965b4ecad212356b01efe7dcae Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 2 Jan 2026 01:14:42 +0100 Subject: [PATCH] Add message history --- .../api-resources/message-endpoint.yaml | 99 ++++++++++ api-customer/requirements.txt | 1 + api/mosquitto/data/mosquitto.db | Bin 164 -> 164 bytes api/mosquitto/log/mosquitto.log | 176 ++++++++++++++++++ .../controllers/ChatController.java | 38 +++- .../controllers/dtos/MessageDto.java | 26 +++ .../boardmateapi/repository/MessageRepo.java | 7 + .../repository/mappings/MessageMapper.java | 7 + .../boardmateapi/services/MessageService.java | 19 ++ 9 files changed, 366 insertions(+), 7 deletions(-) create mode 100644 api-customer/api-resources/message-endpoint.yaml create mode 100644 api/src/main/java/be/naaturel/boardmateapi/controllers/dtos/MessageDto.java diff --git a/api-customer/api-resources/message-endpoint.yaml b/api-customer/api-resources/message-endpoint.yaml new file mode 100644 index 00000000..38ae939a --- /dev/null +++ b/api-customer/api-resources/message-endpoint.yaml @@ -0,0 +1,99 @@ +openapi: "3.1.0" +info: + title: "boardmate_api API" + description: "boardmate_api API" + version: "1.0.0" +servers: + - url: "https://boardmate_api" +paths: + /message/send: + post: + summary: "POST message/send" + operationId: "postMessage" + tags: + - Message + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/MessagePostRequestDto" + required: true + responses: + "200": + description: "OK" + content: + '*/*': + schema: + type: "string" + + /message/history/{clientId}: + get: + summary: "GET message/history/{clientId}" + operationId: "history" + tags: + - Message + parameters: + - name: "clientId" + in: "path" + required: true + schema: + type: "string" + - name: "$top" + in: "query" + required: false + schema: + type: "integer" + format: "int32" + default: "20" + + responses: + "200": + description: "OK" + content: + '*/*': + schema: + type: "array" + items: + $ref: "#/components/schemas/ResponseBodyListMessageDto" + +components: + schemas: + MessagePostRequestDto: + type: "object" + properties: + content: + type: "string" + nullable: true + clientId: + type: "string" + nullable: true + timeStamp: + type: "integer" + format: "int32" + nullable: true + + ResponseBodyListMessageDto: + type: "object" + properties: + data: + type: array + items: + $ref: "#/components/schemas/MessageDto" + nullable: true + message: + type: "string" + nullable: true + success: + type: "boolean" + nullable: false + + MessageDto: + type: "object" + properties: + content: + type: "string" + nullable: true + timestamp: + type: "integer" + format: "int32" + nullable: true \ No newline at end of file diff --git a/api-customer/requirements.txt b/api-customer/requirements.txt index b17bc640..d856f394 100644 --- a/api-customer/requirements.txt +++ b/api-customer/requirements.txt @@ -14,3 +14,4 @@ python-dotenv file:./api-resources/auth-components file:./api-resources/client-components file:./api-resources/game-components +file:./api-resources/message-components diff --git a/api/mosquitto/data/mosquitto.db b/api/mosquitto/data/mosquitto.db index 02caee2c0a0e1d7faa41c156e4f8fa9ee9762c5b..15c306ca0f476b6afe240f5d42d6b82269d1720c 100644 GIT binary patch delta 12 TcmZ3&xP)>> history( + @PathVariable String clientId, + @RequestParam(value = "$top", required = false, defaultValue = "20") int top + ) { + ResponseBody> result = ResponseBody.createEmpty(); + try { + List messages = this.messageService.getHistory(clientId, top); + List dtos = messages.stream() + .map(m -> { + MessageDto dto = new MessageDto(); + dto.setContent(m.getContent()); + dto.setTimestamp(m.getTimeStamp()); + return dto; + }) + .toList(); + + result.setSuccess(true); + result.setData(dtos); + return ResponseEntity.status(HttpStatus.OK).body(result); + + } catch (ServiceException e) { + result.setMessage(e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result); + } } } diff --git a/api/src/main/java/be/naaturel/boardmateapi/controllers/dtos/MessageDto.java b/api/src/main/java/be/naaturel/boardmateapi/controllers/dtos/MessageDto.java new file mode 100644 index 00000000..40916ee2 --- /dev/null +++ b/api/src/main/java/be/naaturel/boardmateapi/controllers/dtos/MessageDto.java @@ -0,0 +1,26 @@ +package be.naaturel.boardmateapi.controllers.dtos; + + +public class MessageDto { + + private String content; + + private int timestamp; + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public int getTimestamp() { + return timestamp; + } + + public void setTimestamp(int timestamp) { + this.timestamp = timestamp; + } + +} diff --git a/api/src/main/java/be/naaturel/boardmateapi/repository/MessageRepo.java b/api/src/main/java/be/naaturel/boardmateapi/repository/MessageRepo.java index 6e246b56..36be1e06 100644 --- a/api/src/main/java/be/naaturel/boardmateapi/repository/MessageRepo.java +++ b/api/src/main/java/be/naaturel/boardmateapi/repository/MessageRepo.java @@ -1,7 +1,14 @@ package be.naaturel.boardmateapi.repository; import be.naaturel.boardmateapi.repository.dtos.MessageDto; +import org.springframework.data.domain.Pageable; import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.Query; + +import java.util.List; public interface MessageRepo extends MongoRepository { + + List findByClientId(String clientId, Pageable pageable); + } diff --git a/api/src/main/java/be/naaturel/boardmateapi/repository/mappings/MessageMapper.java b/api/src/main/java/be/naaturel/boardmateapi/repository/mappings/MessageMapper.java index e047d9e6..5f4f99e0 100644 --- a/api/src/main/java/be/naaturel/boardmateapi/repository/mappings/MessageMapper.java +++ b/api/src/main/java/be/naaturel/boardmateapi/repository/mappings/MessageMapper.java @@ -3,6 +3,9 @@ package be.naaturel.boardmateapi.repository.mappings; import be.naaturel.boardmateapi.common.models.Message; import be.naaturel.boardmateapi.repository.dtos.MessageDto; +import java.util.Collection; +import java.util.List; + public class MessageMapper { public static Message toModel(MessageDto dto){ @@ -18,4 +21,8 @@ public class MessageMapper { return dto; } + public static List toModels(List dtos){ + return dtos.stream().map(MessageMapper::toModel).toList(); + } + } diff --git a/api/src/main/java/be/naaturel/boardmateapi/services/MessageService.java b/api/src/main/java/be/naaturel/boardmateapi/services/MessageService.java index 258a243c..6977c3f2 100644 --- a/api/src/main/java/be/naaturel/boardmateapi/services/MessageService.java +++ b/api/src/main/java/be/naaturel/boardmateapi/services/MessageService.java @@ -1,12 +1,19 @@ package be.naaturel.boardmateapi.services; import be.naaturel.boardmateapi.common.exceptions.ServiceException; +import be.naaturel.boardmateapi.common.helpers.Logger; import be.naaturel.boardmateapi.common.models.Message; import be.naaturel.boardmateapi.repository.MessageRepo; import be.naaturel.boardmateapi.repository.dtos.MessageDto; import be.naaturel.boardmateapi.repository.mappings.MessageMapper; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; +import java.util.Arrays; +import java.util.List; + @Service public class MessageService { @@ -23,9 +30,21 @@ public class MessageService { MessageDto result = repo.save(dto); return result.getId(); } catch (Exception e){ + Logger.displayError(Arrays.toString(e.getStackTrace())); throw new ServiceException("Failed to save message : " + e.getMessage(), e); } } + public List getHistory(String clientId, int limit) throws ServiceException { + try { + Pageable pageable = PageRequest.of(0, limit, Sort.by(Sort.Direction.DESC, "timeStamp")); + List messages = repo.findByClientId(clientId, pageable); + + return MessageMapper.toModels(messages); + } catch (Exception e){ + Logger.displayError(Arrays.toString(e.getStackTrace())); + throw new ServiceException("Failed to retrieve messages history : " + e.getMessage(), e); + } + } }