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            if (!$scope.searchItems.length) return true;
114
115            for (var i = 0, length = $scope.searchItems.length; i < length;
116                 i++) {
117              if (log.search_text.indexOf(
118                      $scope.searchItems[i].toLowerCase()) == -1)
119                return false;
120            }
121            return true;
122          };
123
124          $scope.addSearchItem = function(searchTerms) {
125            var terms = searchTerms.split(' ');
126            terms.forEach(function(searchTerm) {
127              if ($scope.searchItems.indexOf(searchTerm) == -1) {
128                $scope.searchItems.push(searchTerm);
129              }
130            });
131          };
132
133          $scope.clearSearchItem = function(searchTerm) {
134            $scope.searchItems = [];
135          };
136
137          $scope.removeSearchItem = function(searchTerm) {
138            var termIndex = $scope.searchItems.indexOf(searchTerm);
139
140            if (termIndex > -1) {
141              $scope.searchItems.splice(termIndex, 1);
142            }
143          };
144
145          $scope.$watch('all', function() {
146            $scope.filteredLogs.forEach(function(item) {
147              item.selected = $scope.all;
148            });
149          });
150
151          function updateExportData() {
152            $scope.export_name = ($scope.selectedEvents.length == 1) ?
153                $scope.selectedEvents[0].Id + '.json' :
154                'export.json';
155            var data = {};
156            $scope.selectedEvents.forEach(function(item) {
157              data[item.data.key] = item.data.value;
158            });
159            $scope.export_data = JSON.stringify(data);
160          }
161
162          $scope.accept = function() {
163            APIUtils.deleteLogs($scope.selectedEvents).then(function() {
164              $scope.confirm = false;
165              $scope.loadLogs();
166            });
167          };
168
169          $scope.resolve = function() {
170            var events = $scope.selectedEvents.filter(function(item) {
171              return item.Resolved != 1;
172            });
173
174            if (!events.length) return;
175
176            APIUtils.resolveLogs(events).then(
177                function(data) {
178                  events.forEach(function(item) {
179                    item.Resolved = 1;
180                  });
181                },
182                function(error) {
183                  // TODO: Show error to user
184                  console.log(JSON.stringify(error));
185                });
186          };
187
188          $scope.$watch('logs', function() {
189            $scope.selectedEvents = $scope.logs.filter(function(item) {
190              return item.selected;
191            });
192            updateExportData();
193          }, true);
194
195          $scope.loadLogs();
196        }
197      ]);
198})(angular);
199