app/models/ServerTokenDAORedis.scala (41 lines of code) (raw):

package models import akka.actor.ActorSystem import akka.stream.Materializer import javax.inject.{Inject, Singleton} import play.api.Configuration import io.circe.generic.auto._ import io.circe.syntax._ import org.slf4j.LoggerFactory import scala.concurrent.Future @Singleton class ServerTokenDAORedis @Inject() (config:Configuration) (override protected implicit val actorSystem:ActorSystem, override implicit val mat:Materializer) extends ServerTokenDAO { private final val logger = LoggerFactory.getLogger(getClass) lazy val redisClient = scredis.Client( host = config.get[String]("redis.host"), port = config.getOptional[Int]("redis.port").getOrElse(6379), passwordOpt = config.getOptional[String]("redis.password") ) override def get(tokenValue: String): Future[Option[ServerTokenEntry]] = redisClient.get(s"vaultdoor:servertoken:$tokenValue") .map(_.map(io.circe.parser.parse)).flatMap({ case None=>Future(None) case Some(Left(parseError))=> logger.error(s"Could not parse content for server token '$tokenValue' from redis: ${parseError.toString}, deleting it") redisClient.del(s"vaultdoor:servertoken:$tokenValue").map(_=>None) case Some(Right(json))=> json.as[ServerTokenEntry] match { case Left(marshalErr)=> logger.error(s"Could not marshal content for server token '$tokenValue from redis: ${marshalErr.toString}, deleting it") redisClient.del(s"vaultdoor:servertoken:$tokenValue").map(_=>None) case Right(tok)=> Future(Some(tok)) } }) override def put(entry: ServerTokenEntry, expiresIn:Int): Future[Boolean] = { redisClient.setEX(s"vaultdoor:servertoken:${entry.value}",entry.asJson.noSpaces, expiresIn).map(_=>true) } override def remove(tokenValue:String):Future[Boolean] = redisClient.del(s"vaultdoor:servertoken:$tokenValue").map(_=>true) override def finalize(): Unit = { redisClient.quit() } }