app/permissions/SectionSpecificPermissions.scala (46 lines of code) (raw):
package permissions
import com.gu.pandomainauth.action.UserRequest
import com.gu.permissions.PermissionDefinition
import play.api.mvc.{ActionFilter, AnyContent, Result, Results}
import scala.concurrent.{Future, ExecutionContext}
object SectionPermissionMap {
def apply(isMicrosite: Boolean): Option[PermissionDefinition] = {
isMicrosite match {
case true => None
case _ => Some(Permissions.TagAdmin)
}
}
}
trait SectionSpecificPermissionActionFilter extends ActionFilter[UserRequest] {
val testAccess: PermissionDefinition => String => Boolean;
val restrictedAction: String
def commonTestAccess: PermissionDefinition => String => Boolean =
Permissions.testUser
override def filter[A](request: UserRequest[A]): Future[Option[Result]] = {
request.body match {
case b: AnyContent => {
b.asJson.map { json =>
val isMicrosite = (json \ "isMicrosite").as[Boolean]
val permission = SectionPermissionMap(isMicrosite).getOrElse { return Future.successful(None) }
val hasAccess = testAccess(permission)(request.user.email)
if (hasAccess) {
return Future.successful(None)
} else {
return Future.successful(Some(Results.Unauthorized))
}
}.getOrElse {
Future.successful(Some(Results.BadRequest("Expecting Json data")))
}
}
case _ => Future.successful(Some(Results.BadRequest("Expecting body content")))
}
}
}
case class UpdateSectionPermissionsCheck()(implicit val executionContext: ExecutionContext) extends SectionSpecificPermissionActionFilter {
val testAccess: PermissionDefinition => String => Boolean = commonTestAccess
val restrictedAction = "update section"
}
case class CreateSectionPermissionsCheck()(implicit val executionContext: ExecutionContext) extends SectionSpecificPermissionActionFilter {
val testAccess: PermissionDefinition => String => Boolean = commonTestAccess
val restrictedAction = "create section"
}