Skip to content

Commit 6e1454f

Browse files
committed
✨ feat: 이벤트에 대한 브로드 캐스팅 메서드 추가
- 이벤트 타입 별 SSE 본문 객체 추가
1 parent 69c69d7 commit 6e1454f

File tree

7 files changed

+117
-0
lines changed

7 files changed

+117
-0
lines changed

backend/src/main/java/io/f1/backend/domain/game/sse/app/SseService.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.f1.backend.domain.game.sse.app;
22

3+
import io.f1.backend.domain.game.sse.dto.LobbySseEvent;
34
import io.f1.backend.domain.game.sse.store.SseEmitterRepository;
45

56
import lombok.RequiredArgsConstructor;
@@ -28,4 +29,18 @@ public SseEmitter subscribe() {
2829
}
2930
return emitter;
3031
}
32+
33+
// 로비로 SSE 메시지를 쏘기위한 메서드
34+
public <T> void notifyLobbyUpdate(LobbySseEvent<T> event) {
35+
for (SseEmitter emitter : emitterRepository.getAll()) {
36+
try {
37+
emitter.send(SseEmitter.event()
38+
.name(event.type())
39+
.data(event)
40+
);
41+
} catch (IOException e) {
42+
emitterRepository.remove(emitter);
43+
}
44+
}
45+
}
3146
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package io.f1.backend.domain.game.sse.dto;
2+
3+
public record LobbySseEvent<T>(String type, T payload) {
4+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.f1.backend.domain.game.sse.dto;
2+
3+
public record RoomCreatedPayload(
4+
Long roomId,
5+
String roomName,
6+
Integer maxUserCount,
7+
int currentUserCount,
8+
boolean locked,
9+
String roomState,
10+
String quizTitle,
11+
String description,
12+
String creator,
13+
Integer numberOfQuestion,
14+
String thumbnailUrl
15+
) {
16+
17+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.f1.backend.domain.game.sse.dto;
2+
3+
public record RoomDeletedPayload(Long roomId) {
4+
5+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.f1.backend.domain.game.sse.dto;
2+
3+
public record RoomUpdatedPayload(
4+
Long roomId,
5+
int currentUserCount,
6+
String roomState,
7+
String quizTitle,
8+
String description,
9+
String creator,
10+
int numberOfQuestion,
11+
String thumbnailUrl
12+
) {
13+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.f1.backend.domain.game.sse.dto;
2+
3+
public enum SseEventType {
4+
CREATE,
5+
UPDATE,
6+
DELETE
7+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package io.f1.backend.domain.game.sse.mapper;
2+
3+
import io.f1.backend.domain.game.event.RoomCreatedEvent;
4+
import io.f1.backend.domain.game.event.RoomDeletedEvent;
5+
import io.f1.backend.domain.game.event.RoomUpdatedEvent;
6+
import io.f1.backend.domain.game.model.Room;
7+
import io.f1.backend.domain.game.sse.dto.RoomCreatedPayload;
8+
import io.f1.backend.domain.game.sse.dto.RoomDeletedPayload;
9+
import io.f1.backend.domain.game.sse.dto.LobbySseEvent;
10+
import io.f1.backend.domain.game.sse.dto.RoomUpdatedPayload;
11+
import io.f1.backend.domain.game.sse.dto.SseEventType;
12+
import io.f1.backend.domain.quiz.entity.Quiz;
13+
14+
public class SseMapper {
15+
16+
public static LobbySseEvent<RoomCreatedPayload> fromRoomCreated(RoomCreatedEvent event) {
17+
Room room = event.room();
18+
Quiz quiz = event.quiz();
19+
RoomCreatedPayload payload = new RoomCreatedPayload(
20+
room.getId(),
21+
room.getRoomSetting().roomName(),
22+
room.getRoomSetting().maxUserCount(),
23+
room.getPlayerSessionMap().size(),
24+
room.getRoomSetting().locked(),
25+
room.getState().name(),
26+
quiz.getTitle(),
27+
quiz.getDescription(),
28+
quiz.getCreator().getNickname(),
29+
quiz.getQuestions().size(),
30+
quiz.getThumbnailUrl()
31+
);
32+
return new LobbySseEvent<>(SseEventType.CREATE.name(), payload);
33+
}
34+
35+
public static LobbySseEvent<RoomUpdatedPayload> fromRoomUpdated(RoomUpdatedEvent event) {
36+
Room room = event.room();
37+
Quiz quiz = event.quiz();
38+
RoomUpdatedPayload payload = new RoomUpdatedPayload(
39+
room.getId(),
40+
room.getPlayerSessionMap().size(),
41+
room.getState().name(),
42+
quiz.getTitle(),
43+
quiz.getDescription(),
44+
quiz.getCreator().getNickname(),
45+
quiz.getQuestions().size(),
46+
quiz.getThumbnailUrl()
47+
);
48+
return new LobbySseEvent<>(SseEventType.UPDATE.name(), payload);
49+
}
50+
51+
public static LobbySseEvent<RoomDeletedPayload> fromRoomDeleted(RoomDeletedEvent event) {
52+
Long roomId = event.roomId();
53+
RoomDeletedPayload payload = new RoomDeletedPayload(roomId);
54+
return new LobbySseEvent<>(SseEventType.DELETE.name(), payload);
55+
}
56+
}

0 commit comments

Comments
 (0)