/* * PatientView * * Copyright (c) Worth Solutions Limited 2004-2013 * * This file is part of PatientView. * * PatientView is free software: you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * PatientView is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License along with PatientView in a file * titled COPYING. If not, see <http://www.gnu.org/licenses/>. * * @package PatientView * @link http://www.patientview.org * @author PatientView <info@patientview.org> * @copyright Copyright (c) 2004-2013, Worth Solutions Limited * @license http://www.gnu.org/licenses/gpl-3.0.html The GNU General Public License V3.0 */ package org.patientview.service.impl; import org.patientview.patientview.logon.PatientLogon; import org.patientview.patientview.logon.UnitAdmin; import org.patientview.model.Specialty; import org.patientview.patientview.model.SpecialtyUserRole; import org.patientview.patientview.model.radar.Demographics; import org.patientview.patientview.model.PatientUser; import org.patientview.model.Unit; import org.patientview.patientview.model.UserMapping; import org.patientview.patientview.model.User; import org.patientview.patientview.unit.UnitUtils; import org.patientview.patientview.user.UserUtils; import org.patientview.repository.RadarDao; import org.patientview.repository.SpecialtyUserRoleDao; import org.patientview.repository.PatientUserDao; import org.patientview.repository.UnitDao; import org.patientview.repository.UserDao; import org.patientview.repository.UserMappingDao; import org.patientview.service.SecurityUserManager; import org.patientview.service.UserManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.inject.Inject; import java.util.List; @Service(value = "userManager") public class UserManagerImpl implements UserManager { private static final Logger LOGGER = LoggerFactory.getLogger(UserManagerImpl.class); @Inject private UserDao userDao; @Inject private UserMappingDao userMappingDao; @Inject private SecurityUserManager securityUserManager; @Inject private SpecialtyUserRoleDao specialtyUserRoleDao; @Inject private RadarDao radarDao; @Inject private PatientUserDao patientUserDao; @Inject private UnitDao unitDao; @Override public User getLoggedInUser() { return userDao.get(securityUserManager.getLoggedInUsername()); } @Override public User get(Long id) { return userDao.get(id); } @Override public User get(String username) { return userDao.get(username); } @Override public String getLoggedInUserRole() { // get role from spring user for this logged in specialty return getCurrentSpecialtyRole(getLoggedInUser()); } @Override public Specialty getCurrentSpecialty(User user) { SpecialtyUserRole specialtyUserRole = getCurrentSpecialtyUserRole(user); if (specialtyUserRole != null) { return specialtyUserRole.getSpecialty(); } else { return null; } } @Override public String getCurrentSpecialtyRole(User user) { SpecialtyUserRole specialtyUserRole = getCurrentSpecialtyUserRole(user); if (specialtyUserRole != null) { return specialtyUserRole.getRole(); } else { return null; } } private SpecialtyUserRole getCurrentSpecialtyUserRole(User user) { // get role from spring user for this logged in Specialty if (user != null) { List<SpecialtyUserRole> specialtyUserRoles = getSpecialtyUserRoles(user); Specialty loggedInSpecialty = securityUserManager.getLoggedInSpecialty(); if (loggedInSpecialty != null) { for (SpecialtyUserRole specialtyUserRole : specialtyUserRoles) { if (specialtyUserRole.getSpecialty().equals(loggedInSpecialty)) { return specialtyUserRole; } } } } return null; } @Override public List<SpecialtyUserRole> getSpecialtyUserRoles(User user) { return specialtyUserRoleDao.get(user); } @Override public void save(User user) { userDao.save(user); } @Override public User saveUserFromUnitAdmin(UnitAdmin unitAdmin, String unitcode) { // check for an existing user User user = get(unitAdmin.getUsername()); final boolean isNewUser = user == null; if (isNewUser) { // create a user to save based on the unitAdmin user = new User(); user.setEmailverified(unitAdmin.isEmailverified()); } else { if (!user.getEmail().equals(unitAdmin.getEmail())) { user.setEmailverified(false); } } user.setAccountlocked(unitAdmin.isAccountlocked()); user.setDummypatient(unitAdmin.isDummypatient()); user.setEmail(unitAdmin.getEmail()); user.setFailedlogons(unitAdmin.getFailedlogons()); user.setFirstlogon(unitAdmin.isFirstlogon()); user.setLastlogon(unitAdmin.getLastlogon()); user.setName(unitAdmin.getName()); user.setPassword(unitAdmin.getPassword()); user.setUsername(unitAdmin.getUsername()); user.setIsrecipient(unitAdmin.isIsrecipient()); user.setIsclinician(unitAdmin.isIsclinician()); save(user); addEditUserSpecialtyRole(user, unitAdmin.getRole()); if (isNewUser) { UserMapping userMapping = new UserMapping(user.getUsername(), unitcode, ""); save(userMapping); // create mappings in radar if they don't already exist if (!userExistsInRadar(user.getId())) { createProfessionalUserInRadar(user, unitcode); } } return user; } @Override public User saveUserFromPatient(PatientLogon patientLogon) { // check for an existing user User user = get(patientLogon.getUsername()); if (user == null) { // create a user to save based on the unitAdmin user = new User(); } user.setAccountlocked(patientLogon.isAccountlocked()); user.setDummypatient(patientLogon.isDummypatient()); user.setEmail(patientLogon.getEmail()); user.setEmailverified(patientLogon.isEmailverified()); user.setFailedlogons(patientLogon.getFailedlogons()); user.setFirstlogon(patientLogon.isFirstlogon()); user.setLastlogon(patientLogon.getLastlogon()); user.setName(patientLogon.getName()); user.setPassword(patientLogon.getPassword()); user.setUsername(patientLogon.getUsername()); save(user); addEditUserSpecialtyRole(user, patientLogon.getRole()); return user; } // handle the permissions for the Specialty private void addEditUserSpecialtyRole(User user, String role) { SpecialtyUserRole specialtyUserRole = getCurrentSpecialtyUserRole(user); if (specialtyUserRole == null) { // associate new user with the current Specialty and role specialtyUserRole = new SpecialtyUserRole(); } // this is always updating the specialtyUserRole - shouldn't be an issue specialtyUserRole.setUser(user); specialtyUserRole.setRole(role); specialtyUserRole.setSpecialty(securityUserManager.getLoggedInSpecialty()); specialtyUserRoleDao.save(specialtyUserRole); } private void delete(User user, String unitcode) { List<UserMapping> userMappings = getUserMappingsExcludeUnitcode(user.getUsername(), UnitUtils.PATIENT_ENTERS_UNITCODE); if (userMappings.size() == 1) { // this is a user that exists in only one unit -> full delete specialtyUserRoleDao.delete(getCurrentSpecialtyUserRole(user)); deleteUserMappings(user.getUsername(), unitcode); // deletes from usermapping table deleteUserMappings(user.getUsername() + "-GP", unitcode); deleteUserMappings(user.getUsername(), UnitUtils.PATIENT_ENTERS_UNITCODE); userDao.delete(user); // deletes from user table User gpUser = get(user.getUsername() + "-GP"); if (gpUser != null) { userDao.delete(gpUser); } // patients get all their records deleted if ("patient".equals(getCurrentSpecialtyRole(user))) { UserUtils.removePatientFromSystem(user.getUsername(), unitcode); } // remove the user from radar as well radarDao.removeUserFromRadar(user.getId()); } else { // this is a user that exists in multiple units -> just remove their unit access/mapping deleteUserMappings(user.getUsername(), unitcode); deleteUserMappings(user.getUsername() + "-GP", unitcode); } } @Override public void delete(String username, String unitcode) { User user = get(username); if (user != null) { try { delete(user, unitcode); } catch (Exception e) { LOGGER.error(e.getMessage()); LOGGER.debug(e.getMessage(), e); } } } @Override public List<User> getAllUsers() { return userDao.getAll(); } @Override public void save(UserMapping userMapping) { if (userMapping.getSpecialty() == null) { userMapping.setSpecialty(securityUserManager.getLoggedInSpecialty()); } userMappingDao.save(userMapping); } @Override public void deleteUserMappings(String username, String unitcode) { userMappingDao.deleteUserMappings(username, unitcode, securityUserManager.getLoggedInSpecialty()); } @Override public List<UserMapping> getUserMappings(String username) { return userMappingDao.getAll(username, securityUserManager.getLoggedInSpecialty()); } @Override public List<UserMapping> getUserMappingsExcludeUnitcode(String username, String unitcode) { return userMappingDao.getAllExcludeUnitcode(username, unitcode, securityUserManager.getLoggedInSpecialty()); } @Override public List<UserMapping> getUserMappings(String username, String unitcode) { return userMappingDao.getAll(username, unitcode, securityUserManager.getLoggedInSpecialty()); } @Override public List<UserMapping> getUserMappingsForNhsNo(String nhsNo) { return userMappingDao.getAllForNhsNo(nhsNo, securityUserManager.getLoggedInSpecialty()); } @Override public String getUsersRealUnitcodeBestGuess(String username) { return userMappingDao.getUsersRealUnitcodeBestGuess(username, securityUserManager.getLoggedInSpecialty()); } @Override public String getUsersRealNhsNoBestGuess(String username) { return userMappingDao.getUsersRealNhsNoBestGuess(username, securityUserManager.getLoggedInSpecialty()); } @Override public UserMapping getUserMappingPatientEntered(User user) { return userMappingDao.getUserMappingPatientEntered(user, securityUserManager.getLoggedInSpecialty()); } @Override public List<UserMapping> getUsersSiblings(String username, String unitcode) { return userMappingDao.getUsersSiblings(username, unitcode, securityUserManager.getLoggedInSpecialty()); } @Override public List<UserMapping> getDuplicateUsers(String nhsno, String username) { return userMappingDao.getDuplicateUsers(nhsno, username, securityUserManager.getLoggedInSpecialty()); } @Override public boolean patientExistsInRadar(String nhsno) { Demographics demographics = radarDao.getDemographicsByNhsNo(nhsno); if (demographics != null) { PatientUser patientUser = patientUserDao.getPatientUserByRadarNo(demographics.getRadarNo()); return patientUser != null; } return false; } @Override public boolean userExistsInRadar(Long userId) { return radarDao.userExistsInRadar(userId); } @Override public void createProfessionalUserInRadar(User user, String unitcode) { // check to see if this user has an account already in radar and if they dont create one Unit unit = unitDao.get(unitcode, null); if (unit != null) { radarDao.createProfessionalUserInRadar(user, unit); } else { LOGGER.error("Could not create admin user in radar " + user.getId()); } } @Override public void removeUserFromRadar(Long userId) { radarDao.removeUserFromRadar(userId); } }