Add webex message posting

This commit is contained in:
2026-01-02 00:03:46 +01:00
parent a0e974d511
commit 08afaa19ee
20 changed files with 34360 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,8 @@
db = db.getSiblingDB("board-mate-db");
db.createCollection("messages");
db.createCollection("clients");
db.createCollection("rooms");
db.createCollection("telemetry");
db.createCollection("games");

Binary file not shown.

View File

@@ -896,3 +896,315 @@ To fix this, use `chmod 0700 /mosquitto/config/passwords`.
1767230346: Saving in-memory database to /mosquitto/data//mosquitto.db.
1767232055: Saving in-memory database to /mosquitto/data//mosquitto.db.
1767233762: Saving in-memory database to /mosquitto/data//mosquitto.db.
1767282028: mosquitto version 2.0.22 starting
1767282028: Config loaded from /mosquitto/config/mosquitto.conf.
1767282028: Opening ipv4 listen socket on port 1883.
1767282028: Opening ipv6 listen socket on port 1883.
1767282028: Opening websockets listen socket on port 9001.
1767282028: Opening ipv4 listen socket on port 8883.
1767282028: Opening ipv6 listen socket on port 8883.
1767282028: mosquitto version 2.0.22 running
1767282039: New connection from 172.19.0.7:43114 on port 1883.
1767282040: New client connected from 172.19.0.7:43114 as board-mate-api (p2, c0, k60, u'board-mate-api').
1767282040: No will message specified.
1767282040: Sending CONNACK to board-mate-api (1, 0)
1767282040: Received SUBSCRIBE from board-mate-api
1767282040: /board-mate/+/telemetry (QoS 1)
1767282040: board-mate-api 1 /board-mate/+/telemetry
1767282040: Sending SUBACK to board-mate-api
1767282120: Received PINGREQ from board-mate-api
1767282120: Sending PINGRESP to board-mate-api
1767282180: Received PINGREQ from board-mate-api
1767282180: Sending PINGRESP to board-mate-api
1767282240: Received PINGREQ from board-mate-api
1767282240: Sending PINGRESP to board-mate-api
1767282326: Client board-mate-api has exceeded timeout, disconnecting.
1767282511: New connection from 172.19.0.7:44276 on port 1883.
1767282512: New client connected from 172.19.0.7:44276 as board-mate-api (p2, c0, k60, u'board-mate-api').
1767282512: No will message specified.
1767282512: Sending CONNACK to board-mate-api (1, 0)
1767282580: Received PINGREQ from board-mate-api
1767282580: Sending PINGRESP to board-mate-api
1767282640: Received PINGREQ from board-mate-api
1767282640: Sending PINGRESP to board-mate-api
1767282700: Received PINGREQ from board-mate-api
1767282700: Sending PINGRESP to board-mate-api
1767282760: Received PINGREQ from board-mate-api
1767282760: Sending PINGRESP to board-mate-api
1767282820: Received PINGREQ from board-mate-api
1767282820: Sending PINGRESP to board-mate-api
1767282852: Received DISCONNECT from board-mate-api
1767282852: Client board-mate-api disconnected.
1767282851: mosquitto version 2.0.22 terminating
1767282851: Saving in-memory database to /mosquitto/data//mosquitto.db.
1767304450: mosquitto version 2.0.22 starting
1767304450: Config loaded from /mosquitto/config/mosquitto.conf.
1767304450: Opening ipv4 listen socket on port 1883.
1767304450: Opening ipv6 listen socket on port 1883.
1767304450: Opening websockets listen socket on port 9001.
1767304450: Opening ipv4 listen socket on port 8883.
1767304450: Opening ipv6 listen socket on port 8883.
1767304450: mosquitto version 2.0.22 running
1767304462: New connection from 172.18.0.7:50814 on port 1883.
1767304462: New client connected from 172.18.0.7:50814 as board-mate-api (p2, c0, k60, u'board-mate-api').
1767304462: No will message specified.
1767304462: Sending CONNACK to board-mate-api (1, 0)
1767304462: Received SUBSCRIBE from board-mate-api
1767304462: /board-mate/+/telemetry (QoS 1)
1767304462: board-mate-api 1 /board-mate/+/telemetry
1767304462: Sending SUBACK to board-mate-api
1767304522: Received PINGREQ from board-mate-api
1767304522: Sending PINGRESP to board-mate-api
1767304582: Received PINGREQ from board-mate-api
1767304582: Sending PINGRESP to board-mate-api
1767304645: Received PINGREQ from board-mate-api
1767304645: Sending PINGRESP to board-mate-api
1767304731: Client board-mate-api has exceeded timeout, disconnecting.
1767304757: New connection from 172.18.0.7:58660 on port 1883.
1767304765: New client connected from 172.18.0.7:58660 as board-mate-api (p2, c0, k60, u'board-mate-api').
1767304765: No will message specified.
1767304765: Sending CONNACK to board-mate-api (1, 0)
1767304825: Received PINGREQ from board-mate-api
1767304825: Sending PINGRESP to board-mate-api
1767304885: Received PINGREQ from board-mate-api
1767304885: Sending PINGRESP to board-mate-api
1767304945: Received PINGREQ from board-mate-api
1767304945: Sending PINGRESP to board-mate-api
1767305005: Received PINGREQ from board-mate-api
1767305005: Sending PINGRESP to board-mate-api
1767305065: Received PINGREQ from board-mate-api
1767305065: Sending PINGRESP to board-mate-api
1767305125: Received PINGREQ from board-mate-api
1767305125: Sending PINGRESP to board-mate-api
1767305185: Received PINGREQ from board-mate-api
1767305185: Sending PINGRESP to board-mate-api
1767305245: Received PINGREQ from board-mate-api
1767305245: Sending PINGRESP to board-mate-api
1767305305: Received PINGREQ from board-mate-api
1767305305: Sending PINGRESP to board-mate-api
1767305365: Received PINGREQ from board-mate-api
1767305365: Sending PINGRESP to board-mate-api
1767305425: Received PINGREQ from board-mate-api
1767305425: Sending PINGRESP to board-mate-api
1767305485: Received PINGREQ from board-mate-api
1767305485: Sending PINGRESP to board-mate-api
1767305545: Received PINGREQ from board-mate-api
1767305545: Sending PINGRESP to board-mate-api
1767305605: Received PINGREQ from board-mate-api
1767305605: Sending PINGRESP to board-mate-api
1767305650: mosquitto version 2.0.22 terminating
1767305650: Saving in-memory database to /mosquitto/data//mosquitto.db.
1767305652: mosquitto version 2.0.22 starting
1767305652: Config loaded from /mosquitto/config/mosquitto.conf.
1767305652: Opening ipv4 listen socket on port 1883.
1767305652: Opening ipv6 listen socket on port 1883.
1767305652: Opening websockets listen socket on port 9001.
1767305652: Opening ipv4 listen socket on port 8883.
1767305652: Opening ipv6 listen socket on port 8883.
1767305652: mosquitto version 2.0.22 running
1767305664: New connection from 172.18.0.7:60920 on port 1883.
1767305664: New client connected from 172.18.0.7:60920 as board-mate-api (p2, c0, k60, u'board-mate-api').
1767305664: No will message specified.
1767305664: Sending CONNACK to board-mate-api (1, 0)
1767305664: Received SUBSCRIBE from board-mate-api
1767305664: /board-mate/+/telemetry (QoS 1)
1767305664: board-mate-api 1 /board-mate/+/telemetry
1767305664: Sending SUBACK to board-mate-api
1767305724: Received PINGREQ from board-mate-api
1767305724: Sending PINGRESP to board-mate-api
1767305784: Received PINGREQ from board-mate-api
1767305784: Sending PINGRESP to board-mate-api
1767305837: mosquitto version 2.0.22 terminating
1767305837: Saving in-memory database to /mosquitto/data//mosquitto.db.
1767305840: mosquitto version 2.0.22 starting
1767305840: Config loaded from /mosquitto/config/mosquitto.conf.
1767305840: Opening ipv4 listen socket on port 1883.
1767305840: Opening ipv6 listen socket on port 1883.
1767305840: Opening websockets listen socket on port 9001.
1767305840: Opening ipv4 listen socket on port 8883.
1767305840: Opening ipv6 listen socket on port 8883.
1767305840: mosquitto version 2.0.22 running
1767305849: New connection from 172.18.0.7:58484 on port 1883.
1767305849: New client connected from 172.18.0.7:58484 as board-mate-api (p2, c0, k60, u'board-mate-api').
1767305849: No will message specified.
1767305849: Sending CONNACK to board-mate-api (1, 0)
1767305849: Received SUBSCRIBE from board-mate-api
1767305849: /board-mate/+/telemetry (QoS 1)
1767305849: board-mate-api 1 /board-mate/+/telemetry
1767305849: Sending SUBACK to board-mate-api
1767305849: Received DISCONNECT from board-mate-api
1767305849: Client board-mate-api disconnected.
1767305994: mosquitto version 2.0.22 terminating
1767305994: Saving in-memory database to /mosquitto/data//mosquitto.db.
1767305996: mosquitto version 2.0.22 starting
1767305996: Config loaded from /mosquitto/config/mosquitto.conf.
1767305996: Opening ipv4 listen socket on port 1883.
1767305996: Opening ipv6 listen socket on port 1883.
1767305996: Opening websockets listen socket on port 9001.
1767305996: Opening ipv4 listen socket on port 8883.
1767305996: Opening ipv6 listen socket on port 8883.
1767305996: mosquitto version 2.0.22 running
1767306007: New connection from 172.18.0.7:56830 on port 1883.
1767306008: New client connected from 172.18.0.7:56830 as board-mate-api (p2, c0, k60, u'board-mate-api').
1767306008: No will message specified.
1767306008: Sending CONNACK to board-mate-api (1, 0)
1767306008: Received SUBSCRIBE from board-mate-api
1767306008: /board-mate/+/telemetry (QoS 1)
1767306008: board-mate-api 1 /board-mate/+/telemetry
1767306008: Sending SUBACK to board-mate-api
1767306092: Client board-mate-api has exceeded timeout, disconnecting.
1767306102: New connection from 172.18.0.7:39266 on port 1883.
1767306103: New client connected from 172.18.0.7:39266 as board-mate-api (p2, c0, k60, u'board-mate-api').
1767306103: No will message specified.
1767306103: Sending CONNACK to board-mate-api (1, 0)
1767306163: Received PINGREQ from board-mate-api
1767306163: Sending PINGRESP to board-mate-api
1767306223: Received PINGREQ from board-mate-api
1767306223: Sending PINGRESP to board-mate-api
1767306283: Received PINGREQ from board-mate-api
1767306283: Sending PINGRESP to board-mate-api
1767306343: Received PINGREQ from board-mate-api
1767306343: Sending PINGRESP to board-mate-api
1767306403: Received PINGREQ from board-mate-api
1767306403: Sending PINGRESP to board-mate-api
1767306463: Received PINGREQ from board-mate-api
1767306463: Sending PINGRESP to board-mate-api
1767306523: Received PINGREQ from board-mate-api
1767306523: Sending PINGRESP to board-mate-api
1767306583: Received PINGREQ from board-mate-api
1767306583: Sending PINGRESP to board-mate-api
1767306643: Received PINGREQ from board-mate-api
1767306643: Sending PINGRESP to board-mate-api
1767306703: Received PINGREQ from board-mate-api
1767306703: Sending PINGRESP to board-mate-api
1767306763: Received PINGREQ from board-mate-api
1767306763: Sending PINGRESP to board-mate-api
1767306823: Received PINGREQ from board-mate-api
1767306823: Sending PINGRESP to board-mate-api
1767306883: Received PINGREQ from board-mate-api
1767306883: Sending PINGRESP to board-mate-api
1767306943: Received PINGREQ from board-mate-api
1767306943: Sending PINGRESP to board-mate-api
1767307003: Received PINGREQ from board-mate-api
1767307003: Sending PINGRESP to board-mate-api
1767307063: Received PINGREQ from board-mate-api
1767307063: Sending PINGRESP to board-mate-api
1767307123: Received PINGREQ from board-mate-api
1767307123: Sending PINGRESP to board-mate-api
1767307183: Received PINGREQ from board-mate-api
1767307183: Sending PINGRESP to board-mate-api
1767307243: Received PINGREQ from board-mate-api
1767307243: Sending PINGRESP to board-mate-api
1767307303: Received PINGREQ from board-mate-api
1767307303: Sending PINGRESP to board-mate-api
1767307363: Received PINGREQ from board-mate-api
1767307363: Sending PINGRESP to board-mate-api
1767307423: Received PINGREQ from board-mate-api
1767307423: Sending PINGRESP to board-mate-api
1767307483: Received PINGREQ from board-mate-api
1767307483: Sending PINGRESP to board-mate-api
1767307543: Received PINGREQ from board-mate-api
1767307543: Sending PINGRESP to board-mate-api
1767307599: mosquitto version 2.0.22 terminating
1767307599: Saving in-memory database to /mosquitto/data//mosquitto.db.
1767307605: mosquitto version 2.0.22 starting
1767307605: Config loaded from /mosquitto/config/mosquitto.conf.
1767307605: Opening ipv4 listen socket on port 1883.
1767307605: Opening ipv6 listen socket on port 1883.
1767307605: Opening websockets listen socket on port 9001.
1767307605: Opening ipv4 listen socket on port 8883.
1767307605: Opening ipv6 listen socket on port 8883.
1767307605: mosquitto version 2.0.22 running
1767307614: New connection from 172.18.0.7:39586 on port 1883.
1767307614: New client connected from 172.18.0.7:39586 as board-mate-api (p2, c0, k60, u'board-mate-api').
1767307614: No will message specified.
1767307614: Sending CONNACK to board-mate-api (1, 0)
1767307614: Received SUBSCRIBE from board-mate-api
1767307614: /board-mate/+/telemetry (QoS 1)
1767307614: board-mate-api 1 /board-mate/+/telemetry
1767307614: Sending SUBACK to board-mate-api
1767307674: Received PINGREQ from board-mate-api
1767307674: Sending PINGRESP to board-mate-api
1767307737: Received PINGREQ from board-mate-api
1767307737: Sending PINGRESP to board-mate-api
1767307823: Client board-mate-api has exceeded timeout, disconnecting.
1767307831: New connection from 172.18.0.7:60706 on port 1883.
1767307831: New client connected from 172.18.0.7:60706 as board-mate-api (p2, c0, k60, u'board-mate-api').
1767307831: No will message specified.
1767307831: Sending CONNACK to board-mate-api (1, 0)
1767307891: Received PINGREQ from board-mate-api
1767307891: Sending PINGRESP to board-mate-api
1767307920: mosquitto version 2.0.22 terminating
1767307920: Saving in-memory database to /mosquitto/data//mosquitto.db.
1767307925: mosquitto version 2.0.22 starting
1767307925: Config loaded from /mosquitto/config/mosquitto.conf.
1767307925: Opening ipv4 listen socket on port 1883.
1767307925: Opening ipv6 listen socket on port 1883.
1767307925: Opening websockets listen socket on port 9001.
1767307925: Opening ipv4 listen socket on port 8883.
1767307925: Opening ipv6 listen socket on port 8883.
1767307925: mosquitto version 2.0.22 running
1767307937: New connection from 172.18.0.7:43136 on port 1883.
1767307937: New client connected from 172.18.0.7:43136 as board-mate-api (p2, c0, k60, u'board-mate-api').
1767307937: No will message specified.
1767307937: Sending CONNACK to board-mate-api (1, 0)
1767307937: Received SUBSCRIBE from board-mate-api
1767307937: /board-mate/+/telemetry (QoS 1)
1767307937: board-mate-api 1 /board-mate/+/telemetry
1767307937: Sending SUBACK to board-mate-api
1767307998: Received PINGREQ from board-mate-api
1767307998: Sending PINGRESP to board-mate-api
1767308058: Received PINGREQ from board-mate-api
1767308058: Sending PINGRESP to board-mate-api
1767308065: Received DISCONNECT from board-mate-api
1767308065: Client board-mate-api disconnected.
1767308066: mosquitto version 2.0.22 terminating
1767308066: Saving in-memory database to /mosquitto/data//mosquitto.db.
1767308122: mosquitto version 2.0.22 starting
1767308122: Config loaded from /mosquitto/config/mosquitto.conf.
1767308122: Opening ipv4 listen socket on port 1883.
1767308122: Opening ipv6 listen socket on port 1883.
1767308122: Opening websockets listen socket on port 9001.
1767308122: Opening ipv4 listen socket on port 8883.
1767308122: Opening ipv6 listen socket on port 8883.
1767308122: mosquitto version 2.0.22 running
1767308141: New connection from 172.18.0.7:32840 on port 1883.
1767308141: New client connected from 172.18.0.7:32840 as board-mate-api (p2, c0, k60, u'board-mate-api').
1767308141: No will message specified.
1767308141: Sending CONNACK to board-mate-api (1, 0)
1767308141: Received SUBSCRIBE from board-mate-api
1767308141: /board-mate/+/telemetry (QoS 1)
1767308141: board-mate-api 1 /board-mate/+/telemetry
1767308141: Sending SUBACK to board-mate-api
1767308166: mosquitto version 2.0.22 terminating
1767308166: Saving in-memory database to /mosquitto/data//mosquitto.db.
1767308168: mosquitto version 2.0.22 starting
1767308168: Config loaded from /mosquitto/config/mosquitto.conf.
1767308168: Opening ipv4 listen socket on port 1883.
1767308168: Opening ipv6 listen socket on port 1883.
1767308168: Opening websockets listen socket on port 9001.
1767308168: Opening ipv4 listen socket on port 8883.
1767308168: Opening ipv6 listen socket on port 8883.
1767308168: mosquitto version 2.0.22 running
1767308186: New connection from 172.18.0.7:37432 on port 1883.
1767308186: New client connected from 172.18.0.7:37432 as board-mate-api (p2, c0, k60, u'board-mate-api').
1767308186: No will message specified.
1767308186: Sending CONNACK to board-mate-api (1, 0)
1767308186: Received SUBSCRIBE from board-mate-api
1767308186: /board-mate/+/telemetry (QoS 1)
1767308186: board-mate-api 1 /board-mate/+/telemetry
1767308186: Sending SUBACK to board-mate-api
1767308246: Received PINGREQ from board-mate-api
1767308246: Sending PINGRESP to board-mate-api
1767308306: Received PINGREQ from board-mate-api
1767308306: Sending PINGRESP to board-mate-api
1767308366: Received PINGREQ from board-mate-api
1767308366: Sending PINGRESP to board-mate-api
1767308426: Received PINGREQ from board-mate-api
1767308426: Sending PINGRESP to board-mate-api
1767308486: Received PINGREQ from board-mate-api
1767308486: Sending PINGRESP to board-mate-api
1767308546: Received PINGREQ from board-mate-api
1767308546: Sending PINGRESP to board-mate-api
1767308606: Received PINGREQ from board-mate-api
1767308606: Sending PINGRESP to board-mate-api

View File

@@ -0,0 +1,48 @@
package be.naaturel.boardmateapi.common.models;
public class Message {
private String id;
private String content;
private String clientId;
private int timeStamp;
public Message(String id, String content, String clientId, int timeStamp){
this.id = id;
this.content = content;
this.clientId = clientId;
this.timeStamp = timeStamp;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public int getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(int timeStamp) {
this.timeStamp = timeStamp;
}
}

View File

@@ -0,0 +1,38 @@
package be.naaturel.boardmateapi.common.models;
public class Room {
private String id;
private String title;
private String clientId;
public Room(String id, String title, String clientId) {
this.id = id;
this.title = title;
this.clientId = clientId;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
}

View File

@@ -0,0 +1,25 @@
package be.naaturel.boardmateapi.configurations.configurations;
import be.naaturel.boardmateapi.configurations.properties.WebexProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebexConfig {
private final WebexProperties properties;
public WebexConfig(WebexProperties properties){
this.properties = properties;
}
@Bean(name = "clientToken")
public String clientToken(){
return properties.clientToken;
}
@Bean(name = "botToken")
public String botToken(){
return properties.botToken;
}
}

View File

@@ -0,0 +1,15 @@
package be.naaturel.boardmateapi.configurations.properties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class WebexProperties {
@Value("${webex.client.token}")
public String clientToken;
@Value("${webex.bot.token}")
public String botToken;
}

View File

@@ -0,0 +1,60 @@
package be.naaturel.boardmateapi.controllers;
import be.naaturel.boardmateapi.common.models.Message;
import be.naaturel.boardmateapi.controllers.dtos.MessagePostRequestDto;
import be.naaturel.boardmateapi.controllers.dtos.ResponseBody;
import be.naaturel.boardmateapi.services.MessageService;
import be.naaturel.boardmateapi.services.WebexService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ChatController {
private final MessageService messageService;
private final WebexService webexService;
@Autowired
public ChatController(MessageService messageService, WebexService webexService){
this.messageService = messageService;
this.webexService = webexService;
}
@PostMapping("/message/send")
public ResponseEntity<ResponseBody<String>> postMessage(@RequestBody MessagePostRequestDto messagePostRequest) {
ResponseBody<String> result = ResponseBody.createEmpty();
try {
Message model = new Message(
null,
messagePostRequest.getContent(),
messagePostRequest.getClientId(),
messagePostRequest.getTimeStamp());
this.webexService.post(model);
String id = this.messageService.save(model);
result.setSuccess(true);
result.setData(id);
return ResponseEntity.
status(HttpStatus.OK)
.body(result);
} catch (Exception e){
result.setMessage(e.getMessage());
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(result);
}
}
@GetMapping("/message/history")
public void history(){
}
}

View File

@@ -26,6 +26,7 @@ public class ClientController {
ResponseBody<String> result = ResponseBody.createEmpty();
try{
String clientId = service.create(dto.getCompanyName(), dto.getUsername(), dto.getKey());
result.setSuccess(true);
result.setData(clientId);
return ResponseEntity.
status(HttpStatus.OK)
@@ -37,4 +38,7 @@ public class ClientController {
.body(result);
}
}
}

View File

@@ -0,0 +1,33 @@
package be.naaturel.boardmateapi.controllers.dtos;
public class MessagePostRequestDto {
private String content;
private String clientId;
private int timeStamp;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public int getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(int timeStamp) {
this.timeStamp = timeStamp;
}
}

View File

@@ -0,0 +1,7 @@
package be.naaturel.boardmateapi.repository;
import be.naaturel.boardmateapi.repository.dtos.MessageDto;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface MessageRepo extends MongoRepository<MessageDto, String> {
}

View File

@@ -0,0 +1,12 @@
package be.naaturel.boardmateapi.repository;
import be.naaturel.boardmateapi.common.models.Room;
import be.naaturel.boardmateapi.repository.dtos.RoomDto;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
import java.util.Optional;
public interface RoomRepo extends MongoRepository<RoomDto, String> {
Optional<RoomDto> findByClientId(String clientId);
}

View File

@@ -0,0 +1,53 @@
package be.naaturel.boardmateapi.repository.dtos;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Document("messages")
public class MessageDto {
@Id
private String id;
@Field("clientId")
private String clientId;
@Field("content")
private String content;
@Field("timestamp")
private int timestamp;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
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;
}
}

View File

@@ -0,0 +1,55 @@
package be.naaturel.boardmateapi.repository.dtos;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Document("rooms")
public class RoomDto {
@Id
private String id;
@Field("title")
private String title;
@Field("roomId")
private String roomId;
@Field("clientId")
@Indexed(unique = true)
private String clientId;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getRoomId() {
return roomId;
}
public void setRoomId(String roomId) {
this.roomId = roomId;
}
}

View File

@@ -0,0 +1,21 @@
package be.naaturel.boardmateapi.repository.mappings;
import be.naaturel.boardmateapi.common.models.Message;
import be.naaturel.boardmateapi.repository.dtos.MessageDto;
public class MessageMapper {
public static Message toModel(MessageDto dto){
return new Message(dto.getId(), dto.getContent(), dto.getClientId(), dto.getTimestamp());
}
public static MessageDto toDto(Message model){
MessageDto dto = new MessageDto();
dto.setId(model.getId());
dto.setContent(model.getContent());
dto.setClientId(model.getClientId());
dto.setTimestamp(model.getTimeStamp());
return dto;
}
}

View File

@@ -0,0 +1,19 @@
package be.naaturel.boardmateapi.repository.mappings;
import be.naaturel.boardmateapi.common.models.Room;
import be.naaturel.boardmateapi.repository.dtos.RoomDto;
public class RoomMapper {
public static Room toModel(RoomDto dto){
return new Room(dto.getRoomId(),dto.getTitle(), dto.getClientId());
}
public static RoomDto toDto(Room model){
RoomDto dto = new RoomDto();
dto.setTitle(model.getTitle());
dto.setClientId(model.getClientId());
dto.setRoomId(model.getId());
return dto;
}
}

View File

@@ -0,0 +1,31 @@
package be.naaturel.boardmateapi.services;
import be.naaturel.boardmateapi.common.exceptions.ServiceException;
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.stereotype.Service;
@Service
public class MessageService {
private final MessageRepo repo;
public MessageService(MessageRepo repo){
this.repo = repo;
}
public String save(Message message) throws ServiceException {
try {
MessageDto dto = MessageMapper.toDto(message);
MessageDto result = repo.save(dto);
return result.getId();
} catch (Exception e){
throw new ServiceException("Failed to save message : " + e.getMessage(), e);
}
}
}

View File

@@ -0,0 +1,114 @@
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.common.models.Room;
import be.naaturel.boardmateapi.repository.RoomRepo;
import be.naaturel.boardmateapi.repository.dtos.RoomDto;
import be.naaturel.boardmateapi.repository.mappings.RoomMapper;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Arrays;
import java.util.Map;
import java.util.Optional;
@Service
public class WebexService {
private final String botToken;
private final RoomRepo repo;
@Autowired
public WebexService(
RoomRepo repo,
@Qualifier("botToken") String botToken){
this.repo = repo;
this.botToken = botToken;
}
public void post(Message m) throws ServiceException {
try(HttpClient client = HttpClient.newHttpClient()) {
Room room = getClientRoom(m.getClientId());
if(room == null){
room = createRoom(m.getClientId());
}
ObjectMapper mapper = new ObjectMapper();
String jsonBody = mapper.writeValueAsString(
Map.of(
"roomId", room.getId(),
"text", m.getContent()
)
);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://webexapis.com/v1/messages"))
.header("Authorization", "Bearer " + this.botToken)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 300) {
throw new RuntimeException("Webex error " + response.statusCode() + " : " + response.body());
}
} catch (Exception e) {
Logger.displayError(Arrays.toString(e.getStackTrace()));
throw new ServiceException("Failed to post message");
}
}
public Room createRoom(String clientId) throws ServiceException {
try (HttpClient client = HttpClient.newHttpClient()) {
ObjectMapper mapper = new ObjectMapper();
String jsonBody = mapper.writeValueAsString(Map.of("title", "Support"));
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://webexapis.com/v1/rooms"))
.header("Authorization", "Bearer " + this.botToken)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 300) {
throw new RuntimeException("Webex error " + response.statusCode() + " : " + response.body());
}
JsonNode jsonNode = mapper.readTree(response.body());
String id = jsonNode.get("id").asText();
String title = jsonNode.get("title").asText();
RoomDto dto = new RoomDto();
dto.setTitle(title);
dto.setClientId(clientId);
dto.setRoomId(id);
repo.save(dto);
return new Room(id, title, clientId);
} catch (Exception e) {
Logger.displayError(Arrays.toString(e.getStackTrace()));
throw new ServiceException("Failed to create private room : " + e.getMessage(), e);
}
}
private Room getClientRoom(String clientId){
Optional<RoomDto> dto = repo.findByClientId(clientId);
return dto.map(RoomMapper::toModel).orElse(null);
}
}

View File

@@ -26,6 +26,10 @@ mqtt.client-id=board-mate-api
mqtt.username=${BROKER_USERNAME}
mqtt.password=${BROKER_PASSWORD}
#=============WEBEX=============
webex.client.token=N2E0ODMyZDUtY2JmZi00YjlhLWFjZmEtOTU0MmFlNjY3ZDE2M2ZhYWYzNzAtNzFm_P0A1_14a2639d-5e4d-48b4-9757-f4b8a23372de
webex.bot.token=MGM4ZDYzYzctZTZiMi00MjNlLWI3YzEtOTFhNDlmOGM1YzVjYWJhYTk0NzctNjBj_P0A1_14a2639d-5e4d-48b4-9757-f4b8a23372de
#=============METRICS=============
management.endpoint.health.show-details=always
management.endpoints.web.exposure.include=*