feat: 重构游戏房间架构
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user