Skip to content

Commit

Permalink
Merge pull request #26 from Zatch-Team/Feature/Chat
Browse files Browse the repository at this point in the history
Feature/chat
  • Loading branch information
Suanna01 committed Apr 15, 2023
2 parents 7bcb0f6 + 5e746bf commit 0bc8549
Show file tree
Hide file tree
Showing 11 changed files with 196 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ src/main/resources/application.yml
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
src/main/resources/application.yml

### IntelliJ IDEA ###
.idea
Expand Down
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ dependencies {

// AWS 연동
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

// 채팅 - WebSocket
implementation 'org.springframework.boot:spring-boot-starter-websocket'
}

tasks.named('test') {
Expand Down
29 changes: 29 additions & 0 deletions src/main/java/com/zatch/zatchserver/Handler/WebSocketHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.zatch.zatchserver.Handler;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.zatch.zatchserver.domain.ChatRoom;
import com.zatch.zatchserver.dto.ChatMessage;
import com.zatch.zatchserver.service.ChatService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

@Slf4j
@RequiredArgsConstructor
@Component
public class WebSocketHandler extends TextWebSocketHandler {
private final ObjectMapper objectMapper;
private final ChatService chatService;

protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
log.info("{}", payload);
ChatMessage chatMessage = objectMapper.readValue(payload, ChatMessage.class);

ChatRoom chatRoom = chatService.findRoomById(chatMessage.getRoomId());
chatRoom.handlerActions(session, chatMessage, chatService);
}
}
20 changes: 20 additions & 0 deletions src/main/java/com/zatch/zatchserver/config/WebSocketConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.zatch.zatchserver.config;

import com.zatch.zatchserver.Handler.WebSocketHandler;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@RequiredArgsConstructor
@Configuration
@EnableWebSocket //webSocket 활성화
public class WebSocketConfig implements WebSocketConfigurer {
private final WebSocketHandler webSocketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
// Handler와 webSocket 주소를 WebSocketHandlerRegistry에 추가 -> 해당 주소로 접근하면 웹소켓 연결 가능
registry.addHandler(webSocketHandler, "/ws/chat").setAllowedOrigins("*");
}
}
12 changes: 12 additions & 0 deletions src/main/java/com/zatch/zatchserver/controller/ChatController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.zatch.zatchserver.DefaultRes;
import com.zatch.zatchserver.ResponseMessage;
import com.zatch.zatchserver.StatusCode;
import com.zatch.zatchserver.domain.ChatRoom;
import com.zatch.zatchserver.dto.PostChatReqDto;
import com.zatch.zatchserver.service.ChatService;
import io.swagger.annotations.ApiOperation;
Expand All @@ -12,6 +13,7 @@
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

