package com.webgame.webgamebackend.controller; import com.webgame.webgamebackend.common.auth.AuthenticationProvider; import com.webgame.webgamebackend.common.dto.ApiResponse; import com.webgame.webgamebackend.common.dto.game.*; import com.webgame.webgamebackend.service.RoomManager; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; /** * 房间控制器 * * 管理房间的创建、加入、离开、解散、踢人、准备、开始等操作。 * 所有房间内实时操作通过 WebSocket 处理,此控制器仅提供 REST 接口。 */ @Validated @RestController @RequestMapping("/room") @RequiredArgsConstructor public class RoomController { private final RoomManager roomManager; private final AuthenticationProvider authProvider; /** * 获取房间列表 * * @param gameId 游戏 ID(必填) * @param status 状态筛选(可选) */ @GetMapping("/list") public ApiResponse roomList( @RequestParam String gameId, @RequestParam(required = false) String status) { RoomListResponse result = roomManager.getRoomList(gameId, status); return ApiResponse.ok(result); } /** * 获取房间详情 */ @GetMapping("/{roomId}") public ApiResponse roomDetail(@PathVariable String roomId) { RoomDetailResponse result = roomManager.getRoomDetail(roomId); return ApiResponse.ok(result); } /** * 创建房间 * * 需登录。房主自动加入房间并设为已准备。 */ @PostMapping("/create") public ApiResponse createRoom(@Valid @RequestBody CreateRoomRequest request) { String userId = authProvider.getCurrentUserId(); CreateRoomResponse result = roomManager.createRoom(request, userId); return ApiResponse.ok(result); } /** * 加入房间 */ @PostMapping("/join") public ApiResponse joinRoom(@Valid @RequestBody JoinRoomRequest request) { String userId = authProvider.getCurrentUserId(); RoomItemResponse result = roomManager.joinRoom(request, userId); return ApiResponse.ok(result); } /** * 离开房间 */ @PostMapping("/leave") public ApiResponse leaveRoom(@Valid @RequestBody LeaveRoomRequest request) { String userId = authProvider.getCurrentUserId(); roomManager.leaveRoom(request.roomId(), userId); return ApiResponse.ok(null); } /** * 解散房间(仅房主) */ @PostMapping("/disband") public ApiResponse disbandRoom(@Valid @RequestBody DisbandRoomRequest request) { String userId = authProvider.getCurrentUserId(); roomManager.disbandRoom(request.roomId(), userId); return ApiResponse.ok(null); } /** * 踢出玩家(仅房主) */ @PostMapping("/kick") public ApiResponse kickPlayer(@Valid @RequestBody KickPlayerRequest request) { String ownerId = authProvider.getCurrentUserId(); roomManager.kickPlayer(request.roomId(), ownerId, request.userId()); return ApiResponse.ok(null); } /** * 切换准备状态 */ @PostMapping("/ready") public ApiResponse toggleReady(@Valid @RequestBody ReadyRequest request) { String userId = authProvider.getCurrentUserId(); boolean ready = roomManager.toggleReady(request.roomId(), userId); return ApiResponse.ok(ready); } /** * 开始游戏(仅房主) */ @PostMapping("/start") public ApiResponse startGame(@Valid @RequestBody StartGameRequest request) { String ownerId = authProvider.getCurrentUserId(); roomManager.startGame(request.roomId(), ownerId); return ApiResponse.ok(null); } }