Skip to content

Commit

Permalink
#12 Make customFields and metrics mandatory (even if empty)
Browse files Browse the repository at this point in the history
  • Loading branch information
To-om authored and nadouani committed Jul 24, 2017
1 parent a80b352 commit aa502d0
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 11 deletions.
19 changes: 10 additions & 9 deletions thehive-backend/app/models/Case.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,19 @@ package models
import java.util.Date
import javax.inject.{ Inject, Provider, Singleton }

import scala.concurrent.{ ExecutionContext, Future }
import scala.math.BigDecimal.{ int2bigDecimal, long2bigDecimal }
import play.api.Logger
import play.api.libs.json._
import play.api.libs.json.JsValue.jsValueToJsLookup
import play.api.libs.json.Json.toJsFieldJsValueWrapper
import models.JsonFormat.{ caseImpactStatusFormat, caseResolutionStatusFormat, caseStatusFormat }
import org.elastic4play.JsonFormat.dateFormat
import org.elastic4play.models.{ AttributeDef, BaseEntity, EntityDef, HiveEnumeration, ModelDef, AttributeFormat F, AttributeOption O }
import org.elastic4play.services.{ FindSrv, SequenceSrv }
import models.JsonFormat.{ caseImpactStatusFormat, caseResolutionStatusFormat, caseStatusFormat }
import play.api.Logger
import play.api.libs.json.JsValue.jsValueToJsLookup
import play.api.libs.json.Json.toJsFieldJsValueWrapper
import play.api.libs.json._
import services.{ AuditedModel, CaseSrv }

import scala.concurrent.{ ExecutionContext, Future }
import scala.math.BigDecimal.{ int2bigDecimal, long2bigDecimal }

object CaseStatus extends Enumeration with HiveEnumeration {
type Type = Value
val Open, Resolved, Deleted = Value
Expand Down Expand Up @@ -42,13 +43,13 @@ trait CaseAttributes { _: AttributeDef ⇒
val flag: A[Boolean] = attribute("flag", F.booleanFmt, "Flag of the case", false)
val tlp: A[Long] = attribute("tlp", F.numberFmt, "TLP level", 2L)
val status: A[CaseStatus.Value] = attribute("status", F.enumFmt(CaseStatus), "Status of the case", CaseStatus.Open)
val metrics: A[Option[JsValue]] = optionalAttribute("metrics", F.metricsFmt, "List of metrics")
val metrics: A[JsValue] = attribute("metrics", F.metricsFmt, "List of metrics")
val resolutionStatus: A[Option[CaseResolutionStatus.Value]] = optionalAttribute("resolutionStatus", F.enumFmt(CaseResolutionStatus), "Resolution status of the case")
val impactStatus: A[Option[CaseImpactStatus.Value]] = optionalAttribute("impactStatus", F.enumFmt(CaseImpactStatus), "Impact status of the case")
val summary: A[Option[String]] = optionalAttribute("summary", F.textFmt, "Summary of the case, to be provided when closing a case")
val mergeInto: A[Option[String]] = optionalAttribute("mergeInto", F.stringFmt, "Id of the case created by the merge")
val mergeFrom: A[Seq[String]] = multiAttribute("mergeFrom", F.stringFmt, "Id of the cases merged")
val customFields: A[Option[JsValue]] = optionalAttribute("customFields", F.customFields, "Custom fields")
val customFields: A[JsValue] = attribute("customFields", F.customFields, "Custom fields")
}

@Singleton
Expand Down
21 changes: 19 additions & 2 deletions thehive-backend/app/services/CaseMergeSrv.scala
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,7 @@ class CaseMergeSrv @Inject() (
private[services] def mergeMetrics(cases: Seq[Case]): JsObject = {
val metrics = for {
caze cases
metrics caze.metrics()
metricsObject metrics.asOpt[JsObject]
metricsObject caze.metrics().asOpt[JsObject]
} yield metricsObject

val mergedMetrics: Seq[(String, JsValue)] = metrics.flatMap(_.keys).distinct.map { key
Expand All @@ -116,6 +115,23 @@ class CaseMergeSrv @Inject() (
JsObject(mergedMetrics)
}

private[services] def mergeCustomFields(cases: Seq[Case]): JsObject = {
val customFields = for {
caze cases
customFieldsObject caze.customFields().asOpt[JsObject]
} yield customFieldsObject

val mergedCustomFieldsObject: Seq[(String, JsValue)] = customFields.flatMap(_.keys).distinct.map { key
val customFieldsValues = customFields.flatMap(cf (cf \ key).asOpt[JsObject]).distinct
if (customFieldsValues.size != 1)
key JsNull
else
key customFieldsValues.head
}

JsObject(mergedCustomFieldsObject)
}

private[services] def baseFields(entity: BaseEntity): Fields = Fields(entity.attributes - "_id" - "_routing" - "_parent" - "_type" - "createdBy" - "createdAt" - "updatedBy" - "updatedAt" - "user")

private[services] def mergeLogs(oldTask: Task, newTask: Task)(implicit authContext: AuthContext): Future[Done] = {
Expand Down Expand Up @@ -253,6 +269,7 @@ class CaseMergeSrv @Inject() (
.set("tlp", JsNumber(cases.map(_.tlp()).max))
.set("status", JsString(CaseStatus.Open.toString))
.set("metrics", mergeMetrics(cases))
.set("customFields", mergeCustomFields(cases))
.set("resolutionStatus", mergeResolutionStatus(cases))
.set("impactStatus", mergeImpactStatus(cases))
.set("summary", mergeSummary(cases))
Expand Down

0 comments on commit aa502d0

Please sign in to comment.