initial commit
This commit is contained in:
commit
fe8af0fedf
20 changed files with 953 additions and 0 deletions
13
src/main/java/me/imsonmia/epqapi/EpqapiApplication.java
Normal file
13
src/main/java/me/imsonmia/epqapi/EpqapiApplication.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
25
src/main/java/me/imsonmia/epqapi/messaging/Message.java
Normal file
25
src/main/java/me/imsonmia/epqapi/messaging/Message.java
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
11
src/main/java/me/imsonmia/epqapi/model/ChatConvert.java
Normal file
11
src/main/java/me/imsonmia/epqapi/model/ChatConvert.java
Normal 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());
|
||||
}
|
||||
}
|
35
src/main/java/me/imsonmia/epqapi/model/ChatMessage.java
Normal file
35
src/main/java/me/imsonmia/epqapi/model/ChatMessage.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
34
src/main/java/me/imsonmia/epqapi/model/User.java
Normal file
34
src/main/java/me/imsonmia/epqapi/model/User.java
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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> {
|
||||
}
|
|
@ -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);
|
||||
}
|
5
src/main/resources/application.properties
Normal file
5
src/main/resources/application.properties
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue