app/logic/EditionsChecker.scala (108 lines of code) (raw):
package logic
import model.editions.{EditionsCollection, EditionsFront, EditionsIssue}
object EditionsChecker {
/*
* Checks in order of precedence, as provided by Katy
*
* Empty containers that are unhidden
* Container with content that are hidden
* Unhidden special fronts with no content
* Hidden fronts with content
*
*/
def checkIssue(issue: EditionsIssue): List[String] =
if (issue.fronts.isEmpty)
List(
s"Issue is empty"
) // This is actually almost impossible because the templates don't let you!
else if (issue.fronts.forall(_.isHidden))
List(s"Issue contains no visible fronts")
else
checkFronts(issue.fronts)
private def checkFronts(fronts: List[EditionsFront]): List[String] = {
(
checkFrontsCollections(fronts)
:::
visibleEmptyFronts(fronts)
:::
invisibleNonEmptyFronts(fronts)
:::
visibleDefaultNameFronts(fronts)
)
}
private def checkFrontsCollections(fronts: List[EditionsFront]) = {
fronts.flatMap(front => {
if (!front.isHidden)
checkCollections(front, front.collections)
else
List()
})
}
private def visibleEmptyFronts(fronts: List[EditionsFront]) =
fronts.collect {
case front
if (!front.isHidden && front.collections
.flatMap(c => c.items)
.isEmpty) =>
s"Front '${front.displayName}' is visible and empty"
}
private def invisibleNonEmptyFronts(fronts: List[EditionsFront]) =
fronts.collect {
case front
if (front.isHidden && !front.collections
.flatMap(c => c.items)
.isEmpty) =>
s"Front '${front.displayName}' is hidden but has content"
}
private def visibleDefaultNameFronts(fronts: List[EditionsFront]) = {
fronts
.filter(front => !front.isHidden)
.map(front =>
front.metadata
.flatMap(m => m.nameOverride)
.getOrElse(front.displayName)
)
.filter(s => s.matches("^Top Special.*"))
.map(s => {
s"Front '${s}' is visible and has default name"
})
}
private def checkCollections(
front: EditionsFront,
collections: List[EditionsCollection]
): List[String] = {
(
visibleEmptyCollections(front, collections)
:::
invisibleNonEmptyCollections(front, collections)
:::
visibleDefaultNameCollections(front, collections)
)
}
private def visibleDefaultNameCollections(
front: EditionsFront,
collections: List[EditionsCollection]
) = {
collections
.filter(collection =>
collection.displayName.matches("^Special Container.*")
)
.filter(collection => !collection.isHidden)
.map(collection =>
s"Collection '${collection.displayName}' in '${front.displayName}' is visible and has default name"
)
}
private def visibleEmptyCollections(
front: EditionsFront,
collections: List[EditionsCollection]
) = {
collections
.filter(collection => collection.items.isEmpty)
.filter(collection => !collection.isHidden)
.map(collection =>
s"Collection '${collection.displayName}' in '${front.displayName}' is visible and empty"
)
}
private def invisibleNonEmptyCollections(
front: EditionsFront,
collections: List[EditionsCollection]
) = {
collections
.filter(collection => !collection.items.isEmpty)
.filter(collection => collection.isHidden)
.map(collection =>
s"Collection '${collection.displayName}' in '${front.displayName}' is hidden but has content"
)
}
}