app/controllers/Support.scala (36 lines of code) (raw):
package controllers
import com.gu.contentapi.client.IAMSigner
import config.{AWS, Config}
import play.api.Logging
import play.api.libs.ws.WSClient
import play.api.mvc.{BaseController, ControllerComponents, Result}
import java.net.URI
import scala.concurrent.Future
class Support(val controllerComponents: ControllerComponents, val wsClient: WSClient, config: Config, val pandaAuthActions: PanDomainAuthActions) extends BaseController with Logging {
import pandaAuthActions.APIAuthAction
implicit val executionContext = controllerComponents.executionContext
private val signer = new IAMSigner(
credentialsProvider = config.capiPreviewCredentials,
awsRegion = AWS.region.getName
)
private def getHeaders(url: String): Seq[(String,String)] = signer.addIAMHeaders(headers = Map.empty, uri = URI.create(url)).toSeq
def capiProxy(path: String) = APIAuthAction.async { request =>
query(s"${config.capiLiveUrl}/$path?api-key=${config.capiApiKey}&${request.rawQueryString}", Seq.empty)
}
def previewCapiProxy(path: String) = APIAuthAction.async { request =>
val url = s"${config.capiPreviewIAMUrl}/$path?${request.rawQueryString}"
query(url, getHeaders(url))
}
def query(url: String, headers: Seq[(String, String)]): Future[Result] = {
val req = wsClient
.url(url)
.withHttpHeaders(headers: _*)
.get()
req.map(response => response.status match {
case 200 => Ok(response.json)
case _ =>
logger.warn(s"CAPI error response: ${response.status} / ${response.body}")
BadGateway(s"CAPI returned error code ${response.status}")
})
}
}