mirror of
https://github.com/datahub-project/datahub.git
synced 2025-07-23 01:22:00 +00:00
70 lines
2.3 KiB
TypeScript
70 lines
2.3 KiB
TypeScript
![]() |
import Ember from 'ember';
|
||
|
import { IDataset, IDatasetGetResponse } from 'wherehows-web/typings/api/datasets/dataset';
|
||
|
import { getHeaders, getJSON } from 'wherehows-web/utils/api/fetcher';
|
||
|
import { datasetsUrlRoot, datasetUrlById } from 'wherehows-web/utils/api/datasets/shared';
|
||
|
import { ApiStatus } from 'wherehows-web/utils/api';
|
||
|
|
||
|
const { Logger: { warn } } = Ember;
|
||
|
// TODO: DSS-6122 Create and move to Error module
|
||
|
const datasetApiException = 'An error occurred with the dataset api';
|
||
|
const datasetIdException = 'Could not find a dataset with a matching id / urn';
|
||
|
|
||
|
/**
|
||
|
* Reads the dataset object from the get endpoint for the given dataset id
|
||
|
* @param {number} id the id of the dataset
|
||
|
* @return {Promise<IDataset>}
|
||
|
*/
|
||
|
const readDataset = async (id: number = 0): Promise<IDataset> => {
|
||
|
// if id is less than or equal 0, throw illegal dataset error
|
||
|
if (id <= 0) {
|
||
|
throw new Error(datasetIdException);
|
||
|
}
|
||
|
|
||
|
const { status, dataset } = await getJSON<IDatasetGetResponse>({ url: datasetUrlById(id) });
|
||
|
|
||
|
if (status === ApiStatus.OK && dataset) {
|
||
|
return dataset;
|
||
|
}
|
||
|
|
||
|
throw new Error(datasetApiException);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Constructs a url to get a dataset id given a dataset urn
|
||
|
* @param {string} urn
|
||
|
* @return {string}
|
||
|
*/
|
||
|
const datasetIdTranslationUrlByUrn = (urn: string): string => {
|
||
|
return `${datasetsUrlRoot}/urntoid/${encodeURIComponent(urn)}`;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Translates a dataset urn string to a dataset id, using the endpoint at datasetIdTranslationUrlByUrn()
|
||
|
* if a dataset id is not found
|
||
|
* or an exception occurs, the value returned is zero, which is an illegal dataset id
|
||
|
* and should be treated as an exception.
|
||
|
* @param {string} urn
|
||
|
* @return {Promise<number>}
|
||
|
*/
|
||
|
const datasetUrnToId = async (urn: string): Promise<number> => {
|
||
|
let datasetId = 0;
|
||
|
|
||
|
try {
|
||
|
// The headers object is an iterable iterator,
|
||
|
// convert to a map and return the DatasetId header
|
||
|
const headers = await getHeaders({ url: datasetIdTranslationUrlByUrn(urn) });
|
||
|
const stringId = new Map(...headers).get('DatasetId');
|
||
|
|
||
|
// If stringId is not falsey, parse as int and return, otherwise use default
|
||
|
if (stringId) {
|
||
|
datasetId = parseInt(stringId, 10);
|
||
|
}
|
||
|
} catch (e) {
|
||
|
warn(`Exception occurred translating datasetUrn: ${e.message}`);
|
||
|
}
|
||
|
|
||
|
return datasetId;
|
||
|
};
|
||
|
|
||
|
export { readDataset, datasetUrnToId };
|