mirror of
https://github.com/hashicorp/vault.git
synced 2025-11-21 02:31:11 +01:00
90 lines
2.8 KiB
JavaScript
90 lines
2.8 KiB
JavaScript
/**
|
|
* Copyright (c) HashiCorp, Inc.
|
|
* SPDX-License-Identifier: BUSL-1.1
|
|
*/
|
|
|
|
import queryParamString from 'vault/utils/query-param-string';
|
|
import ApplicationAdapter from '../application';
|
|
import { formatDateObject } from 'core/utils/client-count-utils';
|
|
import { debug } from '@ember/debug';
|
|
|
|
export default class ActivityAdapter extends ApplicationAdapter {
|
|
formatTimeParam(dateObj, isEnd = false) {
|
|
let formatted;
|
|
if (dateObj) {
|
|
try {
|
|
const iso = dateObj.timestamp || formatDateObject(dateObj, isEnd);
|
|
formatted = iso;
|
|
} catch (e) {
|
|
// carry on
|
|
}
|
|
}
|
|
return formatted;
|
|
}
|
|
// javascript localizes new Date() objects but all activity log data is stored in UTC
|
|
// create date object from user's input using Date.UTC() then send to backend as unix
|
|
// time params from the backend are formatted as a zulu timestamp
|
|
formatQueryParams(queryParams) {
|
|
const query = {};
|
|
const start = this.formatTimeParam(queryParams?.start_time);
|
|
const end = this.formatTimeParam(queryParams?.end_time, true);
|
|
if (start) {
|
|
query.start_time = start;
|
|
}
|
|
if (end) {
|
|
query.end_time = end;
|
|
}
|
|
return query;
|
|
}
|
|
|
|
queryRecord(store, type, query) {
|
|
const url = `${this.buildURL()}/internal/counters/activity`;
|
|
const options = {
|
|
data: this.formatQueryParams(query),
|
|
};
|
|
|
|
if (query?.namespace) {
|
|
options.namespace = query.namespace;
|
|
}
|
|
|
|
return this.ajax(url, 'GET', options).then((resp) => {
|
|
const response = resp || {};
|
|
response.id = response.request_id || 'no-data';
|
|
return response;
|
|
});
|
|
}
|
|
|
|
async exportData(query) {
|
|
const url = `${this.buildURL()}/internal/counters/activity/export${queryParamString({
|
|
format: query?.format || 'csv',
|
|
start_time: query?.start_time ?? undefined,
|
|
end_time: query?.end_time ?? undefined,
|
|
})}`;
|
|
let errorMsg;
|
|
try {
|
|
const options = query?.namespace ? { namespace: query.namespace } : {};
|
|
const resp = await this.rawRequest(url, 'GET', options);
|
|
if (resp.status === 200) {
|
|
return resp.blob();
|
|
}
|
|
// If it's an empty response (eg 204), there's no data so return an error
|
|
errorMsg = 'no data to export in provided time range.';
|
|
} catch (e) {
|
|
const { errors } = await e.json();
|
|
errorMsg = errors?.join('. ');
|
|
}
|
|
if (errorMsg) {
|
|
throw new Error(errorMsg);
|
|
}
|
|
}
|
|
|
|
// Only dashboard uses findRecord, the client count dashboard uses queryRecord
|
|
findRecord(store, type, id) {
|
|
if (id !== 'clients/activity') {
|
|
debug(`findRecord('clients/activity') should pass 'clients/activity' as the id, you passed: '${id}'`);
|
|
}
|
|
const url = `${this.buildURL()}/internal/counters/activity`;
|
|
return this.ajax(url, 'GET', { skipWarnings: true });
|
|
}
|
|
}
|