registration/app/registration/services/topic/TopicValidator.scala (30 lines of code) (raw):

package registration.services.topic import models.Topic import registration.auditor.AuditorGroup import registration.services.Configuration import scala.concurrent.{ExecutionContext, Future} trait TopicValidator { def removeInvalid(topics: Set[Topic]): Future[Either[TopicValidatorError, Set[Topic]]] } trait TopicValidatorError { def reason: String def topicsQueried: Set[Topic] } final class AuditorTopicValidator(configuration: Configuration, auditors: AuditorGroup)(implicit ec: ExecutionContext) extends TopicValidator { override def removeInvalid(topics: Set[Topic]): Future[Either[TopicValidatorError, Set[Topic]]] = auditors .queryEach { _.expiredTopics(topics) } .map(expired => topics -- expired.flatten) .map(limitTopics(configuration.maxTopics)) .map(Right.apply) .recover { case e: Throwable => Left(AuditorClientError(e.getMessage, topics)) } private def limitTopics(maxTopics: Int)(topics: Set[Topic]): Set[Topic] = topics.toList .sortWith(_.`type`.priority > _.`type`.priority) .take(maxTopics) .toSet case class AuditorClientError(reason: String, topicsQueried: Set[Topic]) extends TopicValidatorError }