diff options
author | Zhongheng Liu <z.liu@outlook.com.gr> | 2023-12-21 12:32:56 +0200 |
---|---|---|
committer | Zhongheng Liu <z.liu@outlook.com.gr> | 2023-12-21 12:32:56 +0200 |
commit | fe8af0fedfed569b565bbabe81b576fe2526806c (patch) | |
tree | c623668e10e964305380b444f41cc6092f2cc049 /src | |
download | epq-api-fe8af0fedfed569b565bbabe81b576fe2526806c.tar.gz epq-api-fe8af0fedfed569b565bbabe81b576fe2526806c.tar.bz2 epq-api-fe8af0fedfed569b565bbabe81b576fe2526806c.zip |
initial commit
Diffstat (limited to 'src')
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() { + } + +} |