app/controllers/PlutoWorkingGroupController.scala (82 lines of code) (raw):

package controllers import akka.actor.ActorRef import javax.inject._ import models.{PlutoWorkingGroup, PlutoWorkingGroupRow, PlutoWorkingGroupSerializer} import play.api.cache.SyncCacheApi import play.api.db.slick.DatabaseConfigProvider import play.api.libs.json.{JsResult, JsValue, Json} import play.api.mvc.{ControllerComponents, Request} import slick.jdbc.PostgresProfile import slick.lifted.TableQuery import slick.jdbc.PostgresProfile.api._ import akka.pattern.ask import auth.BearerTokenAuth import play.api.Configuration import services.{CreateOperation, UpdateOperation} import scala.concurrent.Future import scala.util.{Failure, Success, Try} import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ import scala.language.postfixOps @Singleton class PlutoWorkingGroupController @Inject() (override val controllerComponents:ControllerComponents, override val bearerTokenAuth:BearerTokenAuth, dbConfigProvider:DatabaseConfigProvider, cacheImpl:SyncCacheApi, override implicit val config:Configuration, @Named("rabbitmq-propagator") val rabbitMqPropagator:ActorRef) extends GenericDatabaseObjectController[PlutoWorkingGroup] with PlutoWorkingGroupSerializer { implicit val timeout:akka.util.Timeout = 55 seconds implicit val db = dbConfigProvider.get[PostgresProfile].db implicit val cache:SyncCacheApi = cacheImpl override def selectall(startAt: Int, limit: Int): Future[Try[(Int,Seq[PlutoWorkingGroup])]] = selectall(startAt, limit, None) def selectall(startAt: Int, limit: Int, withHidden:Option[Boolean]): Future[Try[(Int,Seq[PlutoWorkingGroup])]] = { val initialQuery = TableQuery[PlutoWorkingGroupRow].drop(startAt).take(limit) val finalQuery = withHidden match { case None=>initialQuery case Some(true)=>initialQuery case Some(false)=>initialQuery.filter(_.hide===false) } db.run( TableQuery[PlutoWorkingGroupRow].length.result.zip( finalQuery.sortBy(_.name.asc.nullsLast).result ) ).map(Success(_)).recover(Failure(_)) } def list(startAt:Int, limit: Int, showHidden:Option[Boolean]) = IsAuthenticatedAsync {uid=>{request=> selectall(startAt, limit, showHidden).map({ case Success((count, result))=>Ok(Json.obj("status"->"ok","count"->count, "result"->this.jstranslate(result))) case Failure(error)=> logger.error(error.toString) InternalServerError(Json.obj("status"->"error","detail"->error.toString)) }) }} override def selectid(requestedId: Int): Future[Try[Seq[PlutoWorkingGroup]]] = db.run( TableQuery[PlutoWorkingGroupRow].filter(_.id===requestedId).sortBy(_.name.asc.nullsLast).result.asTry ) override def insert(entry: PlutoWorkingGroup, uid: String): Future[Try[Int]] = db.run( (TableQuery[PlutoWorkingGroupRow] returning TableQuery[PlutoWorkingGroupRow].map(_.id) += entry).asTry) .map ({ case suc@Success(newEntryId)=> sendToRabbitMq(CreateOperation(), entry.copy(id=Some(newEntryId)), rabbitMqPropagator) suc case err@Failure(_)=>err }) override def deleteid(requestedId: Int):Future[Try[Int]] = db.run( TableQuery[PlutoWorkingGroupRow].filter(_.id === requestedId).delete.asTry ) override def dbupdate(itemId: Int, entry:PlutoWorkingGroup):Future[Try[Int]] = { val newRecord = entry.id match { case Some(id)=>entry case None=>entry.copy(id=Some(itemId)) } db.run(TableQuery[PlutoWorkingGroupRow].filter(_.id===itemId).update(newRecord).asTry) .map(rows => { sendToRabbitMq(UpdateOperation(), itemId, rabbitMqPropagator) rows }) } /*these are handled through implict translation*/ override def jstranslate(result:Seq[PlutoWorkingGroup]):Json.JsValueWrapper = result override def jstranslate(result:PlutoWorkingGroup):Json.JsValueWrapper = result override def validate(request: Request[JsValue]): JsResult[PlutoWorkingGroup] = request.body.validate[PlutoWorkingGroup] }