media-api/app/lib/usagerights/CostCalculator.scala (42 lines of code) (raw):
package lib.usagerights
import com.gu.mediaservice.model._
import lib.UsageQuota
trait CostCalculator {
val defaultCost: Cost = Pay
val freeSuppliers: List[String]
val suppliersCollectionExcl: Map[String, List[String]]
val quotas: UsageQuota
private def getAgencyCost(agencyUsageRights: Agency): Option[Cost] = {
val supplier = agencyUsageRights.supplier
val isFreeFromAgency = isFreeSupplier(supplier) && !agencyUsageRights.suppliersCollection.exists(isExcludedColl(supplier, _))
if (isFreeFromAgency) {
if (isOverQuota(agencyUsageRights)) {
Some(Overquota)
} else {
Some(Free)
}
} else {
None
}
}
def isConditional(usageRights: UsageRights): Boolean =
getCost(usageRights) == Conditional
def isPay(usageRights: UsageRights): Boolean =
getCost(usageRights) == Pay
def isOverQuota(usageRights: UsageRights): Boolean = quotas.isOverQuota(usageRights)
def getCost(usageRights: UsageRights): Cost = {
val restricted: Option[Cost] = usageRights.restrictions.map(r => Conditional)
val categoryCost: Option[Cost] = usageRights.defaultCost
val supplierCost: Option[Cost] = usageRights match {
case u: Agency => getAgencyCost(u)
case _ => None
}
restricted
.orElse(categoryCost)
.orElse(supplierCost)
.getOrElse(defaultCost)
}
private def isFreeSupplier(supplier: String) = freeSuppliers.contains(supplier)
private def isExcludedColl(supplier: String, supplierColl: String) =
suppliersCollectionExcl.get(supplier).exists(_.contains(supplierColl))
}