app/controllers/BanditDataController.scala (42 lines of code) (raw):
package controllers
import com.gu.googleauth.AuthAction
import com.typesafe.scalalogging.LazyLogging
import io.circe.syntax.EncoderOps
import play.api.mvc.{AbstractController, Action, ActionBuilder, AnyContent, ControllerComponents, Result}
import services.{BigQueryService, DynamoBanditData}
import utils.Circe.noNulls
import zio.{IO, ZEnv, ZIO}
import scala.concurrent.{ExecutionContext, Future}
import scala.util.Try
class BanditDataController(
authAction: ActionBuilder[AuthAction.UserIdentityRequest, AnyContent],
components: ControllerComponents,
stage: String,
runtime: zio.Runtime[ZEnv],
dynamo: DynamoBanditData,
bigQueryService: BigQueryService,
)(implicit ec: ExecutionContext) extends AbstractController(components) with LazyLogging {
private def run(f: => ZIO[ZEnv, Throwable, Result]): Future[Result] =
runtime.unsafeRunToFuture {
f.catchAll(error => {
logger.error(s"Returning InternalServerError to client: ${error.getMessage}", error)
IO.succeed(InternalServerError(error.getMessage))
})
}
def getDataForTest(channel: String, testName: String): Action[AnyContent] = authAction.async { request =>
run {
val sampleCount: Option[Int] = request.getQueryString("sampleCount").flatMap(s => Try(Integer.parseInt(s)).toOption)
dynamo
.getDataForTest(testName, channel, sampleCount)
.map(data => Ok(noNulls(data.asJson)))
}
}
def getLTVDataForTest(testName: String, channel: String): Action[AnyContent] = authAction.async {
run {
val result = bigQueryService.getLTV3Data(testName, channel, stage.toLowerCase)
result.map {data=>
Ok(noNulls(data.asJson))
}
}
}
}