Skip to content

Commit

Permalink
#1483 Add search tasks in case API
Browse files Browse the repository at this point in the history
  • Loading branch information
To-om committed Nov 13, 2020
1 parent 7ff9c1c commit 9779089
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 30 deletions.
31 changes: 16 additions & 15 deletions thehive/app/org/thp/thehive/controllers/v0/QueryCtrl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -93,24 +93,25 @@ trait QueryCtrl {
} yield aggs.map(a => filteredQuery andThen new AggregationQuery(db, queryExecutor.publicProperties, filterQuery).toQuery(a))
}

val searchParser: FieldsParser[Query] = FieldsParser[Query]("search") {
case (_, field) =>
for {
maybeInputFilter <- inputFilterParser.optional(field.get("query"))
filteredQuery =
maybeInputFilter
.map(inputFilter => filterQuery.toQuery(inputFilter))
.fold(publicData.initialQuery)(publicData.initialQuery.andThen)
inputSort <- sortParser(field.get("sort"))
sortedQuery = filteredQuery andThen new SortQuery(db, queryExecutor.publicProperties).toQuery(inputSort)
outputParam <- outputParamParser.optional(field).map(_.getOrElse(OutputParam(0, 10, withStats = false, withParents = 0)))
outputQuery = publicData.pageQuery.toQuery(outputParam)
} yield sortedQuery andThen outputQuery
}
def searchParser(initialQuery: Query = publicData.initialQuery): FieldsParser[Query] =
FieldsParser[Query]("search") {
case (_, field) =>
for {
maybeInputFilter <- inputFilterParser.optional(field.get("query"))
filteredQuery =
maybeInputFilter
.map(inputFilter => filterQuery.toQuery(inputFilter))
.fold(initialQuery)(initialQuery.andThen)
inputSort <- sortParser(field.get("sort"))
sortedQuery = filteredQuery andThen new SortQuery(db, queryExecutor.publicProperties).toQuery(inputSort)
outputParam <- outputParamParser.optional(field).map(_.getOrElse(OutputParam(0, 10, withStats = false, withParents = 0)))
outputQuery = publicData.pageQuery.toQuery(outputParam)
} yield sortedQuery andThen outputQuery
}

def search: Action[AnyContent] =
entrypoint(s"search ${publicData.entityName}")
.extract("query", searchParser)
.extract("query", searchParser())
.auth { implicit request =>
val query: Query = request.body("query")
queryExecutor.execute(query, request)
Expand Down
14 changes: 7 additions & 7 deletions thehive/app/org/thp/thehive/controllers/v0/Router.scala
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,13 @@ class Router @Inject() (
case DELETE(p"/case/share/$shareId") => shareCtrl.removeShare(shareId)
case PATCH(p"/case/share/$shareId") => shareCtrl.updateShare(shareId)

case GET(p"/case/task") => taskCtrl.search
case POST(p"/case/$caseId/task") => taskCtrl.create(caseId) // Audit ok
case GET(p"/case/task/$taskId") => taskCtrl.get(taskId)
case PATCH(p"/case/task/$taskId") => taskCtrl.update(taskId) // Audit ok
case POST(p"/case/task/_search") => taskCtrl.search
case POST(p"/case/task/_stats") => taskCtrl.stats
//case POST(p"/case/$caseId/task/_search") => taskCtrl.search
case GET(p"/case/task") => taskCtrl.search
case POST(p"/case/$caseId/task") => taskCtrl.create(caseId) // Audit ok
case GET(p"/case/task/$taskId") => taskCtrl.get(taskId)
case PATCH(p"/case/task/$taskId") => taskCtrl.update(taskId) // Audit ok
case POST(p"/case/task/_search") => taskCtrl.search
case POST(p"/case/task/_stats") => taskCtrl.stats
case POST(p"/case/$caseId/task/_search") => taskCtrl.searchInCase(caseId)

//case GET(p"/case/task/$taskId/log") => logCtrl.findInTask(taskId)
//case POST(p"/case/task/$taskId/log/_search") => logCtrl.findInTask(taskId)
Expand Down
19 changes: 12 additions & 7 deletions thehive/app/org/thp/thehive/controllers/v0/TaskCtrl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,18 @@ class TaskCtrl @Inject() (
}
}

// def searchInCase(caseId: String): Action[AnyContent] =
// entrypoint("search task in case")
// .extract("query", searchParser)
// .auth { implicit request =>
// val query: Query = request.body("query")
// queryExecutor.execute(query, request)
// }
def searchInCase(caseId: String): Action[AnyContent] =
entrypoint("search task in case")
.extract(
"query",
searchParser(
Query.init[Traversal.V[Task]]("tasksInCase", (graph, authContext) => caseSrv.get(caseId)(graph).visible(authContext).tasks(authContext))
)
)
.auth { implicit request =>
val query: Query = request.body("query")
queryExecutor.execute(query, request)
}
}

@Singleton
Expand Down
24 changes: 23 additions & 1 deletion thehive/test/org/thp/thehive/controllers/v0/TaskCtrlTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.thp.thehive.controllers.v0

import java.util.Date

import akka.stream.Materializer
import io.scalaland.chimney.dsl._
import org.thp.scalligraph.models.Database
import org.thp.scalligraph.traversal.TraversalOps._
Expand Down Expand Up @@ -163,6 +164,27 @@ class TaskCtrlTest extends PlaySpecification with TestAppBuilder {

}

"search tasks in case" in testApp { app =>
val request = FakeRequest("POST", "/api/case/task/_stats")
.withHeaders("user" -> "[email protected]")
.withJsonBody(Json.parse(s"""{
"query":{
"order": 1
}
}"""))
val result = app[TaskCtrl].search(request)
val t = TestTask(
title = "case 1 task 2",
group = Some("group1"),
description = Some("description task 2"),
status = "Waiting",
flag = true,
order = 1
)
val tasks = contentAsJson(result)(defaultAwaitTimeout, app[Materializer]).as[Seq[OutputTask]]
tasks.map(TestTask.apply) should contain(t)
}

"get tasks stats" in testApp { app =>
val case1 = app[Database].roTransaction(graph => app[CaseSrv].startTraversal(graph).has("title", "case#1").getOrFail("Case"))

Expand Down Expand Up @@ -209,7 +231,7 @@ class TaskCtrlTest extends PlaySpecification with TestAppBuilder {
}""".stripMargin
)
)
val result = app[Database].roTransaction(_ => app[TaskCtrl].stats(request))
val result = app[TaskCtrl].stats(request)

status(result) must equalTo(200)

Expand Down

0 comments on commit 9779089

Please sign in to comment.