Newer
Older
PixelPaintWar / apps / server / src / domains / room / application / services / RoomRuntimeResolver.ts
/**
 * RoomRuntimeResolver
 * プレイヤーIDからルームIDとゲームランタイムを解決する
 */
import type {
  FindGameByPlayerPort,
  FindRoomByPlayerPort,
  RoomScopedGamePort,
} from "../ports/roomUseCasePorts";

/** プレイヤー起点で解決したランタイム情報 */
export type RuntimeByPlayerResolution = {
  roomId: string;
  gameManager: RoomScopedGamePort;
};

/** プレイヤーIDからルームIDとゲームランタイムを解決する */
export const resolveRuntimeByPlayerId = (
  roomResolver: FindRoomByPlayerPort,
  runtimeResolver: FindGameByPlayerPort,
  playerId: string
): RuntimeByPlayerResolution | undefined => {
  const roomId = roomResolver.getRoomByPlayerId(playerId)?.roomId;
  const gameManager = runtimeResolver.getGameManagerByPlayerId(playerId);
  if (!roomId || !gameManager) {
    return undefined;
  }

  return {
    roomId,
    gameManager,
  };
};

/** プレイヤーID起点のランタイム解決成功時のみ処理を実行する */
export const runWithRuntimeByPlayerId = (
  roomResolver: FindRoomByPlayerPort,
  runtimeResolver: FindGameByPlayerPort,
  playerId: string,
  onResolved: (resolution: RuntimeByPlayerResolution) => void,
): boolean => {
  const runtime = resolveRuntimeByPlayerId(
    roomResolver,
    runtimeResolver,
    playerId,
  );
  if (!runtime) {
    return false;
  }

  onResolved(runtime);
  return true;
};