Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.back.domain.studyroom.dto;

import com.back.domain.studyroom.entity.RoomRole;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;

/**
* 멤버 입장 알림 DTO
* WebSocket을 통해 방 참가자들에게 브로드캐스트
*/
@Getter
@Builder
public class MemberJoinedNotification {
private Long roomId;
private Long userId;
private String nickname;
private String profileImageUrl;
private RoomRole role; // 입장 시 역할 (보통 VISITOR)
private LocalDateTime timestamp;

public static MemberJoinedNotification of(Long roomId, Long userId, String nickname,
String profileImageUrl, RoomRole role) {
return MemberJoinedNotification.builder()
.roomId(roomId)
.userId(userId)
.nickname(nickname)
.profileImageUrl(profileImageUrl)
.role(role)
.timestamp(LocalDateTime.now())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.back.domain.studyroom.dto;

import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;

/**
* 멤버 퇴장 알림 DTO
* WebSocket을 통해 방 참가자들에게 브로드캐스트
*/
@Getter
@Builder
public class MemberLeftNotification {
private Long roomId;
private Long userId;
private String nickname;
private LocalDateTime timestamp;

public static MemberLeftNotification of(Long roomId, Long userId, String nickname) {
return MemberLeftNotification.builder()
.roomId(roomId)
.userId(userId)
.nickname(nickname)
.timestamp(LocalDateTime.now())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.back.domain.studyroom.dto;

import com.back.domain.studyroom.entity.RoomStatus;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;

/**
* 방 상태 변경 알림 DTO
* WebSocket을 통해 방 참가자들에게 브로드캐스트
*/
@Getter
@Builder
public class RoomStatusChangedNotification {
private Long roomId;
private RoomStatus oldStatus;
private RoomStatus newStatus;
private String changedBy; // 변경한 사용자 닉네임
private LocalDateTime timestamp;

public static RoomStatusChangedNotification of(Long roomId, RoomStatus oldStatus,
RoomStatus newStatus, String changedBy) {
return RoomStatusChangedNotification.builder()
.roomId(roomId)
.oldStatus(oldStatus)
.newStatus(newStatus)
.changedBy(changedBy)
.timestamp(LocalDateTime.now())
.build();
}
}
42 changes: 9 additions & 33 deletions src/main/java/com/back/domain/studyroom/entity/Room.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,6 @@ public class Room extends BaseEntity {
@Column(nullable = false)
private RoomStatus status = RoomStatus.WAITING;

// 현재 참여자
@Builder.Default
@Column(nullable = false)
private int currentParticipants = 0;

// 방장
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "created_by")
Expand Down Expand Up @@ -74,40 +69,22 @@ public class Room extends BaseEntity {
/**
* 방에 입장할 수 있는지 확인
* 사용 상황: 사용자가 방 입장을 시도할 때 입장 가능 여부를 미리 체크
방이 활성화되어 있고, 입장 가능한 상태이며, 정원이 초과되지 않은 경우
* 방이 활성화되어 있고, 입장 가능한 상태인 경우
*
* 정원 체크는 Redis에서 실시간으로 수행 (RoomService에서 처리)
*/
public boolean canJoin() {
return isActive && status.isJoinable() && currentParticipants < maxParticipants;
return isActive && status.isJoinable();
}

/**
* 방의 정원이 가득 찼는지 확인
방 목록에서 "만석" 표시하거나, 입장 제한할 때
*/
public boolean isFull() {
return currentParticipants >= maxParticipants;
}

/**
* 참가자 수 증가 (최대 정원까지만)
누군가 방에 입장했을 때 참가자 수를 1 증가시킴
최대 정원을 초과하지 않도록 체크
*
* 실제 정원 체크는 Redis 기반으로 RoomService에서 수행
* 이 메서드는 UI 표시용으로만 사용 (최대 정원 반환)
*/
public void incrementParticipant() {
if (currentParticipants < maxParticipants) {
this.currentParticipants++;
}
}

/**
* 참가자 수 감소 (0 이하로는 감소하지 않음)
누군가 방에서 나갔을 때 참가자 수를 1 감소시킴
음수가 되지 않도록 체크
*/
public void decrementParticipant() {
if (this.currentParticipants > 0) {
this.currentParticipants--;
}
public int getMaxCapacity() {
return maxParticipants;
}

/**
Expand Down Expand Up @@ -184,7 +161,6 @@ public static Room create(String title, String description, boolean isPrivate,
room.allowAudio = useWebRTC; // WebRTC 사용 여부에 따라 설정
room.allowScreenShare = useWebRTC; // WebRTC 사용 여부에 따라 설정
room.status = RoomStatus.WAITING; // 생성 시 대기 상태
room.currentParticipants = 0; // 생성 시 참가자 0명
room.createdBy = creator;
room.theme = theme;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,6 @@ public interface RoomMemberRepositoryCustom {
*/
List<RoomMember> findByRoomIdOrderByRole(Long roomId);

/**
* 방의 온라인 멤버 조회
* TODO: Redis 기반으로 변경 예정
* 현재는 DB에 저장된 모든 멤버 반환 (임시)
*/
@Deprecated
List<RoomMember> findOnlineMembersByRoomId(Long roomId);

/**
* 방의 활성 멤버 수 조회
* TODO: Redis 기반으로 변경 예정
*/
@Deprecated
int countActiveMembersByRoomId(Long roomId);

/**
* 사용자가 참여 중인 모든 방의 멤버십 조회
* DB에 저장된 멤버십만 조회 (MEMBER 이상)
Expand Down Expand Up @@ -72,30 +57,4 @@ public interface RoomMemberRepositoryCustom {
* @return 멤버십 목록 (MEMBER 이상만 DB에 있음)
*/
List<RoomMember> findByRoomIdAndUserIdIn(Long roomId, java.util.Set<Long> userIds);

/**
* 특정 역할의 멤버 수 조회
* TODO: Redis 기반으로 변경 예정
*/
@Deprecated
int countByRoomIdAndRole(Long roomId, RoomRole role);

/**
* 방 퇴장 처리 (벌크 업데이트)
* TODO: Redis로 이관 예정, DB에는 멤버십만 유지
*/
@Deprecated
void leaveRoom(Long roomId, Long userId);

/**
* 방의 모든 멤버를 오프라인 처리 (방 종료 시)
* TODO: Redis로 이관 예정
*/
@Deprecated
void disconnectAllMembers(Long roomId);

/**
* 스터디룸의 모든 멤버 User ID 조회 (알림 전송용)
*/
List<Long> findUserIdsByRoomId(Long roomId);
}
Loading