Files
vault/ui/lib/kv/addon/routes/list-directory.js

96 lines
2.8 KiB
JavaScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: MPL-2.0
*/
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
import { hash } from 'rsvp';
import { normalizePath } from 'vault/utils/path-encoding-helpers';
import { breadcrumbsForSecret } from 'kv/utils/kv-breadcrumbs';
import { pathIsDirectory } from 'kv/utils/kv-breadcrumbs';
export default class KvSecretsListRoute extends Route {
@service store;
@service router;
@service secretMountPath;
queryParams = {
pageFilter: {
refreshModel: true,
},
page: {
refreshModel: true,
},
};
async fetchMetadata(backend, pathToSecret, params) {
return await this.store
.lazyPaginatedQuery('kv/metadata', {
backend,
responsePath: 'data.keys',
page: Number(params.page) || 1,
pageFilter: params.pageFilter,
pathToSecret,
})
.catch((err) => {
if (err.httpStatus === 403) {
return 403;
}
if (err.httpStatus === 404) {
return [];
} else {
throw err;
}
});
}
getPathToSecret(pathParam) {
if (!pathParam) return '';
// links and routing assumes pathToParam includes trailing slash
return pathIsDirectory(pathParam) ? normalizePath(pathParam) : normalizePath(`${pathParam}/`);
}
model(params) {
const { pageFilter, path_to_secret } = params;
const pathToSecret = this.getPathToSecret(path_to_secret);
const backend = this.secretMountPath.currentPath;
const filterValue = pathToSecret ? (pageFilter ? pathToSecret + pageFilter : pathToSecret) : pageFilter;
return hash({
secrets: this.fetchMetadata(backend, pathToSecret, params),
backend,
pathToSecret,
filterValue,
pageFilter,
});
}
setupController(controller, resolvedModel) {
super.setupController(controller, resolvedModel);
// renders alert inline error for overview card
resolvedModel.failedDirectoryQuery =
resolvedModel.secrets === 403 && pathIsDirectory(resolvedModel.pathToSecret);
let breadcrumbsArray = [{ label: 'secrets', route: 'secrets', linkExternal: true }];
// if on top level don't link the engine breadcrumb label, but if within a directory, do link back to top level.
if (this.routeName === 'list') {
breadcrumbsArray.push({ label: resolvedModel.backend });
} else {
breadcrumbsArray = [
...breadcrumbsArray,
{ label: resolvedModel.backend, route: 'list' },
...breadcrumbsForSecret(resolvedModel.pathToSecret, true),
];
}
controller.set('breadcrumbs', breadcrumbsArray);
}
resetController(controller, isExiting) {
if (isExiting) {
controller.set('pageFilter', null);
controller.set('page', null);
}
}
}