package no.niths.services.school;
import java.util.List;
import no.niths.application.rest.helper.Status;
import no.niths.common.helpers.MessageProvider;
import no.niths.common.helpers.ValidationHelper;
import no.niths.domain.school.FadderGroup;
import no.niths.domain.school.Role;
import no.niths.domain.school.Student;
import no.niths.infrastructure.interfaces.GenericRepository;
import no.niths.infrastructure.school.interfaces.FadderGroupRepository;
import no.niths.infrastructure.school.interfaces.RoleRepository;
import no.niths.infrastructure.school.interfaces.StudentRepository;
import no.niths.services.AbstractGenericService;
import no.niths.services.school.interfaces.FadderGroupService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Service Class for FadderGroup
*
* <p>
* Inherits the basic CRUD actions and has methods
* for addLeader, removeLeader,
* removeAllLeaders, addChild,
* removeChild, removeChildren,
* addChildren, removeAllChildren
* and getStudentsNotInAGroup
* </p>
*/
@Service
public class FadderGroupServiceImpl extends AbstractGenericService<FadderGroup>
implements FadderGroupService {
private Logger logger = LoggerFactory
.getLogger(FadderGroupServiceImpl.class);
@Autowired
private FadderGroupRepository fadderGroupRepository;
@Autowired
private StudentRepository studentRepository;
@Autowired
private RoleRepository roleRepo;
@Override
public GenericRepository<FadderGroup> getRepository() {
return fadderGroupRepository;
}
@Override
public List<FadderGroup> getAll(FadderGroup domain) {
List<FadderGroup> list = fadderGroupRepository.getAll(domain);
for (FadderGroup fg : list) {
fg.getLeaders().size();
}
return list;
}
/**
* {@inheritDoc}
*/
@Override
public void addLeader(Long groupId, Long studentId) {
FadderGroup group = validate(fadderGroupRepository.getById(groupId),
FadderGroup.class);
checkIfObjectIsInCollection(group.getLeaders(), studentId,
Student.class);
Student leader = studentRepository.getById(studentId);
ValidationHelper.isObjectNull(leader, Student.class);
// add role FADDER_LEADER To student;
Role r = new Role();
r.setRoleName("ROLE_FADDER_LEADER");
List<Role> roles = roleRepo.getAll(r);
if (roles.size() > 0) {
if(!leader.getRoles().contains(roles.get(0))){
leader.getRoles().add(roles.get(0));
}
}
group.getLeaders().add(leader);
logger.debug(MessageProvider.buildStatusMsg(Student.class,
Status.UPDATED));
}
/**
* {@inheritDoc}
*/
@Override
public void removeLeader(Long groupId, Long studentId) {
FadderGroup group = validate(fadderGroupRepository.getById(groupId),
FadderGroup.class);
Student student = studentRepository.getById(studentId);
checkIfIsRemoved(group.getLeaders().remove(student),
Student.class);
// remove role
for(Role r:student.getRoles()){
if(r.getRoleName().equals("ROLE_FADDER_LEADER")){
student.getRoles().remove(r);
break;
}
}
}
/**
* {@inheritDoc}
*/
@Override
public void addChild(Long groupId, Long studentId) {
FadderGroup group = validate(fadderGroupRepository.getById(groupId),
FadderGroup.class);
checkIfObjectIsInCollection(group.getFadderChildren(), studentId,
Student.class);
Student child = studentRepository.getById(studentId);
ValidationHelper.isObjectNull(child, Student.class);
group.getFadderChildren().add(child);
logger.debug(MessageProvider.buildStatusMsg(Student.class,
Status.UPDATED));
}
/**
* {@inheritDoc}
*/
@Override
public void addChildren(Long groupId, Long[] studentIds) {
for (Long studentId : studentIds) {
addChild(groupId, studentId);
}
}
/**
* {@inheritDoc}
*/
@Override
public void removeChild(Long groupId, Long studentId) {
FadderGroup group = validate(fadderGroupRepository.getById(groupId),
FadderGroup.class);
checkIfIsRemoved(
group.getFadderChildren().remove(new Student(studentId)),
Student.class);
}
/**
* {@inheritDoc}
*/
@Override
public void removeChildren(Long groupId, Long[] studentIds) {
for (Long studentId : studentIds) {
removeChild(groupId, studentId);
}
}
/**
* {@inheritDoc}
*/
@Override
public void removeAllChildren(Long groupId) {
FadderGroup group = validate(fadderGroupRepository.getById(groupId),
FadderGroup.class);
boolean isRemoved = false;
if (group.getFadderChildren() != null) {
group.getFadderChildren().clear();
isRemoved = true;
}
checkIfIsRemoved(isRemoved, Student.class);
}
/**
* {@inheritDoc}
*/
@Override
public void removeAllLeaders(Long groupId) {
FadderGroup group = validate(fadderGroupRepository.getById(groupId),
FadderGroup.class);
boolean isRemoved = false;
if (group.getLeaders() != null) {
group.getLeaders().clear();
isRemoved = true;
}
checkIfIsRemoved(isRemoved, Student.class);
}
/**
* {@inheritDoc}
*/
@Override
public List<Student> getStudentsNotInAGroup() {
return fadderGroupRepository.getStudentsNotInAGroup();
}
}