Newer
Older
PixelPaintWar / apps / server / src / domains / room / application / ports / roomUseCasePorts.ts
/**
 * roomUseCasePorts
 * ルームユースケースが依存する操作ポートを定義する
 */
import type { roomTypes } from "@repo/shared";
import type {
  BombHitReportValidationPort,
  BombPlacementPort,
  DisconnectPlayerPort,
  MovePlayerPort,
  ReadyForGamePort,
  StartGamePort,
} from "@server/domains/game/application/ports/gameUseCasePorts";

/** ルーム単位ゲーム管理が満たす操作ポート集合 */
export type RoomScopedGamePort =
  & StartGamePort
  & ReadyForGamePort
  & MovePlayerPort
  & BombPlacementPort
  & BombHitReportValidationPort
  & DisconnectPlayerPort;

/** ルーム参加処理の実行結果 */
export type JoinRoomResult = {
  room: roomTypes.Room;
  status: "joined" | "duplicate" | "full";
};

/** ルームユースケースが利用する出力ポート */
export interface RoomOutputPort {
  publishRoomUpdateToRoom(roomId: roomTypes.Room["roomId"], room: roomTypes.Room): void;
  publishJoinRejectedToSocket(payload: roomTypes.JoinRoomRejectedPayload): void;
}

/** ルーム参加ユースケースが利用する参加操作ポート */
export interface JoinRoomPort {
  addPlayerToRoom(roomId: string, socketId: string, playerName: string): JoinRoomResult;
}

/** ルーム切断ユースケースが利用する退出操作ポート */
export interface DisconnectRoomPort {
  removePlayer(socketId: string): RoomDisconnectResult;
}

/** 退出処理で更新対象となったルーム情報 */
export type RoomDisconnectResult = {
  updatedRooms: roomTypes.Room[];
  deletedRoomIds: string[];
};

/** 切断調停で利用するプレイヤー所属ルーム参照ポート */
export interface FindRoomByPlayerPort {
  getRoomByPlayerId(playerId: string): roomTypes.Room | undefined;
}

/** ゲーム開始調停で利用するオーナー所属ルーム参照ポート */
export interface FindRoomByOwnerPort {
  getRoomByOwnerId(ownerId: string): roomTypes.Room | undefined;
}

/** ゲーム開始調停で利用するルーム状態遷移ポート */
export interface RoomPhaseTransitionPort {
  markRoomPlaying(roomId: string): RoomPhaseTransitionResult;
  markRoomWaiting(roomId: string): RoomPhaseTransitionResult;
}

/** ルーム状態遷移の実行結果 */
export type RoomPhaseTransitionResult = {
  status: "updated" | "not_found" | "invalid_transition";
  room?: roomTypes.Room;
};

/** ルームIDでの存在確認に利用する参照ポート */
export interface FindRoomByIdPort {
  getRoomById(roomId: string): roomTypes.Room | undefined;
}

/** ルーム参加後にゲームランタイムを確保する操作ポート */
export interface EnsureGameRuntimePort {
  ensureGameManagerForRoom(roomId: string): void;
}

/** ルーム解散後に不要ランタイムを破棄する操作ポート */
export interface CleanupGameRuntimePort {
  cleanupGameManagerForRoom(roomId: string): void;
}

/** ルームIDでゲーム管理を解決する参照ポート */
export interface FindGameByRoomPort {
  getGameManagerByRoomId(roomId: string): RoomScopedGamePort | undefined;
}

/** プレイヤーIDでゲーム管理を解決する参照ポート */
export interface FindGameByPlayerPort {
  getGameManagerByPlayerId(playerId: string): RoomScopedGamePort | undefined;
}