diff --git a/src/datasets/domain/models/DatasetVersionInfo.ts b/src/datasets/domain/models/DatasetVersionInfo.ts deleted file mode 100644 index 5501af10..00000000 --- a/src/datasets/domain/models/DatasetVersionInfo.ts +++ /dev/null @@ -1,41 +0,0 @@ -export interface DatasetVersionInfo { - id: number - versionNumber: string - summary?: DatasetVersionSummary | SummaryStringValues - contributors: string - publishedOn?: string -} - -export type DatasetVersionSummary = { - [key: string]: SummaryUpdates | SummaryUpdatesWithFields | FilesSummaryUpdates | boolean -} - -export interface SummaryUpdates { - added: number - deleted: number - changed: number -} - -export interface SummaryUpdatesWithFields { - [key: string]: SummaryUpdates -} - -export interface FilesSummaryUpdates { - added: number - removed: number - replaced: number - changedFileMetaData: number - changedVariableMetadata: number -} - -export enum SummaryStringValues { - firstPublished = 'firstPublished', - firstDraft = 'firstDraft', - versionDeaccessioned = 'versionDeaccessioned', - previousVersionDeaccessioned = 'previousVersionDeaccessioned' -} - -export enum SummaryKnownFields { - files = 'files', - termsAccessChanged = 'termsAccessChanged' -} diff --git a/src/datasets/domain/repositories/IDatasetsRepository.ts b/src/datasets/domain/repositories/IDatasetsRepository.ts index 11cd0485..dd2b954d 100644 --- a/src/datasets/domain/repositories/IDatasetsRepository.ts +++ b/src/datasets/domain/repositories/IDatasetsRepository.ts @@ -7,7 +7,6 @@ import { DatasetDTO } from '../dtos/DatasetDTO' import { DatasetDeaccessionDTO } from '../dtos/DatasetDeaccessionDTO' import { MetadataBlock } from '../../../metadataBlocks' import { DatasetVersionDiff } from '../models/DatasetVersionDiff' -import { DatasetVersionInfo } from '../models/DatasetVersionInfo' export interface IDatasetsRepository { getDataset( @@ -52,5 +51,4 @@ export interface IDatasetsRepository { datasetVersionId: string, deaccessionDTO: DatasetDeaccessionDTO ): Promise - getDatasetVersions(datasetId: number | string): Promise } diff --git a/src/datasets/domain/useCases/GetDatasetVersions.ts b/src/datasets/domain/useCases/GetDatasetVersions.ts deleted file mode 100644 index b2e109cd..00000000 --- a/src/datasets/domain/useCases/GetDatasetVersions.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { UseCase } from '../../../core/domain/useCases/UseCase' -import { DatasetVersionInfo } from '../models/DatasetVersionInfo' -import { IDatasetsRepository } from '../repositories/IDatasetsRepository' - -export class GetDatasetVersions implements UseCase { - private datasetsRepository: IDatasetsRepository - - constructor(datasetsRepository: IDatasetsRepository) { - this.datasetsRepository = datasetsRepository - } - - /** - * Returns a list of versions for a given dataset including a summary of differences between consecutive versions where available. - * Draft versions will only be available to users who have permission to view unpublished drafts. - * @param {number | string} [datasetId] - The dataset identifier, which can be a string (for persistent identifiers), or a number (for numeric identifiers). - * @returns {Promise} - An array of DatasetVersionInfo. - */ - async execute(datasetId: number | string): Promise { - return await this.datasetsRepository.getDatasetVersions(datasetId) - } -} diff --git a/src/datasets/index.ts b/src/datasets/index.ts index 34aacd2e..3667cbf7 100644 --- a/src/datasets/index.ts +++ b/src/datasets/index.ts @@ -17,7 +17,6 @@ import { PublishDataset } from './domain/useCases/PublishDataset' import { UpdateDataset } from './domain/useCases/UpdateDataset' import { GetDatasetVersionDiff } from './domain/useCases/GetDatasetVersionDiff' import { DeaccessionDataset } from './domain/useCases/DeaccessionDataset' -import { GetDatasetVersions } from './domain/useCases/GetDatasetVersions' const datasetsRepository = new DatasetsRepository() @@ -49,7 +48,6 @@ const updateDataset = new UpdateDataset( datasetResourceValidator ) const deaccessionDataset = new DeaccessionDataset(datasetsRepository) -const getDatasetVersions = new GetDatasetVersions(datasetsRepository) export { getDataset, @@ -64,8 +62,7 @@ export { publishDataset, createDataset, updateDataset, - deaccessionDataset, - getDatasetVersions + deaccessionDataset } export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion' export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions' diff --git a/src/datasets/infra/repositories/DatasetsRepository.ts b/src/datasets/infra/repositories/DatasetsRepository.ts index affb9709..2107d960 100644 --- a/src/datasets/infra/repositories/DatasetsRepository.ts +++ b/src/datasets/infra/repositories/DatasetsRepository.ts @@ -18,7 +18,6 @@ import { transformDatasetLocksResponseToDatasetLocks } from './transformers/data import { transformDatasetPreviewsResponseToDatasetPreviewSubset } from './transformers/datasetPreviewsTransformers' import { DatasetVersionDiff } from '../../domain/models/DatasetVersionDiff' import { transformDatasetVersionDiffResponseToDatasetVersionDiff } from './transformers/datasetVersionDiffTransformers' -import { DatasetVersionInfo } from '../../domain/models/DatasetVersionInfo' export interface GetAllDatasetPreviewsQueryParams { per_page?: number @@ -236,15 +235,4 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi throw error }) } - - public async getDatasetVersions(datasetId: string | number): Promise { - return this.doGet( - this.buildApiEndpoint(this.datasetsResourceName, 'versions/compareSummary', datasetId), - true - ) - .then((response) => response.data.data) - .catch((error) => { - throw error - }) - } } diff --git a/test/environment/.env b/test/environment/.env index 29160d68..80e9a14e 100644 --- a/test/environment/.env +++ b/test/environment/.env @@ -1,6 +1,6 @@ POSTGRES_VERSION=13 DATAVERSE_DB_USER=dataverse SOLR_VERSION=9.3.0 -DATAVERSE_IMAGE_REGISTRY=ghcr.io -DATAVERSE_IMAGE_TAG=11188-version-difference-summary +DATAVERSE_IMAGE_REGISTRY=docker.io +DATAVERSE_IMAGE_TAG=unstable DATAVERSE_BOOTSTRAP_TIMEOUT=5m diff --git a/test/integration/datasets/DatasetsRepository.test.ts b/test/integration/datasets/DatasetsRepository.test.ts index 9ea95ec4..1f8add69 100644 --- a/test/integration/datasets/DatasetsRepository.test.ts +++ b/test/integration/datasets/DatasetsRepository.test.ts @@ -7,8 +7,7 @@ import { deleteUnpublishedDatasetViaApi, waitForDatasetsIndexedInSolr, deletePublishedDatasetViaApi, - deaccessionDatasetViaApi, - createDatasetLicenseModel + deaccessionDatasetViaApi } from '../../testHelpers/datasets/datasetHelper' import { ReadError } from '../../../src/core/domain/repositories/ReadError' import { @@ -19,8 +18,7 @@ import { createDataset, CreatedDatasetIdentifiers, DatasetDTO, - DatasetDeaccessionDTO, - publishDataset + DatasetDeaccessionDTO } from '../../../src/datasets' import { ApiConfig, WriteError } from '../../../src' import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' @@ -33,23 +31,9 @@ import { import { createCollectionViaApi, deleteCollectionViaApi, - publishCollectionViaApi, - ROOT_COLLECTION_ALIAS, - setStorageDriverViaApi + ROOT_COLLECTION_ALIAS } from '../../testHelpers/collections/collectionHelper' -import { - calculateBlobChecksum, - createSinglepartFileBlob, - testTextFile1Name, - uploadFileViaApi -} from '../../testHelpers/files/filesHelper' -import { - DatasetVersionSummary, - SummaryStringValues -} from '../../../src/datasets/domain/models/DatasetVersionInfo' -import { FilesRepository } from '../../../src/files/infra/repositories/FilesRepository' -import { DirectUploadClient } from '../../../src/files/infra/clients/DirectUploadClient' -import { createTestFileUploadDestination } from '../../testHelpers/files/fileUploadDestinationHelper' +import { testTextFile1Name, uploadFileViaApi } from '../../testHelpers/files/filesHelper' const TEST_DIFF_DATASET_DTO: DatasetDTO = { license: { @@ -95,9 +79,6 @@ describe('DatasetsRepository', () => { const sut: DatasetsRepository = new DatasetsRepository() const nonExistentTestDatasetId = 100 - const filesRepositorySut = new FilesRepository() - const directUploadSut: DirectUploadClient = new DirectUploadClient(filesRepositorySut) - beforeAll(async () => { ApiConfig.init( TestConstants.TEST_API_URL, @@ -944,179 +925,4 @@ describe('DatasetsRepository', () => { ).rejects.toBeInstanceOf(WriteError) }) }) - - describe('getDatasetVersions', () => { - const testDatasetVersionsCollectionAlias = 'testDatasetVersionsCollection' - - beforeAll(async () => { - await createCollectionViaApi(testDatasetVersionsCollectionAlias) - await publishCollectionViaApi(testDatasetVersionsCollectionAlias) - await setStorageDriverViaApi(testDatasetVersionsCollectionAlias, 'LocalStack') - }) - - afterAll(async () => { - await deleteCollectionViaApi(testDatasetVersionsCollectionAlias) - }) - - test('should return dataset versions when dataset exists', async () => { - const testDatasetIds = await createDataset.execute( - TestConstants.TEST_NEW_DATASET_DTO, - testDatasetVersionsCollectionAlias - ) - - const actual = await sut.getDatasetVersions(testDatasetIds.numericId) - - expect(actual.length).toBeGreaterThan(0) - expect(actual[0].versionNumber).toBe('DRAFT') - expect(actual[0].summary).toBe(SummaryStringValues.firstDraft) - - await deleteUnpublishedDatasetViaApi(testDatasetIds.numericId) - }) - - test('should return dataset versions correctly after first publish', async () => { - const testDatasetIds = await createDataset.execute( - TestConstants.TEST_NEW_DATASET_DTO, - testDatasetVersionsCollectionAlias - ) - await publishDataset.execute(testDatasetIds.numericId, VersionUpdateType.MAJOR) - - await waitForNoLocks(testDatasetIds.numericId, 10) - - const actual = await sut.getDatasetVersions(testDatasetIds.numericId) - - expect(actual.length).toBeGreaterThan(0) - expect(actual[0].versionNumber).toBe('1.0') - expect(actual[0].summary).toBe(SummaryStringValues.firstPublished) - - await deletePublishedDatasetViaApi(testDatasetIds.persistentId) - }) - - test('should return dataset versions correctly after 1st publish and metadata fields update', async () => { - const testDatasetIds = await createDataset.execute( - TestConstants.TEST_NEW_DATASET_DTO, - testDatasetVersionsCollectionAlias - ) - await publishDataset.execute(testDatasetIds.numericId, VersionUpdateType.MAJOR) - - await waitForNoLocks(testDatasetIds.numericId, 10) - - const metadataBlocksRepository = new MetadataBlocksRepository() - const citationMetadataBlock = await metadataBlocksRepository.getMetadataBlockByName( - 'citation' - ) - - await sut.updateDataset( - testDatasetIds.numericId, - { - license: createDatasetLicenseModel(true), - metadataBlockValues: [ - { - name: 'citation', - fields: { - title: 'Updated Dataset Title' - } - } - ] - }, - [citationMetadataBlock] - ) - - const actual = await sut.getDatasetVersions(testDatasetIds.numericId) - - expect(actual.length).toEqual(2) - - expect(actual[0].versionNumber).toBe('DRAFT') - expect(actual[0].summary).toMatchObject({ - 'Citation Metadata': { - Title: { - added: 0, - deleted: 0, - changed: 1 - } - }, - files: { - added: 0, - removed: 0, - replaced: 0, - changedFileMetaData: 0, - changedVariableMetadata: 0 - }, - termsAccessChanged: false - }) - - expect(actual[1].versionNumber).toBe('1.0') - expect(actual[1].summary).toBe(SummaryStringValues.firstPublished) - - await deletePublishedDatasetViaApi(testDatasetIds.persistentId) - }) - - test('should return correct files summary', async () => { - const testDatasetIds = await createDataset.execute( - TestConstants.TEST_NEW_DATASET_DTO, - testDatasetVersionsCollectionAlias - ) - await publishDataset.execute(testDatasetIds.numericId, VersionUpdateType.MAJOR) - - await waitForNoLocks(testDatasetIds.numericId, 10) - - const singlepartFile = await createSinglepartFileBlob() - - const destination = await createTestFileUploadDestination( - singlepartFile, - testDatasetIds.numericId - ) - - const actualStorageId = await directUploadSut.uploadFile( - testDatasetIds.numericId, - singlepartFile, - jest.fn(), - new AbortController(), - destination - ) - - const fileArrayBuffer = await singlepartFile.arrayBuffer() - const fileBuffer = Buffer.from(fileArrayBuffer) - - const uploadedFileDTO = { - fileName: singlepartFile.name, - storageId: actualStorageId, - checksumType: 'md5', - checksumValue: calculateBlobChecksum(fileBuffer, 'md5'), - mimeType: singlepartFile.type - } - - await filesRepositorySut.addUploadedFilesToDataset(testDatasetIds.numericId, [ - uploadedFileDTO - ]) - - const actual = await sut.getDatasetVersions(testDatasetIds.numericId) - - expect(actual.length).toEqual(2) - - expect(actual[0].versionNumber).toBe('DRAFT') - expect(actual[0].summary).toMatchObject({ - files: { - added: 1, - removed: 0, - replaced: 0, - changedFileMetaData: 0, - changedVariableMetadata: 0 - }, - termsAccessChanged: false - }) - - expect(actual[1].versionNumber).toBe('1.0') - expect(actual[1].summary).toBe(SummaryStringValues.firstPublished) - - await deletePublishedDatasetViaApi(testDatasetIds.persistentId) - }) - - test('should return error when dataset does not exist', async () => { - const expectedError = new ReadError( - `[404] Dataset with ID ${nonExistentTestDatasetId} not found.` - ) - - await expect(sut.getDatasetVersions(nonExistentTestDatasetId)).rejects.toThrow(expectedError) - }) - }) }) diff --git a/test/integration/files/DirectUpload.test.ts b/test/integration/files/DirectUpload.test.ts index be1c5ddc..87583732 100644 --- a/test/integration/files/DirectUpload.test.ts +++ b/test/integration/files/DirectUpload.test.ts @@ -15,15 +15,13 @@ import { setStorageDriverViaApi } from '../../testHelpers/collections/collectionHelper' import { deleteUnpublishedDatasetViaApi } from '../../testHelpers/datasets/datasetHelper' - +import axios from 'axios' import { - calculateBlobChecksum, createMultipartFileBlob, - createSinglepartFileBlob, - singlepartFileExistsInBucket + createSinglepartFileBlob } from '../../testHelpers/files/filesHelper' import { FileUploadCancelError } from '../../../src/files/infra/clients/errors/FileUploadCancelError' -import { createTestFileUploadDestination } from '../../testHelpers/files/fileUploadDestinationHelper' +import * as crypto from 'crypto' describe('Direct Upload', () => { const testCollectionAlias = 'directUploadTestCollection' @@ -115,7 +113,7 @@ describe('Direct Upload', () => { fileName: singlepartFile.name, storageId: actualStorageId, checksumType: checksumAlgorithm, - checksumValue: calculateBlobChecksum(fileBuffer, checksumAlgorithm), + checksumValue: calculateBlobChecksum(fileBuffer), mimeType: singlepartFile.type } @@ -172,7 +170,7 @@ describe('Direct Upload', () => { fileName: multipartFile.name, storageId: actualStorageId, checksumType: checksumAlgorithm, - checksumValue: calculateBlobChecksum(fileBuffer, checksumAlgorithm), + checksumValue: calculateBlobChecksum(fileBuffer), mimeType: multipartFile.type } @@ -214,4 +212,30 @@ describe('Direct Upload', () => { ) ).rejects.toThrow(FileUploadCancelError) }) + + const createTestFileUploadDestination = async (file: File, testDatasetId: number) => { + const filesRepository = new FilesRepository() + const destination = await filesRepository.getFileUploadDestination(testDatasetId, file) + destination.urls.forEach((destinationUrl, index) => { + destination.urls[index] = destinationUrl.replace('localstack', 'localhost') + }) + return destination + } + + const singlepartFileExistsInBucket = async (fileUrl: string): Promise => { + return axios + .get(fileUrl) + .then(() => { + return true + }) + .catch(() => { + return false + }) + } + + const calculateBlobChecksum = (blob: Buffer): string => { + const hash = crypto.createHash(checksumAlgorithm) + hash.update(blob) + return hash.digest('hex') + } }) diff --git a/test/testHelpers/collections/collectionHelper.ts b/test/testHelpers/collections/collectionHelper.ts index 8ccde481..b1e129fe 100644 --- a/test/testHelpers/collections/collectionHelper.ts +++ b/test/testHelpers/collections/collectionHelper.ts @@ -147,18 +147,6 @@ export async function setStorageDriverViaApi( } } -export async function publishCollectionViaApi(collectionAlias: string): Promise { - try { - return await axios.post( - `${TestConstants.TEST_API_URL}/dataverses/${collectionAlias}/actions/:publish`, - {}, - DATAVERSE_API_REQUEST_HEADERS - ) - } catch (error) { - throw new Error(`Error while publishing test collection ${collectionAlias}`) - } -} - export const createCollectionDTO = (alias = 'test-collection'): CollectionDTO => { return { alias: alias, diff --git a/test/testHelpers/files/fileUploadDestinationHelper.ts b/test/testHelpers/files/fileUploadDestinationHelper.ts index defac0c6..102ece1a 100644 --- a/test/testHelpers/files/fileUploadDestinationHelper.ts +++ b/test/testHelpers/files/fileUploadDestinationHelper.ts @@ -1,5 +1,4 @@ import { FileUploadDestination } from '../../../src/files/domain/models/FileUploadDestination' -import { FilesRepository } from '../../../src/files/infra/repositories/FilesRepository' import { FileMultipartUploadDestinationPayload, FileSingleUploadDestinationPayload, @@ -43,12 +42,3 @@ export const createMultipartFileUploadDestinationModel = (): FileUploadDestinati multipartFileUploadDestinationPayload ) } - -export const createTestFileUploadDestination = async (file: File, testDatasetId: number) => { - const filesRepository = new FilesRepository() - const destination = await filesRepository.getFileUploadDestination(testDatasetId, file) - destination.urls.forEach((destinationUrl, index) => { - destination.urls[index] = destinationUrl.replace('localstack', 'localhost') - }) - return destination -} diff --git a/test/testHelpers/files/filesHelper.ts b/test/testHelpers/files/filesHelper.ts index fc6814d0..666551bf 100644 --- a/test/testHelpers/files/filesHelper.ts +++ b/test/testHelpers/files/filesHelper.ts @@ -6,7 +6,6 @@ import { readFile } from 'fs/promises' import { FilesSubset } from '../../../src/files/domain/models/FilesSubset' import { DvObjectType } from '../../../src/core/domain/models/DvObjectOwnerNode' import { FilePayload } from '../../../src/files/infra/repositories/transformers/FilePayload' -import * as crypto from 'crypto' interface FileMetadata { categories?: string[] @@ -228,20 +227,3 @@ export const updateFileTabularTags = async ( } ) } - -export const calculateBlobChecksum = (blob: Buffer, checksumAlgorithm: string): string => { - const hash = crypto.createHash(checksumAlgorithm) - hash.update(blob) - return hash.digest('hex') -} - -export const singlepartFileExistsInBucket = async (fileUrl: string): Promise => { - return axios - .get(fileUrl) - .then(() => { - return true - }) - .catch(() => { - return false - }) -}