62 lines
2.5 KiB
TypeScript
Raw Normal View History

import Ember from 'ember';
import { createInitialComplianceInfo } from 'wherehows-web/utils/datasets/compliance-policy';
import { datasetUrlById } from 'wherehows-web/utils/api/datasets/shared';
import { ApiStatus } from 'wherehows-web/utils/api/shared';
import { IComplianceSuggestion, IComplianceSuggestionResponse } from 'wherehows-web/typings/api/datasets/compliance';
const { $: { getJSON }, assert } = Ember;
/**
* Constructs the dataset compliance url
* @param {number} id the id of the dataset
* @return {string} the dataset compliance url
*/
const datasetComplianceUrlById = (id: number): string => `${datasetUrlById(id)}/compliance`;
/**
* Constructs the compliance suggestions url based of the compliance id
* @param {number} id the id of the dataset
* @return {string} compliance suggestions url
*/
const datasetComplianceSuggestionsUrlById = (id: number): string => `${datasetComplianceUrlById(id)}/suggestions`;
/**
* Fetches the current compliance policy for a dataset with thi given id
* @param {number} id the id of the dataset
* @return {Promise<{isNewComplianceInfo: boolean, complianceInfo: *}>}
*/
const readDatasetCompliance = async (id: number): Promise<{ isNewComplianceInfo: boolean; complianceInfo: any }> => {
assert(`Expected id to be a number but received ${typeof id}`, typeof id === 'number');
const notFound = 'No entity found for query';
// complianceInfo contains the compliance data for the specified dataset
let {
msg = '',
status,
complianceInfo
}: { msg: string; status: ApiStatus; complianceInfo: any } = await Promise.resolve(
getJSON(datasetComplianceUrlById(id))
);
// If the endpoint responds with a failed status, and the msg contains the indicator that a compliance does not exist
const isNewComplianceInfo: boolean = status === ApiStatus.FAILED && String(msg).includes(notFound);
if (isNewComplianceInfo) {
complianceInfo = createInitialComplianceInfo(id);
}
return { isNewComplianceInfo, complianceInfo };
};
/**
* Requests the compliance suggestions for a given dataset Id and returns the suggestion list
* @param {number} id the id of the dataset
* @return {Promise<IComplianceSuggestion>}
*/
const readDatasetComplianceSuggestion = async (id: number): Promise<IComplianceSuggestion> => {
const { complianceSuggestion = <IComplianceSuggestion>{} }: IComplianceSuggestionResponse = await Promise.resolve(
getJSON(datasetComplianceSuggestionsUrlById(id))
);
return complianceSuggestion;
};
export { readDatasetCompliance, readDatasetComplianceSuggestion, datasetComplianceUrlById };