From 0eeeb8fb1f5dda636cb2b29a726fad728090279d Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Thu, 3 Jul 2025 17:30:14 -0400 Subject: [PATCH 1/4] fix: add include Deaccession to the GETFILE api --- package-lock.json | 8 ++++---- package.json | 2 +- src/files/infrastructure/FileJSDataverseRepository.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index a6272842e..17002e490 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@dnd-kit/sortable": "8.0.0", "@dnd-kit/utilities": "3.2.2", "@faker-js/faker": "7.6.0", - "@iqss/dataverse-client-javascript": "2.0.0-alpha.51", + "@iqss/dataverse-client-javascript": "2.0.0-alpha.53", "@iqss/dataverse-design-system": "*", "@istanbuljs/nyc-config-typescript": "1.0.2", "@tanstack/react-table": "8.9.2", @@ -3561,9 +3561,9 @@ }, "node_modules/@iqss/dataverse-client-javascript": { "name": "@IQSS/dataverse-client-javascript", - "version": "2.0.0-alpha.51", - "resolved": "https://npm.pkg.github.com/download/@IQSS/dataverse-client-javascript/2.0.0-alpha.51/001cc84de8d320ac38bae2045df74eb3f222a1ac", - "integrity": "sha512-FTadhjpOL2HUPhORVAceG8bZS4yJlJd44yivlSsMrhMDCyiJWA26rZqp6HnG+284CvrW6Ja+40wCwJbDGhrc/A==", + "version": "2.0.0-alpha.53", + "resolved": "https://npm.pkg.github.com/download/@IQSS/dataverse-client-javascript/2.0.0-alpha.53/0a9acbda27e2bb1d97b7beb3518a278e8d264cc2", + "integrity": "sha512-7aG4YdPu6tFxYOILLRh8u47kXBRmEWJiYAQHDmQl4Y0eY0C+gR8ckDKSM0E9KAwvMUM/OhvDtTXkJOjEaD1aKQ==", "license": "MIT", "dependencies": { "@types/node": "^18.15.11", diff --git a/package.json b/package.json index 865d91e25..8fb033fb1 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@dnd-kit/sortable": "8.0.0", "@dnd-kit/utilities": "3.2.2", "@faker-js/faker": "7.6.0", - "@iqss/dataverse-client-javascript": "2.0.0-alpha.51", + "@iqss/dataverse-client-javascript": "2.0.0-alpha.53", "@iqss/dataverse-design-system": "*", "@istanbuljs/nyc-config-typescript": "1.0.2", "@tanstack/react-table": "8.9.2", diff --git a/src/files/infrastructure/FileJSDataverseRepository.ts b/src/files/infrastructure/FileJSDataverseRepository.ts index a2aa23f57..614be28f7 100644 --- a/src/files/infrastructure/FileJSDataverseRepository.ts +++ b/src/files/infrastructure/FileJSDataverseRepository.ts @@ -250,7 +250,7 @@ export class FileJSDataverseRepository implements FileRepository { getById(id: number, datasetVersionNumber?: string): Promise { return getFileAndDataset - .execute(id, datasetVersionNumber) + .execute(id, datasetVersionNumber, includeDeaccessioned) .then(([jsFile, jsDataset]) => Promise.all([ jsFile, From 2ede1737471ff09610d9a90de7f1ec3635a51826 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Thu, 3 Jul 2025 18:43:59 -0400 Subject: [PATCH 2/4] fix: add include Deaccessioned to getById and affected by EditPermission --- .../FileJSDataverseRepository.ts | 51 ++++++++++++------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/src/files/infrastructure/FileJSDataverseRepository.ts b/src/files/infrastructure/FileJSDataverseRepository.ts index 614be28f7..04d0b028b 100644 --- a/src/files/infrastructure/FileJSDataverseRepository.ts +++ b/src/files/infrastructure/FileJSDataverseRepository.ts @@ -96,7 +96,8 @@ export class FileJSDataverseRepository implements FileRepository { datasetPersistentId: string, datasetVersion: DatasetVersion, paginationInfo: FilePaginationInfo = new FilePaginationInfo(), - criteria: FileCriteria = new FileCriteria() + criteria: FileCriteria = new FileCriteria(), + includeDeaccessioned?: boolean ): Promise { return getDatasetFiles .execute( @@ -210,7 +211,8 @@ export class FileJSDataverseRepository implements FileRepository { getFilesCountInfoByDatasetPersistentId( datasetPersistentId: string, datasetVersionNumber: DatasetVersionNumber, - criteria: FileCriteria + criteria: FileCriteria, + includeDeaccessioned?: boolean ): Promise { return getDatasetFileCounts .execute( @@ -230,7 +232,8 @@ export class FileJSDataverseRepository implements FileRepository { getFilesTotalDownloadSizeByDatasetPersistentId( datasetPersistentId: string, datasetVersionNumber: DatasetVersionNumber, - criteria: FileCriteria = new FileCriteria() + criteria: FileCriteria = new FileCriteria(), + includeDeaccessioned?: boolean ): Promise { return getDatasetFilesTotalDownloadSize .execute( @@ -249,20 +252,28 @@ export class FileJSDataverseRepository implements FileRepository { } getById(id: number, datasetVersionNumber?: string): Promise { - return getFileAndDataset - .execute(id, datasetVersionNumber, includeDeaccessioned) - .then(([jsFile, jsDataset]) => - Promise.all([ - jsFile, - jsDataset, - getDatasetCitation.execute(jsDataset.id, datasetVersionNumber, includeDeaccessioned), - FileJSDataverseRepository.getCitationById(jsFile.id, datasetVersionNumber), - FileJSDataverseRepository.getDownloadCountById(jsFile.id, jsFile.publicationDate), - FileJSDataverseRepository.getPermissionsById(jsFile.id), - FileJSDataverseRepository.getThumbnailById(jsFile.id), - FileJSDataverseRepository.getTabularDataById(jsFile.id, jsFile.tabularData) - ]) - ) + return FileJSDataverseRepository.getPermissionsById(id) + .then((permissions) => { + const includeDeaccessioned = permissions?.canEditOwnerDataset + return getFileAndDataset + .execute(id, datasetVersionNumber, includeDeaccessioned) + .then(([jsFile, jsDataset]) => { + return Promise.all([ + jsFile, + jsDataset, + getDatasetCitation.execute(jsDataset.id, datasetVersionNumber, includeDeaccessioned), + FileJSDataverseRepository.getCitationById( + jsFile.id, + datasetVersionNumber, + includeDeaccessioned + ), + FileJSDataverseRepository.getDownloadCountById(jsFile.id, jsFile.publicationDate), + Promise.resolve(permissions), + FileJSDataverseRepository.getThumbnailById(jsFile.id), + FileJSDataverseRepository.getTabularDataById(jsFile.id, jsFile.tabularData) + ]) + }) + }) .then( ([ jsFile, @@ -290,7 +301,11 @@ export class FileJSDataverseRepository implements FileRepository { }) } - private static getCitationById(id: number, datasetVersionNumber?: string): Promise { + private static getCitationById( + id: number, + datasetVersionNumber?: string, + includeDeaccessioned?: boolean + ): Promise { return getFileCitation .execute(id, datasetVersionNumber, includeDeaccessioned) .catch((error: ReadError) => { From 5706b60988d5d01db4162bcd0feb34c2e4b34ecc Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Thu, 3 Jul 2025 18:51:07 -0400 Subject: [PATCH 3/4] fix: change FileVersion links only access to who canEditDataset --- .../file/file-version/FileVersions.tsx | 3 ++- .../file/file-version/FileVersions.spec.tsx | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/sections/file/file-version/FileVersions.tsx b/src/sections/file/file-version/FileVersions.tsx index 733cb4671..88c5b2233 100644 --- a/src/sections/file/file-version/FileVersions.tsx +++ b/src/sections/file/file-version/FileVersions.tsx @@ -77,7 +77,8 @@ export function FileVersions({ const isCurrentVersion = fileVersion.datasetVersion === displayVersion const isLinkable = fileVersion.versionState === DatasetVersionState.RELEASED || - fileVersion.versionState === DatasetVersionState.DEACCESSIONED || + (fileVersion.versionState === DatasetVersionState.DEACCESSIONED && + canEditOwnerDataset) || (fileVersion.versionState === DatasetVersionState.DRAFT && canEditOwnerDataset) return ( diff --git a/tests/component/sections/file/file-version/FileVersions.spec.tsx b/tests/component/sections/file/file-version/FileVersions.spec.tsx index 942a87606..e5a80cd82 100644 --- a/tests/component/sections/file/file-version/FileVersions.spec.tsx +++ b/tests/component/sections/file/file-version/FileVersions.spec.tsx @@ -67,6 +67,29 @@ describe('FileVersions', () => { ) }) + it('disables the link button for deaccessioned versions without permission', () => { + const deaccessionedFile = [ + { + ...fileVersionSummaries[0], + datasetVersion: '1.2', + versionState: DatasetVersionState.DEACCESSIONED + } + ] + fileRepository.getFileVersionSummaries = cy.stub().resolves(deaccessionedFile) + cy.customMount( + + ) + + cy.get('span').contains('1.2').should('exist') + cy.findByTestId('file-version-link-1.2').should('not.exist') + }) + it('disables the link button for draft version without permission', () => { const draftFile = [ { From 948164f8689c99ed509c11b7a93e3db60e87f0d8 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Thu, 3 Jul 2025 19:03:56 -0400 Subject: [PATCH 4/4] fix: delete some paramters accidentally push --- src/files/infrastructure/FileJSDataverseRepository.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/files/infrastructure/FileJSDataverseRepository.ts b/src/files/infrastructure/FileJSDataverseRepository.ts index 04d0b028b..4e2335390 100644 --- a/src/files/infrastructure/FileJSDataverseRepository.ts +++ b/src/files/infrastructure/FileJSDataverseRepository.ts @@ -96,8 +96,7 @@ export class FileJSDataverseRepository implements FileRepository { datasetPersistentId: string, datasetVersion: DatasetVersion, paginationInfo: FilePaginationInfo = new FilePaginationInfo(), - criteria: FileCriteria = new FileCriteria(), - includeDeaccessioned?: boolean + criteria: FileCriteria = new FileCriteria() ): Promise { return getDatasetFiles .execute( @@ -211,8 +210,7 @@ export class FileJSDataverseRepository implements FileRepository { getFilesCountInfoByDatasetPersistentId( datasetPersistentId: string, datasetVersionNumber: DatasetVersionNumber, - criteria: FileCriteria, - includeDeaccessioned?: boolean + criteria: FileCriteria ): Promise { return getDatasetFileCounts .execute( @@ -232,8 +230,7 @@ export class FileJSDataverseRepository implements FileRepository { getFilesTotalDownloadSizeByDatasetPersistentId( datasetPersistentId: string, datasetVersionNumber: DatasetVersionNumber, - criteria: FileCriteria = new FileCriteria(), - includeDeaccessioned?: boolean + criteria: FileCriteria = new FileCriteria() ): Promise { return getDatasetFilesTotalDownloadSize .execute( @@ -255,6 +252,7 @@ export class FileJSDataverseRepository implements FileRepository { return FileJSDataverseRepository.getPermissionsById(id) .then((permissions) => { const includeDeaccessioned = permissions?.canEditOwnerDataset + return getFileAndDataset .execute(id, datasetVersionNumber, includeDeaccessioned) .then(([jsFile, jsDataset]) => {