diff --git a/src/components/ServiceContent.js b/src/components/ServiceContent.js index 1a31300d8..de339778f 100644 --- a/src/components/ServiceContent.js +++ b/src/components/ServiceContent.js @@ -35,10 +35,7 @@ const ServiceContent = () => { - p.datasets_v2).length} - /> + p.datasets).length} /> diff --git a/src/components/explorer/ExplorerSearchContent.js b/src/components/explorer/ExplorerSearchContent.js index 89a534284..df76fb073 100644 --- a/src/components/explorer/ExplorerSearchContent.js +++ b/src/components/explorer/ExplorerSearchContent.js @@ -21,7 +21,7 @@ const ExplorerSearchContent = () => { // url: `/data/explorer/projects/${project.identifier}`, key: project.identifier, text: project.title, - children: project.datasets_v2.map((dataset) => ({ + children: project.datasets.map((dataset) => ({ url: `/data/explorer/search/${dataset.identifier}`, text: dataset.title, })), diff --git a/src/components/manager/DatasetTreeSelect.js b/src/components/manager/DatasetTreeSelect.js index 179f15c43..4b61476e9 100644 --- a/src/components/manager/DatasetTreeSelect.js +++ b/src/components/manager/DatasetTreeSelect.js @@ -35,7 +35,7 @@ const DatasetTreeSelect = forwardRef(({ value, onChange, style, idFormat }, ref) selectable: false, key: p.identifier, value: p.identifier, - children: p.datasets_v2.map((d) => { + children: p.datasets.map((d) => { const key = idFormat === ID_FORMAT_PROJECT_DATASET ? `${p.identifier}:${d.identifier}` : d.identifier; return { title: d.title, diff --git a/src/components/manager/access/GrantForm.tsx b/src/components/manager/access/GrantForm.tsx index 5574f9c7f..881d8b954 100644 --- a/src/components/manager/access/GrantForm.tsx +++ b/src/components/manager/access/GrantForm.tsx @@ -315,7 +315,7 @@ const ResourceInput = ({ value, onChange }: ResourceInputProps) => { if (selectedProject) { options.push( - ...(selectedProject.datasets_v2 ?? []).map((d) => ({ + ...(selectedProject.datasets ?? []).map((d) => ({ value: d.identifier, label: d.title, })), diff --git a/src/components/manager/projects/Project.js b/src/components/manager/projects/Project.js index 3ae645d77..37822163a 100644 --- a/src/components/manager/projects/Project.js +++ b/src/components/manager/projects/Project.js @@ -69,7 +69,7 @@ const Project = ({ (onCancelEdit || nop)(); }, [editingForm, onCancelEdit]); - const datasets = value.datasets_v2 ?? []; + const datasets = value.datasets ?? []; return ( <> diff --git a/src/components/manager/projects/RoutedProject.js b/src/components/manager/projects/RoutedProject.js index 0d2f83ff2..6fee9d971 100644 --- a/src/components/manager/projects/RoutedProject.js +++ b/src/components/manager/projects/RoutedProject.js @@ -40,7 +40,7 @@ const RoutedProject = () => { // Derive from live Redux state so the form reflects post-save data const datasetForEdit = selectedDataset - ? (project?.datasets_v2?.find((d) => d.identifier === selectedDataset.identifier) ?? selectedDataset) + ? (project?.datasets?.find((d) => d.identifier === selectedDataset.identifier) ?? selectedDataset) : selectedDataset; useEffect(() => { diff --git a/src/modules/datasets/actions.js b/src/modules/datasets/actions.js index 9001ee383..c8c585a5b 100644 --- a/src/modules/datasets/actions.js +++ b/src/modules/datasets/actions.js @@ -10,16 +10,20 @@ export const INVALIDATE_DATASET_SUMMARIES = "INVALIDATE_DATASET_SUMMARIES"; export const FETCH_DATASET_RESOURCES = createNetworkActionTypes("FETCH_DATASET_RESOURCES"); -const fetchDatasetDataTypesSummary = networkAction((serviceInfo, datasetID) => ({ +const fetchDatasetDataTypesSummary = networkAction((serviceInfo, datasetID, datasetsPath) => ({ types: FETCH_DATASET_DATA_TYPES, params: { serviceInfo, datasetID }, - url: `${serviceInfo.url}/datasets/${datasetID}/data-types`, + url: `${serviceInfo.url}/${datasetsPath}/${datasetID}/data-types`, })); export const fetchDatasetDataTypesIfPossible = (datasetID) => async (dispatch, getState) => { if (getState().datasetDataTypes.itemsByID?.[datasetID]?.isFetching) return; + const metadataUrl = getState().services.metadataService?.url; await Promise.all( - getDataServices(getState()).map((serviceInfo) => dispatch(fetchDatasetDataTypesSummary(serviceInfo, datasetID))), + getDataServices(getState()).map((serviceInfo) => { + const datasetsPath = serviceInfo.url === metadataUrl ? "api/datasets" : "datasets"; + return dispatch(fetchDatasetDataTypesSummary(serviceInfo, datasetID, datasetsPath)); + }), ); }; @@ -33,18 +37,22 @@ export const fetchDatasetsDataTypes = () => async (dispatch, getState) => { dispatch(endFlow(FETCHING_DATASETS_DATA_TYPES)); }; -const fetchServiceDatasetSummary = networkAction((serviceInfo, datasetID) => ({ +const fetchServiceDatasetSummary = networkAction((serviceInfo, datasetID, datasetsPath) => ({ types: FETCH_SERVICE_DATASET_SUMMARY, params: { serviceInfo, datasetID }, - url: `${serviceInfo.url}/datasets/${datasetID}/summary`, + url: `${serviceInfo.url}/${datasetsPath}/${datasetID}/summary`, })); export const fetchDatasetSummariesIfNeeded = (datasetID) => async (dispatch, getState) => { const existingSummaryState = getState().datasetSummaries.itemsByID[datasetID] ?? {}; if (existingSummaryState.isFetching || (!existingSummaryState.isInvalid && existingSummaryState.hasAttempted)) return; + const metadataUrl = getState().services.metadataService?.url; dispatch(beginFlow(FETCHING_DATASET_SUMMARIES, { datasetID })); await Promise.all( - getDataServices(getState()).map((serviceInfo) => dispatch(fetchServiceDatasetSummary(serviceInfo, datasetID))), + getDataServices(getState()).map((serviceInfo) => { + const datasetsPath = serviceInfo.url === metadataUrl ? "api/datasets" : "datasets"; + return dispatch(fetchServiceDatasetSummary(serviceInfo, datasetID, datasetsPath)); + }), ); dispatch(endFlow(FETCHING_DATASET_SUMMARIES, { datasetID })); }; @@ -54,7 +62,7 @@ export const invalidateDatasetSummaries = (datasetID) => ({ type: INVALIDATE_DAT const fetchDatasetResources = networkAction((datasetID) => (_dispatch, getState) => ({ types: FETCH_DATASET_RESOURCES, params: { datasetID }, - url: `${getState().services.metadataService.url}/datasets_v2/${datasetID}/resources`, + url: `${getState().services.metadataService.url}/api/datasets/${datasetID}/resources`, err: "Error fetching dataset resources", })); export const fetchDatasetResourcesIfNecessary = (datasetID) => (dispatch, getState) => { diff --git a/src/modules/metadata/actions.js b/src/modules/metadata/actions.js index ec9788f63..07edc1b41 100644 --- a/src/modules/metadata/actions.js +++ b/src/modules/metadata/actions.js @@ -46,12 +46,12 @@ export const fetchDiscoverySchema = () => (dispatch, getState) => { export const clearDatasetDataType = networkAction((datasetId, dataTypeID) => (_dispatch, getState) => { const { service_base_url: serviceBaseUrl } = getState().serviceDataTypes.itemsByID[dataTypeID]; const metadataServiceUrl = getState().services.metadataService?.url ?? ""; - const datasetsSegment = - metadataServiceUrl && serviceBaseUrl.startsWith(metadataServiceUrl) ? "datasets_v2" : "datasets"; + const datasetsPath = + metadataServiceUrl && serviceBaseUrl.startsWith(metadataServiceUrl) ? "api/datasets" : "datasets"; // noinspection JSUnusedGlobalSymbols return { types: DELETE_DATASET_DATA_TYPE, - url: `${serviceBaseUrl}${datasetsSegment}/${datasetId}/data-types/${dataTypeID}`, + url: `${serviceBaseUrl}${datasetsPath}/${datasetId}/data-types/${dataTypeID}`, req: { method: "DELETE", }, @@ -149,7 +149,7 @@ export const deleteProjectIfPossible = (project) => async (dispatch, getState) = // Remove data without destroying project/datasets first try { - await Promise.all(project.datasets_v2.map((ds) => dispatch(clearDatasetDataTypes(ds.identifier)))); + await Promise.all(project.datasets.map((ds) => dispatch(clearDatasetDataTypes(ds.identifier)))); await dispatch(deleteProject(project)); } catch (err) { console.error(err); @@ -180,7 +180,7 @@ export const saveProjectIfPossible = networkAction((project) => (dispatch, getSt export const addProjectDataset = networkAction((project, dataset, onSuccess = nop) => (_dispatch, getState) => ({ types: ADD_PROJECT_DATASET, - url: `${getState().services.metadataService.url}/api/datasets_v2`, + url: `${getState().services.metadataService.url}/api/datasets`, req: jsonRequest({ ...dataset, project: project.identifier }, "POST"), err: `Error adding dataset to project '${project.title}'`, // TODO: More user-friendly error // TODO: END ACTION? @@ -192,7 +192,7 @@ export const addProjectDataset = networkAction((project, dataset, onSuccess = no export const saveProjectDataset = networkAction((dataset, onSuccess = nop) => (_dispatch, getState) => ({ types: SAVE_PROJECT_DATASET, - url: `${getState().services.metadataService.url}/api/datasets_v2/${dataset.identifier}`, + url: `${getState().services.metadataService.url}/api/datasets/${dataset.identifier}`, // Filter out read-only props // TODO: PATCH req: jsonRequest(objectWithoutProps(dataset, ["identifier", "created", "updated"]), "PUT"), @@ -206,7 +206,7 @@ export const saveProjectDataset = networkAction((dataset, onSuccess = nop) => (_ export const deleteProjectDataset = networkAction((project, dataset) => (_dispatch, getState) => ({ types: DELETE_PROJECT_DATASET, params: { project, dataset }, - url: `${getState().services.metadataService.url}/api/datasets_v2/${dataset.identifier}`, + url: `${getState().services.metadataService.url}/api/datasets/${dataset.identifier}`, req: { method: "DELETE" }, err: `Error deleting dataset '${dataset.title}'`, })); @@ -229,7 +229,7 @@ export const deleteProjectDatasetIfPossible = (project, dataset) => async (dispa const addDatasetLinkedFieldSet = networkAction((dataset, linkedFieldSet, onSuccess) => (_dispatch, getState) => ({ types: ADD_DATASET_LINKED_FIELD_SET, - url: `${getState().services.metadataService.url}/api/datasets_v2/${dataset.identifier}`, + url: `${getState().services.metadataService.url}/api/datasets/${dataset.identifier}`, req: jsonRequest({ linked_field_sets: [...(dataset.linked_field_sets ?? []), linkedFieldSet] }, "PATCH"), err: `Error adding linked field set '${linkedFieldSet.name}' to dataset '${dataset.title}'`, onSuccess: async () => { @@ -253,7 +253,7 @@ export const addDatasetLinkedFieldSetIfPossible = const saveDatasetLinkedFieldSet = networkAction( (dataset, index, linkedFieldSet, onSuccess) => (_dispatch, getState) => ({ types: SAVE_DATASET_LINKED_FIELD_SET, - url: `${getState().services.metadataService.url}/api/datasets_v2/${dataset.identifier}`, + url: `${getState().services.metadataService.url}/api/datasets/${dataset.identifier}`, req: jsonRequest( { linked_field_sets: dataset.linked_field_sets.map((l, i) => (i === index ? linkedFieldSet : l)), @@ -284,7 +284,7 @@ export const saveDatasetLinkedFieldSetIfPossible = const deleteDatasetLinkedFieldSet = networkAction( (dataset, linkedFieldSet, linkedFieldSetIndex) => (_dispatch, getState) => ({ types: DELETE_DATASET_LINKED_FIELD_SET, - url: `${getState().services.metadataService.url}/api/datasets_v2/${dataset.identifier}`, + url: `${getState().services.metadataService.url}/api/datasets/${dataset.identifier}`, req: jsonRequest( { linked_field_sets: dataset.linked_field_sets.filter((_, i) => i !== linkedFieldSetIndex), diff --git a/src/modules/metadata/reducers.ts b/src/modules/metadata/reducers.ts index ac45e2ce7..2e94ba3b0 100644 --- a/src/modules/metadata/reducers.ts +++ b/src/modules/metadata/reducers.ts @@ -81,7 +81,7 @@ export const projects: Reducer = ( case FETCH_PROJECTS.RECEIVE: { const projects = [...(action.data as Project[])].sort(projectSort); const datasets: ProjectScopedDatasetModel[] = projects.flatMap((p: Project) => - (p.datasets_v2 ?? []).map((d: DatasetModel) => ({ ...d, project: p.identifier })), + (p.datasets ?? []).map((d: DatasetModel) => ({ ...d, project: p.identifier })), ); return { ...state, @@ -164,13 +164,13 @@ export const projects: Reducer = ( ...state, isAddingDataset: false, items: state.items.map((p) => - p.identifier === projectID ? { ...p, datasets_v2: [...(p.datasets_v2 ?? []), newDataset] } : p, + p.identifier === projectID ? { ...p, datasets: [...(p.datasets ?? []), newDataset] } : p, ), itemsByID: { ...state.itemsByID, [projectID]: { ...(state.itemsByID[projectID] || {}), - datasets_v2: [...(state.itemsByID[projectID]?.datasets_v2 ?? []), newDataset], + datasets: [...(state.itemsByID[projectID]?.datasets ?? []), newDataset], }, }, datasets: [...state.datasets, newDataset], @@ -195,15 +195,13 @@ export const projects: Reducer = ( return { ...state, items: state.items.map((p) => - p.identifier === deletedProject.identifier - ? { ...p, datasets_v2: (p.datasets_v2 ?? []).filter(deleteDataset) } - : p, + p.identifier === deletedProject.identifier ? { ...p, datasets: (p.datasets ?? []).filter(deleteDataset) } : p, ), itemsByID: { ...state.itemsByID, [deletedProject.identifier]: { ...(state.itemsByID[deletedProject.identifier] || {}), - datasets_v2: ((state.itemsByID[deletedProject.identifier] || {}).datasets_v2 ?? []).filter(deleteDataset), + datasets: ((state.itemsByID[deletedProject.identifier] || {}).datasets ?? []).filter(deleteDataset), }, }, datasets: state.datasets.filter((d) => d.identifier !== deletedDataset.identifier), @@ -232,15 +230,13 @@ export const projects: Reducer = ( return { ...state, items: state.items.map((p) => - p.identifier === updatedDataset.project - ? { ...p, datasets_v2: (p.datasets_v2 ?? []).map(replaceDataset) } - : p, + p.identifier === updatedDataset.project ? { ...p, datasets: (p.datasets ?? []).map(replaceDataset) } : p, ), itemsByID: { ...state.itemsByID, [updatedDataset.project]: { ...(state.itemsByID[updatedDataset.project] || {}), - datasets_v2: ((state.itemsByID[updatedDataset.project] || {}).datasets_v2 ?? []).map(replaceDataset), + datasets: ((state.itemsByID[updatedDataset.project] || {}).datasets ?? []).map(replaceDataset), }, }, }; diff --git a/src/modules/metadata/types.ts b/src/modules/metadata/types.ts index 4ebb024df..1e22710eb 100644 --- a/src/modules/metadata/types.ts +++ b/src/modules/metadata/types.ts @@ -18,7 +18,7 @@ export type Project = { description: string; project_schemas?: ProjectJSONSchema[]; - datasets_v2: DatasetModel[]; + datasets: DatasetModel[]; created: string; // ISO timestamp string updated: string; // ISO timestamp string