CMSgov/dpc-app

View on GitHub
dpc-attribution/src/main/java/gov/cms/dpc/attribution/jobs/ExpireAttributions.java

Summary

Maintainability
A
0 mins
Test Coverage
F
8%
package gov.cms.dpc.attribution.jobs;

import gov.cms.dpc.attribution.DPCAttributionConfiguration;
import gov.cms.dpc.attribution.dao.tables.Attributions;
import gov.cms.dpc.attribution.exceptions.AttributionException;
import io.dropwizard.db.ManagedDataSource;
import io.dropwizard.jobs.Job;
import io.dropwizard.jobs.annotations.On;
import org.jooq.DSLContext;
import org.jooq.conf.Settings;
import org.jooq.impl.DSL;
import org.quartz.JobExecutionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * This job runs every day at midnight to expire (remove) attribution relationships which are older than a certain threshold.
 * The value is set in the config file ({@link DPCAttributionConfiguration#getExpirationThreshold()}) and defaults to 90 days.
 */
@On("0 0 * * * ?")
public class ExpireAttributions extends Job {

    private static final Logger logger = LoggerFactory.getLogger(ExpireAttributions.class);

    @Inject
    private ManagedDataSource dataSource;
    @Inject
    private Settings settings;

    public ExpireAttributions() {}

    @Override
    public void doJob(JobExecutionContext jobContext) {
        final OffsetDateTime expirationTemporal = OffsetDateTime.now(ZoneOffset.UTC);
        // Find all the jobs and remove them
        logger.debug("Expiring active attribution relationships before {}.", expirationTemporal.format(DateTimeFormatter.ISO_DATE_TIME));

        try (final Connection connection = this.dataSource.getConnection(); final DSLContext context = DSL.using(connection, this.settings)) {
            final int updated = context
                    .update(Attributions.ATTRIBUTIONS)
                    .set(Attributions.ATTRIBUTIONS.INACTIVE, true)
                    .where(Attributions.ATTRIBUTIONS.PERIOD_END.le(expirationTemporal))
                    .execute();
            logger.debug("Expired {} attribution relationships.", updated);
        } catch (SQLException e) {
            throw new AttributionException("Unable to open connection to database.", e);
        }

        // Remove everything that is inactive and has been expired for more than 6 months
        try (final Connection connection = this.dataSource.getConnection(); final DSLContext context = DSL.using(connection, this.settings)) {
            final int removed = context
                    .delete(Attributions.ATTRIBUTIONS)
                    .where(Attributions.ATTRIBUTIONS.PERIOD_END.le(expirationTemporal.minusMonths(6))
                            .and(Attributions.ATTRIBUTIONS.INACTIVE.eq(true)))
                    .execute();
            logger.debug("Removed {} attribution relationships.", removed);
        } catch (SQLException e) {
            throw new AttributionException("Unable to open connection to database.", e);
        }
    }
}