package com.flexpoker.game.command.aggregate; import java.util.List; import java.util.UUID; import org.springframework.stereotype.Component; import com.flexpoker.game.command.commands.CreateGameCommand; import com.flexpoker.game.command.events.GameCreatedEvent; import com.flexpoker.game.command.factory.GameFactory; import com.flexpoker.game.command.framework.GameEvent; import com.flexpoker.game.query.dto.GameStage; @Component public class DefaultGameFactory implements GameFactory { @Override public Game createNew(CreateGameCommand command) { UUID aggregateId = UUID.randomUUID(); return createGame(false, aggregateId, command.getGameName(), command.getNumberOfPlayers(), command.getNumberOfPlayersPerTable(), command.getCreatedByPlayerId(), command.getNumberOfMinutesBetweenBlindLevels()); } @Override public Game createFrom(List<GameEvent> events) { GameCreatedEvent gameCreatedEvent = (GameCreatedEvent) events.get(0); Game game = createGame(true, gameCreatedEvent.getAggregateId(), gameCreatedEvent.getGameName(), gameCreatedEvent.getNumberOfPlayers(), gameCreatedEvent.getNumberOfPlayersPerTable(), gameCreatedEvent.getCreatedByPlayerId(), gameCreatedEvent.getNumberOfMinutesBetweenBlindLevels()); game.applyAllHistoricalEvents(events); return game; } private Game createGame(boolean creatingFromEvents, UUID aggregateId, String gameName, int maxNumberOfPlayers, int numberOfPlayersPerTable, UUID createdById, int numberOfMinutesBetweenBlindLevels) { BlindSchedule blindSchedule = new BlindSchedule(numberOfMinutesBetweenBlindLevels); TableBalancer tableBalancer = new TableBalancer(aggregateId, numberOfPlayersPerTable); return new Game(creatingFromEvents, aggregateId, gameName, maxNumberOfPlayers, numberOfPlayersPerTable, createdById, GameStage.REGISTERING, blindSchedule, tableBalancer); } }