app/controllers/DeleteController.scala (48 lines of code) (raw):
package controllers
import akka.actor.ActorSystem
import akka.stream.{ActorMaterializer, Materializer}
import helpers.{ESClientManager, ZonedDateTimeEncoder}
import javax.inject.{Inject, Singleton}
import play.api.{Configuration, Logger}
import play.api.libs.Files.TemporaryFileCreator
import play.api.libs.circe.Circe
import play.api.mvc.{AbstractController, ControllerComponents, RequestHeader}
import responses.GenericErrorResponse
import io.circe.syntax._
import io.circe.generic.auto._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
@Singleton
class DeleteController @Inject()(playConfig:Configuration,cc:ControllerComponents,
defaultTempFileCreator:TemporaryFileCreator, esClientMgr:ESClientManager)(implicit system:ActorSystem)
extends AbstractController(cc) with ZonedDateTimeEncoder with Circe {
import com.sksamuel.elastic4s.http.ElasticDsl._
import com.sksamuel.elastic4s.circe._
private val logger = Logger(getClass)
implicit def materializer:Materializer = ActorMaterializer()
private val client = esClientMgr.getClient()
protected val indexName = playConfig.get[String]("elasticsearch.indexName")
protected val loginsIndex = playConfig.get[String]("elasticsearch.loginsIndexName")
def deleteComputerRecord(hostName:String) = client.execute {
deleteById(indexName, "entry", hostName)
}
def deleteUserRecordsForComputer(hostName:String) = client.execute {
deleteByQuery(loginsIndex, "login", matchQuery("hostname.keyword",hostName))
}
def deleteFor(hostName:String) = Action.async {
Future.sequence(
Seq(
deleteComputerRecord(hostName),
deleteUserRecordsForComputer(hostName)
)).map(results=>{
val failures=results.collect({case Left(err)=>err})
if(failures.nonEmpty){
failures.foreach(f=>logger.error(f.toString))
InternalServerError(GenericErrorResponse("db_error",failures.map(_.toString).mkString(",")).asJson)
} else {
Ok(GenericErrorResponse("ok", s"$hostName records deleted").asJson)
}
}
)
}
}