Skip to content

Commit

Permalink
#1561 Fix output when observable creation request contains attachment…
Browse files Browse the repository at this point in the history
… and data
  • Loading branch information
To-om committed Nov 13, 2020
1 parent 5f9bf24 commit 730909b
Showing 1 changed file with 32 additions and 28 deletions.
60 changes: 32 additions & 28 deletions thehive/app/org/thp/thehive/controllers/v0/ObservableCtrl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -49,41 +49,45 @@ class ObservableCtrl @Inject() (
observableType <- observableTypeSrv.getOrFail(EntityName(inputObservable.dataType))
} yield (case0, observableType)
}
.flatMap {
.map {
case (case0, observableType) =>
db
.tryTransaction { implicit graph =>
inputObservable
.attachment
.map { a =>
val initialSuccessesAndFailures: (Seq[JsValue], Seq[JsValue]) = inputObservable
.attachment
.map { attachmentFile =>
db
.tryTransaction { implicit graph =>
observableSrv
.create(inputObservable.toObservable, observableType, a, inputObservable.tags, Nil)
.create(inputObservable.toObservable, observableType, attachmentFile, inputObservable.tags, Nil)
.flatMap(o => caseSrv.addObservable(case0, o).map(_ => o.toJson))
}
.flip
.fold(
e =>
Nil -> Seq(
errorHandler.toErrorResult(e)._2 ++ Json
.obj("object" -> Json.obj("attachment" -> Json.obj("name" -> attachmentFile.filename)))
),
s => Seq(s) -> Nil
)
}
.map {
case None =>
val (successes, failures) = inputObservable
.data
.foldLeft(Seq.empty[JsValue] -> Seq.empty[JsValue]) {
case ((successes, failures), data) =>
db
.tryTransaction { implicit graph =>
observableSrv
.create(inputObservable.toObservable, observableType, data, inputObservable.tags, Nil)
.flatMap(o => caseSrv.addObservable(case0, o).map(_ => o.toJson))
}
.fold(
failure =>
(successes, failures :+ errorHandler.toErrorResult(failure)._2 ++ Json.obj("object" -> Json.obj("data" -> data))),
success => (successes :+ success, failures)
)
.getOrElse(Nil -> Nil)

val (successes, failures) = inputObservable
.data
.foldLeft(initialSuccessesAndFailures) {
case ((successes, failures), data) =>
db
.tryTransaction { implicit graph =>
observableSrv
.create(inputObservable.toObservable, observableType, data, inputObservable.tags, Nil)
.flatMap(o => caseSrv.addObservable(case0, o).map(_ => o.toJson))
}
if (failures.isEmpty) Results.Created(JsArray(successes))
else Results.MultiStatus(Json.obj("success" -> successes, "failure" -> failures))
case Some(output) => Results.Created(output)
.fold(
failure => (successes, failures :+ errorHandler.toErrorResult(failure)._2 ++ Json.obj("object" -> Json.obj("data" -> data))),
success => (successes :+ success, failures)
)
}
if (failures.isEmpty) Results.Created(JsArray(successes))
else Results.MultiStatus(Json.obj("success" -> successes, "failure" -> failures))
}
}

Expand Down

0 comments on commit 730909b

Please sign in to comment.