package de.flower.rmt.service;
import com.google.common.base.Predicate;
import de.flower.common.util.Check;
import de.flower.common.util.NameFinder;
import de.flower.rmt.model.db.entity.Player_;
import de.flower.rmt.model.db.entity.Team;
import de.flower.rmt.model.db.entity.Team_;
import de.flower.rmt.model.db.entity.User;
import de.flower.rmt.repository.ITeamRepo;
import de.flower.rmt.repository.Specs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @author flowerrrr
*/
@Service
@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public class TeamManager extends AbstractService implements ITeamManager {
@Autowired
private ITeamRepo teamRepo;
@Autowired
private IEventManager eventManager;
@Autowired
private IPlayerManager playerManager;
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void save(Team entity) {
validate(entity);
teamRepo.save(entity);
}
@Override
public Team loadById(Long id) {
return Check.notNull(teamRepo.findOne(id));
}
@Override
public List<Team> findAll() {
return teamRepo.findAll();
}
@Override
public List<Team> findAllByUserPlayer(final User user) {
Specification spec = Specs.joinEq(Team_.players, Player_.user, user);
return teamRepo.findAll(spec);
}
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void delete(Long id) {
Team entity = loadById(id);
entity.setName(NameFinder.delete(entity.getName(), new Predicate<String>() {
@Override
public boolean apply(final String name) {
return teamRepo.findByName(name) == null;
}
}));
teamRepo.softDelete(entity);
// mark all events related to this team also as deleted
eventManager.deleteByTeam(entity);
// delete all players of team squad
playerManager.deleteByTeam(entity);
}
@Override
public Team newInstance() {
return new Team(getClub());
}
}