initial commit

This commit is contained in:
Zhongheng Liu 2023-12-21 12:32:56 +02:00
commit fe8af0fedf
No known key found for this signature in database
20 changed files with 953 additions and 0 deletions

View file

@ -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);
}
}

View file

@ -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();
}
}

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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");
}
});
}
}

View file

@ -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());
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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> {
}

View file

@ -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);
}