| /** |
| * Copyright (c) HashiCorp, Inc. |
| * SPDX-License-Identifier: MPL-2.0 |
| */ |
| |
| // usage: |
| // |
| // import lazyCapabilities, { apiPath } from 'vault/macros/lazy-capabilities'; |
| // |
| // export default DS.Model.extend({ |
| // //pass the template string as the first arg, and be sure to use '' around the |
| // //parameters that get interpolated in the string - that's how the template function |
| // //knows where to put each value |
| // zeroAddressPath: lazyCapabilities(apiPath`${'id'}/config/zeroaddress`, 'id'), |
| // |
| // }); |
| // |
| |
| import { maybeQueryRecord } from 'vault/macros/maybe-query-record'; |
| |
| export function apiPath(strings, ...keys) { |
| return function (data) { |
| const dict = data || {}; |
| const result = [strings[0]]; |
| keys.forEach((key, i) => { |
| result.push(dict[key], strings[i + 1]); |
| }); |
| return result.join(''); |
| }; |
| } |
| |
| export default function () { |
| const [templateFn, ...keys] = arguments; |
| return maybeQueryRecord( |
| 'capabilities', |
| (context) => { |
| // pull all context attrs |
| const contextObject = context.getProperties(...keys); |
| // remove empty ones |
| const nonEmptyContexts = Object.keys(contextObject).reduce((ret, key) => { |
| if (contextObject[key] != null) { |
| ret[key] = contextObject[key]; |
| } |
| return ret; |
| }, {}); |
| // if all of them aren't present, cancel the fetch |
| if (Object.keys(nonEmptyContexts).length !== keys.length) { |
| return; |
| } |
| // otherwise proceed with the capabilities check |
| return { |
| id: templateFn(nonEmptyContexts), |
| }; |
| }, |
| ...keys |
| ); |
| } |