@apistudio/apim-cli
Version:
CLI for API Management Products
119 lines (118 loc) • 4.43 kB
JavaScript
/**
* Copyright Super iPaaS Integration LLC, an IBM Company 2024
*/
import { equalsIgnoreCase, isNullOrUndefined, } from "../helpers/common/data-helper.js";
import { getTargetModelAssetKind, hasNamespace, isValidAsset, isValidAssetRefValue, } from "../helpers/apim/asset-helper.js";
import { COLON } from "../constants/app-constants.js";
import { fromAssetRefValue, isSameAsset, } from "../helpers/apim/build-helper.js";
class AssetCache {
constructor() {
this.processedAssets = new Set();
this.toBeProcessedAssets = new Set();
}
static getInstance() {
if (isNullOrUndefined(AssetCache.INSTANCE)) {
AssetCache.INSTANCE = new AssetCache();
}
return this.INSTANCE;
}
markAsProcessed(asset) {
if (!isValidAsset(asset)) {
return;
}
const result = hasNamespace(asset)
? [asset.metadata.namespace]
: [];
result.push(asset.metadata.name);
result.push(asset.metadata.version);
const assetRefValue = result.join(COLON);
this.processedAssets.add({
kind: getTargetModelAssetKind(asset.kind),
ref: assetRefValue,
isNewlyAdded: false,
});
if (this.isToBeProcessed(asset.kind, assetRefValue)) {
const unProcessedAsset = this.getUnProcessedAsset(asset.kind, assetRefValue);
this.toBeProcessedAssets.delete(unProcessedAsset);
}
}
isProcessed(targetKind, assetRefValue) {
const found = this.getProcessedAsset(targetKind, assetRefValue);
return found !== undefined;
}
isToBeProcessed(targetKind, assetRefValue) {
const found = this.getUnProcessedAsset(targetKind, assetRefValue);
return found !== undefined;
}
getNewlyAddedUnProcessedAssets() {
const unProcessedAssets = this.getUnProcessedAssets();
const newlyAdded = new Set();
unProcessedAssets.forEach((unProcessedAsset) => {
if (unProcessedAsset.isNewlyAdded) {
newlyAdded.add({
...unProcessedAsset,
});
}
});
return newlyAdded;
}
getCheckedUnProcessedAssets() {
const unProcessedAssets = this.getUnProcessedAssets();
const checkedAssets = new Set();
unProcessedAssets.forEach((unProcessedAsset) => {
if (!unProcessedAsset.isNewlyAdded) {
checkedAssets.add({
...unProcessedAsset,
});
}
});
return checkedAssets;
}
markUnProcessedAssetAsChecked(cacheModel) {
const unProcessedAsset = this.getUnProcessedAsset(cacheModel.kind, cacheModel.ref);
if (!isNullOrUndefined(unProcessedAsset) &&
unProcessedAsset?.isNewlyAdded) {
unProcessedAsset.isNewlyAdded = false;
}
}
markAllUnProcessedAssetAsUnchecked() {
this.toBeProcessedAssets.forEach((toBeProcessed) => (toBeProcessed.isNewlyAdded = true));
}
getProcessedAsset(targetKind, assetRefValue) {
for (const value of this.processedAssets.values()) {
if (isSameAsset(fromAssetRefValue(value.ref), fromAssetRefValue(assetRefValue)) &&
equalsIgnoreCase(value.kind, getTargetModelAssetKind(targetKind))) {
return value;
}
}
return undefined;
}
getUnProcessedAsset(targetKind, assetRefValue) {
for (const value of this.toBeProcessedAssets.values()) {
if (isSameAsset(fromAssetRefValue(value.ref), fromAssetRefValue(assetRefValue)) &&
equalsIgnoreCase(value.kind, getTargetModelAssetKind(targetKind))) {
return value;
}
}
return undefined;
}
getUnProcessedAssets() {
return new Set(this.toBeProcessedAssets);
}
clear() {
this.toBeProcessedAssets.clear();
this.processedAssets.clear();
}
//assetRef: <namespace>:<name>:<version> or <name>:<version>
checkAndMarkAsUnProcessed(targetAssetModel) {
if (!isValidAssetRefValue(targetAssetModel.ref)) {
return false;
}
if (this.isProcessed(targetAssetModel.kind, targetAssetModel.ref)) {
return false;
}
this.toBeProcessedAssets.add(targetAssetModel);
return true;
}
}
export { AssetCache };