mirror of
https://github.com/datahub-project/datahub.git
synced 2025-09-03 06:13:14 +00:00
Merge pull request #1002 from theseyi/urn-to-id
converts a dataset id to urn using urntoid endpoint. refactors a chec…
This commit is contained in:
commit
14a1e4bdea
@ -11,15 +11,14 @@ import { IDatasetView } from 'wherehows-web/typings/api/datasets/dataset';
|
|||||||
import { IDatasetSchema } from 'wherehows-web/typings/api/datasets/schema';
|
import { IDatasetSchema } from 'wherehows-web/typings/api/datasets/schema';
|
||||||
import { IComplianceDataType } from 'wherehows-web/typings/api/list/compliance-datatypes';
|
import { IComplianceDataType } from 'wherehows-web/typings/api/list/compliance-datatypes';
|
||||||
import {
|
import {
|
||||||
ApiResponseStatus,
|
|
||||||
IReadComplianceResult,
|
IReadComplianceResult,
|
||||||
|
notFoundApiError,
|
||||||
readDatasetComplianceByUrn,
|
readDatasetComplianceByUrn,
|
||||||
readDatasetComplianceSuggestionByUrn,
|
readDatasetComplianceSuggestionByUrn,
|
||||||
saveDatasetComplianceByUrn
|
saveDatasetComplianceByUrn
|
||||||
} from 'wherehows-web/utils/api';
|
} from 'wherehows-web/utils/api';
|
||||||
import { columnDataTypesAndFieldNames } from 'wherehows-web/utils/api/datasets/columns';
|
import { columnDataTypesAndFieldNames } from 'wherehows-web/utils/api/datasets/columns';
|
||||||
import { readDatasetSchemaByUrn } from 'wherehows-web/utils/api/datasets/schema';
|
import { readDatasetSchemaByUrn } from 'wherehows-web/utils/api/datasets/schema';
|
||||||
import { ApiError } from 'wherehows-web/utils/api/errors/errors';
|
|
||||||
import { readComplianceDataTypes } from 'wherehows-web/utils/api/list/compliance-datatypes';
|
import { readComplianceDataTypes } from 'wherehows-web/utils/api/list/compliance-datatypes';
|
||||||
import { compliancePolicyStrings, removeReadonlyAttr, filterEditableEntities } from 'wherehows-web/constants';
|
import { compliancePolicyStrings, removeReadonlyAttr, filterEditableEntities } from 'wherehows-web/constants';
|
||||||
|
|
||||||
@ -160,7 +159,7 @@ export default class DatasetComplianceContainer extends Component {
|
|||||||
setProperties(this, { schemaFieldNamesMappedToDataTypes, schemaless });
|
setProperties(this, { schemaFieldNamesMappedToDataTypes, schemaless });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// If this schema is missing, silence exception, otherwise propagate
|
// If this schema is missing, silence exception, otherwise propagate
|
||||||
if (!(e instanceof ApiError && e.status === ApiResponseStatus.NotFound)) {
|
if (!notFoundApiError(e)) {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import Controller from '@ember/controller';
|
import Controller from '@ember/controller';
|
||||||
import { computed, set, get, setProperties, getProperties, getWithDefault } from '@ember/object';
|
import { computed, set, get, setProperties, getProperties, getWithDefault } from '@ember/object';
|
||||||
import { debug } from '@ember/debug';
|
import { debug } from '@ember/debug';
|
||||||
|
import $ from 'jquery';
|
||||||
import { inject as service } from '@ember/service';
|
import { inject as service } from '@ember/service';
|
||||||
import { run, scheduleOnce } from '@ember/runloop';
|
import { run, scheduleOnce } from '@ember/runloop';
|
||||||
import $ from 'jquery';
|
|
||||||
import {
|
import {
|
||||||
datasetComplianceUrlById,
|
datasetComplianceUrlById,
|
||||||
createDatasetComment,
|
createDatasetComment,
|
||||||
@ -13,7 +13,6 @@ import {
|
|||||||
} from 'wherehows-web/utils/api';
|
} from 'wherehows-web/utils/api';
|
||||||
import { encodeUrn } from 'wherehows-web/utils/validators/urn';
|
import { encodeUrn } from 'wherehows-web/utils/validators/urn';
|
||||||
import { updateDatasetDeprecation } from 'wherehows-web/utils/api/datasets/properties';
|
import { updateDatasetDeprecation } from 'wherehows-web/utils/api/datasets/properties';
|
||||||
import { readDatasetView } from 'wherehows-web/utils/api/datasets/dataset';
|
|
||||||
import { readDatasetOwners, updateDatasetOwners } from 'wherehows-web/utils/api/datasets/owners';
|
import { readDatasetOwners, updateDatasetOwners } from 'wherehows-web/utils/api/datasets/owners';
|
||||||
import { Tabs } from 'wherehows-web/constants/datasets/shared';
|
import { Tabs } from 'wherehows-web/constants/datasets/shared';
|
||||||
import { action } from 'ember-decorators/object';
|
import { action } from 'ember-decorators/object';
|
||||||
|
@ -3,7 +3,7 @@ import { set, get, setProperties } from '@ember/object';
|
|||||||
import { inject } from '@ember/service';
|
import { inject } from '@ember/service';
|
||||||
import { makeUrnBreadcrumbs } from 'wherehows-web/utils/entities';
|
import { makeUrnBreadcrumbs } from 'wherehows-web/utils/entities';
|
||||||
import { isRequiredMinOwnersNotConfirmed } from 'wherehows-web/constants/datasets/owner';
|
import { isRequiredMinOwnersNotConfirmed } from 'wherehows-web/constants/datasets/owner';
|
||||||
import { readDatasetById, readDatasetByUrn } from 'wherehows-web/utils/api/datasets/dataset';
|
import { datasetIdToUrn, readDatasetByUrn } from 'wherehows-web/utils/api/datasets/dataset';
|
||||||
import isUrn, { isWhUrn, isLiUrn, convertWhUrnToLiUrn, encodeUrn, decodeUrn } from 'wherehows-web/utils/validators/urn';
|
import isUrn, { isWhUrn, isLiUrn, convertWhUrnToLiUrn, encodeUrn, decodeUrn } from 'wherehows-web/utils/validators/urn';
|
||||||
|
|
||||||
import { checkAclAccess } from 'wherehows-web/utils/api/datasets/acl-access';
|
import { checkAclAccess } from 'wherehows-web/utils/api/datasets/acl-access';
|
||||||
@ -48,7 +48,8 @@ export default Route.extend({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return await readDatasetById(identifier);
|
// recurse with dataset urn from id
|
||||||
|
return this.model({ dataset_id: await datasetIdToUrn(identifier) });
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import { assert } from '@ember/debug';
|
import { assert } from '@ember/debug';
|
||||||
import { ApiResponseStatus } from 'wherehows-web/utils/api';
|
import { notFoundApiError } from 'wherehows-web/utils/api';
|
||||||
import { ApiError } from 'wherehows-web/utils/api/errors/errors';
|
|
||||||
import { createInitialComplianceInfo } from 'wherehows-web/utils/datasets/compliance-policy';
|
import { createInitialComplianceInfo } from 'wherehows-web/utils/datasets/compliance-policy';
|
||||||
import { datasetUrlById, datasetUrlByUrn } from 'wherehows-web/utils/api/datasets/shared';
|
import { datasetUrlById, datasetUrlByUrn } from 'wherehows-web/utils/api/datasets/shared';
|
||||||
import { ApiStatus } from 'wherehows-web/utils/api/shared';
|
import { ApiStatus } from 'wherehows-web/utils/api/shared';
|
||||||
@ -98,7 +97,7 @@ const readDatasetComplianceByUrn = async (urn: string): Promise<IReadComplianceR
|
|||||||
url: datasetComplianceUrlByUrn(urn)
|
url: datasetComplianceUrlByUrn(urn)
|
||||||
}));
|
}));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e instanceof ApiError && e.status === ApiResponseStatus.NotFound) {
|
if (notFoundApiError(e)) {
|
||||||
complianceInfo = createInitialComplianceInfo(urn);
|
complianceInfo = createInitialComplianceInfo(urn);
|
||||||
isNewComplianceInfo = true;
|
isNewComplianceInfo = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
import { warn } from '@ember/debug';
|
|
||||||
import {
|
import {
|
||||||
IDataset,
|
|
||||||
IDatasetGetResponse,
|
|
||||||
IDatasetsGetResponse,
|
IDatasetsGetResponse,
|
||||||
IDatasetView,
|
IDatasetView,
|
||||||
IDatasetViewGetResponse,
|
IDatasetViewGetResponse,
|
||||||
@ -12,44 +9,10 @@ import {
|
|||||||
datasetsCountUrl,
|
datasetsCountUrl,
|
||||||
datasetsUrl,
|
datasetsUrl,
|
||||||
datasetsUrlRoot,
|
datasetsUrlRoot,
|
||||||
datasetUrlById,
|
|
||||||
datasetUrlByUrn
|
datasetUrlByUrn
|
||||||
} from 'wherehows-web/utils/api/datasets/shared';
|
} from 'wherehows-web/utils/api/datasets/shared';
|
||||||
import { ApiStatus } from 'wherehows-web/utils/api';
|
|
||||||
import { encodeUrn } from 'wherehows-web/utils/validators/urn';
|
import { encodeUrn } from 'wherehows-web/utils/validators/urn';
|
||||||
|
|
||||||
// TODO: DSS-6122 Create and move to Error module
|
|
||||||
const datasetApiException = 'An error occurred with the dataset api';
|
|
||||||
const datasetIdException = 'Dataset reference in unexpected format. Expected a urn or dataset id.';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs the dataset view endpoint url from the dataset id
|
|
||||||
* @param {number} id the dataset id
|
|
||||||
*/
|
|
||||||
const datasetViewUrlById = (id: number) => `${datasetUrlById(id)}/view`;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 readDatasetById = async (id: number | string): Promise<IDataset> => {
|
|
||||||
id = parseInt(id + '', 10);
|
|
||||||
// if id is less than or equal 0, throw illegal dataset error
|
|
||||||
if (id <= 0 || !Number.isInteger(id)) {
|
|
||||||
throw new TypeError(datasetIdException);
|
|
||||||
}
|
|
||||||
|
|
||||||
const { status, dataset, message } = await getJSON<IDatasetGetResponse>({ url: datasetUrlById(id) });
|
|
||||||
let errorMessage = message || datasetApiException;
|
|
||||||
|
|
||||||
if (status === ApiStatus.OK && dataset) {
|
|
||||||
return dataset;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(errorMessage);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads a dataset by urn, in the li format
|
* Reads a dataset by urn, in the li format
|
||||||
* @param {string} urn
|
* @param {string} urn
|
||||||
@ -61,54 +24,20 @@ const readDatasetByUrn = async (urn: string = ''): Promise<IDatasetView> => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads the response from the datasetView endpoint for the provided dataset id
|
* Constructs a url to get a dataset urn given a dataset id
|
||||||
* @param {number} id
|
* @param {number} id
|
||||||
* @returns {Promise<IDatasetView>}
|
|
||||||
*/
|
|
||||||
const readDatasetView = async (id: number): Promise<IDatasetView> => {
|
|
||||||
const { status, dataset } = await getJSON<IDatasetViewGetResponse>({ url: datasetViewUrlById(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}
|
* @return {string}
|
||||||
*/
|
*/
|
||||||
const datasetIdTranslationUrlByUrn = (urn: string): string => {
|
const datasetUrnTranslationUrlByUrn = (id: number): string => `${datasetsUrlRoot('v2')}/idtourn/${id}`;
|
||||||
return `${datasetsUrlRoot('v1')}/urntoid/${encodeURIComponent(urn)}`;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Translates a dataset urn string to a dataset id, using the endpoint at datasetIdTranslationUrlByUrn()
|
* Translates a dataset id to a dataset urn, using the endpoint at datasetIdTranslationUrlByUrn()
|
||||||
* if a dataset id is not found
|
* @param {number} id
|
||||||
* or an exception occurs, the value returned is zero, which is an illegal dataset id
|
* @return {Promise<string>}
|
||||||
* and should be treated as an exception.
|
|
||||||
* @param {string} urn
|
|
||||||
* @return {Promise<number>}
|
|
||||||
*/
|
*/
|
||||||
const datasetUrnToId = async (urn: string): Promise<number> => {
|
const datasetIdToUrn = async (id: number) => {
|
||||||
let datasetId = 0;
|
const headers = await getHeaders({ url: datasetUrnTranslationUrlByUrn(id) });
|
||||||
|
return headers.get('whUrn');
|
||||||
try {
|
|
||||||
// The headers object is a Header
|
|
||||||
const headers = await getHeaders({ url: datasetIdTranslationUrlByUrn(urn) });
|
|
||||||
const stringId = 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;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -140,4 +69,4 @@ const readDatasetsCount = async ({ platform, prefix }: Partial<IReadDatasetsOpti
|
|||||||
return await getJSON<number>({ url });
|
return await getJSON<number>({ url });
|
||||||
};
|
};
|
||||||
|
|
||||||
export { readDatasetById, datasetUrnToId, readDatasetView, readDatasets, readDatasetsCount, readDatasetByUrn };
|
export { readDatasets, readDatasetsCount, readDatasetByUrn, datasetIdToUrn };
|
||||||
|
@ -10,9 +10,8 @@ import {
|
|||||||
IPartyProps,
|
IPartyProps,
|
||||||
IUserEntityMap
|
IUserEntityMap
|
||||||
} from 'wherehows-web/typings/api/datasets/party-entities';
|
} from 'wherehows-web/typings/api/datasets/party-entities';
|
||||||
import { ApiResponseStatus } from 'wherehows-web/utils/api';
|
import { notFoundApiError } from 'wherehows-web/utils/api';
|
||||||
import { datasetUrlById, datasetUrlByUrn } from 'wherehows-web/utils/api/datasets/shared';
|
import { datasetUrlById, datasetUrlByUrn } from 'wherehows-web/utils/api/datasets/shared';
|
||||||
import { ApiError } from 'wherehows-web/utils/api/errors/errors';
|
|
||||||
import { getJSON, postJSON } from 'wherehows-web/utils/api/fetcher';
|
import { getJSON, postJSON } from 'wherehows-web/utils/api/fetcher';
|
||||||
import { getApiRoot, ApiStatus } from 'wherehows-web/utils/api/shared';
|
import { getApiRoot, ApiStatus } from 'wherehows-web/utils/api/shared';
|
||||||
import { arrayFilter, arrayMap } from 'wherehows-web/utils/array';
|
import { arrayFilter, arrayMap } from 'wherehows-web/utils/array';
|
||||||
@ -128,7 +127,7 @@ const readDatasetOwnersByUrn = async (urn: string): Promise<Array<IOwner>> => {
|
|||||||
({ owners = [] } = await getJSON<Pick<IOwnerResponse, 'owners'>>({ url: datasetOwnersUrlByUrn(urn) }));
|
({ owners = [] } = await getJSON<Pick<IOwnerResponse, 'owners'>>({ url: datasetOwnersUrlByUrn(urn) }));
|
||||||
return ownersWithModifiedTimeAsDate(owners);
|
return ownersWithModifiedTimeAsDate(owners);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e instanceof ApiError && e.status === ApiResponseStatus.NotFound) {
|
if (notFoundApiError(e)) {
|
||||||
return owners;
|
return owners;
|
||||||
} else {
|
} else {
|
||||||
throw e;
|
throw e;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import fetch from 'fetch';
|
import fetch from 'fetch';
|
||||||
import { throwIfApiError } from 'wherehows-web/utils/api/errors/errors';
|
import { apiErrorStatusMessage } from 'wherehows-web/constants/errors/errors';
|
||||||
|
import { ApiError, throwIfApiError } from 'wherehows-web/utils/api/errors/errors';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Describes the attributes on the fetch configuration object
|
* Describes the attributes on the fetch configuration object
|
||||||
@ -112,13 +113,14 @@ const getHeaders = async (config: FetchConfig): Promise<Headers> => {
|
|||||||
...withBaseFetchHeaders(config.headers),
|
...withBaseFetchHeaders(config.headers),
|
||||||
method: 'HEAD'
|
method: 'HEAD'
|
||||||
};
|
};
|
||||||
const { ok, headers, statusText } = await fetch(config.url, fetchConfig);
|
const response = await fetch(config.url, fetchConfig);
|
||||||
|
const { ok, headers, status } = response;
|
||||||
|
|
||||||
if (ok) {
|
if (ok) {
|
||||||
return headers;
|
return headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(statusText);
|
throw new ApiError(status, apiErrorStatusMessage(status));
|
||||||
};
|
};
|
||||||
|
|
||||||
export { getJSON, postJSON, deleteJSON, putJSON, getHeaders };
|
export { getJSON, postJSON, deleteJSON, putJSON, getHeaders };
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
/**
|
/**
|
||||||
* Defines available api version types
|
* Defines available api version types
|
||||||
*/
|
*/
|
||||||
|
import { ApiError } from 'wherehows-web/utils/api/errors/errors';
|
||||||
|
|
||||||
export type ApiVersion = 'v1' | 'v2';
|
export type ApiVersion = 'v1' | 'v2';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -31,3 +33,10 @@ export enum ApiResponseStatus {
|
|||||||
UnAuthorized = 401,
|
UnAuthorized = 401,
|
||||||
InternalServerError = 500
|
InternalServerError = 500
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience function to ascertain if an api error is a not found code
|
||||||
|
* @param {Error} e
|
||||||
|
* @return {boolean}
|
||||||
|
*/
|
||||||
|
export const notFoundApiError = (e: Error) => e instanceof ApiError && e.status === ApiResponseStatus.NotFound;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user