package gov.nysenate.openleg.dao.notification;
import gov.nysenate.openleg.dao.base.SqlBaseDao;
import gov.nysenate.openleg.model.notification.NotificationDigestSubscription;
import gov.nysenate.openleg.model.notification.NotificationSubscription;
import gov.nysenate.openleg.model.notification.NotificationTarget;
import gov.nysenate.openleg.model.notification.NotificationType;
import gov.nysenate.openleg.util.DateUtils;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;
import static gov.nysenate.openleg.dao.notification.SqlNotificationSubscriptionQuery.*;
@Repository
public class SqlNotificationSubscriptionDao extends SqlBaseDao implements NotificationSubscriptionDao {
/**
* {@inheritDoc}
*/
@Override
public Set<NotificationSubscription> getSubscriptions() {
return new HashSet<>(
jdbcNamed.query(SELECT_ALL_SUBSCRIPTIONS.getSql(schema()),
new MapSqlParameterSource(), subscriptionRowMapper)
);
}
/**
* {@inheritDoc}
*/
@Override
public void insertSubscription(NotificationSubscription subscription) {
MapSqlParameterSource params = getSubscriptionParams(subscription);
jdbcNamed.update(INSERT_SUBSCRIPTION.getSql(schema()), params);
}
/** {@inheritDoc} */
@Override
public void removeSubscription(NotificationSubscription subscription) {
MapSqlParameterSource params = getSubscriptionParams(subscription);
jdbcNamed.update(DELETE_SUBSCRIPTION.getSql(schema()), params);
}
/** {@inheritDoc} */
@Override
public Set<NotificationDigestSubscription> getPendingDigests() {
return new HashSet<>(
jdbcNamed.query(SELECT_PENDING_DIGESTS.getSql(schema()),
new MapSqlParameterSource(), digestSubscriptionRowMapper)
);
}
/** {@inheritDoc} */
@Override
public Set<NotificationDigestSubscription> getDigestSubsForUser(String username) {
return new HashSet<>(
jdbcNamed.query(SELECT_DIGEST_SUBS_FOR_USER.getSql(schema()),
new MapSqlParameterSource("user", username), digestSubscriptionRowMapper)
);
}
/** {@inheritDoc} */
@Override
public void insertDigestSubscription(NotificationDigestSubscription subscription) {
KeyHolder idHolder = new GeneratedKeyHolder();
jdbcNamed.update(INSERT_DIGEST_SUB.getSql(schema()), getDigestSubscriptionParams(subscription),
idHolder, new String[]{"id"});
subscription.setId(idHolder.getKey().intValue());
}
/** {@inheritDoc} */
@Override
public void updateNextDigest(int digestSubscriptionId, LocalDateTime nextDigest) {
MapSqlParameterSource params = new MapSqlParameterSource("id", digestSubscriptionId)
.addValue("nextDigest", DateUtils.toDate(nextDigest));
jdbcNamed.update(UPDATE_NEXT_DIGEST.getSql(schema()), params);
}
/** {@inheritDoc} */
@Override
public void removeDigestSubscription(int digestSubscriptionId) {
jdbcNamed.update(DELETE_DIGEST_SUB.getSql(schema()), new MapSqlParameterSource("id", digestSubscriptionId));
}
private static RowMapper<NotificationSubscription> subscriptionRowMapper = (rs, rowNum) ->
new NotificationSubscription(
rs.getString("user_name"),
NotificationType.valueOf(rs.getString("type")),
NotificationTarget.valueOf(rs.getString("target")),
rs.getString("address")
);
private static RowMapper<NotificationDigestSubscription> digestSubscriptionRowMapper = (rs, rowNum) ->
new NotificationDigestSubscription(
subscriptionRowMapper.mapRow(rs, rowNum),
rs.getInt("id"),
getDurationFromRs(rs, "period"),
getPeriodFromRs(rs, "period"),
getLocalDateTimeFromRs(rs, "next_digest"),
rs.getBoolean("send_empty_digest"),
rs.getBoolean("full")
);
private MapSqlParameterSource getSubscriptionParams(NotificationSubscription subscription) {
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("user", subscription.getUserName());
params.addValue("type", subscription.getType().toString());
params.addValue("target", subscription.getTarget().toString());
params.addValue("address", subscription.getTargetAddress());
return params;
}
private MapSqlParameterSource getDigestSubscriptionParams(NotificationDigestSubscription subscription) {
return new MapSqlParameterSource()
.addValue("id", subscription.getId())
.addValue("user", subscription.getUserName())
.addValue("type", subscription.getType().toString())
.addValue("target", subscription.getTarget().toString())
.addValue("address", subscription.getTargetAddress())
.addValue("nextDigest", DateUtils.toDate(subscription.getNextDigest()))
.addValue("period", DateUtils.toInterval(subscription.getPeriodDays(), subscription.getPeriodHours()))
.addValue("sendEmptyDigest", subscription.isSendEmptyDigest())
.addValue("full", subscription.isFull());
}
}