package fr.keemto.provider.exchange;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
public class JdbcMailRepository implements MailRepository {
private static final Logger log = LoggerFactory.getLogger(JdbcMailRepository.class);
public static final String SQL_MAILS_MOST_RECENT = "SELECT TOP 1 ts FROM mail ORDER BY ts DESC";
public static final String SQL_MAILS_BY_SENDER = "SELECT * FROM mail WHERE sender = ? AND ts > ?";
private final JdbcTemplate jdbcTemplate;
public JdbcMailRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void persist(List<Email> emails) {
for (Email email : emails) {
persist(email);
}
}
private void persist(Email email) {
String insertEvent = "insert into mail (id,sender,subject,body,ts,recipients) values(?,?,?,?,?,?)";
log.debug("Persisting mail {} into database", email);
try {
jdbcTemplate.update(insertEvent,
new Object[]{email.getId(), email.getFrom(), email.getSubject(), email.getBody(), email.getTimestamp(), email.getRecipientsAsString()});
} catch (DuplicateKeyException e) {
throw new DuplicateMailException("Unable to persist mail " + email +
" because another event exists with same id: " + email.getId(), e);
}
}
@Override
public long getMostRecentMailCreationTime() {
try {
return jdbcTemplate.queryForLong(SQL_MAILS_MOST_RECENT);
} catch (EmptyResultDataAccessException e) {
log.debug("No mail exists in table.");
return 0;
}
}
@Override
public List<Email> getMails(String from, long newerThan) {
return jdbcTemplate.query(SQL_MAILS_BY_SENDER, new Object[]{from, newerThan}, new MailRowMapper());
}
private final class MailRowMapper implements RowMapper<Email> {
@Override
public Email mapRow(ResultSet rs, int rowNum) throws SQLException {
String id = rs.getString("id");
String subject = rs.getString("subject");
String body = rs.getString("body");
String sender = rs.getString("sender");
String recipients = rs.getString("recipients");
long timestamp = rs.getLong("ts");
return new Email(id, sender, subject, body, timestamp, recipients);
}
}
}