diff --git a/frontend/app/scripts/controllers/alert/AlertStatsCtrl.js b/frontend/app/scripts/controllers/alert/AlertStatsCtrl.js index 61ed1c7d03..4883fb8ff1 100644 --- a/frontend/app/scripts/controllers/alert/AlertStatsCtrl.js +++ b/frontend/app/scripts/controllers/alert/AlertStatsCtrl.js @@ -5,7 +5,7 @@ 'use strict'; angular.module('theHiveControllers').controller('AlertStatsCtrl', - function($rootScope, $scope, $stateParams, $timeout, StatSrv, StreamStatSrv, FilteringSrv) { + function($rootScope, $scope, $stateParams, $timeout, StatSrv, StreamQuerySrv, FilteringSrv) { var self = this; this.filtering = FilteringSrv; @@ -17,44 +17,80 @@ self.$onInit = function() { // Get stats by tags - StreamStatSrv({ + StreamQuerySrv('v1', [ + { _name: 'listAlert' }, + { + _name: 'aggregation', + _agg: 'field', + _field: 'tags', + _select: [ + { _agg: 'count' } + ], + _order: [ '-count' ], + _size: 5 + } + ], { scope: $scope, rootId: 'any', - query: {}, objectType: 'alert', - field: 'tags', - sort: ['-count'], - limit: 5, - result: {}, - success: function(data){ + query: { + params: { + name: 'alert-by-tags-stats' + } + }, + onUpdate: function(data) { self.byTags = StatSrv.prepareResult(data); } }); - // Get stats by type - StreamStatSrv({ + // Get stats by read status + StreamQuerySrv('v1', [ + { _name: 'listAlert' }, + { + _name: 'aggregation', + _agg: 'field', + _field: 'read', + _select: [ + { _agg: 'count' } + ] + } + ], { scope: $scope, rootId: 'any', - query: {}, objectType: 'alert', - field: 'status', - result: {}, - success: function(data){ + query: { + params: { + name: 'alert-by-read-status-stats' + } + }, + onUpdate: function(data) { self.byStatus = StatSrv.prepareResult(data); } }); // Get stats by ioc - StreamStatSrv({ + StreamQuerySrv('v1', [ + { _name: 'listAlert' }, + { + _name: 'aggregation', + _agg: 'field', + _field: 'type', + _select: [ + { _agg: 'count' } + ], + _order: [ '-count' ], + _size: 5 + } + ], { scope: $scope, rootId: 'any', - query: {}, objectType: 'alert', - field: 'type', - sort: ['-count'], - limit: 5, - result: {}, - success: function(data){ + query: { + params: { + name: 'alert-by-type-stats' + } + }, + onUpdate: function(data) { self.byType = StatSrv.prepareResult(data); } }); diff --git a/frontend/app/scripts/controllers/case/CaseListCtrl.js b/frontend/app/scripts/controllers/case/CaseListCtrl.js index f0661cab85..93e0e1a5bd 100644 --- a/frontend/app/scripts/controllers/case/CaseListCtrl.js +++ b/frontend/app/scripts/controllers/case/CaseListCtrl.js @@ -49,16 +49,17 @@ }); + // Case stats to build quick filter menu StreamQuerySrv('v1', [ { - "_name": "listCase" + _name: 'listCase' }, { - "_name": "aggregation", - "_agg": "field", - "_field": "status", - "_select": [ - {"_agg": "count"} + _name: 'aggregation', + _agg: 'field', + _field: 'status', + _select: [ + {_agg: 'count'} ] } ], { @@ -67,13 +68,32 @@ objectType: 'case', query: { params: { - name: "case-status-stats" + name: 'case-status-stats' } }, onUpdate: function(updates) { self.caseStats = updates; } }); + + // Case total + StreamQuerySrv('v1', [ + {_name: 'listCase'}, + {_name: 'count'} + ], { + scope: $scope, + rootId: 'any', + objectType: 'case', + query: { + params: { + name: 'case-count-stats' + } + }, + onUpdate: function(updates) { + self.caseCount = updates; + } + }); + }; this.load = function() { @@ -91,7 +111,7 @@ operations: [ {'_name': 'listCase'} ], - extraData: ["observableStats", "taskStats", "isOwner", "shareCount", "permissions"], + extraData: ['observableStats', 'taskStats', 'isOwner', 'shareCount', 'permissions'], onUpdate: function() { self.resetSelection(); } diff --git a/frontend/app/scripts/controllers/case/CaseMainCtrl.js b/frontend/app/scripts/controllers/case/CaseMainCtrl.js index 5f675e047e..f6b5e9763a 100644 --- a/frontend/app/scripts/controllers/case/CaseMainCtrl.js +++ b/frontend/app/scripts/controllers/case/CaseMainCtrl.js @@ -144,15 +144,6 @@ } }); - // $scope.alerts = StreamStatSrv({ - // scope: $scope, - // rootId: caseId, - // query: { 'case': caseId }, - // result: {}, - // objectType: 'alert', - // field: 'type' - // }); - $scope.$on('tasks:task-removed', function(event, task) { CaseTabsSrv.removeTab('task-' + task._id); }); diff --git a/frontend/app/scripts/controllers/case/CaseStatsCtrl.js b/frontend/app/scripts/controllers/case/CaseStatsCtrl.js index ce0b87773c..d734fbf453 100644 --- a/frontend/app/scripts/controllers/case/CaseStatsCtrl.js +++ b/frontend/app/scripts/controllers/case/CaseStatsCtrl.js @@ -5,7 +5,7 @@ 'use strict'; angular.module('theHiveControllers').controller('CaseStatsCtrl', - function($rootScope, $scope, $stateParams, $timeout, StatSrv, StreamStatSrv) { + function($rootScope, $scope, $stateParams, $timeout, StatSrv, StreamQuerySrv) { var self = this; this.byResolution = {}; @@ -13,65 +13,83 @@ this.byTags = {}; self.$onInit = function() { - // Get stats by tags - StreamStatSrv({ + StreamQuerySrv('v1', [ + { _name: 'listCase' }, + { + _name: 'aggregation', + _agg: 'field', + _field: 'tags', + _select: [ + { _agg: 'count' } + ], + _order: [ '-count' ], + _size: 5 + } + ], { scope: $scope, rootId: 'any', - query: {}, objectType: 'case', - field: 'tags', - sort: ['-count'], - limit: 5, - result: {}, - success: function(data){ + query: { + params: { + name: 'case-by-tags-stats' + } + }, + onUpdate: function(data) { self.byTags = StatSrv.prepareResult(data); } }); - // Get stats by type - StreamStatSrv({ + // Get stats by status + StreamQuerySrv('v1', [ + { _name: 'listCase' }, + { + _name: 'aggregation', + _agg: 'field', + _field: 'status', + _select: [ + { _agg: 'count' } + ] + } + ], { scope: $scope, rootId: 'any', - query: {}, objectType: 'case', - field: 'status', - result: {}, - success: function(data){ + query: { + params: { + name: 'case-by-status-stats' + } + }, + onUpdate: function(data) { self.byStatus = StatSrv.prepareResult(data); } }); - // Get stats by ioc - StreamStatSrv({ + // Get stats by resolution status + StreamQuerySrv('v1', [ + { _name: 'listCase' }, + { + _name: 'aggregation', + _agg: 'field', + _field: 'resolutionStatus', + _select: [ + { _agg: 'count' } + ] + } + ], { scope: $scope, rootId: 'any', - query: {}, objectType: 'case', - field: 'resolutionStatus', - result: {}, - success: function(data){ + query: { + params: { + name: 'case-by-resolution-status-stats' + } + }, + onUpdate: function(data) { self.byResolution = StatSrv.prepareResult(data); } }); }; - - // this.prepareResult = function(rawStats) { - // var total = rawStats.count; - // - // var keys = _.without(_.keys(rawStats), 'count'); - // var columns = keys.map(function(key) { - // return { - // key: key, - // count: rawStats[key].count - // }; - // }); - // - // return { - // total: total, - // details: _.sortBy(columns, 'count').reverse() - // }; - // }; } ); })(); diff --git a/frontend/app/scripts/controllers/case/ObservablesStatsCtrl.js b/frontend/app/scripts/controllers/case/ObservablesStatsCtrl.js index b93b8f50b8..59a22251af 100644 --- a/frontend/app/scripts/controllers/case/ObservablesStatsCtrl.js +++ b/frontend/app/scripts/controllers/case/ObservablesStatsCtrl.js @@ -5,69 +5,97 @@ 'use strict'; angular.module('theHiveControllers').controller('ObservablesStatsCtrl', - function($rootScope, $scope, $stateParams, $timeout, StatSrv, StreamStatSrv) { + function($rootScope, $scope, $stateParams, $timeout, StatSrv, StreamQuerySrv) { var self = this; this.byType = {}; this.byIoc = {}; this.byTags = {}; - var defaultQuery = { - '_and': [{ - '_parent': { - '_type': 'case', - '_query': { - '_id': $stateParams.caseId - } - } - }, { - 'status': 'Ok' - }] - }; - self.$onInit = function() { + var caseId = $stateParams.caseId; // Get stats by tags - StreamStatSrv({ + StreamQuerySrv('v1', [ + { _name: 'getCase', idOrName: caseId }, + { _name: 'observables' }, + { + _name: 'aggregation', + _agg: 'field', + _field: 'tags', + _select: [ + { _agg: 'count' } + ], + _order: [ '-count' ], + _size: 10 + } + ], { scope: $scope, - rootId: $stateParams.caseId, - query: defaultQuery, + rootId: caseId, objectType: 'case_artifact', - field: 'tags', - sort: ['_count'], - limit: 10, - result: {}, - success: function(data){ + query: { + params: { + name: 'observables-by-tags-stats-' + caseId + } + }, + onUpdate: function(data) { self.byTags = StatSrv.prepareResult(data); } }); + // Get stats by type - StreamStatSrv({ + StreamQuerySrv('v1', [ + { _name: 'getCase', idOrName: caseId }, + { _name: 'observables' }, + { + _name: 'aggregation', + _agg: 'field', + _field: 'dataType', + _select: [ + { _agg: 'count' } + ] + } + ], { scope: $scope, - rootId: $stateParams.caseId, - query: defaultQuery, + rootId: caseId, objectType: 'case_artifact', - field: 'dataType', - result: {}, - success: function(data){ + query: { + params: { + name: 'observables-by-type-stats-' + caseId + } + }, + onUpdate: function(data) { self.byType = StatSrv.prepareResult(data); } }); // Get stats by ioc - StreamStatSrv({ + StreamQuerySrv('v1', [ + { _name: 'getCase', idOrName: caseId }, + { _name: 'observables' }, + { + _name: 'aggregation', + _agg: 'field', + _field: 'ioc', + _select: [ + { _agg: 'count' } + ] + } + ], { scope: $scope, - rootId: $stateParams.caseId, - query: defaultQuery, + rootId: caseId, objectType: 'case_artifact', - field: 'ioc', - result: {}, - success: function(data){ + query: { + params: { + name: 'observables-by-ioc-stats-' + caseId + } + }, + onUpdate: function(data) { self.byIoc = StatSrv.prepareResult(data); } }); - }; + }; } ); })(); diff --git a/frontend/app/views/partials/alert/list/mini-stats.html b/frontend/app/views/partials/alert/list/mini-stats.html index 49392c4a0d..183fb1725f 100644 --- a/frontend/app/views/partials/alert/list/mini-stats.html +++ b/frontend/app/views/partials/alert/list/mini-stats.html @@ -8,9 +8,9 @@
{{item.key}} | +{{item.key === 'true' ? 'Read' : 'Unread'}} | - {{item.count}} + {{item.count}} |