app/controllers/V2App.scala (136 lines of code) (raw):

package controllers import com.amazonaws.services.dynamodbv2.AmazonDynamoDB import org.scanamo._ import org.scanamo.syntax._ import model.{ClipboardCard, FeatureSwitch, UserData, UserDataForDefaults} import scala.concurrent.ExecutionContext import com.gu.facia.client.models.{Metadata, TargetedTerritory} import model.editions.{CuratedPlatform, EditionsAppTemplates, FeastAppTemplates} import org.apache.hc.core5.reactor.Command.Priority import permissions.Permissions import play.api.libs.json.Json import services.editions.db.EditionsDB import software.amazon.awssdk.services.dynamodb.DynamoDbClient import switchboard.SwitchManager import util.{AccessGranted, Acl, AclJson} class V2App( isDev: Boolean, val acl: Acl, dynamoClient: DynamoDbClient, db: EditionsDB, val deps: BaseFaciaControllerComponents )(implicit ec: ExecutionContext) extends BaseFaciaController(deps) { import model.UserData._ def editionIndex(issueId: String) = index(s"issues/${issueId}", Some(issueId)) def index(priority: String = "", issueId: Option[String] = None) = getCollectionPermissionFilterByPriority(priority, acl)(ec) { implicit req => val editingEdition = issueId.isDefined val isFeast = issueId .flatMap(id => db.getIssue(id).map(issue => issue.platform == CuratedPlatform.Feast) ) .getOrElse(false) import org.scanamo.generic.auto._ val userDataTable = Table[UserData](config.faciatool.userDataTable) val jsFileName = "dist/index.js" val cssFileName = "dist/index.css" val faviconDirectoryName = "favicon/" val jsLocation: String = routes.V2Assets.at(jsFileName).toString val cssLocation: String = routes.V2Assets.at(cssFileName).toString val faviconLocation: String = routes.V2Assets.at(faviconDirectoryName).toString val hasBreakingNews = acl.testUser( Permissions.BreakingNewsAlert, "facia-tool-allow-breaking-news-for-all" )(req.user.email) val hasConfigureFronts = acl.testUser( Permissions.ConfigureFronts, "facia-tool-allow-config-for-all" )(req.user.email) val hasEditionsPermissions = acl.testUser( Permissions.EditEditions, "facia-tool-allow-edit-editions-for-all" )(req.user.email) val pinboardPermission = acl.testUser(Permissions.Pinboard, "facia-tool-allow-pinboard-for-all")( req.user.email ) val acls = AclJson( fronts = Map(config.faciatool.breakingNewsFront -> hasBreakingNews), editions = Map(config.faciatool.canEditEditions -> hasEditionsPermissions), permissions = Map("configure-config" -> hasConfigureFronts) ) val userEmail: String = req.user.email val maybeUserData: Option[UserData] = Scanamo(dynamoClient) .exec(userDataTable.get("email" === userEmail)) .flatMap(_.toOption) val clipboardCards = if (editingEdition) { if (isFeast) maybeUserData.map( _.feastEditionsClipboardCards .getOrElse(List()) .map(ClipboardCard.apply) ) else maybeUserData.map( _.editionsClipboardArticles .getOrElse(List()) .map(ClipboardCard.apply) ) } else maybeUserData.map( _.clipboardArticles.getOrElse(List()).map(ClipboardCard.apply) ) val userDataForDefaults = UserDataForDefaults.fromUserData( maybeUserData.getOrElse(UserData(userEmail)), clipboardCards ) val conf = Defaults( isDev, config.environment.stage, Seq("uk", "us", "au"), userEmail, req.user.avatarUrl, req.user.firstName, req.user.lastName, config.sentry.publicDSN, config.media.baseUrl.get, config.media.apiUrl, SwitchManager.getSwitchesAsJson(), acls, config.facia.collectionCap, config.facia.navListCap, config.facia.navListType, Metadata.tags.map { case (_, meta) => meta }, Some(userDataForDefaults), routes.FaciaContentApiProxy.capiLive("").absoluteURL(true), routes.FaciaContentApiProxy.capiPreview("").absoluteURL(true), TargetedTerritory.allTerritories, EditionsAppTemplates.getAvailableTemplates ++ FeastAppTemplates.getAvailableTemplates, telemetryUrl = telemetryUrl ) Ok( views.html.V2App.app( "Fronts Tool", jsLocation, cssLocation, faviconLocation, Json.toJson(conf).toString(), isDev, maybePinboardUrl = pinboardPermission match { case AccessGranted => Some( s"https://pinboard.${config.environment.correspondingToolsDomainSuffix}/pinboard.loader.js" ) case _ => None }, maybeTelemetryUrl = Some(telemetryUrl) ) ) } }