Skip to content

Commit

Permalink
#557 Fix error when a merged case is deleted
Browse files Browse the repository at this point in the history
  • Loading branch information
To-om committed May 29, 2018
1 parent b676b4c commit 7b019e3
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 16 deletions.
4 changes: 2 additions & 2 deletions thehive-backend/app/controllers/SearchCtrl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import javax.inject.{ Inject, Singleton }
import scala.concurrent.{ ExecutionContext, Future }

import play.api.http.Status
import play.api.libs.json.{ JsObject, Json }
import play.api.libs.json.JsObject
import play.api.mvc.{ AbstractController, Action, ControllerComponents }

import models.Roles
Expand Down Expand Up @@ -56,7 +56,7 @@ class SearchCtrl @Inject() (
findSrv.apply(model, and(globalQuery ::: query), agg: _*)
}
.map { statsResults
renderer.toOutput(OK, statsResults.reduceOption(_ deepMerge _).getOrElse(Json.obj()))
renderer.toOutput(OK, statsResults.reduceOption(_ deepMerge _).getOrElse(JsObject.empty))
}
}
}
41 changes: 28 additions & 13 deletions thehive-backend/app/models/Case.scala
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,20 @@ trait CaseAttributes { _: AttributeDef ⇒

@Singleton
class CaseModel @Inject() (
artifactModel: Provider[ArtifactModel],
taskModel: Provider[TaskModel],
caseSrv: Provider[CaseSrv],
alertModel: Provider[AlertModel],
artifactModelProvider: Provider[ArtifactModel],
taskModelProvider: Provider[TaskModel],
caseSrvProvider: Provider[CaseSrv],
alertModelProvider: Provider[AlertModel],
sequenceSrv: SequenceSrv,
findSrv: FindSrv,
implicit val ec: ExecutionContext) extends ModelDef[CaseModel, Case]("case", "Case", "/case") with CaseAttributes with AuditedModel { caseModel

private[CaseModel] lazy val logger = Logger(getClass)
private lazy val logger = Logger(getClass)
private lazy val artifactModel = artifactModelProvider.get
private lazy val taskModel = taskModelProvider.get
private lazy val caseSrv = caseSrvProvider.get
private lazy val alertModel = alertModelProvider.get

override val defaultSortBy = Seq("-startDate")
override val removeAttribute: JsObject = Json.obj("status" CaseStatus.Deleted)

Expand All @@ -90,7 +95,7 @@ class CaseModel @Inject() (
private[models] def buildArtifactStats(caze: Case): Future[JsObject] = {
import org.elastic4play.services.QueryDSL._
findSrv(
artifactModel.get,
artifactModel,
and(
parent("case", withId(caze.id)),
"status" ~= "Ok"),
Expand All @@ -103,7 +108,7 @@ class CaseModel @Inject() (
private[models] def buildTaskStats(caze: Case): Future[JsObject] = {
import org.elastic4play.services.QueryDSL._
findSrv(
taskModel.get,
taskModel,
and(
parent("case", withId(caze.id)),
"status" in ("Waiting", "InProgress", "Completed")),
Expand All @@ -120,34 +125,44 @@ class CaseModel @Inject() (

private[models] def buildMergeIntoStats(caze: Case): Future[JsObject] = {
caze.mergeInto()
.fold(Future.successful(Json.obj())) { mergeCaseId
caseSrv.get.get(mergeCaseId).map { c
.fold(Future.successful(JsObject.empty)) { mergeCaseId
caseSrv.get(mergeCaseId).map { c
Json.obj("mergeInto" Json.obj(
"caseId" c.caseId(),
"title" c.title()))
}
.recover {
case _ Json.obj("mergeInto" Json.obj(
"caseId" "<deleted>",
"title" "<deleted>"))
}
}
}

private[models] def buildMergeFromStats(caze: Case): Future[JsObject] = {
Future
.traverse(caze.mergeFrom()) { id
caseSrv.get.get(id).map { c
caseSrv.get(id).map { c
Json.obj(
"caseId" c.caseId(),
"title" c.title())
}
.recover {
case _ Json.obj(
"caseId" "<deleted>",
"title" "<deleted>")
}
}
.map {
case mf if mf.nonEmpty Json.obj("mergeFrom" mf)
case _ Json.obj()
case _ JsObject.empty
}
}

private[models] def buildAlertStats(caze: Case): Future[JsObject] = {
import org.elastic4play.services.QueryDSL._
findSrv(
alertModel.get,
alertModel,
"case" ~= caze.id,
groupByField("type", groupByField("source", selectCount)))
.map { alertStatsJson
Expand All @@ -172,7 +187,7 @@ class CaseModel @Inject() (
} yield taskStats ++ artifactStats ++ alertStats ++ mergeIntoStats ++ mergeFromStats
case other
logger.warn(s"Request caseStats from a non-case entity ?! ${other.getClass}:$other")
Future.successful(Json.obj())
Future.successful(JsObject.empty)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class JobReplicateActor @Inject() (
.mapAsyncUnordered(5) { job
val baseFields = Fields(job.attributes - "_id" - "_routing" - "_parent" - "_type" - "_version" - "createdBy" - "createdAt" - "updatedBy" - "updatedAt" - "user")
val createdJob = cortexSrv.create(newArtifact, baseFields)(authContext)
createdJob.failed.foreach(error => logger.error(s"Fail to create job under artifact ${newArtifact.id}\n\tjob attributes: $baseFields", error))
createdJob.failed.foreach(error logger.error(s"Fail to create job under artifact ${newArtifact.id}\n\tjob attributes: $baseFields", error))
createdJob
}
.runWith(Sink.ignore)
Expand Down

0 comments on commit 7b019e3

Please sign in to comment.