1/**
2 * Controller for log
3 *
4 * @module app/serverHealth
5 * @exports logController
6 * @name logController
7 */
8
9window.angular && (function(angular) {
10  'use strict';
11  angular.module('app.serverHealth')
12      .config([
13        'paginationTemplateProvider',
14        function(paginationTemplateProvider) {
15          paginationTemplateProvider.setString(
16              require('../../common/directives/dirPagination.tpl.html'));
17        }
18      ])
19      .controller('logController', [
20        '$scope', '$window', 'APIUtils', 'dataService', 'Constants',
21        '$routeParams', '$filter',
22        function(
23            $scope, $window, APIUtils, dataService, Constants, $routeParams,
24            $filter) {
25          $scope.dataService = dataService;
26          $scope.logs = [];
27          $scope.filteredLogs = [];
28          $scope.tmz = '';
29          $scope.itemsPerPage = Constants.PAGINATION.LOG_ITEMS_PER_PAGE;
30          $scope.loading = false;
31          var expandedSelectedIdOnce = false;
32
33          var sensorType = $routeParams.type;
34          var eventId = $routeParams.id;
35
36          // priority buttons
37          $scope.selectedSeverity =
38              {all: true, low: false, medium: false, high: false};
39
40          if (sensorType == 'high') {
41            $scope.selectedSeverity.all = false;
42            $scope.selectedSeverity.high = true;
43          }
44
45          $scope.selectedStatus = {all: true, resolved: false};
46
47          $scope.customSearch = '';
48          $scope.searchItems = [];
49          $scope.selectedEvents = [];
50
51          if (eventId) {
52            $scope.customSearch = '#' + eventId;
53            $scope.searchItems.push('#' + eventId);
54          }
55
56          $scope.loadLogs = function() {
57            $scope.loading = true;
58            APIUtils.getLogs().then(function(result) {
59              if (eventId && expandedSelectedIdOnce == false) {
60                var log = result.data.filter(function(item) {
61                  return item.Id == eventId;
62                });
63
64                if (log.length) {
65                  log[0].meta = true;
66                }
67                expandedSelectedIdOnce = true;
68              }
69              dataService.updateServerHealth(result.data);
70              $scope.logs = result.data;
71              $scope.originalData = result.original;
72              $scope.loading = false;
73            });
74          };
75          $scope.jsonData = function(data) {
76            return JSON.stringify(data);
77          };
78
79          $scope.filterBySeverity = function(log) {
80            if ($scope.selectedSeverity.all) return true;
81
82            return (
83                (log.severity_flags.low && $scope.selectedSeverity.low) ||
84                (log.severity_flags.medium && $scope.selectedSeverity.medium) ||
85                (log.severity_flags.high && $scope.selectedSeverity.high));
86          };
87
88          $scope.filterByStatus = function(log) {
89            if ($scope.selectedStatus.all) return true;
90            return (
91                (log.Resolved && $scope.selectedStatus.resolved) ||
92                (!log.Resolved && !$scope.selectedStatus.resolved));
93          };
94
95          $scope.filterByDate = function(log) {
96            var endDate;
97            if ($scope.end_date &&
98                typeof $scope.end_date.getTime === 'function') {
99              endDate = new Date($scope.end_date.getTime());
100              endDate.setTime(endDate.getTime() + 86399000);
101            }
102
103            if ($scope.start_date && endDate) {
104              return (
105                  log.Timestamp >= $scope.start_date &&
106                  log.Timestamp <= endDate);
107            } else {
108              return true;
109            }
110          };
111
112          $scope.filterBySearchTerms = function(log) {
113            const searchableProperties = [
114              'eventID', 'severity_code', 'description', 'priority',
115              'additional_data', 'type', 'logId'
116            ];
117            let matched = false;
118
119            if (!$scope.searchItems.length) return true;
120            for (const searchTerm of $scope.searchItems) {
121              if (matched) {
122                break;
123              }
124              for (const prop of searchableProperties) {
125                const propVal = log[prop];
126                if (propVal &&
127                    propVal.toLowerCase().indexOf(searchTerm) !== -1) {
128                  matched = true;
129                  break;
130                }
131              }
132            }
133            return matched;
134          };
135
136          $scope.addSearchItem = function(searchTerms) {
137            var terms = searchTerms.split(' ');
138            terms.forEach(function(searchTerm) {
139              if ($scope.searchItems.indexOf(searchTerm) == -1) {
140                $scope.searchItems.push(searchTerm.toLowerCase());
141              }
142            });
143          };
144
145          $scope.clearSearchItem = function(searchTerm) {
146            $scope.searchItems = [];
147          };
148
149          $scope.removeSearchItem = function(searchTerm) {
150            var termIndex = $scope.searchItems.indexOf(searchTerm);
151
152            if (termIndex > -1) {
153              $scope.searchItems.splice(termIndex, 1);
154            }
155          };
156
157          $scope.$watch('all', function() {
158            $scope.filteredLogs.forEach(function(item) {
159              item.selected = $scope.all;
160            });
161          });
162
163          function updateExportData() {
164            $scope.export_name = ($scope.selectedEvents.length == 1) ?
165                $scope.selectedEvents[0].Id + '.json' :
166                'export.json';
167            var data = {};
168            $scope.selectedEvents.forEach(function(item) {
169              data[item.data.key] = item.data.value;
170            });
171            $scope.export_data = JSON.stringify(data);
172          }
173
174          $scope.accept = function() {
175            APIUtils.deleteLogs($scope.selectedEvents).then(function() {
176              $scope.confirm = false;
177              $scope.loadLogs();
178            });
179          };
180
181          $scope.resolve = function() {
182            var events = $scope.selectedEvents.filter(function(item) {
183              return item.Resolved != 1;
184            });
185
186            if (!events.length) return;
187
188            APIUtils.resolveLogs(events).then(
189                function(data) {
190                  events.forEach(function(item) {
191                    item.Resolved = 1;
192                  });
193                },
194                function(error) {
195                  // TODO: Show error to user
196                  console.log(JSON.stringify(error));
197                });
198          };
199
200          $scope.$watch('logs', function() {
201            $scope.selectedEvents = $scope.logs.filter(function(item) {
202              return item.selected;
203            });
204            updateExportData();
205          }, true);
206
207          $scope.loadLogs();
208        }
209      ]);
210})(angular);
211