| /** |
| * Copyright (c) HashiCorp, Inc. |
| * SPDX-License-Identifier: MPL-2.0 |
| */ |
| |
| import { get } from '@ember/object'; |
| import ApplicationSerializer from './application'; |
| |
| export default ApplicationSerializer.extend({ |
| secretDataPath: 'data', |
| normalizeItems(payload, requestType) { |
| if ( |
| requestType !== 'queryRecord' && |
| payload.data && |
| payload.data.keys && |
| Array.isArray(payload.data.keys) |
| ) { |
| // if we have data.keys, it's a list of ids, so we map over that |
| // and create objects with id's |
| return payload.data.keys.map((secret) => { |
| // secrets don't have an id in the response, so we need to concat the full |
| // path of the secret here - the id in the payload is added |
| // in the adapter after making the request |
| let fullSecretPath = payload.id ? payload.id + secret : secret; |
| |
| // if there is no path, it's a "top level" secret, so add |
| // a unicode space for the id |
| // https://github.com/hashicorp/vault/issues/3348 |
| if (!fullSecretPath) { |
| fullSecretPath = '\u0020'; |
| } |
| return { id: fullSecretPath, backend: payload.backend }; |
| }); |
| } |
| const path = this.secretDataPath; |
| // move response that is the contents of the secret from the dataPath |
| // to `secret_data` so it will be `secretData` in the model |
| payload.secret_data = get(payload, path); |
| delete payload[path]; |
| // return the payload if it's expecting a single object or wrap |
| // it as an array if not |
| return requestType === 'queryRecord' ? payload : [payload]; |
| }, |
| |
| serialize(snapshot) { |
| return snapshot.attr('secretData'); |
| }, |
| }); |