From 0bed64f900bafb3a83428a5ba906038ae657d3ac Mon Sep 17 00:00:00 2001 From: aa89227 Date: Thu, 20 Jun 2024 22:37:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9C=A8=20readyRoom=20=E9=96=8B?= =?UTF-8?q?=E5=A7=8B=E9=81=8A=E6=88=B2=E6=99=82=E6=9C=83=E5=89=B5=E5=BB=BA?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E9=81=8A=E6=88=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Usecases/ReadyRoom/StartGameUsecase.cs | 20 ++++++++++++++++--- .../Builders/MonopolyBuilder.cs | 4 ++-- .../ReadyRoomAggregate.cs | 5 +++-- .../ReadyRoom/GameStartTest.cs | 6 ++++++ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/ApplicationLayer/Monopoly.ApplicationLayer.Application/Usecases/ReadyRoom/StartGameUsecase.cs b/ApplicationLayer/Monopoly.ApplicationLayer.Application/Usecases/ReadyRoom/StartGameUsecase.cs index d10b277..dc9114d 100644 --- a/ApplicationLayer/Monopoly.ApplicationLayer.Application/Usecases/ReadyRoom/StartGameUsecase.cs +++ b/ApplicationLayer/Monopoly.ApplicationLayer.Application/Usecases/ReadyRoom/StartGameUsecase.cs @@ -1,5 +1,7 @@ using Monopoly.ApplicationLayer.Application.Common; using Monopoly.DomainLayer.Common; +using Monopoly.DomainLayer.Domain.Builders; +using Monopoly.DomainLayer.Domain.Maps; namespace Monopoly.ApplicationLayer.Application.Usecases.ReadyRoom; @@ -8,20 +10,32 @@ public record StartGameRequest(string GameId, string PlayerId) public record StartGameResponse(IReadOnlyList Events) : CommandResponse(Events); -public class StartGameUsecase(IReadyRoomRepository repository, IEventBus eventBus) +public class StartGameUsecase(IReadyRoomRepository readyRoomRepository, ICommandRepository gameRepository, IEventBus eventBus) : Usecase { public override async Task ExecuteAsync(StartGameRequest gameRequest, IPresenter presenter, CancellationToken cancellationToken = default) { //查 - var readyRoom = await repository.GetReadyRoomAsync(gameRequest.GameId); + var readyRoom = await readyRoomRepository.GetReadyRoomAsync(gameRequest.GameId); //改 readyRoom.StartGame(gameRequest.PlayerId); + var builder = new MonopolyBuilder(); + foreach (var player in readyRoom.Players) + { + builder.WithPlayer(player.Id); + } + builder.WithId(readyRoom.GameId) + .WithHost(readyRoom.HostId) + .WithCurrentPlayer(readyRoom.Players[0].Id) + .WithMap(new SevenXSevenMap()); + var game = builder.Build(); + //存 - await repository.SaveReadyRoomAsync(readyRoom); + await readyRoomRepository.SaveReadyRoomAsync(readyRoom); + gameRepository.Save(game); //推 await eventBus.PublishAsync(readyRoom.DomainEvents, cancellationToken); diff --git a/DomainLayer/Monopoly.DomainLayer.Domain/Builders/MonopolyBuilder.cs b/DomainLayer/Monopoly.DomainLayer.Domain/Builders/MonopolyBuilder.cs index f5b0d4c..9b4066b 100644 --- a/DomainLayer/Monopoly.DomainLayer.Domain/Builders/MonopolyBuilder.cs +++ b/DomainLayer/Monopoly.DomainLayer.Domain/Builders/MonopolyBuilder.cs @@ -6,7 +6,7 @@ namespace Monopoly.DomainLayer.Domain.Builders; public class MonopolyBuilder { - public string GameId { get; private set; } + public string? GameId { get; private set; } public List PlayerBuilders { get; private set; } @@ -25,7 +25,7 @@ public MonopolyBuilder() PlayerBuilders = new(); } - public MonopolyBuilder WithId(string id) + public MonopolyBuilder WithId(string? id) { GameId = id; return this; diff --git a/DomainLayer/Monopoly.DomainLayer.ReadyRoom/ReadyRoomAggregate.cs b/DomainLayer/Monopoly.DomainLayer.ReadyRoom/ReadyRoomAggregate.cs index affcdde..c4c7784 100644 --- a/DomainLayer/Monopoly.DomainLayer.ReadyRoom/ReadyRoomAggregate.cs +++ b/DomainLayer/Monopoly.DomainLayer.ReadyRoom/ReadyRoomAggregate.cs @@ -13,6 +13,7 @@ public sealed class ReadyRoomAggregate(string id, List players, string h public IGameIdProvider GameIdProvider { get; set; } = new GameIdProvider(); public IReadOnlyList Players => players; public string HostId => hostId; + public string? GameId { get; private set; } private Player GetPlayer(string playerId) { @@ -55,8 +56,8 @@ public void StartGame(string playerId) var unreadyPlayers = players.Where(p => p.IsReady is not true && p.Id != hostId); if (unreadyPlayers.Any()) throw new HostCannotStartGameException(); - var gameId = GameIdProvider.GetGameId(); - AddDomainEvent(new GameStartedEvent(gameId)); + GameId = GameIdProvider.GetGameId(); + AddDomainEvent(new GameStartedEvent(GameId)); } public void PlayerJoin(string playerId) diff --git a/tests/Monopoly.InterfaceAdapterLayer.Server.Tests/AcceptanceTests/ReadyRoom/GameStartTest.cs b/tests/Monopoly.InterfaceAdapterLayer.Server.Tests/AcceptanceTests/ReadyRoom/GameStartTest.cs index 0211e30..15f1583 100644 --- a/tests/Monopoly.InterfaceAdapterLayer.Server.Tests/AcceptanceTests/ReadyRoom/GameStartTest.cs +++ b/tests/Monopoly.InterfaceAdapterLayer.Server.Tests/AcceptanceTests/ReadyRoom/GameStartTest.cs @@ -1,4 +1,6 @@ using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.DependencyInjection; +using Monopoly.ApplicationLayer.Application.Common; using Monopoly.DomainLayer.ReadyRoom.Builders; using Monopoly.DomainLayer.ReadyRoom.Common; using Moq; @@ -15,6 +17,7 @@ public class GameStartTest : AbstractReadyRoomTestBase Given: 房內有4名玩家,除了玩家A以外的所有玩家都已經準備 When: 房主按下開始遊戲 Then: 遊戲開始 + repository 的遊戲存在 """)] public async Task 房主成功開始遊戲() { @@ -56,6 +59,9 @@ public async Task 房主成功開始遊戲() // Assert hub.FluentAssert.GameStartedEvent(new GameStartedEventArgs(gameId)); + + var gameRepository = Server.Services.GetRequiredService(); + var game = gameRepository.FindGameById(gameId); } [TestMethod]