From 3bb2cde1e57fdc46ef72113db00f328d661049ce Mon Sep 17 00:00:00 2001 From: lehojun Date: Mon, 26 May 2025 15:50:54 +0900 Subject: [PATCH] =?UTF-8?q?[FEAT]=20#31=20=EC=8A=A4=ED=84=B0=EB=94=94?= =?UTF-8?q?=EB=A3=B8=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20api=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/be/config/LiveKitConfig.java | 28 +++++++++ .../example/be/service/RoomServiceImpl.java | 59 +++++++++++++++++++ .../be/web/controller/RoomController.java | 43 ++++++++++++++ .../example/be/web/dto/ParticipantDTO.java | 21 +++++++ .../java/com/example/be/web/dto/RoomDTO.java | 43 ++++++++++++++ src/main/resources/application.yml | 1 + 6 files changed, 195 insertions(+) create mode 100644 src/main/java/com/example/be/config/LiveKitConfig.java create mode 100644 src/main/java/com/example/be/service/RoomServiceImpl.java create mode 100644 src/main/java/com/example/be/web/controller/RoomController.java create mode 100644 src/main/java/com/example/be/web/dto/ParticipantDTO.java create mode 100644 src/main/java/com/example/be/web/dto/RoomDTO.java diff --git a/src/main/java/com/example/be/config/LiveKitConfig.java b/src/main/java/com/example/be/config/LiveKitConfig.java new file mode 100644 index 0000000..0e53af5 --- /dev/null +++ b/src/main/java/com/example/be/config/LiveKitConfig.java @@ -0,0 +1,28 @@ +package com.example.be.config; + +import io.livekit.server.RoomServiceClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class LiveKitConfig { + + @Value("${livekit.api.key}") + private String LIVEKIT_API_KEY; + + @Value("${livekit.api.secret}") + private String LIVEKIT_API_SECRET; + + @Value("${livekit.api.host}") + private String LIVEKIT_API_HOST; + + @Bean + public RoomServiceClient roomServiceClient() { + return RoomServiceClient.create( + LIVEKIT_API_HOST, + LIVEKIT_API_KEY, + LIVEKIT_API_SECRET + ); + } +} diff --git a/src/main/java/com/example/be/service/RoomServiceImpl.java b/src/main/java/com/example/be/service/RoomServiceImpl.java new file mode 100644 index 0000000..f479a18 --- /dev/null +++ b/src/main/java/com/example/be/service/RoomServiceImpl.java @@ -0,0 +1,59 @@ +package com.example.be.service; + +import com.example.be.web.dto.RoomDTO; +import io.livekit.server.RoomService; +import io.livekit.server.RoomServiceClient; +import livekit.LivekitModels; +import livekit.LivekitRoom; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import retrofit2.Call; +import retrofit2.Response; + +import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class RoomServiceImpl { + private final RoomServiceClient roomServiceClient; + + public RoomDTO.RoomListResponseDto getAllRooms() { + try { + Call> call = roomServiceClient.listRooms(); + Response> response = call.execute(); + + if (!response.isSuccessful()) { + throw new RuntimeException("Failed to fetch rooms: " + response.errorBody().string()); + } + + List rooms = response.body(); + List roomDtos = rooms.stream() + .map(this::convertToDto) + .collect(Collectors.toList()); + + return RoomDTO.RoomListResponseDto.builder() + .rooms(roomDtos) + .totalCount(roomDtos.size()) + .build(); + } catch (IOException e) { + log.error("Failed to fetch rooms from LiveKit", e); + throw new RuntimeException("Failed to fetch rooms from LiveKit", e); + } + } + + + private RoomDTO.RoomDto convertToDto(LivekitModels.Room room) { + return RoomDTO.RoomDto.builder() + .sid(room.getSid()) + .name(room.getName()) + .creationTime(room.getCreationTime()) + .numParticipants(room.getNumParticipants()) + .maxParticipants(room.getMaxParticipants()) + .metadata(room.getMetadata()) + .build(); + } +} diff --git a/src/main/java/com/example/be/web/controller/RoomController.java b/src/main/java/com/example/be/web/controller/RoomController.java new file mode 100644 index 0000000..35b3d5e --- /dev/null +++ b/src/main/java/com/example/be/web/controller/RoomController.java @@ -0,0 +1,43 @@ +package com.example.be.web.controller; + + +import com.example.be.apiPayload.ApiResponse; +import com.example.be.service.RoomServiceImpl; +import com.example.be.web.dto.RoomDTO; +import io.livekit.server.AccessToken; +import io.livekit.server.RoomJoin; +import io.livekit.server.RoomList; +import io.livekit.server.VideoGrant; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +@RestController +@RequestMapping("/room") +@RequiredArgsConstructor +public class RoomController { + private final RoomServiceImpl roomService; + + + @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()); + } +} diff --git a/src/main/java/com/example/be/web/dto/ParticipantDTO.java b/src/main/java/com/example/be/web/dto/ParticipantDTO.java new file mode 100644 index 0000000..c1c094e --- /dev/null +++ b/src/main/java/com/example/be/web/dto/ParticipantDTO.java @@ -0,0 +1,21 @@ +package com.example.be.web.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class ParticipantDTO { + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class ParticipantDto { + private String sid; + private String identity; + private String name; + private String metadata; + private long joinedAt; + } +} diff --git a/src/main/java/com/example/be/web/dto/RoomDTO.java b/src/main/java/com/example/be/web/dto/RoomDTO.java new file mode 100644 index 0000000..75e251a --- /dev/null +++ b/src/main/java/com/example/be/web/dto/RoomDTO.java @@ -0,0 +1,43 @@ +package com.example.be.web.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +public class RoomDTO { + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class RoomDto { + private String sid; + private String name; + private long creationTime; + private int numParticipants; + private int maxParticipants; + private String metadata; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class CreateRoomRequestDto { + private String roomName; + private Integer maxParticipants; + private String metadata; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class RoomListResponseDto { + private List rooms; + private int totalCount; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3c2d499..ac6386f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -78,5 +78,6 @@ server: livekit: api: + host: ${LIVEKIT_API_HOST} key: ${LIVEKIT_API_KEY} secret: ${LIVEKIT_API_SECRET}