122 lines
3.9 KiB
Java
122 lines
3.9 KiB
Java
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);
|
||
}
|
||
}
|