package fi.pyramus.services;
import javax.annotation.security.RolesAllowed;
import javax.ejb.Stateless;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.persistence.EnumType;
import javax.xml.ws.BindingType;
import fi.otavanopisto.pyramus.dao.DAOFactory;
import fi.otavanopisto.pyramus.dao.base.ContactTypeDAO;
import fi.otavanopisto.pyramus.dao.base.EmailDAO;
import fi.otavanopisto.pyramus.dao.base.PersonDAO;
import fi.otavanopisto.pyramus.dao.users.StaffMemberDAO;
import fi.otavanopisto.pyramus.dao.users.UserIdentificationDAO;
import fi.otavanopisto.pyramus.dao.users.UserVariableDAO;
import fi.otavanopisto.pyramus.domainmodel.base.ContactType;
import fi.otavanopisto.pyramus.domainmodel.base.Email;
import fi.otavanopisto.pyramus.domainmodel.base.Person;
import fi.otavanopisto.pyramus.domainmodel.users.Role;
import fi.otavanopisto.pyramus.domainmodel.users.StaffMember;
import fi.otavanopisto.pyramus.domainmodel.users.UserIdentification;
import fi.otavanopisto.pyramus.framework.UserUtils;
import fi.pyramus.services.entities.EntityFactoryVault;
import fi.pyramus.services.entities.users.UserEntity;
@Stateless
@WebService
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
@RolesAllowed("WebServices")
public class UsersService extends PyramusService {
public UserEntity[] listUsers() {
StaffMemberDAO userDAO = DAOFactory.getInstance().getStaffMemberDAO();
return (UserEntity[]) EntityFactoryVault.buildFromDomainObjects(userDAO.listAll());
}
public UserEntity[] listUsersByUserVariable(@WebParam(name = "key") String key, @WebParam(name = "value") String value) {
StaffMemberDAO staffMemberDAO = DAOFactory.getInstance().getStaffMemberDAO();
return (UserEntity[]) EntityFactoryVault.buildFromDomainObjects(staffMemberDAO.listByUserVariable(key, value));
}
public UserEntity createUser(@WebParam(name = "firstName") String firstName, @WebParam(name = "lastName") String lastName,
@WebParam(name = "externalId") String externalId, @WebParam(name = "authProvider") String authProvider, @WebParam(name = "role") String role) {
StaffMemberDAO staffMemberDAO = DAOFactory.getInstance().getStaffMemberDAO();
PersonDAO personDAO = DAOFactory.getInstance().getPersonDAO();
UserIdentificationDAO userIdentificationDAO = DAOFactory.getInstance().getUserIdentificationDAO();
// TODO: should not create if user exists
Person person = personDAO.create(null, null, null, null, Boolean.FALSE);
userIdentificationDAO.create(person, authProvider, externalId);
Role userRole = EnumType.valueOf(Role.class, role);
StaffMember staffMember = staffMemberDAO.create(firstName, lastName, userRole, person, false);
personDAO.updateDefaultUser(person, staffMember);
validateEntity(staffMember);
return EntityFactoryVault.buildFromDomainObject(staffMember);
}
public void updateUser(@WebParam(name = "userId") Long userId, @WebParam(name = "firstName") String firstName, @WebParam(name = "lastName") String lastName,
@WebParam(name = "role") String role) {
StaffMemberDAO staffDAO = DAOFactory.getInstance().getStaffMemberDAO();
StaffMember user = staffDAO.findById(userId);
Role userRole = EnumType.valueOf(Role.class, role);
staffDAO.update(user, firstName, lastName, userRole);
validateEntity(user);
}
public UserEntity getUserById(@WebParam(name = "userId") Long userId) {
StaffMemberDAO userDAO = DAOFactory.getInstance().getStaffMemberDAO();
return EntityFactoryVault.buildFromDomainObject(userDAO.findById(userId));
}
public UserEntity getUserByExternalId(@WebParam(name = "externalId") String externalId, @WebParam(name = "authProvider") String authProvider) {
UserIdentificationDAO userIdentificationDAO = DAOFactory.getInstance().getUserIdentificationDAO();
StaffMemberDAO staffDAO = DAOFactory.getInstance().getStaffMemberDAO();
UserIdentification userIdentification = userIdentificationDAO.findByAuthSourceAndExternalId(authProvider, externalId);
if(userIdentification != null){
StaffMember staffMember = staffDAO.findByPerson(userIdentification.getPerson());
if(staffMember != null){
return EntityFactoryVault.buildFromDomainObject(staffMember);
}
}
return null;
}
public UserEntity getUserByEmail(@WebParam(name = "email") String email) {
StaffMemberDAO userDAO = DAOFactory.getInstance().getStaffMemberDAO();
return EntityFactoryVault.buildFromDomainObject(userDAO.findByUniqueEmail(email));
}
public void addUserEmail(@WebParam(name = "userId") Long userId, @WebParam(name = "address") String address) {
StaffMemberDAO userDAO = DAOFactory.getInstance().getStaffMemberDAO();
EmailDAO emailDAO = DAOFactory.getInstance().getEmailDAO();
ContactTypeDAO contactTypeDAO = DAOFactory.getInstance().getContactTypeDAO();
StaffMember user = userDAO.findById(userId);
// Trim the email address
address = address != null ? address.trim() : null;
// TODO contact type, default address
ContactType contactType = contactTypeDAO.findById(new Long(1));
if (!UserUtils.isAllowedEmail(address, contactType, user.getPerson().getId()))
throw new RuntimeException("Email address is in use");
Email email = emailDAO.create(user.getContactInfo(), contactType, Boolean.TRUE, address);
validateEntity(email);
}
public void removeUserEmail(@WebParam(name = "userId") Long userId, @WebParam(name = "address") String address) {
StaffMemberDAO userDAO = DAOFactory.getInstance().getStaffMemberDAO();
EmailDAO emailDAO = DAOFactory.getInstance().getEmailDAO();
fi.otavanopisto.pyramus.domainmodel.users.User user = userDAO.findById(userId);
for (Email email : user.getContactInfo().getEmails()) {
if (email.getAddress().equals(address)) {
emailDAO.delete(email);
break;
}
}
}
public void updateUserEmail(@WebParam(name = "userId") Long userId, @WebParam(name = "fromAddress") String fromAddress,
@WebParam(name = "toAddress") String toAddress) {
StaffMemberDAO userDAO = DAOFactory.getInstance().getStaffMemberDAO();
EmailDAO emailDAO = DAOFactory.getInstance().getEmailDAO();
fi.otavanopisto.pyramus.domainmodel.users.User user = userDAO.findById(userId);
// Trim the email address
toAddress = toAddress != null ? toAddress.trim() : null;
for (Email email : user.getContactInfo().getEmails()) {
if (email.getAddress().equals(fromAddress)) {
email = emailDAO.update(email, email.getContactType(), email.getDefaultAddress(), toAddress);
validateEntity(email);
break;
}
}
}
public String getUserVariable(@WebParam(name = "userId") Long userId, @WebParam(name = "key") String key) {
StaffMemberDAO userDAO = DAOFactory.getInstance().getStaffMemberDAO();
UserVariableDAO userVariableDAO = DAOFactory.getInstance().getUserVariableDAO();
return userVariableDAO.findByUserAndKey(userDAO.findById(userId), key);
}
public void setUserVariable(@WebParam(name = "userId") Long userId, @WebParam(name = "key") String key, @WebParam(name = "value") String value) {
StaffMemberDAO userDAO = DAOFactory.getInstance().getStaffMemberDAO();
UserVariableDAO userVariableDAO = DAOFactory.getInstance().getUserVariableDAO();
userVariableDAO.setUserVariable(userDAO.findById(userId), key, value);
}
}