membership-attribute-service/app/filters/AddGuIdentityHeaders.scala (33 lines of code) (raw):

package filters import org.apache.pekko.stream.Materializer import filters.AddGuIdentityHeaders.{identityHeaderNames, xGuIdentityIdHeaderName, xGuMembershipTestUserHeaderName} import models.UserFromToken import play.api.mvc._ import services.IdentityAuthService import scala.concurrent.{ExecutionContext, Future} /* * This is a candidate for inclusion in https://github.com/guardian/memsub-common-play-auth , * this particular version is a tweaked copy from https://github.com/guardian/subscriptions-frontend/blob/ea805479/app/filters/AddGuIdentityHeaders.scala */ class AddGuIdentityHeadersFilter(addGuIdentityHeaders: AddGuIdentityHeaders)(implicit val mat: Materializer, ex: ExecutionContext) extends Filter { def apply(nextFilter: RequestHeader => Future[Result])(request: RequestHeader): Future[Result] = nextFilter(request) flatMap { result => addGuIdentityHeaders.fromIdapiIfMissing(request, result) } } class AddGuIdentityHeaders(identityAuthService: IdentityAuthService, testUserChecker: TestUserChecker) { def fromUser(result: Result, user: UserFromToken): Result = result.withHeaders( xGuIdentityIdHeaderName -> user.identityId, xGuMembershipTestUserHeaderName -> testUserChecker.isTestUser(user.primaryEmailAddress)(user.logPrefix).toString, ) def fromIdapiIfMissing(request: RequestHeader, result: Result)(implicit ex: ExecutionContext): Future[Result] = { if (hasIdentityHeaders(result)) { Future.successful(result) } else identityAuthService.user(requiredScopes = Nil)(request) map { case Right(user) => fromUser(result, user) case Left(_) => result } } def hasIdentityHeaders(result: Result) = identityHeaderNames.forall(result.header.headers.contains) } object AddGuIdentityHeaders { val xGuIdentityIdHeaderName = "X-Gu-Identity-Id" val xGuMembershipTestUserHeaderName = "X-Gu-Membership-Test-User" val identityHeaderNames = Set(xGuIdentityIdHeaderName, xGuMembershipTestUserHeaderName) }