From e52fa6e186ac0581a7536675c785bb391b5aa1b7 Mon Sep 17 00:00:00 2001 From: Joenio Marques da Costa Date: Mon, 2 Nov 2020 15:19:21 +0100 Subject: [PATCH] added `deleteDataset($datasetId)` to destroy datasets This new method make a request to the following address: * DELETE /api/datasets/:persistentId/destroy/?persistentId=$datasetId This Dataverse API endpoint let superusers to remove published datasets and ordinary users to remove draft/unpublished datasets as can see on the API spec docs: * https://guides.dataverse.org/en/latest/api/native-api.html#delete-published-dataset --- README.md | 2 ++ src/dataverseClient.ts | 11 +++++++++++ test/dataverseClient.spec.ts | 17 ++++++++++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fae2fef3..a743054f 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,8 @@ http://demo.dataverse.org/api/datasets/389608/versions/1 `public async publishDataset(datasetId: string, versionUpgradeType: DatasetVersionUpgradeType = DatasetVersionUpgradeType.MAJOR): Promise {` +`public async deleteDataset(datasetId: string): Promise {` + ## Build project In order to build the project, we need to run the following command: diff --git a/src/dataverseClient.ts b/src/dataverseClient.ts index 9ab0614a..44403e81 100644 --- a/src/dataverseClient.ts +++ b/src/dataverseClient.ts @@ -173,6 +173,11 @@ export class DataverseClient { return this.postRequest(url, '') } + public async deleteDataset(datasetId: string): Promise { + const url = `${this.host}/api/datasets/:persistentId/destroy/?persistentId=${datasetId}` + return this.deleteRequest(url) + } + private async getRequest(url: string, options: { params?: object, headers?: DataverseHeaders, responseType?: ResponseType } = { headers: this.getHeaders() }): Promise { return await axios.get(url, options).catch(error => { throw new DataverseException(error.response.status, error.response.data ? error.response.data.message : '') @@ -185,6 +190,12 @@ export class DataverseClient { }) } + private async deleteRequest(url: string, options: { params?: object, headers?: DataverseHeaders, responseType?: ResponseType } = { headers: this.getHeaders() }): Promise { + return await axios.delete(url, options).catch(error => { + throw new DataverseException(error.response.status, error.response.data ? error.response.data.message : '') + }) + } + private getHeaders(): DataverseHeaders { return { 'X-Dataverse-key': this.apiToken ? this.apiToken : '' diff --git a/test/dataverseClient.spec.ts b/test/dataverseClient.spec.ts index fa49f011..dc99aa78 100644 --- a/test/dataverseClient.spec.ts +++ b/test/dataverseClient.spec.ts @@ -28,6 +28,7 @@ describe('DataverseClient', () => { let axiosGetStub: SinonStub let axiosPostStub: SinonStub let requestPostStub: SinonStub + let axiosDeleteStub: SinonStub let mapBasicDatasetInformationStub: SinonStub let getErrorMessageStub: SinonStub @@ -63,6 +64,7 @@ describe('DataverseClient', () => { axiosGetStub = sandbox.stub(axios, 'get').resolves(mockResponse) axiosPostStub = sandbox.stub(axios, 'post').resolves(mockResponse) requestPostStub = sandbox.stub(request, 'post').resolves(mockResponse) + axiosDeleteStub = sandbox.stub(axios, 'delete').resolves(mockResponse) mapBasicDatasetInformationStub = sandbox.stub(DatasetUtil, 'mapBasicDatasetInformation').returns(mockDatasetInformation) getErrorMessageStub = sandbox.stub(ResponseUtil, 'getErrorMessage').returns(mockErrorMessage) @@ -1480,5 +1482,18 @@ describe('DataverseClient', () => { expect(error.errorCode).to.be.equal(errorCode) }) }) + }) -}) \ No newline at end of file + + describe('deleteDataset()', () => { + it('should call axios with expected url', async () => { + const datasetId: string = random.number().toString() + + await client.deleteDataset(datasetId) + + assert.calledOnce(axiosDeleteStub) + assert.calledWithExactly(axiosDeleteStub, `${host}/api/datasets/:persistentId/destroy/?persistentId=${datasetId}`, { headers: { 'X-Dataverse-key': apiToken } }) + }) + }) + +})