From 64682c17d9a07023d42012b56031c8782fdae9c0 Mon Sep 17 00:00:00 2001 From: lehojun Date: Tue, 10 Jun 2025 11:36:55 +0900 Subject: [PATCH] =?UTF-8?q?[FEAT]=20#42=20livekit=20=EC=9B=B9=ED=9B=85=20?= =?UTF-8?q?=EC=88=98=EC=8B=A0=20=ED=9B=84=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=EC=97=90=20=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/be/domain/Room.java | 4 +-- .../example/be/repository/RoomRepository.java | 9 ++++++ .../be/web/controller/OpenviduController.java | 28 +++++++++++++++++++ .../be/web/controller/RoomController.java | 10 ------- 4 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/example/be/repository/RoomRepository.java diff --git a/src/main/java/com/example/be/domain/Room.java b/src/main/java/com/example/be/domain/Room.java index 96d92c1..c7258cf 100644 --- a/src/main/java/com/example/be/domain/Room.java +++ b/src/main/java/com/example/be/domain/Room.java @@ -31,9 +31,9 @@ public class Room { private String maxParticipants; - private Long participantCount; + private int participantCount; - private LocalDateTime createDate; + private long createDate; //Relationships diff --git a/src/main/java/com/example/be/repository/RoomRepository.java b/src/main/java/com/example/be/repository/RoomRepository.java new file mode 100644 index 0000000..f0c6b8c --- /dev/null +++ b/src/main/java/com/example/be/repository/RoomRepository.java @@ -0,0 +1,9 @@ +package com.example.be.repository; + +import com.example.be.domain.RefreshToken; +import com.example.be.domain.Room; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface RoomRepository extends JpaRepository { + Room findByTitle(String title); +} diff --git a/src/main/java/com/example/be/web/controller/OpenviduController.java b/src/main/java/com/example/be/web/controller/OpenviduController.java index 6513862..3550d62 100644 --- a/src/main/java/com/example/be/web/controller/OpenviduController.java +++ b/src/main/java/com/example/be/web/controller/OpenviduController.java @@ -1,7 +1,10 @@ package com.example.be.web.controller; +import com.example.be.domain.Room; +import com.example.be.repository.RoomRepository; import com.example.be.web.dto.OpenviduDTO; import io.livekit.server.*; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -13,6 +16,7 @@ @CrossOrigin(origins = "*") @RestController @RequestMapping("/api/v1/video") +@RequiredArgsConstructor public class OpenviduController { @Value("${livekit.api.key}") @@ -21,6 +25,8 @@ public class OpenviduController { @Value("${livekit.api.secret}") private String LIVEKIT_API_SECRET; + private final RoomRepository roomRepository; + @PostMapping(value = "/token") public ResponseEntity> createToken(@RequestBody OpenviduDTO.TokenRequestDto request) { @@ -44,7 +50,29 @@ public ResponseEntity receiveWebhook(@RequestHeader("Authorization") Str WebhookReceiver webhookReceiver = new WebhookReceiver(LIVEKIT_API_KEY, LIVEKIT_API_SECRET); try { WebhookEvent event = webhookReceiver.receive(body, authHeader); + String roomName = event.getRoom().getName(); + Room room = roomRepository.findByTitle(roomName); + long createAt = event.getRoom().getCreationTime(); System.out.println("LiveKit Webhook: " + event.toString()); + + switch (event.toString()) { + case "room_started" -> { + room = Room.builder() + .title(roomName) + .createDate(createAt) + .build(); + roomRepository.save(room); + } + case "room_finished" -> roomRepository.delete(room); + case "participant_joined" -> { + room.setParticipantCount(room.getParticipantCount() + 1); + roomRepository.save(room); + } + case "participant_left" -> { + room.setParticipantCount(room.getParticipantCount() - 1); + roomRepository.save(room); + } + } } catch (Exception e) { System.err.println("Error validating webhook event: " + e.getMessage()); } diff --git a/src/main/java/com/example/be/web/controller/RoomController.java b/src/main/java/com/example/be/web/controller/RoomController.java index 35b3d5e..012cdff 100644 --- a/src/main/java/com/example/be/web/controller/RoomController.java +++ b/src/main/java/com/example/be/web/controller/RoomController.java @@ -27,16 +27,6 @@ public class RoomController { @GetMapping("/rooms") @Operation(summary = "방 목록 조회", description = "생성된 모든 방 목록을 조회합니다.") public ApiResponse getAllRooms() { -// -// AccessToken accessToken = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET); -// -// // Grant 설정 -// RoomList roomList = new RoomList(true); -// accessToken.addGrants(roomList); -// -// String jwt = accessToken.toJwt(); -// HttpHeaders headers = new HttpHeaders(); -// headers.add("Authorization", "Bearer " + jwt); return ApiResponse.onSuccess(roomService.getAllRooms()); }