@RequiredArgsConstructor
@RestController
Expand All @@ -20,6 +22,16 @@ public class ChatController {

private final ChatService chatService;

@PostMapping
public ChatRoom createRoom(@RequestBody String name) {
return chatService.createRoom(name);
}

@GetMapping
public List<ChatRoom> findAllRoom() {
return chatService.findAllRoom();
}

//(거래 후) 별점, 후기 등록하기
@PostMapping("/after_deal")
@ApiOperation(value = "별점&후기 등록", notes = "별점&후기 등록 API")
Expand Down
38 changes: 38 additions & 0 deletions src/main/java/com/zatch/zatchserver/domain/ChatRoom.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.zatch.zatchserver.domain;

import com.zatch.zatchserver.dto.ChatMessage;
import com.zatch.zatchserver.service.ChatService;
import lombok.Builder;
import lombok.Getter;
import org.springframework.web.socket.WebSocketSession;

import java.util.HashSet;
import java.util.Set;

@Getter
public class ChatRoom {
private String roomId;
private String name;
private Set<WebSocketSession> sessions = new HashSet<>();

@Builder
public ChatRoom(String roomId, String name) {
this.roomId = roomId;
this.name = name;
}

public void handlerActions(WebSocketSession session, ChatMessage chatMessage, ChatService chatService) {
chatService.updateDB(String.valueOf(chatMessage.getType()), chatMessage.getRoomId(), chatMessage.getSender(), chatMessage.getMessage());
if (chatMessage.getType().equals(ChatMessage.MessageType.ENTER)) {
sessions.add(session);
chatMessage.setMessage(chatMessage.getSender() + "님이 입장했습니다.");
}
sendMessage(chatMessage, chatService);
}

private <T> void sendMessage(T message, ChatService chatService) {
sessions.parallelStream()
.forEach(session -> chatService.sendMessage(session, message));
}
}

19 changes: 19 additions & 0 deletions src/main/java/com/zatch/zatchserver/dto/ChatMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.zatch.zatchserver.dto;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class ChatMessage {
public enum MessageType{
ENTER, TALK
// ENTER : 처음 채팅방에 들어온 상태
// TALK : 이미 session에 연결되어 있고 채팅 중인 상태
}

private MessageType type;
private String roomId;
private String sender;
private String message;
}
15 changes: 15 additions & 0 deletions src/main/java/com/zatch/zatchserver/repository/ChatRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,21 @@ public ChatRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

@Override
public String updateDB(String type, String roomId, String sender, String message) {
try {
String chat_info = "type : " + type + " / roomId : " + roomId + " / sender" + sender + " / message" + message;
System.out.println(chat_info);
String sql = "INSERT INTO chat(chat_type, chat_room_id, chat_sender, chat_message) VALUES(?, ?, ?, ?)";
Object[] params = {type, roomId, sender, message};
jdbcTemplate.update(sql, params);
System.out.println("chat sql insert");
return chat_info;
} catch (Exception e){
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Chat SQL ERROR");
}
}

@Override
public String after_deal(Long send_user_id, Long receive_user_id, String review_context, int star_rating) {
try {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.zatch.zatchserver.repository;

public interface ChatRepositoryImpl {
String updateDB(String type, String roomId, String sender, String message);
String after_deal(Long send_user_id, Long receive_user_id, String review_context, int star_rating);
}
10 changes: 10 additions & 0 deletions src/main/java/com/zatch/zatchserver/service/ChatService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
package com.zatch.zatchserver.service;

import com.zatch.zatchserver.domain.ChatRoom;
import org.springframework.web.socket.WebSocketSession;

import java.util.List;

public interface ChatService {
List<ChatRoom> findAllRoom();
ChatRoom createRoom(String name);
ChatRoom findRoomById(String roomId);
<T> void sendMessage(WebSocketSession session, T message);
String after_deal(Long send_user_id, Long receive_user_id, String review_context, int star_rating);
String updateDB(String type, String roomId, String sender, String message);
}
48 changes: 48 additions & 0 deletions src/main/java/com/zatch/zatchserver/service/ChatServiceImpl.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,65 @@
package com.zatch.zatchserver.service;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.zatch.zatchserver.domain.ChatRoom;
import com.zatch.zatchserver.repository.ChatRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.util.*;

@Slf4j
@RequiredArgsConstructor
@Service
public class ChatServiceImpl implements ChatService {
private final ObjectMapper objectMapper;
private Map<String, ChatRoom> chatRooms;

private final ChatRepository chatRepository;

@PostConstruct
private void init() {
chatRooms = new LinkedHashMap<>();
}

public List<ChatRoom> findAllRoom() {
return new ArrayList<>(chatRooms.values());
}

public ChatRoom findRoomById(String roomId) {
return chatRooms.get(roomId);
}

public ChatRoom createRoom(String name) {
String randomId = UUID.randomUUID().toString();
ChatRoom chatRoom = ChatRoom.builder()
.roomId(randomId)
.name(name)
.build();
chatRooms.put(randomId, chatRoom);
return chatRoom;
}

public <T> void sendMessage(WebSocketSession session, T message) {
try{
session.sendMessage(new TextMessage(objectMapper.writeValueAsString(message)));
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}

@Override
public String after_deal(Long send_user_id, Long receive_user_id, String review_context, int star_rating) {
return chatRepository.after_deal(send_user_id, receive_user_id, review_context, star_rating);
}

@Override
public String updateDB(String type, String roomId, String sender, String message) {
return chatRepository.updateDB(type, roomId, sender, message);
}
}

0 comments on commit 0bc8549

Please sign in to comment.