aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZhongheng Liu <z.liu@outlook.com.gr>2023-12-21 12:32:56 +0200
committerZhongheng Liu <z.liu@outlook.com.gr>2023-12-21 12:32:56 +0200
commitfe8af0fedfed569b565bbabe81b576fe2526806c (patch)
treec623668e10e964305380b444f41cc6092f2cc049 /src
downloadepq-api-fe8af0fedfed569b565bbabe81b576fe2526806c.tar.gz
epq-api-fe8af0fedfed569b565bbabe81b576fe2526806c.tar.bz2
epq-api-fe8af0fedfed569b565bbabe81b576fe2526806c.zip
initial commit
Diffstat (limited to 'src')
-rw-r--r--src/main/java/me/imsonmia/epqapi/EpqapiApplication.java13
-rw-r--r--src/main/java/me/imsonmia/epqapi/controller/ChatMessageController.java19
-rw-r--r--src/main/java/me/imsonmia/epqapi/controller/UserController.java37
-rw-r--r--src/main/java/me/imsonmia/epqapi/messaging/Message.java25
-rw-r--r--src/main/java/me/imsonmia/epqapi/messaging/MessageDecoder.java28
-rw-r--r--src/main/java/me/imsonmia/epqapi/messaging/MessageEncoder.java25
-rw-r--r--src/main/java/me/imsonmia/epqapi/messaging/WebSocketHandler.java71
-rw-r--r--src/main/java/me/imsonmia/epqapi/model/ChatConvert.java11
-rw-r--r--src/main/java/me/imsonmia/epqapi/model/ChatMessage.java35
-rw-r--r--src/main/java/me/imsonmia/epqapi/model/User.java34
-rw-r--r--src/main/java/me/imsonmia/epqapi/repository/ChatMessageRepository.java8
-rw-r--r--src/main/java/me/imsonmia/epqapi/repository/UserRepository.java9
-rw-r--r--src/main/resources/application.properties5
-rw-r--r--src/test/java/me/imsonmia/epqapi/EpqapiApplicationTests.java13
14 files changed, 333 insertions, 0 deletions
diff --git a/src/main/java/me/imsonmia/epqapi/EpqapiApplication.java b/src/main/java/me/imsonmia/epqapi/EpqapiApplication.java
new file mode 100644
index 0000000..ed48498
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/EpqapiApplication.java
@@ -0,0 +1,13 @@
+package me.imsonmia.epqapi;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class EpqapiApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(EpqapiApplication.class, args);
+ }
+
+}
diff --git a/src/main/java/me/imsonmia/epqapi/controller/ChatMessageController.java b/src/main/java/me/imsonmia/epqapi/controller/ChatMessageController.java
new file mode 100644
index 0000000..bf94991
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/controller/ChatMessageController.java
@@ -0,0 +1,19 @@
+package me.imsonmia.epqapi.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import me.imsonmia.epqapi.model.ChatMessage;
+import me.imsonmia.epqapi.repository.ChatMessageRepository;
+
+@RestController
+@RequestMapping("/api/v1")
+public class ChatMessageController {
+ private ChatMessageRepository chatMessageRepository;
+ @GetMapping("/msg/{id}")
+ public ChatMessage getMessageById(@PathVariable(value = "id") Long id) {
+ return chatMessageRepository.findById(id).get();
+ }
+}
diff --git a/src/main/java/me/imsonmia/epqapi/controller/UserController.java b/src/main/java/me/imsonmia/epqapi/controller/UserController.java
new file mode 100644
index 0000000..bc7079f
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/controller/UserController.java
@@ -0,0 +1,37 @@
+package me.imsonmia.epqapi.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import me.imsonmia.epqapi.model.User;
+import me.imsonmia.epqapi.repository.UserRepository;
+
+@RestController
+@RequestMapping("/api/v1")
+public class UserController {
+ @Autowired
+ private UserRepository userRepository;
+ @GetMapping("/user/{id}")
+ public User getUserById(@PathVariable(value = "id") Long id) {
+ return userRepository.findById(id).get();
+ }
+ @PostMapping("/user")
+ public User addUser(
+ @RequestBody
+ User newUser
+ ) {
+ return userRepository.save(newUser);
+ }
+ @DeleteMapping("/user/{id}")
+ public void deleteUser(
+ @PathVariable(value = "id") Long id
+ ) {
+ userRepository.deleteById(id);
+ }
+}
diff --git a/src/main/java/me/imsonmia/epqapi/messaging/Message.java b/src/main/java/me/imsonmia/epqapi/messaging/Message.java
new file mode 100644
index 0000000..c11d96e
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/messaging/Message.java
@@ -0,0 +1,25 @@
+package me.imsonmia.epqapi.messaging;
+
+public class Message {
+ private String from;
+ private String to;
+ private String content;
+ public String getFrom() {
+ return this.from;
+ }
+ public void setFrom(String from) {
+ this.from = from;
+ }
+ public String getTo() {
+ return to;
+ }
+ public void setTo(String to) {
+ this.to = to;
+ }
+ public String getContent() {
+ return content;
+ }
+ public void setContent(String content) {
+ this.content = content;
+ }
+}
diff --git a/src/main/java/me/imsonmia/epqapi/messaging/MessageDecoder.java b/src/main/java/me/imsonmia/epqapi/messaging/MessageDecoder.java
new file mode 100644
index 0000000..78f2e2d
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/messaging/MessageDecoder.java
@@ -0,0 +1,28 @@
+package me.imsonmia.epqapi.messaging;
+
+import com.google.gson.Gson;
+
+import jakarta.websocket.DecodeException;
+import jakarta.websocket.Decoder;
+import jakarta.websocket.EndpointConfig;
+
+public class MessageDecoder implements Decoder.Text<Message> {
+ private static Gson gson = new Gson();
+ @Override
+ public Message decode(String message) throws DecodeException {
+ return gson.fromJson(message, Message.class);
+ }
+ @Override
+ public void destroy() {
+ Text.super.destroy();
+ }
+ @Override
+ public void init(EndpointConfig endpointConfig) {
+ Text.super.init(endpointConfig);
+ }
+ @Override
+ public boolean willDecode(String s) {
+ // TODO Auto-generated method stub
+ return (s != null);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/me/imsonmia/epqapi/messaging/MessageEncoder.java b/src/main/java/me/imsonmia/epqapi/messaging/MessageEncoder.java
new file mode 100644
index 0000000..6a44b16
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/messaging/MessageEncoder.java
@@ -0,0 +1,25 @@
+package me.imsonmia.epqapi.messaging;
+
+import com.google.gson.Gson;
+
+import jakarta.websocket.EncodeException;
+import jakarta.websocket.Encoder;
+import jakarta.websocket.EndpointConfig;
+
+public class MessageEncoder implements Encoder.Text<Message> {
+ private static Gson gson = new Gson();
+ @Override
+ public String encode(Message message) throws EncodeException {
+ return gson.toJson(message);
+ }
+ @Override
+ public void destroy() {
+ // TODO Auto-generated method stub
+ Text.super.destroy();
+ }
+ @Override
+ public void init(EndpointConfig endpointConfig) {
+ // TODO Auto-generated method stub
+ Text.super.init(endpointConfig);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/me/imsonmia/epqapi/messaging/WebSocketHandler.java b/src/main/java/me/imsonmia/epqapi/messaging/WebSocketHandler.java
new file mode 100644
index 0000000..25d653d
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/messaging/WebSocketHandler.java
@@ -0,0 +1,71 @@
+package me.imsonmia.epqapi.messaging;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import org.slf4j.Logger;
+
+import jakarta.websocket.EncodeException;
+import jakarta.websocket.OnClose;
+import jakarta.websocket.OnMessage;
+import jakarta.websocket.OnOpen;
+import jakarta.websocket.Session;
+import jakarta.websocket.server.ServerEndpoint;
+import me.imsonmia.epqapi.model.ChatConvert;
+import me.imsonmia.epqapi.model.ChatMessage;
+import me.imsonmia.epqapi.repository.ChatMessageRepository;
+
+// https://www.baeldung.com/java-websockets
+@ServerEndpoint(
+ value = "/chat/{username}",
+ encoders = MessageEncoder.class,
+ decoders = MessageDecoder.class
+ )
+public class WebSocketHandler {
+ private Logger logger;
+ private ChatMessageRepository chatMessageRepository;
+ private Session session;
+ private Set<WebSocketHandler> chatEndpoints = new CopyOnWriteArraySet<>();
+ private HashMap<String, String> users = new HashMap<>();
+ @OnOpen
+ public void onOpen(Session session, String username) throws IOException {
+ this.session = session;
+ chatEndpoints.add(this);
+ users.put(session.getId(), username);
+ Message message = new Message();
+ message.setFrom(username);
+ message.setContent("Connected, hello world!");
+ broadcast(message);
+ ChatMessage cmessage = new ChatConvert().fromMessage(message);
+ chatMessageRepository.save(cmessage);
+ }
+ @OnMessage
+ public void onMessage(Session session, Message message) throws IOException {
+ message.setFrom(users.get(session.getId()));
+ broadcast(message);
+ }
+ @OnClose
+ public void onClose(Session session) throws IOException {
+ chatEndpoints.remove(this);
+ Message message = new Message();
+ message.setFrom(users.get(session.getId()));
+ message.setContent("Disconnected!");
+ broadcast(message);
+ }
+ public void broadcast(Message message) {
+ chatEndpoints.forEach(endpoint -> {
+ try {
+ endpoint.session.getBasicRemote().sendObject(message);
+ }
+ catch (IOException e) {
+ logger.info("Error sending message! IOException");
+ logger.error(null, e);
+ }
+ catch (EncodeException e) {
+ logger.info("Error sending message! EncodeException");
+ }
+ });
+ }
+}
diff --git a/src/main/java/me/imsonmia/epqapi/model/ChatConvert.java b/src/main/java/me/imsonmia/epqapi/model/ChatConvert.java
new file mode 100644
index 0000000..69528d6
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/model/ChatConvert.java
@@ -0,0 +1,11 @@
+package me.imsonmia.epqapi.model;
+
+import me.imsonmia.epqapi.messaging.Message;
+import me.imsonmia.epqapi.repository.UserRepository;
+
+public class ChatConvert {
+ private UserRepository r;
+ public ChatMessage fromMessage(Message s) {
+ return new ChatMessage(r.findByFirstName(s.getFrom()).getId(), s.getContent());
+ }
+}
diff --git a/src/main/java/me/imsonmia/epqapi/model/ChatMessage.java b/src/main/java/me/imsonmia/epqapi/model/ChatMessage.java
new file mode 100644
index 0000000..d14336d
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/model/ChatMessage.java
@@ -0,0 +1,35 @@
+package me.imsonmia.epqapi.model;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import lombok.Getter;
+import lombok.Setter;
+@Entity
+@Table(name = "message")
+public class ChatMessage {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @Getter
+ Long id;
+ @Getter
+ @Setter
+ Long fromId;
+ @Getter
+ @Setter
+ String text;
+ @Getter
+ @Setter
+ String[] attachments;
+ public ChatMessage() {}
+ public ChatMessage(
+ Long fromId,
+ String text
+ ) {
+ this.fromId = fromId;
+ this.text = text;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/me/imsonmia/epqapi/model/User.java b/src/main/java/me/imsonmia/epqapi/model/User.java
new file mode 100644
index 0000000..cce261e
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/model/User.java
@@ -0,0 +1,34 @@
+package me.imsonmia.epqapi.model;
+
+import java.util.Date;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import lombok.Getter;
+import lombok.Setter;
+
+@Entity
+@Table(name = "user")
+public class User {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @Getter
+ Long id;
+ @Getter
+ @Setter
+ String userName;
+ @Getter
+ @Setter
+ Date dateJoined;
+ public User() {
+
+ }
+ public User(Long id, String userName, Date dateJoined) {
+ this.id = id;
+ this.userName = userName;
+ this.dateJoined = dateJoined;
+ }
+}
diff --git a/src/main/java/me/imsonmia/epqapi/repository/ChatMessageRepository.java b/src/main/java/me/imsonmia/epqapi/repository/ChatMessageRepository.java
new file mode 100644
index 0000000..8ee82e2
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/repository/ChatMessageRepository.java
@@ -0,0 +1,8 @@
+package me.imsonmia.epqapi.repository;
+
+import org.springframework.data.repository.CrudRepository;
+
+import me.imsonmia.epqapi.model.ChatMessage;
+
+public interface ChatMessageRepository extends CrudRepository<ChatMessage, Long> {
+}
diff --git a/src/main/java/me/imsonmia/epqapi/repository/UserRepository.java b/src/main/java/me/imsonmia/epqapi/repository/UserRepository.java
new file mode 100644
index 0000000..b877899
--- /dev/null
+++ b/src/main/java/me/imsonmia/epqapi/repository/UserRepository.java
@@ -0,0 +1,9 @@
+package me.imsonmia.epqapi.repository;
+
+import org.springframework.data.repository.CrudRepository;
+
+import me.imsonmia.epqapi.model.User;
+
+public interface UserRepository extends CrudRepository<User, Long> {
+ User findByFirstName(String userName);
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
new file mode 100644
index 0000000..a6bbf47
--- /dev/null
+++ b/src/main/resources/application.properties
@@ -0,0 +1,5 @@
+spring.datasource.url=jdbc:mariadb://localhost:3306/test
+spring.datasource.username=dbuser
+spring.datasource.password=dbpasswd
+spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
+spring.jpa.hibernate.ddl-auto=create-drop \ No newline at end of file
diff --git a/src/test/java/me/imsonmia/epqapi/EpqapiApplicationTests.java b/src/test/java/me/imsonmia/epqapi/EpqapiApplicationTests.java
new file mode 100644
index 0000000..f6d3d45
--- /dev/null
+++ b/src/test/java/me/imsonmia/epqapi/EpqapiApplicationTests.java
@@ -0,0 +1,13 @@
+package me.imsonmia.epqapi;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class EpqapiApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}