app/housekeeping/MarkOldUnusedBakesForDeletion.scala (56 lines of code) (raw):
package housekeeping
import data.{Bakes, Dynamo, Recipes}
import models.{Bake, RecipeId}
import org.joda.time.{DateTime, Duration}
import org.quartz.SimpleScheduleBuilder
import prism.RecipeUsage
import services.{Loggable, PrismData}
object MarkOldUnusedBakesForDeletion {
val MAX_AGE = 30
val BATCH_SIZE = 100
def getOldUnusedBakes(
recipeIds: Set[RecipeId],
now: DateTime,
listBakes: RecipeId => Iterable[Bake],
getRecipeUsage: Iterable[Bake] => RecipeUsage
): Set[Bake] = {
val allBakes = recipeIds.flatMap(listBakes)
val oldBakes = allBakes.filter { bake =>
val duration = new Duration(bake.startedAt, now)
duration.getStandardDays > MAX_AGE
}
val recipeUsage = getRecipeUsage(oldBakes)
val usedBakes = recipeUsage.bakeUsage.map(_.bake).distinct.toSet
oldBakes -- usedBakes
}
}
class MarkOldUnusedBakesForDeletion(prismAgents: PrismData, dynamo: Dynamo)
extends HousekeepingJob
with Loggable {
override val schedule = SimpleScheduleBuilder.repeatHourlyForever(1)
override def housekeep(): Unit = {
implicit val implicitPrismAgents: PrismData = prismAgents
implicit val implicitDynamo: Dynamo = dynamo
log.info(s"Started marking old, unused bakes for deletion")
val now = new DateTime()
val recipeIds = Recipes.list().map(_.id).toSet
val oldUnusedBakes = MarkOldUnusedBakesForDeletion.getOldUnusedBakes(
recipeIds,
now,
Bakes.list,
RecipeUsage.apply
)
if (oldUnusedBakes.nonEmpty)
log.info(
s"Found ${oldUnusedBakes.size} unused bakes over ${MarkOldUnusedBakesForDeletion.MAX_AGE} days old"
)
val bakesToMark =
oldUnusedBakes.take(MarkOldUnusedBakesForDeletion.BATCH_SIZE)
if (bakesToMark.nonEmpty)
log.info(s"Marking ${bakesToMark.size} unused bakes for deletion")
bakesToMark.foreach { bake =>
Bakes.markToDelete(bake.bakeId)
log.info(s"Marked ${bake.bakeId} for deletion")
}
}
}