package com.flexpoker.table.command.handlers;
import java.util.List;
import javax.inject.Inject;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import com.flexpoker.framework.command.CommandHandler;
import com.flexpoker.framework.event.EventPublisher;
import com.flexpoker.table.command.aggregate.Table;
import com.flexpoker.table.command.commands.ResumeCommand;
import com.flexpoker.table.command.factory.TableFactory;
import com.flexpoker.table.command.framework.TableEvent;
import com.flexpoker.table.command.repository.TableEventRepository;
@Component
public class ResumeCommandHandler implements CommandHandler<ResumeCommand> {
private final TableFactory tableFactory;
private final EventPublisher<TableEvent> eventPublisher;
private final TableEventRepository tableEventRepository;
@Inject
public ResumeCommandHandler(TableFactory tableFactory,
EventPublisher<TableEvent> eventPublisher,
TableEventRepository tableEventRepository) {
this.tableFactory = tableFactory;
this.eventPublisher = eventPublisher;
this.tableEventRepository = tableEventRepository;
}
@Async
@Override
public void handle(ResumeCommand command) {
List<TableEvent> tableEvents = tableEventRepository
.fetchAll(command.getTableId());
Table table = tableFactory.createFrom(tableEvents);
table.resume();
table.fetchNewEvents().forEach(x -> tableEventRepository.save(x));
table.fetchNewEvents().forEach(x -> eventPublisher.publish(x));
}
}