blob: 89f8a6db2dc5ba03fdaf19da433cf4d9ec3e39f9 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {Injectable} from '@angular/core';
import {ListItem} from '@app/classes/list-item';
import {CustomTimeRange, SearchBoxParameter, SortingListItem, TimeUnit, TimeUnitListItem} from '@app/classes/filtering';
import * as moment from 'moment-timezone';
import {HomogeneousObject} from '@app/classes/object';
import {LogsType, SortingType} from '@app/classes/string';
import {UtilsService} from '@app/services/utils.service';
import { LogTypeTab } from '@app/classes/models/log-type-tab';
// @ToDo remove duplication, this options are in the LogsContainerService
export const timeRangeFilterOptions = [{
label: 'filter.timeRange.7d',
value: {
type: 'LAST',
unit: 'd',
interval: 7
},
group: 0
},
{
label: 'filter.timeRange.30d',
value: {
type: 'LAST',
unit: 'd',
interval: 30
},
group: 0
},
{
label: 'filter.timeRange.60d',
value: {
type: 'LAST',
unit: 'd',
interval: 60
},
group: 0
},
{
label: 'filter.timeRange.90d',
value: {
type: 'LAST',
unit: 'd',
interval: 90
},
group: 0
},
{
label: 'filter.timeRange.6m',
value: {
type: 'LAST',
unit: 'M',
interval: 6
},
group: 0
},
{
label: 'filter.timeRange.1y',
value: {
type: 'LAST',
unit: 'y',
interval: 1
},
group: 0
},
{
label: 'filter.timeRange.2y',
value: {
type: 'LAST',
unit: 'y',
interval: 2
},
group: 0
},
{
label: 'filter.timeRange.5y',
value: {
type: 'LAST',
unit: 'y',
interval: 5
},
group: 0
},
{
label: 'filter.timeRange.yesterday',
value: {
type: 'PAST',
unit: 'd'
},
group: 1
},
{
label: 'filter.timeRange.previousWeek',
value: {
type: 'PAST',
unit: 'w'
},
group: 1
},
{
label: 'filter.timeRange.previousMonth',
value: {
type: 'PAST',
unit: 'M'
},
group: 1
},
{
label: 'filter.timeRange.previousYear',
value: {
type: 'PAST',
unit: 'y'
},
group: 1
},
{
label: 'filter.timeRange.today',
value: {
type: 'CURRENT',
unit: 'd'
},
group: 1
},
{
label: 'filter.timeRange.thisWeek',
value: {
type: 'CURRENT',
unit: 'w'
},
group: 1
},
{
label: 'filter.timeRange.thisMonth',
value: {
type: 'CURRENT',
unit: 'M'
},
group: 1
},
{
label: 'filter.timeRange.thisYear',
value: {
type: 'CURRENT',
unit: 'y'
},
group: 1
},
{
label: 'filter.timeRange.5min',
value: {
type: 'LAST',
unit: 'm',
interval: 5
},
group: 2
},
{
label: 'filter.timeRange.15min',
value: {
type: 'LAST',
unit: 'm',
interval: 15
},
group: 2
},
{
label: 'filter.timeRange.30min',
value: {
type: 'LAST',
unit: 'm',
interval: 30
},
group: 2
},
{
label: 'filter.timeRange.1hr',
value: {
type: 'LAST',
unit: 'h',
interval: 1
},
group: 2
},
{
label: 'filter.timeRange.3hr',
value: {
type: 'LAST',
unit: 'h',
interval: 3
},
group: 2
},
{
label: 'filter.timeRange.6hr',
value: {
type: 'LAST',
unit: 'h',
interval: 6
},
group: 2
},
{
label: 'filter.timeRange.12hr',
value: {
type: 'LAST',
unit: 'h',
interval: 12
},
group: 2
},
{
label: 'filter.timeRange.24hr',
value: {
type: 'LAST',
unit: 'h',
interval: 24
},
group: 2
}];
@Injectable()
export class LogsFilteringUtilsService {
readonly defaultFilterSelections = {
clusters: [],
timeRange: {
value: {
type: 'LAST',
unit: 'h',
interval: 1
},
label: 'filter.timeRange.1hr'
},
components: [],
levels: [],
hosts: [],
auditLogsSorting: {
label: 'sorting.time.desc',
value: {
key: 'evtTime',
type: 'desc'
}
},
serviceLogsSorting: {
label: 'sorting.time.desc',
value: {
key: 'logtime',
type: 'desc'
}
},
pageSize: [{
label: '100',
value: '100'
}],
page: 0,
query: [],
users: [],
isUndoOrRedo: false
};
constructor(
private utilsService: UtilsService
) { }
getTimeRandeOptionsByGroup() {
return timeRangeFilterOptions.reduce((groups: any, item: any) => {
const groupItem = {...item};
delete groupItem.group;
groups[item.group] = groups[item.group] || [];
groups[item.group].push(groupItem);
return groups;
}, []);
}
getStartTimeMomentFromTimeUnitListItem(selection: TimeUnitListItem, end: moment.Moment, timeZone: string): moment.Moment | undefined {
let time;
const value = selection && selection.value;
if (value) {
const endTime = end.clone();
switch (value.type) {
case 'LAST':
time = endTime.subtract(value.interval, value.unit);
break;
case 'CURRENT':
time = moment().tz(timeZone).startOf(value.unit);
break;
case 'PAST':
time = endTime.startOf(value.unit);
break;
case 'CUSTOM':
time = value.start;
break;
default:
break;
}
}
return time;
}
getStartTimeFromTimeUnitListItem(selection: TimeUnitListItem, current: string, timeZone: string): string {
const startMoment = this.getStartTimeMomentFromTimeUnitListItem(selection, moment(moment(current).valueOf()), timeZone);
return startMoment ? startMoment.toISOString() : '';
}
getEndTimeMomentFromTimeUnitListItem(selection: TimeUnitListItem, timeZone: string): moment.Moment | undefined {
let time;
const value = selection && selection.value;
if (value) {
switch (value.type) {
case 'LAST':
time = moment();
break;
case 'CURRENT':
time = moment().tz(timeZone).endOf(value.unit);
break;
case 'PAST':
time = moment().tz(timeZone).startOf(value.unit).millisecond(-1);
break;
case 'CUSTOM':
time = value.end;
break;
default:
break;
}
}
return time;
}
getEndTimeFromTimeUnitListItem(selection: TimeUnitListItem, timeZone: string): string {
const endMoment = this.getEndTimeMomentFromTimeUnitListItem(selection, timeZone);
return endMoment ? endMoment.toISOString() : '';
}
getQuery(isExclude: boolean): (value: SearchBoxParameter[]) => string {
return (value: SearchBoxParameter[]): string => {
let parameters;
if (value && value.length) {
parameters = value.filter((item: SearchBoxParameter): boolean => {
return item.isExclude === isExclude;
}).map((parameter: SearchBoxParameter): HomogeneousObject<string> => {
return {
[parameter.name]: parameter.value.replace(/\s/g, '+')
};
});
}
return parameters && parameters.length ? JSON.stringify(parameters) : '';
};
}
getIncludeQuery(value: SearchBoxParameter[]) {
return this.getQuery(false)(value);
}
getExcludeQuery(value: SearchBoxParameter[]) {
return this.getQuery(true)(value);
}
getSortTypeFromSortingListItem(selection: SortingListItem[] = []): SortingType {
return selection && selection[0] && selection[0].value ? selection[0].value.type : 'desc';
}
getSortKeyFromSortingListItem(selection: SortingListItem[] = []): string {
return selection && selection[0] && selection[0].value ? selection[0].value.key : '';
}
getPage(value: number | undefined): string | undefined {
return typeof value === 'undefined' ? value : value.toString();
}
defaultValueGetterFromListItem(selection: ListItem | ListItem[] | null): string {
if (Array.isArray(selection)) {
return selection.map((item: ListItem): any => item.value).join(',');
} else if (selection) {
return selection.value;
} else {
return '';
}
}
getParamsFromActiveFilter(activeFilter: any, activeLogsType: LogsType): {[key: string]: string} {
const {...filters} = activeFilter;
delete filters.isUndoOrRedo;
return Object.keys(filters).reduce((currentParams, key) => {
const newParams = {
...currentParams
};
if (filters[key] !== null && filters[key] !== undefined) {
switch (key) {
case 'auditLogsSorting':
case 'serviceLogsSorting':
if (`${activeLogsType}Sorting` === key) {
const item = Array.isArray(filters[key]) ? filters[key][0] : filters[key];
const itemValue = item && item.value;
if (itemValue) {
Object.assign(newParams, {
sortingKey: itemValue.key,
sortingType: itemValue.type,
});
}
}
break;
case 'query' :
if (filters[key] && Object.keys(filters[key]).length) {
Object.assign(newParams, {
[key]: JSON.stringify(filters[key])
});
}
break;
case 'timeRange' :
if (filters[key].value) {
const timeRangeValue: TimeUnit | CustomTimeRange = filters[key].value;
const timeRangeParams: {[key: string]: string} = {
timeRangeType: timeRangeValue.type
};
if (timeRangeValue.type === 'CUSTOM') {
Object.assign(timeRangeParams, {
timeRangeStart: timeRangeValue.start.toISOString(),
timeRangeEnd: timeRangeValue.end.toISOString()
});
} else {
Object.assign(timeRangeParams, {
timeRangeUnit: timeRangeValue.unit
});
if (timeRangeValue.interval !== undefined) {
Object.assign(timeRangeParams, {
timeRangeInterval: timeRangeValue.interval
});
}
}
Object.assign(newParams, timeRangeParams);
}
break;
default:
const customMethodName: string = 'get' + (key.charAt(0).toUpperCase()) + key.slice(1);
const valueGetter: Function = (
this[customMethodName] || this.defaultValueGetterFromListItem
);
const paramValue = valueGetter(filters[key]);
if (paramValue !== null && paramValue !== undefined && paramValue !== '') {
Object.assign(newParams, {
[key]: paramValue
});
}
break;
}
}
return newParams;
}, {});
}
private getListItemsFromListParamValue = (value: string): ListItem[] => {
return value ? value.split(',').map(this.getListItemFromParamValue) : [];
}
private getListItemFromParamValue = (value: string): ListItem => {
return Object.assign(this.utilsService.getListItemFromString(value), {
isChecked: true
});
}
getFilterFromParams(params: {[key: string]: string}, activeLogsType: LogsType): {[key: string]: any} {
const filter: {[key: string]: any} = {};
const paramsKeys: string[] = Object.keys(params);
return paramsKeys.reduce((currentFilter, key) => {
let newFilter = {};
switch (key) {
case 'clusters':
case 'components':
case 'hosts':
case 'levels':
case 'pageSize':
case 'users':
newFilter = {
[key]: this.getListItemsFromListParamValue(params[key])
};
break;
case 'page' :
newFilter = {
[key]: parseInt(params[key], 0)
};
break;
case 'timeRangeType':
const type = params.timeRangeType || 'LAST';
const interval = params.timeRangeInterval && parseInt(params.timeRangeInterval, 0);
const unit = params.timeRangeUnit;
const timeRangeFilterValue: {[key: string]: any} = {type, unit, interval};
let timeRangeFilterLabel = 'filter.timeRange.';
const timeRangeOption = timeRangeFilterOptions.find((option: any) => {
const value = option.value;
return value.type === type && value.unit === timeRangeFilterValue.unit && value.interval === timeRangeFilterValue.interval;
});
if (timeRangeOption) {
timeRangeFilterLabel = timeRangeOption.label;
} else if (params.timeRangeType !== 'CUSTOM') {
Object.assign(timeRangeFilterValue, {
unit: params.timeRangeUnit,
interval: parseInt(params.timeRangeInterval, 0)
});
timeRangeFilterLabel += `${timeRangeFilterValue.interval}${timeRangeFilterValue.unit}`;
} else {
Object.assign(timeRangeFilterValue, {
start: moment(params.timeRangeStart),
end: moment(params.timeRangeEnd)
});
timeRangeFilterLabel += 'custom';
}
newFilter = {
timeRange: {
label: timeRangeFilterLabel,
value: timeRangeFilterValue
}
};
break;
case 'sortingKey' :
const sortingKey = `${activeLogsType}Sorting`;
newFilter = {
[sortingKey]: {
label: `sorting.time.${params.sortingType}`,
value: {
key: params.sortingKey,
type: params.sortingType
}
}
};
break;
case 'query' :
newFilter = {
query: JSON.parse(params[key])
};
break;
}
return {...currentFilter, ...newFilter};
}, filter);
}
getNavigationForTab(tab: LogTypeTab): any[] {
const logsType = tab.appState && tab.appState.activeLogsType;
return [tab.id, this.getParamsFromActiveFilter(tab.activeFilters || {}, logsType)];
}
}