in client-play-json-v30/src/main/scala/com/gu/targeting/client/Campaign.scala [79:105]
def fetch(url: String, limit: Int = 100, ruleLimit: Option[Int] = None, tagLimit: Option[Int] = None)(implicit ec: ExecutionContext): Future[CampaignCache] = {
val queryUrl = url + s"?activeOnly=true&limit=$limit&types=${Fields.allTypes.mkString(",")}"
Future {
val response = HttpClients.createDefault().execute(new HttpGet(queryUrl))
val status = response.getStatusLine.getStatusCode
if (!(200 to 299).contains(status)) {
throw TargetingServiceException(s"Failed to get campaign list, status code: $status")
}
val body = Source.fromInputStream(response.getEntity.getContent).getLines().mkString("")
// Total campaigns number, used to indicate to the client how many campaigns they've truncated
val header = response.getFirstHeader(TOTAL_CAMPAIGNS_HEADER_NAME)
val totalCampaigns = Try(header.getValue.toInt).toOption
val campaigns = Json.parse(body).as[List[Campaign]].filter(campaign => {
// Is the number of rules less than or equal to the limit?
ruleLimit.forall(campaign.rules.length <= _) &&
// And all of the rules have too many required or lacking tags
tagLimit.forall(limit => campaign.rules.forall(rule => rule.requiredTags.length + rule.lackingTags.length <= limit))
})
CampaignCache(campaigns, totalCampaigns)
}
}