Skip to content

Commit

Permalink
[#45] Feat: 여러 사용자 동시 입장 API 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
tkguswls1106 committed May 19, 2024
1 parent ea96689 commit 616631f
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@

import com.sajang.devracebackend.dto.problem.ProblemSaveRequestDto;
import com.sajang.devracebackend.dto.room.RoomSaveResponseDto;
import com.sajang.devracebackend.dto.user.UserEnterRequestDto;
import com.sajang.devracebackend.response.ResponseCode;
import com.sajang.devracebackend.response.ResponseData;
import com.sajang.devracebackend.service.RoomService;
import com.sajang.devracebackend.service.UserRoomService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
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.RestController;
Expand All @@ -21,6 +24,7 @@
public class RoomController {

private final RoomService roomService;
private final UserRoomService userRoomService;


@PostMapping("/rooms")
Expand All @@ -29,4 +33,14 @@ public ResponseEntity<ResponseData<RoomSaveResponseDto>> createRoom(@RequestBody
RoomSaveResponseDto roomSaveResponseDto = roomService.createRoom(problemSaveRequestDto);
return ResponseData.toResponseEntity(ResponseCode.CREATED_ROOM, roomSaveResponseDto);
}

@PostMapping("/rooms/{roomId}")
@Operation(summary = "방 입장 시작 [jwt O]")
public ResponseEntity<ResponseData> usersEnterRoom(
@PathVariable(value = "roomId") Long roomId, // value=""를 작성해주어야만, Swagger에서 api테스트할때 이름값이 뜸.
@RequestBody UserEnterRequestDto userEnterRequestDto) {

userRoomService.usersEnterRoom(roomId, userEnterRequestDto);
return ResponseData.toResponseEntity(ResponseCode.CREATED_USERROOM);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.sajang.devracebackend.dto.chat;

import com.sajang.devracebackend.domain.Chat;
import com.sajang.devracebackend.domain.enums.MessageType;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDateTime;

@Getter
@NoArgsConstructor
public class ChatSaveRequestDto {

// cannot NULL
@NotNull(message = "ERROR - roomId cannot be NULL")
private Long roomId;
@NotNull(message = "ERROR - senderId cannot be NULL")
private Long senderId; // 첫 입장때는 방장 userId로.
@NotNull(message = "ERROR - messageType cannot be NULL")
private MessageType messageType;

// can NULL
@Setter
private String message; // MessageType == 'ENTER' or 'LEAVE' or 'RANK' 일때는 null 가능. 'TALK'일때는 null 불가능.


public Chat toEntity(String senderName, String message, LocalDateTime createdTime) {
return Chat.ChatSaveBuilder()
.roomId(roomId)
.senderId(senderId)
.senderName(senderName)
.message(message)
.messageType(messageType)
.createdTime(createdTime)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.sajang.devracebackend.service.impl;

import com.sajang.devracebackend.domain.Chat;
import com.sajang.devracebackend.domain.Room;
import com.sajang.devracebackend.domain.User;
import com.sajang.devracebackend.domain.enums.MessageType;
import com.sajang.devracebackend.domain.mapping.UserRoom;
import com.sajang.devracebackend.dto.user.UserEnterRequestDto;
import com.sajang.devracebackend.repository.ChatRepository;
import com.sajang.devracebackend.repository.UserRepository;
import com.sajang.devracebackend.repository.UserRoomRepository;
import com.sajang.devracebackend.service.RoomService;
Expand All @@ -13,6 +16,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

Expand All @@ -24,6 +28,7 @@ public class UserRoomServiceImpl implements UserRoomService {
private final RoomService roomService;
private final UserRepository userRepository;
private final UserRoomRepository userRoomRepository;
private final ChatRepository chatRepository;


@Transactional
Expand All @@ -39,6 +44,7 @@ public void createUserRoom(User user, Room room) {
@Transactional
@Override
public void usersEnterRoom(Long roomId, UserEnterRequestDto userEnterRequestDto) {
User managerUser = userService.findLoginUser(); // 방장 = 로그인된 사용자
Room room = roomService.findRoom(roomId);
List<Long> userIdList = userEnterRequestDto.getUserIdList();

Expand All @@ -49,8 +55,28 @@ public void usersEnterRoom(Long roomId, UserEnterRequestDto userEnterRequestDto)
.room(room)
.build())
.collect(Collectors.toList());
userRooms.add(UserRoom.UserRoomSaveBuilder()
.user(managerUser)
.room(room)
.build());

// 한번에 저장 (여러번 DB에 접근하는것을 방지.)
userRoomRepository.saveAll(userRooms);

String message = null;
if(userList.size() == 0) message = "'" + managerUser.getNickname() + "'님이 방에 참가하였습니다.";
else message = "'" + managerUser.getNickname() + "'님 외 " + userList.size() + "명이 방에 참가하였습니다.";

Chat chat = Chat.ChatSaveBuilder()
.roomId(roomId)
.senderId(managerUser.getId())
.senderName(managerUser.getNickname())
.message(message)
.messageType(MessageType.ENTER)
.createdTime(LocalDateTime.now()) // 시간을 수동으로 직접 넣어줌. (실시간으로 chat 넘겨주는 시간과 DB에 저장되는 시간을 완전히 같게 하기위해서임.)
.build();

// 입장 채팅 내역 저장
chatRepository.save(chat);
}
}

0 comments on commit 616631f

Please sign in to comment.