본문 바로가기
개발/Spring

[SpringBoot] WebSocket 채팅방 구현(4) - controller

by 코딩하는 흰둥이 2024. 8. 18.

이전글 

https://greed-yb.tistory.com/282

 

[SpringBoot] WebSocket 채팅방 구현(3) - html , js

이전글https://greed-yb.tistory.com/281 [SpringBoot] WebSocket 채팅방 구현(2) - WebSocketConfigJava 로 구현WebSocketConfigimport org.springframework.context.annotation.Configuration;import org.springframework.web.socket.config.annotation.EnableW

greed-yb.tistory.com

 

controller
import com.example.practice.service.widget.WidgetService;
import com.example.practice.vo.UserVo;
import com.example.practice.vo.messenger.MessageVo;
import com.example.practice.vo.messenger.RoomVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class WidgetController {

    @Autowired
    private WidgetService widgetService;
    

    /**
     * 사내 메신저 유저 정보 가져오기
     * @return
     * @throws Exception
     */
    @GetMapping("/messengerInfo")
    public List<UserVo> messengerInfo() throws Exception{
        // Spring Security 에서 로그인한 사용자 id 가져오기
        String username = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        List<UserVo> vo = widgetService.messengerInfo(username);
        return vo;
    }


    /**
     * 선택한 대상과의 채팅방이 있는지 체크하여 있다면 대화내용을 불러옴
     * @param targetId
     * @param userId
     * @return
     * @throws Exception
     */
    @GetMapping("/chatRoomInfo")
    public List<MessageVo> chatRoomInfo(@RequestParam String targetId, @RequestParam String userId) throws Exception{
        Long checkRoom = widgetService.chatRoomInfo(targetId , userId);

        List<MessageVo> vo = null;
        if (checkRoom == null){
            vo = new ArrayList<>();
        }else{
            widgetService.readChat(String.valueOf(checkRoom), userId);
            vo = widgetService.selectChatInfo(checkRoom);
        }
        return vo;
    }

    /**
     * 채팅방이 없으면 생성 후 메세지 저장
     * @param id
     * @param roomDetail
     * @param targetId
     * @param userId
     * @return
     * @throws Exception
     */
    @PostMapping("/sendMsg")
    public Map<String, Object> sendMsg(@RequestParam String id , @RequestParam String roomDetail, @RequestParam String targetId, @RequestParam String userId) throws Exception{
        Map<String, Object> msg = new HashMap<>();

        Long roomId = 0L;
        if(id.equals("")){
            // 마지막 채팅방 id의 다음 값을 가져온다
            roomId = widgetService.selectNextRoomId();

            // 채팅방 생성
            widgetService.createRoom(roomId);

            // 채팅방에 참여해있는 유저 insert(본인과 상대방)
            String[] arrId = {targetId, userId};
            for (int i = 0; i < arrId.length; i++) {
                widgetService.createRoomUser(roomId , arrId[i]);
            }
        }else{
            roomId = Long.valueOf(id);
        }

        try {
            // 메시지 insert
            widgetService.insertMsg(roomId , roomDetail, userId);

            String sendTargetid = widgetService.targetId(id , userId);

            msg.put("msg" , "success");
            msg.put("roomId" , roomId);
            msg.put("userId" , sendTargetid);
            return msg;
        }catch (Exception e){
            e.printStackTrace();
            msg.put("msg" , "fail");
            return msg;
        }

    }

    /**
     * 읽지 않은 메시지 수
     * @return
     * @throws Exception
     */
    @GetMapping("/messengerReadCount")
    public String messengerReadCount() throws Exception{
        // Spring Security 에서 로그인한 사용자 id 가져오기
        String username = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        Long count = widgetService.messengerReadCount(username);

        String result = String.valueOf(count);
        return result;
    }


    /**
     * 채팅방 목록 가져오기
     * @return
     * @throws Exception
     */
    @GetMapping("/roomList")
    public List<RoomVo> roomList() throws Exception{
        // Spring Security 에서 로그인한 사용자 id 가져오기
        String username = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        List<RoomVo> vo = widgetService.roomList(username);

        return vo;
    }

    /**
     * 채팅방 접속
     * @param id
     * @return
     * @throws Exception
     */
    @GetMapping("/chatRoomEnter")
    public List<MessageVo> chatRoomEnter(@RequestParam String id) throws Exception{
        // Spring Security 에서 로그인한 사용자 id 가져오기
        String username = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        widgetService.readChat(id, username);

        List<MessageVo> vo = widgetService.chatRoomEnter(id);

        return vo;
    }

}

댓글