/** * Copyright (c) HashiCorp, Inc. * SPDX-License-Identifier: MPL-2.0 */ import ApplicationSerializer from './application'; import { TYPE_AUTH_METHOD_PASSWORD } from 'api/models/auth-method'; export default class AuthMethodSerializer extends ApplicationSerializer { // =methods /** * Delegates to a type-specific serialization, or default. * @override * @param {Snapshot} snapshot * @return {object} */ serialize(snapshot) { switch (snapshot.record.type) { case TYPE_AUTH_METHOD_PASSWORD: return this.serializePassword(...arguments); default: return this.serializeDefault(...arguments); } } serializeAttribute(snapshot, json, key, attribute) { const { type } = snapshot.record; super.serializeAttribute(...arguments); const { options } = attribute; // If an attribute has a `for` option, it must match the // record's `type`, else the attribute is excluded // from serialization. if (options?.for && !options.for.includes(type)) { if (options.isNestedAttribute) { delete json?.attributes?.[key]; } } } /** * Password serialization omits `attributes`. * @return {object} */ serializePassword() { let serialized = super.serialize(...arguments); delete serialized.attributes; return serialized; } /** * If `adapterOptions.state` is set, the serialization should * include **only state** and version. Normally, this is not serialized. * @param {Snapshot} snapshot * @return {object} */ serializeDefault(snapshot) { let serialized = super.serialize(...arguments); const state = snapshot?.adapterOptions?.state; if (state) { serialized = this.serializeWithState(snapshot, state); } else { delete serialized.attributes.state; } return serialized; } /** * Returns a payload containing only state and version. * @param {Snapshot} snapshot * @param {string} state * @return {object} */ serializeWithState(snapshot, state) { return { version: snapshot.attr('version'), attributes: { state }, }; } /** * Sorts the array in order of "is_primary" such that the primary method * appears first. The "natural" order of auth methods places primary first. * * @override * @return {object} */ normalizeArrayResponse() { const normalized = super.normalizeArrayResponse(...arguments); normalized.data = normalized.data.sort((a) => a.attributes.is_primary ? -1 : 1 ); return normalized; } /** * Sets `is_primary` to `false` if it is missing in the response. The API * omits "zero" values per: * https://developers.google.com/protocol-buffers/docs/proto3#default * * TODO: generalize this so that all zero values are reified. * @override * @param {Model} typeClass * @param {Object} hash * @return {Object} */ normalize(typeClass, hash, ...rest) { let normalizedHash = structuredClone(hash); // switch (normalizedHash.type) { // case 'oidc': // normalizedHash = this.normalizeOIDC(normalizedHash); // break; // } const normalized = super.normalize(typeClass, normalizedHash, ...rest); if (!normalized.data.attributes.is_primary) { normalized.data.attributes.is_primary = false; } return normalized; } }