diff --git a/thehive-backend/app/controllers/ReportTemplate.scala b/thehive-backend/app/controllers/ReportTemplate.scala new file mode 100644 index 0000000000..31b1ccfd12 --- /dev/null +++ b/thehive-backend/app/controllers/ReportTemplate.scala @@ -0,0 +1,64 @@ +package controllers + +import javax.inject.{ Inject, Singleton } + +import scala.concurrent.ExecutionContext + +import play.api.http.Status +import play.api.mvc.Controller + +import org.elastic4play.Timed +import org.elastic4play.controllers.{ Authenticated, FieldsBodyParser, Renderer } +import org.elastic4play.models.JsonFormat.baseModelEntityWrites +import org.elastic4play.services.{ QueryDSL, QueryDef, Role } +import org.elastic4play.services.AuxSrv +import org.elastic4play.services.JsonFormat.queryReads + +import services.ReportTemplateSrv + +@Singleton +class ReportTemplateCtrl @Inject() ( + reportTemplateSrv: ReportTemplateSrv, + auxSrv: AuxSrv, + authenticated: Authenticated, + renderer: Renderer, + fieldsBodyParser: FieldsBodyParser, + implicit val ec: ExecutionContext) extends Controller with Status { + + @Timed + def create = authenticated(Role.admin).async(fieldsBodyParser) { implicit request ⇒ + reportTemplateSrv.create(request.body) + .map(reportTemplate ⇒ renderer.toOutput(CREATED, reportTemplate)) + } + + @Timed + def get(id: String) = authenticated(Role.read).async { implicit request ⇒ + reportTemplateSrv.get(id) + .map(reportTemplate ⇒ renderer.toOutput(OK, reportTemplate)) + } + + @Timed + def update(id: String) = authenticated(Role.admin).async(fieldsBodyParser) { implicit request ⇒ + reportTemplateSrv.update(id, request.body) + .map(reportTemplate ⇒ renderer.toOutput(OK, reportTemplate)) + } + + @Timed + def delete(id: String) = authenticated(Role.admin).async { implicit request ⇒ + reportTemplateSrv.delete(id) + .map(_ ⇒ NoContent) + } + + @Timed + def find = authenticated(Role.read).async(fieldsBodyParser) { implicit request ⇒ + val query = request.body.getValue("query").fold[QueryDef](QueryDSL.any)(_.as[QueryDef]) + val range = request.body.getString("range") + val sort = request.body.getStrings("sort").getOrElse(Nil) + val nparent = request.body.getLong("nparent").getOrElse(0L).toInt + val withStats = request.body.getBoolean("nstats").getOrElse(false) + + val (reportTemplates, total) = reportTemplateSrv.find(query, range, sort) + val reportTemplatesWithStats = auxSrv(reportTemplates, nparent, withStats) + renderer.toOutput(OK, reportTemplatesWithStats, total) + } +} \ No newline at end of file diff --git a/thehive-backend/app/services/ReportTemplateSrv.scala b/thehive-backend/app/services/ReportTemplateSrv.scala new file mode 100644 index 0000000000..13481fba63 --- /dev/null +++ b/thehive-backend/app/services/ReportTemplateSrv.scala @@ -0,0 +1,58 @@ +package services + +import javax.inject.{ Inject, Singleton } + +import scala.concurrent.{ ExecutionContext, Future } +import scala.util.Try + +import akka.NotUsed +import akka.stream.scaladsl.Source + +import play.api.Logger +import play.api.libs.json.JsObject + +import org.elastic4play.controllers.Fields +import org.elastic4play.services.{ Agg, AuthContext, CreateSrv, DeleteSrv, FindSrv, GetSrv, QueryDef, UpdateSrv } + +import models.{ ReportTemplate, ReportTemplateModel } + +@Singleton +class ReportTemplateSrv @Inject() ( + reportTemplateModel: ReportTemplateModel, + createSrv: CreateSrv, + artifactSrv: ArtifactSrv, + getSrv: GetSrv, + updateSrv: UpdateSrv, + deleteSrv: DeleteSrv, + findSrv: FindSrv, + implicit val ec: ExecutionContext) { + + lazy val log = Logger(getClass) + + def create(fields: Fields)(implicit authContext: AuthContext): Future[ReportTemplate] = { + createSrv[ReportTemplateModel, ReportTemplate](reportTemplateModel, fields) + } + + def get(id: String): Future[ReportTemplate] = + getSrv[ReportTemplateModel, ReportTemplate](reportTemplateModel, id) + + def update(id: String, fields: Fields)(implicit authContext: AuthContext): Future[ReportTemplate] = + updateSrv[ReportTemplateModel, ReportTemplate](reportTemplateModel, id, fields) + + def bulkUpdate(ids: Seq[String], fields: Fields)(implicit authContext: AuthContext): Future[Seq[Try[ReportTemplate]]] = { + updateSrv[ReportTemplateModel, ReportTemplate](reportTemplateModel, ids, fields) + } + + def delete(id: String)(implicit Context: AuthContext): Future[ReportTemplate] = + deleteSrv[ReportTemplateModel, ReportTemplate](reportTemplateModel, id) + + def find(queryDef: QueryDef, range: Option[String], sortBy: Seq[String]): (Source[ReportTemplate, NotUsed], Future[Long]) = { + findSrv[ReportTemplateModel, ReportTemplate](reportTemplateModel, queryDef, range, sortBy) + } + + def stats(queryDef: QueryDef, aggs: Seq[Agg]): Future[JsObject] = findSrv(reportTemplateModel, queryDef, aggs: _*) + + def getStats(id: String): Future[JsObject] = { + Future.successful(JsObject(Nil)) + } +} \ No newline at end of file diff --git a/thehive-backend/conf/routes b/thehive-backend/conf/routes index ca05053d7d..2e30f5eaae 100644 --- a/thehive-backend/conf/routes +++ b/thehive-backend/conf/routes @@ -26,6 +26,12 @@ GET /api/case/template/:caseTemplateId controllers.CaseTemplateCtrl.g PATCH /api/case/template/:caseTemplateId controllers.CaseTemplateCtrl.update(caseTemplateId) DELETE /api/case/template/:caseTemplateId controllers.CaseTemplateCtrl.delete(caseTemplateId) +POST /api/report/template/_search controllers.ReportTemplateCtrl.find() +POST /api/report/template controllers.ReportTemplateCtrl.create() +GET /api/report/template/:caseTemplateId controllers.ReportTemplateCtrl.get(caseTemplateId) +PATCH /api/report/template/:caseTemplateId controllers.ReportTemplateCtrl.update(caseTemplateId) +DELETE /api/report/template/:caseTemplateId controllers.ReportTemplateCtrl.delete(caseTemplateId) + POST /api/case/artifact/_search controllers.ArtifactCtrl.find() POST /api/case/:caseId/artifact/_search controllers.ArtifactCtrl.findInCase(caseId) POST /api/case/artifact/_stats controllers.ArtifactCtrl.stats()