app/services/OktaUserService.scala (25 lines of code) (raw):
package services
import com.okta.sdk.resource.api.UserApi
import com.okta.sdk.resource.client.{ApiClient, ApiException}
import model.User
import play.api.Logging
import play.api.libs.ws.WSClient
import utils.FutureHelper.tryAsync
import scala.concurrent.{ExecutionContext, Future}
import scala.util.Failure
import scala.util.chaining.scalaUtilChainingOps
class OktaUserService(userApi: UserApi, orgUrl: String, ws: WSClient)(implicit ctx: ExecutionContext) extends Logging {
def healthCheck(): Future[Unit] =
ws
.url(s"$orgUrl/.well-known/openid-configuration")
.get()
.map(_ => ())
.tap(_.onComplete {
case Failure(exception) => logger.error(s"Health check failed: ${exception.getMessage}")
case _ => ()
})
def fetchUserByOktaId(oktaId: String): Future[Option[User]] =
tryAsync(userApi.getUser(oktaId)).map(user => Some(User.fromOktaUser(user))).recover {
case e: ApiException if e.getCode == 404 => None
}
}