package fi.otavanopisto.pyramus.dao.courses; import java.util.List; import javax.ejb.Stateless; import javax.enterprise.event.Event; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.Root; import fi.otavanopisto.pyramus.dao.PyramusEntityDAO; import fi.otavanopisto.pyramus.domainmodel.courses.Course; import fi.otavanopisto.pyramus.domainmodel.courses.CourseStaffMember; import fi.otavanopisto.pyramus.domainmodel.courses.CourseStaffMemberRole; import fi.otavanopisto.pyramus.domainmodel.users.StaffMember; import fi.otavanopisto.pyramus.domainmodel.users.StaffMember_; import fi.otavanopisto.pyramus.events.CourseStaffMemberCreatedEvent; import fi.otavanopisto.pyramus.events.CourseStaffMemberDeletedEvent; import fi.otavanopisto.pyramus.events.CourseStaffMemberUpdatedEvent; import fi.otavanopisto.pyramus.domainmodel.courses.CourseStaffMember_; @Stateless public class CourseStaffMemberDAO extends PyramusEntityDAO<CourseStaffMember> { @Inject private Event<CourseStaffMemberCreatedEvent> courseStaffMemberCreatedEvent; @Inject private Event<CourseStaffMemberUpdatedEvent> courseStaffMemberUpdatedEvent; @Inject private Event<CourseStaffMemberDeletedEvent> courseStaffMemberDeletedEvent; public CourseStaffMember create(Course course, StaffMember staffMember, CourseStaffMemberRole role) { CourseStaffMember courseStaffMember = new CourseStaffMember(); courseStaffMember.setCourse(course); courseStaffMember.setStaffMember(staffMember); courseStaffMember.setRole(role); persist(courseStaffMember); courseStaffMemberCreatedEvent.fire(new CourseStaffMemberCreatedEvent(courseStaffMember.getId(), courseStaffMember.getCourse().getId(), courseStaffMember.getStaffMember().getId())); return courseStaffMember; } public List<CourseStaffMember> listByCourse(Course course) { EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<CourseStaffMember> criteria = criteriaBuilder.createQuery(CourseStaffMember.class); Root<CourseStaffMember> root = criteria.from(CourseStaffMember.class); Join<CourseStaffMember, StaffMember> staffMemberJoin = root.join(CourseStaffMember_.staffMember); criteria.select(root); criteria.where( criteriaBuilder.and( criteriaBuilder.equal(root.get(CourseStaffMember_.course), course), criteriaBuilder.equal(staffMemberJoin.get(StaffMember_.archived), Boolean.FALSE) ) ); return entityManager.createQuery(criteria).getResultList(); } public CourseStaffMember updateRole(CourseStaffMember courseStaffMember, CourseStaffMemberRole role) { courseStaffMember.setRole(role); persist(courseStaffMember); courseStaffMemberUpdatedEvent.fire(new CourseStaffMemberUpdatedEvent(courseStaffMember.getId(), courseStaffMember.getCourse().getId(), courseStaffMember.getStaffMember().getId())); return courseStaffMember; } @Override public void delete(CourseStaffMember courseStaffMember) { Long courseId = courseStaffMember.getCourse().getId(); Long staffMemberId = courseStaffMember.getStaffMember().getId(); Long id = courseStaffMember.getId(); super.delete(courseStaffMember); courseStaffMemberDeletedEvent.fire(new CourseStaffMemberDeletedEvent(id, courseId, staffMemberId)); } }