feat: 重构游戏房间架构

This commit is contained in:
2026-06-30 10:20:26 +08:00
parent d92f7bb581
commit ff284e2841
25 changed files with 2065 additions and 1324 deletions

View File

@@ -0,0 +1,121 @@
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<RoomListResponse> roomList(
@RequestParam String gameId,
@RequestParam(required = false) String status) {
RoomListResponse result = roomManager.getRoomList(gameId, status);
return ApiResponse.ok(result);
}
/**
* 获取房间详情
*/
@GetMapping("/{roomId}")
public ApiResponse<RoomDetailResponse> roomDetail(@PathVariable String roomId) {
RoomDetailResponse result = roomManager.getRoomDetail(roomId);
return ApiResponse.ok(result);
}
/**
* 创建房间
*
* 需登录。房主自动加入房间并设为已准备。
*/
@PostMapping("/create")
public ApiResponse<CreateRoomResponse> createRoom(@Valid @RequestBody CreateRoomRequest request) {
String userId = authProvider.getCurrentUserId();
CreateRoomResponse result = roomManager.createRoom(request, userId);
return ApiResponse.ok(result);
}
/**
* 加入房间
*/
@PostMapping("/join")
public ApiResponse<RoomItemResponse> joinRoom(@Valid @RequestBody JoinRoomRequest request) {
String userId = authProvider.getCurrentUserId();
RoomItemResponse result = roomManager.joinRoom(request, userId);
return ApiResponse.ok(result);
}
/**
* 离开房间
*/
@PostMapping("/leave")
public ApiResponse<Void> leaveRoom(@Valid @RequestBody LeaveRoomRequest request) {
String userId = authProvider.getCurrentUserId();
roomManager.leaveRoom(request.roomId(), userId);
return ApiResponse.ok(null);
}
/**
* 解散房间(仅房主)
*/
@PostMapping("/disband")
public ApiResponse<Void> disbandRoom(@Valid @RequestBody DisbandRoomRequest request) {
String userId = authProvider.getCurrentUserId();
roomManager.disbandRoom(request.roomId(), userId);
return ApiResponse.ok(null);
}
/**
* 踢出玩家(仅房主)
*/
@PostMapping("/kick")
public ApiResponse<Void> kickPlayer(@Valid @RequestBody KickPlayerRequest request) {
String ownerId = authProvider.getCurrentUserId();
roomManager.kickPlayer(request.roomId(), ownerId, request.userId());
return ApiResponse.ok(null);
}
/**
* 切换准备状态
*/
@PostMapping("/ready")
public ApiResponse<Boolean> toggleReady(@Valid @RequestBody ReadyRequest request) {
String userId = authProvider.getCurrentUserId();
boolean ready = roomManager.toggleReady(request.roomId(), userId);
return ApiResponse.ok(ready);
}
/**
* 开始游戏(仅房主)
*/
@PostMapping("/start")
public ApiResponse<Void> startGame(@Valid @RequestBody StartGameRequest request) {
String ownerId = authProvider.getCurrentUserId();
roomManager.startGame(request.roomId(), ownerId);
return ApiResponse.ok(null);
}
}