PlayerManagementServiceImpl.java
package net.andresbustamante.yafoot.core.services.impl;
import net.andresbustamante.yafoot.commons.exceptions.ApplicationException;
import net.andresbustamante.yafoot.commons.exceptions.DatabaseException;
import net.andresbustamante.yafoot.commons.exceptions.DirectoryException;
import net.andresbustamante.yafoot.commons.model.UserContext;
import net.andresbustamante.yafoot.core.adapters.UserManagementAdapter;
import net.andresbustamante.yafoot.core.dao.PlayerDao;
import net.andresbustamante.yafoot.core.exceptions.PlayerNotFoundException;
import net.andresbustamante.yafoot.core.model.Player;
import net.andresbustamante.yafoot.core.services.CarManagementService;
import net.andresbustamante.yafoot.core.services.MatchManagementService;
import net.andresbustamante.yafoot.core.services.PlayerManagementService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
* @author andresbustamante
*/
@Service
public class PlayerManagementServiceImpl implements PlayerManagementService {
private final PlayerDao playerDAO;
private final UserManagementAdapter userManagementAdapter;
private final MatchManagementService matchManagementService;
private final CarManagementService carManagementService;
private final Logger log = LoggerFactory.getLogger(PlayerManagementServiceImpl.class);
public PlayerManagementServiceImpl(final PlayerDao playerDAO, final UserManagementAdapter userManagementAdapter,
final MatchManagementService matchManagementService,
final CarManagementService carManagementService) {
this.playerDAO = playerDAO;
this.userManagementAdapter = userManagementAdapter;
this.matchManagementService = matchManagementService;
this.carManagementService = carManagementService;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public Integer savePlayer(final Player player, final UserContext userContext) throws ApplicationException {
if (!playerDAO.isPlayerAlreadySignedUp(player.getEmail())) {
// Create the player in database
playerDAO.savePlayer(player);
log.info("New player registered with the address {}", player.getEmail());
return player.getId();
} else {
log.info("Existing player with the address {}", player.getEmail());
throw new ApplicationException("email.already.registered.error",
"A player already exists for this email address");
}
}
@Transactional
@Override
public void updatePlayer(final Player player, final UserContext userContext)
throws DirectoryException, ApplicationException {
Player existingPlayer = playerDAO.findPlayerById(player.getId());
if (existingPlayer != null) {
if (player.getFirstName() != null) {
existingPlayer.setFirstName(player.getFirstName());
}
if (player.getSurname() != null) {
existingPlayer.setSurname(player.getSurname());
}
if (player.getPhoneNumber() != null) {
existingPlayer.setPhoneNumber(player.getPhoneNumber());
}
playerDAO.updatePlayer(existingPlayer);
userManagementAdapter.updateUser(player, userContext);
log.info("Player {} updated", player.getEmail());
} else {
log.info("No user registered with the address {}", player.getEmail());
throw new PlayerNotFoundException("No player registered with the address " + player.getEmail());
}
}
@Transactional
@Override
public void deactivatePlayer(final Player player, final UserContext userContext)
throws DirectoryException, DatabaseException {
// Delete all data from player
matchManagementService.unregisterPlayerFromAllMatches(player, userContext);
carManagementService.deactivateCarsByPlayer(player, userContext);
int numPlayers = playerDAO.deactivatePlayer(player);
log.info("Players deactivated: {}", numPlayers);
userManagementAdapter.deleteUser(player, userContext);
}
}