package fi.otavanopisto.muikku.users;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;
import javax.inject.Inject;
import fi.otavanopisto.muikku.dao.users.FlagDAO;
import fi.otavanopisto.muikku.dao.users.FlagShareDAO;
import fi.otavanopisto.muikku.dao.users.FlagStudentDAO;
import fi.otavanopisto.muikku.model.users.Flag;
import fi.otavanopisto.muikku.model.users.FlagShare;
import fi.otavanopisto.muikku.model.users.FlagStudent;
import fi.otavanopisto.muikku.model.users.UserSchoolDataIdentifier;
import fi.otavanopisto.muikku.schooldata.SchoolDataIdentifier;
public class FlagController {
@Inject
private Logger logger;
@Inject
private FlagDAO flagDAO;
@Inject
private FlagStudentDAO flagStudentDAO;
@Inject
private FlagShareDAO flagShareDAO;
@Inject
private UserSchoolDataIdentifierController userSchoolDataIdentifierController;
public Flag createFlag(SchoolDataIdentifier ownerIdentifier, String name, String color, String description) {
UserSchoolDataIdentifier ownerSchoolDataIdentifier = userSchoolDataIdentifierController.findUserSchoolDataIdentifierBySchoolDataIdentifier(ownerIdentifier);
if (ownerSchoolDataIdentifier == null) {
logger.severe(String.format("Could not find school data user by identifier %s", ownerIdentifier));
return null;
}
return flagDAO.create(ownerSchoolDataIdentifier, name, color, description, Boolean.FALSE);
}
public Flag findFlagById(Long flagId) {
return flagDAO.findById(flagId);
}
public List<Flag> listByOwnedAndSharedFlags(SchoolDataIdentifier ownerIdentifier) {
UserSchoolDataIdentifier userSchoolDataIdentifier = userSchoolDataIdentifierController.findUserSchoolDataIdentifierBySchoolDataIdentifier(ownerIdentifier);
if (userSchoolDataIdentifier == null) {
logger.severe(String.format("Could not find school data user by identifier %s", ownerIdentifier));
return Collections.emptyList();
}
return listByOwnedAndSharedFlags(userSchoolDataIdentifier);
}
public List<Flag> listByOwnedAndSharedFlags(UserSchoolDataIdentifier userSchoolDataIdentifier) {
List<Flag> flags = flagShareDAO.listFlagsByUserIdentifier(userSchoolDataIdentifier);
flags.addAll(flagDAO.listByOwnerIdentifier(userSchoolDataIdentifier));
return flags;
}
public Flag updateFlag(Flag flag, String name, String color, String description) {
flag = flagDAO.updateName(flag, name);
flag = flagDAO.updateColor(flag, color);
flag = flagDAO.updateDescription(flag, description);
return flag;
}
public boolean hasFlagPermission(Flag flag, SchoolDataIdentifier userIdentifier) {
UserSchoolDataIdentifier owner = flag.getOwnerIdentifier();
SchoolDataIdentifier ownerIdentfier = toIdentifier(owner);
if (ownerIdentfier.equals(userIdentifier)) {
return true;
}
UserSchoolDataIdentifier userSchoolDataIdentifier = userSchoolDataIdentifierController.findUserSchoolDataIdentifierBySchoolDataIdentifier(userIdentifier);
if (userSchoolDataIdentifier == null) {
logger.severe(String.format("Could not find school data user by identifier %s", userIdentifier));
return false;
}
FlagShare flagShare = flagShareDAO.findByFlagAndUserIdentifier(flag, userSchoolDataIdentifier);
if (flagShare != null) {
return true;
}
return false;
}
public List<SchoolDataIdentifier> getFlaggedStudents(List<Flag> flags) {
List<UserSchoolDataIdentifier> students = flagStudentDAO.listStudentIdentifiersByFlags(flags);
return toIdentifiers(students);
}
public FlagStudent findFlagStudentById(Long id) {
return flagStudentDAO.findById(id);
}
public List<FlagStudent> listByOwnedAndSharedStudentFlags(SchoolDataIdentifier studentIdentifier,
SchoolDataIdentifier userIdentifier) {
UserSchoolDataIdentifier userSchoolDataIdentifier = userSchoolDataIdentifierController.findUserSchoolDataIdentifierBySchoolDataIdentifier(userIdentifier);
if (userSchoolDataIdentifier == null) {
logger.severe(String.format("Could not find school data user by identifier %s", userIdentifier));
return Collections.emptyList();
}
UserSchoolDataIdentifier studentSchoolDataIdentifier = userSchoolDataIdentifierController.findUserSchoolDataIdentifierBySchoolDataIdentifier(studentIdentifier);
if (studentSchoolDataIdentifier == null) {
logger.severe(String.format("Could not find school data user by identifier %s", studentIdentifier));
return Collections.emptyList();
}
List<FlagStudent> flagStudents = flagStudentDAO.listByStudentIdentifier(studentSchoolDataIdentifier);
List<FlagStudent> result = new ArrayList<>(flagStudents.size());
for (FlagStudent flagStudent : flagStudents) {
if (hasFlagPermission(flagStudent.getFlag(), userIdentifier)) {
result.add(flagStudent);
}
}
return result;
}
public FlagStudent flagStudent(Flag flag, SchoolDataIdentifier studentIdentifier) {
UserSchoolDataIdentifier studentSchoolDataIdentifier = userSchoolDataIdentifierController.findUserSchoolDataIdentifierBySchoolDataIdentifier(studentIdentifier);
if (studentSchoolDataIdentifier == null) {
logger.severe(String.format("Could not find school data user by identifier %s", studentIdentifier));
return null;
}
FlagStudent flagStudent = flagStudentDAO.findByFlagAndStudentIdentifier(flag, studentSchoolDataIdentifier);
if (flagStudent != null) {
return flagStudent;
}
return flagStudentDAO.create(flag, studentSchoolDataIdentifier, new Date());
}
public void unflagStudent(Flag flag, SchoolDataIdentifier studentIdentifier) {
UserSchoolDataIdentifier studentSchoolDataIdentifier = userSchoolDataIdentifierController.findUserSchoolDataIdentifierBySchoolDataIdentifier(studentIdentifier);
if (studentSchoolDataIdentifier == null) {
logger.severe(String.format("Could not find school data user by identifier %s", studentIdentifier));
return;
}
FlagStudent flagStudent = flagStudentDAO.findByFlagAndStudentIdentifier(flag, studentSchoolDataIdentifier);
if (flagStudent != null) {
unflagStudent(flagStudent);
}
}
public void unflagStudent(FlagStudent flagStudent) {
flagStudentDAO.delete(flagStudent);
}
public List<FlagShare> listShares(Flag flag) {
return flagShareDAO.listByFlag(flag);
}
public void unshareFlag(Flag flag, UserSchoolDataIdentifier userIdentifier) {
FlagShare flagShare = flagShareDAO.findByFlagAndUserIdentifier(flag, userIdentifier);
flagShareDAO.delete(flagShare);
}
public FlagShare findFlagShare(Long id) {
return flagShareDAO.findById(id);
}
public FlagShare createFlagShare(Flag flag, SchoolDataIdentifier userIdentifier) {
UserSchoolDataIdentifier studentSchoolDataIdentifier = userSchoolDataIdentifierController.findUserSchoolDataIdentifierBySchoolDataIdentifier(userIdentifier);
if (studentSchoolDataIdentifier == null) {
logger.severe(String.format("Could not find school data user by identifier %s", userIdentifier));
return null;
}
return createFlagShare(flag, studentSchoolDataIdentifier);
}
private FlagShare createFlagShare(Flag flag, UserSchoolDataIdentifier studentSchoolDataIdentifier) {
return flagShareDAO.create(flag, studentSchoolDataIdentifier);
}
public void deleteFlagShare(FlagShare flagShare) {
flagShareDAO.delete(flagShare);
}
public void deleteFlag(Flag flag) {
flagDAO.delete(flag);
}
public void deleteFlagCascade(Flag flag) {
List<FlagStudent> flagStudents = flagStudentDAO.listByFlag(flag);
for (FlagStudent flagStudent : flagStudents) {
flagStudentDAO.delete(flagStudent);
}
deleteFlag(flag);
}
private List<SchoolDataIdentifier> toIdentifiers(List<UserSchoolDataIdentifier> userSchoolDataIdentifiers) {
List<SchoolDataIdentifier> result = new ArrayList<>(userSchoolDataIdentifiers.size());
for (UserSchoolDataIdentifier userSchoolDataIdentifier : userSchoolDataIdentifiers) {
result.add(toIdentifier(userSchoolDataIdentifier));
}
return result;
}
private SchoolDataIdentifier toIdentifier(UserSchoolDataIdentifier userSchoolDataIdentifier) {
SchoolDataIdentifier ownerIdentfier = new SchoolDataIdentifier(userSchoolDataIdentifier.getIdentifier(), userSchoolDataIdentifier.getDataSource().getIdentifier());
return ownerIdentfier;
}
}