Newer
Older
PixelPaintWar / apps / server / src / domains / room / application / services / RoomPhaseService.ts
/**
 * RoomPhaseService
 * ルーム状態のフェーズ更新処理を提供する
 */
import { domain } from "@repo/shared";
import type { RoomPhaseTransitionResult } from "../ports/roomUseCasePorts";

/** ルーム状態のフェーズ遷移を管理するサービス */
export class RoomPhaseService {
  constructor(private rooms: Map<string, domain.room.Room>) {}

  public markRoomPlaying(roomId: string): RoomPhaseTransitionResult {
    const room = this.rooms.get(roomId);
    if (!room) {
      return { status: "not_found" };
    }

    if (room.status === domain.room.RoomPhase.PLAYING) {
      return { status: "invalid_transition" };
    }

    room.status = domain.room.RoomPhase.PLAYING;
    return {
      status: "updated",
      room,
    };
  }

  public markRoomWaiting(roomId: string): RoomPhaseTransitionResult {
    const room = this.rooms.get(roomId);
    if (!room) {
      return { status: "not_found" };
    }

    if (room.status === domain.room.RoomPhase.WAITING) {
      return { status: "invalid_transition" };
    }

    room.status = domain.room.RoomPhase.WAITING;
    return {
      status: "updated",
      room,
    };
  }
}