1+ package com .dmu .debug_visual .collab .rest ;
2+
3+ import com .dmu .debug_visual .security .CustomUserDetails ;
4+ import com .dmu .debug_visual .collab .rest .dto .CreateRoomRequest ;
5+ import com .dmu .debug_visual .collab .rest .dto .CreateSessionRequest ;
6+ import com .dmu .debug_visual .collab .rest .dto .RoomResponse ;
7+ import com .dmu .debug_visual .collab .rest .dto .SessionResponse ;
8+ import com .dmu .debug_visual .collab .service .RoomService ;
9+ import io .swagger .v3 .oas .annotations .Operation ;
10+ import io .swagger .v3 .oas .annotations .Parameter ;
11+ import io .swagger .v3 .oas .annotations .media .Content ;
12+ import io .swagger .v3 .oas .annotations .media .Schema ;
13+ import io .swagger .v3 .oas .annotations .responses .ApiResponse ;
14+ import io .swagger .v3 .oas .annotations .responses .ApiResponses ;
15+ import io .swagger .v3 .oas .annotations .tags .Tag ;
16+ import lombok .RequiredArgsConstructor ;
17+ import org .springframework .http .ResponseEntity ;
18+ import org .springframework .security .core .annotation .AuthenticationPrincipal ;
19+ import org .springframework .web .bind .annotation .*;
20+
21+ @ Tag (name = "협업 방 및 세션 관리 API" , description = "실시간 협업을 위한 방과 코드 세션을 생성하고 관리합니다." )
22+ @ RestController
23+ @ RequestMapping ("/api/collab-rooms" )
24+ @ RequiredArgsConstructor
25+ public class RoomController {
26+
27+ private final RoomService roomService ; // DB 관련 서비스
28+
29+ @ Operation (summary = "새로운 협업 방 생성" , description = "DB에 새로운 협업 방을 생성하고, 방장(owner)을 첫 참여자로 자동 등록합니다." )
30+ @ ApiResponses ({
31+ @ ApiResponse (responseCode = "200" , description = "방 생성 성공" ,
32+ content = @ Content (mediaType = "application/json" , schema = @ Schema (implementation = RoomResponse .class ))),
33+ @ ApiResponse (responseCode = "401" , description = "인증 실패" , content = @ Content )
34+ })
35+ @ PostMapping
36+ public ResponseEntity <RoomResponse > createRoom (
37+ @ RequestBody CreateRoomRequest request ,
38+ @ AuthenticationPrincipal CustomUserDetails userDetails
39+ ) {
40+ String ownerUserId = userDetails .getUsername ();
41+ RoomResponse response = roomService .createRoom (request , ownerUserId );
42+ return ResponseEntity .ok (response );
43+ }
44+
45+ @ Operation (summary = "방 안에 새 코드 세션 생성" , description = "기존에 생성된 협업 방 안에 독립적인 새 코드 편집 세션을 생성합니다." )
46+ @ ApiResponses ({
47+ @ ApiResponse (responseCode = "200" , description = "세션 생성 성공" ,
48+ content = @ Content (mediaType = "application/json" , schema = @ Schema (implementation = SessionResponse .class ))),
49+ @ ApiResponse (responseCode = "401" , description = "인증 실패" , content = @ Content ),
50+ @ ApiResponse (responseCode = "403" , description = "해당 방의 참여자가 아님" , content = @ Content ),
51+ @ ApiResponse (responseCode = "404" , description = "존재하지 않는 방" , content = @ Content )
52+ })
53+ @ PostMapping ("/{roomId}/sessions" )
54+ public ResponseEntity <SessionResponse > createSession (
55+ @ Parameter (description = "세션을 생성할 방의 고유 ID (UUID)" , required = true )
56+ @ PathVariable String roomId ,
57+
58+ @ RequestBody CreateSessionRequest request ,
59+ @ AuthenticationPrincipal CustomUserDetails userDetails
60+ ) {
61+ String creatorUserId = userDetails .getUsername ();
62+ SessionResponse response = roomService .createCodeSessionInRoom (roomId , request , creatorUserId );
63+ return ResponseEntity .ok (response );
64+ }
65+ }
0 commit comments