app/models/UserProfileDAO.scala (35 lines of code) (raw):

package models import akka.actor.ActorSystem import akka.stream.scaladsl.Sink import akka.stream.{ActorMaterializer, Materializer} import org.scanamo.{DynamoReadError, ScanamoAlpakka, Table} import org.scanamo.syntax._ import org.scanamo.generic.auto._ import com.theguardian.multimedia.archivehunter.common.ZonedDateTimeEncoder import com.theguardian.multimedia.archivehunter.common.clientManagers.DynamoClientManager import com.theguardian.multimedia.archivehunter.common.cmn_helpers.ZonedTimeFormat import javax.inject.{Inject, Singleton} import play.api.Configuration import scala.concurrent.ExecutionContext.Implicits.global @Singleton class UserProfileDAO @Inject() (config:Configuration, ddbClientMgr:DynamoClientManager)(implicit actorSystem:ActorSystem, mat:Materializer) extends ZonedDateTimeEncoder with ZonedTimeFormat { protected val tableName = config.get[String]("auth.userProfileTable") private val table = Table[UserProfile](tableName) private val awsProfile = config.getOptional[String]("externalData.awsProfile") private val scanamoAlpakka = ScanamoAlpakka(ddbClientMgr.getNewAsyncDynamoClient(awsProfile)) private val MakeUserProfileSink = Sink.fold[List[Either[DynamoReadError, UserProfile]], List[Either[DynamoReadError, UserProfile]]](List())(_ ++ _) def userProfileForEmail(userEmail:String) = scanamoAlpakka .exec(table.get("userEmail"===userEmail)) .runWith(Sink.head) def put(userProfile: UserProfile) = scanamoAlpakka .exec(table.put(userProfile)) .runWith(Sink.head) .map(_=>userProfile) def allUsers() = scanamoAlpakka .exec(table.scan()) .runWith(MakeUserProfileSink) def delete(userEmail:String) = scanamoAlpakka .exec(table.delete("userEmail"===userEmail)) .runWith(Sink.head) }