/**
* =============================================================================
*
* ORCID (R) Open Source
* http://orcid.org
*
* Copyright (c) 2012-2014 ORCID, Inc.
* Licensed under an MIT-Style License (MIT)
* http://orcid.org/open-source-license
*
* This copyright and license information (including a link to the full license)
* shall be included in its entirety in all copies or substantial portion of
* the software.
*
* =============================================================================
*/
package org.orcid.persistence.dao.impl;
import java.util.Date;
import java.util.List;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import org.hibernate.NonUniqueResultException;
import org.orcid.persistence.dao.CustomEmailDao;
import org.orcid.persistence.jpa.entities.CustomEmailEntity;
import org.orcid.persistence.jpa.entities.EmailType;
import org.orcid.persistence.jpa.entities.keys.CustomEmailPk;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.transaction.annotation.Transactional;
public class CustomEmailDaoImpl extends GenericDaoImpl<CustomEmailEntity, CustomEmailPk> implements CustomEmailDao {
public CustomEmailDaoImpl() {
super(CustomEmailEntity.class);
}
/**
* Get a list of all custom emails created by a specific client
* @param clientDetailsId
* @return a list containing all custom emails associated with a client
* */
@Override
public List<CustomEmailEntity> getCustomEmails(String clientDetailsId) {
TypedQuery<CustomEmailEntity> query = entityManager.createQuery("from CustomEmailEntity WHERE clientDetailsEntity.id=:clientDetailsId", CustomEmailEntity.class);
query.setParameter("clientDetailsId", clientDetailsId);
return query.getResultList();
}
/**
* Finds a custom email given his client id and the email type
* @param clientDetailsId
* @param emailType
* @return a CustomEmailEntity object if the email is found, null otherwise
* */
@Override
@Cacheable(value = "custom-email", key = "#clientDetailsId.concat('-').concat(#emailType).concat('-').concat(#lastModified)")
public CustomEmailEntity findByClientIdAndEmailType(String clientDetailsId, EmailType emailType, long lastModified) {
TypedQuery<CustomEmailEntity> query = entityManager.createQuery("FROM CustomEmailEntity WHERE clientDetailsEntity.id=:clientDetailsId and emailType=:emailType", CustomEmailEntity.class);
query.setParameter("clientDetailsId", clientDetailsId);
query.setParameter("emailType", emailType);
try {
return query.getSingleResult();
} catch (NonUniqueResultException exception) {
return null;
} catch (NoResultException exception) {
return null;
}
}
/**
* Creates a custom email on database
* @param clientDetailsId
* @param emailType
* @param sender
* @param subject
* @param content
* @return true if it was able to create the custom email
* */
@Override
@Transactional
public boolean createCustomEmail(String clientDetailsId, EmailType emailType, String sender, String subject, String content, boolean isHtml) {
Query query = entityManager.createNativeQuery("INSERT INTO custom_email(client_details_id, email_type, sender, subject, content, is_html, date_created, last_modified) values(:clientDetailsId, :emailType, :sender, :subject, :content, :isHtml, now(), now())");
query.setParameter("clientDetailsId", clientDetailsId);
query.setParameter("emailType", emailType.name());
query.setParameter("sender", sender);
query.setParameter("subject", subject);
query.setParameter("content", content);
query.setParameter("isHtml", isHtml);
return query.executeUpdate() > 0;
}
/**
* Updated an existing custom email
* @param clientDetailsId
* @param emailType
* @param sender
* @param subject
* @param content
* @return true if it was able to update the custom email
* */
@Override
@Transactional
public boolean updateCustomEmail(String clientDetailsId, EmailType emailType, String sender, String subject, String content, boolean isHtml) {
Query query = entityManager.createNativeQuery("UPDATE custom_email SET email_type=:emailType, sender=:sender, subject=:subject, content=:content, is_html=:isHtml, last_modified=now() WHERE client_details_id=:clientDetailsId");
query.setParameter("clientDetailsId", clientDetailsId);
query.setParameter("emailType", emailType.name());
query.setParameter("sender", sender);
query.setParameter("subject", subject);
query.setParameter("content", content);
query.setParameter("isHtml", isHtml);
return query.executeUpdate() > 0;
}
/**
* Deletes a custom email
* @param clientDetailsId
* @param emailType
* @return true if it was able to delete the custom email
* */
@Override
@Transactional
public boolean deleteCustomEmail(String clientDetailsId, EmailType emailType) {
Query query = entityManager.createNativeQuery("DELETE FROM custom_email WHERE client_details_id=:clientDetailsId AND email_type=:emailType");
query.setParameter("clientDetailsId", clientDetailsId);
query.setParameter("emailType", emailType.name());
return query.executeUpdate() > 0;
}
/**
* Checks if a custom email exists
* @param clientDetailsId
* @param emailType
* @return true if a custom email with id=clientDetailsId and email type=emailType exists
* */
@Override
public boolean exists(String clientDetailsId, EmailType emailType) {
TypedQuery<Long> query = entityManager.createQuery("SELECT count(*) FROM CustomEmailEntity WHERE clientDetailsEntity.id=:clientDetailsId and emailType=:emailType", Long.class);
query.setParameter("clientDetailsId", clientDetailsId);
query.setParameter("emailType", emailType);
Long result = query.getSingleResult();
return (result != null && result > 0);
}
/**
* Get the last modified date of a custom email
* @param clientDetailsId
* @param emailType
* @return the last modified date of the custom email, null in case the email doesn't exists
* */
@Override
public Date getLastModified(String clientDetailsId, EmailType emailType) {
TypedQuery<Date> query = entityManager.createQuery("SELECT lastModified FROM CustomEmailEntity WHERE clientDetailsEntity.id=:clientDetailsId and emailType=:emailType", Date.class);
query.setParameter("clientDetailsId", clientDetailsId);
query.setParameter("emailType", emailType);
Date result = null;
try {
result = query.getSingleResult();
} catch(Exception e) {
result = new Date();
}
return result;
}
}