mirror of
https://github.com/hashicorp/vault.git
synced 2025-08-22 23:21:08 +02:00
74 lines
2.1 KiB
JavaScript
74 lines
2.1 KiB
JavaScript
/**
|
|
* Copyright (c) HashiCorp, Inc.
|
|
* SPDX-License-Identifier: BUSL-1.1
|
|
*/
|
|
|
|
import ApplicationSerializer from 'vault/serializers/application';
|
|
import { findDestination } from 'core/helpers/sync-destinations';
|
|
|
|
export default class SyncAssociationSerializer extends ApplicationSerializer {
|
|
attrs = {
|
|
destinationName: { serialize: false },
|
|
destinationType: { serialize: false },
|
|
syncStatus: { serialize: false },
|
|
updatedAt: { serialize: false },
|
|
subKey: { serialize: false },
|
|
};
|
|
|
|
generateId(data) {
|
|
let id = `${data.mount}/${data.secret_name}`;
|
|
if (data.sub_key) {
|
|
id += `/${data.sub_key}`;
|
|
}
|
|
return id;
|
|
}
|
|
|
|
extractLazyPaginatedData(payload) {
|
|
if (payload) {
|
|
const { store_name, store_type, associated_secrets } = payload.data;
|
|
const secrets = [];
|
|
for (const key in associated_secrets) {
|
|
const data = associated_secrets[key];
|
|
data.id = this.generateId(data);
|
|
const association = {
|
|
destinationName: store_name,
|
|
destinationType: store_type,
|
|
...data,
|
|
};
|
|
secrets.push(association);
|
|
}
|
|
return secrets;
|
|
}
|
|
return payload;
|
|
}
|
|
|
|
normalizeFetchByDestinations(payload) {
|
|
const { store_name, store_type, associated_secrets } = payload.data;
|
|
const unsynced = [];
|
|
let lastUpdated;
|
|
|
|
for (const key in associated_secrets) {
|
|
const association = associated_secrets[key];
|
|
// for display purposes, any status other than SYNCED is considered unsynced
|
|
if (association.sync_status !== 'SYNCED') {
|
|
unsynced.push(association.sync_status);
|
|
}
|
|
// use the most recent updated_at value as the last synced date
|
|
const updated = new Date(association.updated_at);
|
|
if (!lastUpdated || updated > lastUpdated) {
|
|
lastUpdated = updated;
|
|
}
|
|
}
|
|
|
|
const associationCount = Object.entries(associated_secrets).length;
|
|
return {
|
|
icon: findDestination(store_type).icon,
|
|
name: store_name,
|
|
type: store_type,
|
|
associationCount,
|
|
status: associationCount ? (unsynced.length ? `${unsynced.length} Unsynced` : 'All synced') : null,
|
|
lastUpdated,
|
|
};
|
|
}
|
|
}
|