From 537966cc4e775d4e2a95d5da6511a56f36efa070 Mon Sep 17 00:00:00 2001 From: lehojun Date: Sun, 4 May 2025 14:16:47 +0900 Subject: [PATCH] =?UTF-8?q?[FEAT]=20#13=20createToken,=20receiveWebhook=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 ++ .../be/web/controller/OpenviduController.java | 55 +++++++++++++++++++ .../com/example/be/web/dto/OpenviduDTO.java | 18 ++++++ src/main/resources/application.yml | 5 ++ 4 files changed, 82 insertions(+) create mode 100644 src/main/java/com/example/be/web/controller/OpenviduController.java create mode 100644 src/main/java/com/example/be/web/dto/OpenviduDTO.java diff --git a/build.gradle b/build.gradle index 1118cd3..81e6b84 100644 --- a/build.gradle +++ b/build.gradle @@ -56,6 +56,10 @@ dependencies { // Deploy Health-Check implementation 'org.springframework.boot:spring-boot-starter-actuator' + //Openvidu + implementation 'io.livekit:livekit-server:0.9.0' + + } test { diff --git a/src/main/java/com/example/be/web/controller/OpenviduController.java b/src/main/java/com/example/be/web/controller/OpenviduController.java new file mode 100644 index 0000000..6037597 --- /dev/null +++ b/src/main/java/com/example/be/web/controller/OpenviduController.java @@ -0,0 +1,55 @@ +package com.example.be.web.controller; + +import com.example.be.web.dto.OpenviduDTO; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +import io.livekit.server.AccessToken; +import io.livekit.server.RoomJoin; +import io.livekit.server.RoomName; +import io.livekit.server.WebhookReceiver; +import livekit.LivekitWebhook.WebhookEvent; + +@CrossOrigin(origins = "*") +@RestController +public class OpenviduController { + + @Value("${livekit.api.key}") + private String LIVEKIT_API_KEY; + + @Value("${livekit.api.secret}") + private String LIVEKIT_API_SECRET; + + + @PostMapping(value = "/token") + public ResponseEntity> createToken(@RequestBody OpenviduDTO.TokenRequestDto request) { + String roomName = request.getRoomName(); + String participantName = request.getParticipantName(); + + if (roomName == null || participantName == null) { + return ResponseEntity.badRequest().body(Map.of("errorMessage", "roomName and participantName are required")); + } + + AccessToken token = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET); + token.setName(participantName); + token.setIdentity(participantName); + token.addGrants(new RoomJoin(true), new RoomName(roomName)); + + return ResponseEntity.ok(Map.of("token", token.toJwt())); + } + + @PostMapping(value = "/livekit/webhook", consumes = "application/webhook+json") + public ResponseEntity receiveWebhook(@RequestHeader("Authorization") String authHeader, @RequestBody String body) { + WebhookReceiver webhookReceiver = new WebhookReceiver(LIVEKIT_API_KEY, LIVEKIT_API_SECRET); + try { + WebhookEvent event = webhookReceiver.receive(body, authHeader); + System.out.println("LiveKit Webhook: " + event.toString()); + } catch (Exception e) { + System.err.println("Error validating webhook event: " + e.getMessage()); + } + return ResponseEntity.ok("ok"); + } +} diff --git a/src/main/java/com/example/be/web/dto/OpenviduDTO.java b/src/main/java/com/example/be/web/dto/OpenviduDTO.java new file mode 100644 index 0000000..08fa47e --- /dev/null +++ b/src/main/java/com/example/be/web/dto/OpenviduDTO.java @@ -0,0 +1,18 @@ +package com.example.be.web.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class OpenviduDTO { + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class TokenRequestDto { + private String roomName; + private String participantName; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f167bfc..244b11f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -77,3 +77,8 @@ server: protocol: https host: 8080 port: 8081 + +livekit: + api: + key: ${LIVEKIT_API_KEY} + secret: ${LIVEKIT_API_SECRET}