Skip to content

Commit a40c600

Browse files
authored
Merge pull request #207 from IQSS/191-dynamic-root-alias
Use ':root', rather than alias 'root' for default root collection
2 parents 38d68b7 + 9f7fae2 commit a40c600

File tree

16 files changed

+71
-49
lines changed

16 files changed

+71
-49
lines changed

docs/useCases.md

+8-8
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ _See [use case](../src/collections/domain/useCases/GetCollection.ts)_ definition
108108

109109
The `collectionIdOrAlias` is a generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId).
110110

111-
If no collection identifier is specified, the default collection identifier; `root` will be used. If you want to search for a different collection, you must add the collection identifier as a parameter in the use case call.
111+
If no collection identifier is specified, the default collection identifier; `:root` will be used. If you want to search for a different collection, you must add the collection identifier as a parameter in the use case call.
112112

113113
#### Get Collection Facets
114114

@@ -135,7 +135,7 @@ _See [use case](../src/collections/domain/useCases/GetCollectionFacets.ts)_ defi
135135

136136
The `collectionIdOrAlias` is a generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId).
137137

138-
If no collection identifier is specified, the default collection identifier; `root` will be used. If you want to search for a different collection, you must add the collection identifier as a parameter in the use case call.
138+
If no collection identifier is specified, the default collection identifier; `:root` will be used. If you want to search for a different collection, you must add the collection identifier as a parameter in the use case call.
139139

140140
#### Get User Permissions on a Collection
141141

@@ -163,7 +163,7 @@ _See [use case](../src/collections/domain/useCases/GetCollectionUserPermissions.
163163

164164
The `collectionIdOrAlias` is a generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId).
165165

166-
If no collection identifier is specified, the default collection identifier; `root` will be used. If you want to search for a different collection, you must add the collection identifier as a parameter in the use case call.
166+
If no collection identifier is specified, the default collection identifier; `:root` will be used. If you want to search for a different collection, you must add the collection identifier as a parameter in the use case call.
167167

168168
#### List All Collection Items
169169

@@ -203,7 +203,7 @@ This use case supports the following optional parameters depending on the search
203203

204204
#### Create a Collection
205205

206-
Creates a new Collection, given a [CollectionDTO](../src/collections/domain/dtos/CollectionDTO.ts) object and an optional parent collection identifier, which defaults to `root`.
206+
Creates a new Collection, given a [CollectionDTO](../src/collections/domain/dtos/CollectionDTO.ts) object and an optional parent collection identifier, which defaults to `:root`.
207207

208208
##### Example call:
209209

@@ -228,7 +228,7 @@ createCollection.execute(collectionDTO).then((createdCollectionId: number) => {
228228

229229
_See [use case](../src/collections/domain/useCases/CreateCollection.ts) implementation_.
230230

231-
The above example creates the new collection in the `root` collection since no collection identifier is specified. If you want to create the collection in a different collection, you must add the collection identifier as a second parameter in the use case call.
231+
The above example creates the new collection in the root collection since no collection identifier is specified. If you want to create the collection in a different collection, you must add the collection identifier as a second parameter in the use case call.
232232

233233
The use case returns a number, which is the identifier of the created collection.
234234

@@ -454,15 +454,15 @@ _See [use case](../src/datasets/domain/useCases/GetAllDatasetPreviews.ts) implem
454454

455455
Note that `limit` and `offset` are optional parameters for pagination.
456456

457-
Note that `collectionId` is an optional parameter to filter datasets by collection. If not set, the default value is `root`.
457+
Note that `collectionId` is an optional parameter to filter datasets by collection. If not set, the default value is `:root`.
458458

459459
The `DatasetPreviewSubset`returned instance contains a property called `totalDatasetCount` which is necessary for pagination.
460460

461461
### Datasets Write Use Cases
462462

463463
#### Create a Dataset
464464

465-
Creates a new Dataset in a collection, given a [DatasetDTO](../src/datasets/domain/dtos/DatasetDTO.ts) object and an optional collection identifier, which defaults to `root`.
465+
Creates a new Dataset in a collection, given a [DatasetDTO](../src/datasets/domain/dtos/DatasetDTO.ts) object and an optional collection identifier, which defaults to `:root`.
466466

467467
This use case validates the submitted fields of each metadata block and can return errors of type [ResourceValidationError](../src/core/domain/useCases/validators/errors/ResourceValidationError.ts), which include sufficient information to determine which field value is invalid and why.
468468

@@ -517,7 +517,7 @@ createDataset.execute(datasetDTO).then((newDatasetIds: CreatedDatasetIdentifiers
517517

518518
_See [use case](../src/datasets/domain/useCases/CreateDataset.ts) implementation_.
519519

520-
The above example creates the new dataset in the `root` collection since no collection identifier is specified. If you want to create the dataset in a different collection, you must add the collection identifier as a second parameter in the use case call.
520+
The above example creates the new dataset in the root collection since no collection identifier is specified. If you want to create the dataset in a different collection, you must add the collection identifier as a second parameter in the use case call.
521521

522522
The use case returns a [CreatedDatasetIdentifiers](../src/datasets/domain/models/CreatedDatasetIdentifiers.ts) object, which includes the persistent and numeric identifiers of the created dataset.
523523

src/collections/domain/models/Collection.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ export interface CollectionInputLevel {
1717
required: boolean
1818
}
1919

20-
export const ROOT_COLLECTION_ALIAS = 'root'
20+
export const ROOT_COLLECTION_ID = ':root'

src/collections/domain/useCases/CreateCollection.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { UseCase } from '../../../core/domain/useCases/UseCase'
22
import { CollectionDTO } from '../dtos/CollectionDTO'
3-
import { ROOT_COLLECTION_ALIAS } from '../models/Collection'
3+
import { ROOT_COLLECTION_ID } from '../models/Collection'
44
import { ICollectionsRepository } from '../repositories/ICollectionsRepository'
55

66
export class CreateCollection implements UseCase<number> {
@@ -11,16 +11,16 @@ export class CreateCollection implements UseCase<number> {
1111
}
1212

1313
/**
14-
* Creates a new collection, given a CollectionDTO object and an optional collection identifier, which defaults to root.
14+
* Creates a new collection, given a CollectionDTO object and an optional collection identifier, which defaults to :root.
1515
*
1616
* @param {CollectionDTO} [newCollection] - CollectionDTO object including the new collection data.
17-
* @param {string} [parentCollectionId] - Specifies the parent collection identifier (optional, defaults to root).
17+
* @param {string} [parentCollectionId] - Specifies the parent collection identifier (optional, defaults to :root).
1818
* @returns {Promise<number>} - The created collection identifier.
1919
* @throws {WriteError} - If there are errors while writing data.
2020
*/
2121
async execute(
2222
newCollection: CollectionDTO,
23-
parentCollectionId: number | string = ROOT_COLLECTION_ALIAS
23+
parentCollectionId: number | string = ROOT_COLLECTION_ID
2424
): Promise<number> {
2525
return await this.collectionsRepository.createCollection(newCollection, parentCollectionId)
2626
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { UseCase } from '../../../core/domain/useCases/UseCase'
22
import { ICollectionsRepository } from '../repositories/ICollectionsRepository'
3-
import { Collection, ROOT_COLLECTION_ALIAS } from '../models/Collection'
3+
import { Collection, ROOT_COLLECTION_ID } from '../models/Collection'
44

55
export class GetCollection implements UseCase<Collection> {
66
private collectionsRepository: ICollectionsRepository
@@ -12,11 +12,11 @@ export class GetCollection implements UseCase<Collection> {
1212
/**
1313
* Returns a Collection instance, given the search parameters to identify it.
1414
*
15-
* @param {number | string} [collectionIdOrAlias = 'root'] - A generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId)
16-
* If this parameter is not set, the default value is: 'root'
15+
* @param {number | string} [collectionIdOrAlias = ':root'] - A generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId)
16+
* If this parameter is not set, the default value is: ':root'
1717
* @returns {Promise<Collection>}
1818
*/
19-
async execute(collectionIdOrAlias: number | string = ROOT_COLLECTION_ALIAS): Promise<Collection> {
19+
async execute(collectionIdOrAlias: number | string = ROOT_COLLECTION_ID): Promise<Collection> {
2020
return await this.collectionsRepository.getCollection(collectionIdOrAlias)
2121
}
2222
}

src/collections/domain/useCases/GetCollectionFacets.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { UseCase } from '../../../core/domain/useCases/UseCase'
22
import { ICollectionsRepository } from '../repositories/ICollectionsRepository'
3-
import { ROOT_COLLECTION_ALIAS } from '../models/Collection'
3+
import { ROOT_COLLECTION_ID } from '../models/Collection'
44
import { CollectionFacet } from '../models/CollectionFacet'
55

66
export class GetCollectionFacets implements UseCase<CollectionFacet[]> {
@@ -13,12 +13,12 @@ export class GetCollectionFacets implements UseCase<CollectionFacet[]> {
1313
/**
1414
* Returns a CollectionFacet array containing the facets of the requested collection, given the collection identifier or alias.
1515
*
16-
* @param {number | string} [collectionIdOrAlias = 'root'] - A generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId)
17-
* If this parameter is not set, the default value is: 'root'
16+
* @param {number | string} [collectionIdOrAlias = ':root'] - A generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId)
17+
* If this parameter is not set, the default value is: ':root'
1818
* @returns {Promise<string[]>}
1919
*/
2020
async execute(
21-
collectionIdOrAlias: number | string = ROOT_COLLECTION_ALIAS
21+
collectionIdOrAlias: number | string = ROOT_COLLECTION_ID
2222
): Promise<CollectionFacet[]> {
2323
return await this.collectionsRepository.getCollectionFacets(collectionIdOrAlias)
2424
}

src/collections/domain/useCases/GetCollectionUserPermissions.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { UseCase } from '../../../core/domain/useCases/UseCase'
22
import { CollectionUserPermissions } from '../models/CollectionUserPermissions'
33
import { ICollectionsRepository } from '../repositories/ICollectionsRepository'
4+
import { ROOT_COLLECTION_ID } from '../models/Collection'
45

56
export class GetCollectionUserPermissions implements UseCase<CollectionUserPermissions> {
67
private collectionsRepository: ICollectionsRepository
@@ -12,11 +13,13 @@ export class GetCollectionUserPermissions implements UseCase<CollectionUserPermi
1213
/**
1314
* Returns an instance of CollectionUserPermissions that includes the permissions that the calling user has on a particular Collection.
1415
*
15-
* @param {number | string} [collectionIdOrAlias = 'root'] - A generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId)
16-
* If this parameter is not set, the default value is: 'root'
16+
* @param {number | string} [collectionIdOrAlias = ':root'] - A generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId)
17+
* If this parameter is not set, the default value is: ':root'
1718
* @returns {Promise<CollectionUserPermissions>}
1819
*/
19-
async execute(collectionIdOrAlias: number | string): Promise<CollectionUserPermissions> {
20+
async execute(
21+
collectionIdOrAlias: number | string = ROOT_COLLECTION_ID
22+
): Promise<CollectionUserPermissions> {
2023
return await this.collectionsRepository.getCollectionUserPermissions(collectionIdOrAlias)
2124
}
2225
}

src/collections/infra/repositories/CollectionsRepository.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
transformCollectionItemsResponseToCollectionItemSubset,
66
transformCollectionResponseToCollection
77
} from './transformers/collectionTransformers'
8-
import { Collection, ROOT_COLLECTION_ALIAS } from '../../domain/models/Collection'
8+
import { Collection, ROOT_COLLECTION_ID } from '../../domain/models/Collection'
99
import { CollectionDTO } from '../../domain/dtos/CollectionDTO'
1010
import { CollectionFacet } from '../../domain/models/CollectionFacet'
1111
import { CollectionUserPermissions } from '../../domain/models/CollectionUserPermissions'
@@ -52,7 +52,7 @@ export class CollectionsRepository extends ApiRepository implements ICollections
5252
private readonly collectionsResourceName: string = 'dataverses'
5353

5454
public async getCollection(
55-
collectionIdOrAlias: number | string = ROOT_COLLECTION_ALIAS
55+
collectionIdOrAlias: number | string = ROOT_COLLECTION_ID
5656
): Promise<Collection> {
5757
return this.doGet(`/${this.collectionsResourceName}/${collectionIdOrAlias}`, true, {
5858
returnOwners: true
@@ -65,7 +65,7 @@ export class CollectionsRepository extends ApiRepository implements ICollections
6565

6666
public async createCollection(
6767
collectionDTO: CollectionDTO,
68-
parentCollectionId: number | string = ROOT_COLLECTION_ALIAS
68+
parentCollectionId: number | string = ROOT_COLLECTION_ID
6969
): Promise<number> {
7070
const dataverseContacts: NewCollectionContactRequestPayload[] = collectionDTO.contacts.map(
7171
(contact) => ({

src/datasets/domain/useCases/CreateDataset.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { DatasetDTO } from '../dtos/DatasetDTO'
33
import { ResourceValidator } from '../../../core/domain/useCases/validators/ResourceValidator'
44
import { IMetadataBlocksRepository } from '../../../metadataBlocks/domain/repositories/IMetadataBlocksRepository'
55
import { CreatedDatasetIdentifiers } from '../models/CreatedDatasetIdentifiers'
6-
import { ROOT_COLLECTION_ALIAS } from '../../../collections/domain/models/Collection'
6+
import { ROOT_COLLECTION_ID } from '../../../collections/domain/models/Collection'
77
import { DatasetWriteUseCase } from './DatasetWriteUseCase'
88

99
export class CreateDataset extends DatasetWriteUseCase<CreatedDatasetIdentifiers> {
@@ -16,18 +16,18 @@ export class CreateDataset extends DatasetWriteUseCase<CreatedDatasetIdentifiers
1616
}
1717

1818
/**
19-
* Creates a new Dataset in a collection, given a DatasetDTO object and an optional collection identifier, which defaults to root.
19+
* Creates a new Dataset in a collection, given a DatasetDTO object and an optional collection identifier, which defaults to :root.
2020
*
2121
* @param {DatasetDTO} [newDataset] - DatasetDTO object including the new dataset metadata field values for each metadata block.
22-
* @param {string} [collectionId] - Specifies the collection identifier where the new dataset should be created (optional, defaults to root).
22+
* @param {string} [collectionId] - Specifies the collection identifier where the new dataset should be created (optional, defaults to :root).
2323
* @returns {Promise<CreatedDatasetIdentifiers>}
2424
* @throws {ResourceValidationError} - If there are validation errors related to the provided information.
2525
* @throws {ReadError} - If there are errors while reading data.
2626
* @throws {WriteError} - If there are errors while writing data.
2727
*/
2828
async execute(
2929
newDataset: DatasetDTO,
30-
collectionId = ROOT_COLLECTION_ALIAS
30+
collectionId = ROOT_COLLECTION_ID
3131
): Promise<CreatedDatasetIdentifiers> {
3232
const metadataBlocks = await this.getNewDatasetMetadataBlocks(newDataset)
3333
this.getNewDatasetValidator().validate(newDataset, metadataBlocks)

src/metadataBlocks/domain/useCases/GetCollectionMetadataBlocks.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { UseCase } from '../../../core/domain/useCases/UseCase'
22
import { MetadataBlock } from '../..'
3-
import { ROOT_COLLECTION_ALIAS } from '../../../collections/domain/models/Collection'
3+
import { ROOT_COLLECTION_ID } from '../../../collections/domain/models/Collection'
44
import { IMetadataBlocksRepository } from '../repositories/IMetadataBlocksRepository'
55

66
export class GetCollectionMetadataBlocks implements UseCase<MetadataBlock[]> {
@@ -13,13 +13,13 @@ export class GetCollectionMetadataBlocks implements UseCase<MetadataBlock[]> {
1313
/**
1414
* Returns a MetadataBlock array containing the metadata blocks from the requested collection.
1515
*
16-
* @param {number | string} [collectionIdOrAlias = 'root'] - A generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId)
17-
* If this parameter is not set, the default value is: 'root'
16+
* @param {number | string} [collectionIdOrAlias = ':root'] - A generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId)
17+
* If this parameter is not set, the default value is: ':root'
1818
* @param {boolean} [onlyDisplayedOnCreate=false] - Indicates whether or not to return only the metadata blocks that are displayed on dataset creation. The default value is false.
1919
* @returns {Promise<MetadataBlock[]>}
2020
*/
2121
async execute(
22-
collectionIdOrAlias: number | string = ROOT_COLLECTION_ALIAS,
22+
collectionIdOrAlias: number | string = ROOT_COLLECTION_ID,
2323
onlyDisplayedOnCreate = false
2424
): Promise<MetadataBlock[]> {
2525
return await this.metadataBlocksRepository.getCollectionMetadataBlocks(

test/functional/collections/GetCollectionFacets.test.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { ApiConfig, CollectionFacet, ReadError, getCollectionFacets } from '../../../src'
22
import { TestConstants } from '../../testHelpers/TestConstants'
33
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
4-
import { ROOT_COLLECTION_ALIAS } from '../../../src/collections/domain/models/Collection'
4+
5+
import { ROOT_COLLECTION_ALIAS } from '../../testHelpers/collections/collectionHelper'
56

67
describe('execute', () => {
78
beforeEach(async () => {

test/functional/collections/GetCollectionUserPermissions.test.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import {
66
} from '../../../src'
77
import { TestConstants } from '../../testHelpers/TestConstants'
88
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
9-
import { ROOT_COLLECTION_ALIAS } from '../../../src/collections/domain/models/Collection'
9+
10+
import { ROOT_COLLECTION_ALIAS } from '../../testHelpers/collections/collectionHelper'
1011

1112
describe('execute', () => {
1213
beforeEach(async () => {
@@ -17,6 +18,22 @@ describe('execute', () => {
1718
)
1819
})
1920

21+
test('should return user permissions for the default collection', async () => {
22+
let actual: CollectionUserPermissions
23+
try {
24+
actual = await getCollectionUserPermissions.execute()
25+
} catch (error) {
26+
throw new Error('Permissions should be retrieved')
27+
} finally {
28+
expect(actual.canAddDataset).toBe(true)
29+
expect(actual.canAddCollection).toBe(true)
30+
expect(actual.canDeleteCollection).toBe(true)
31+
expect(actual.canEditCollection).toBe(true)
32+
expect(actual.canManageCollectionPermissions).toBe(true)
33+
expect(actual.canPublishCollection).toBe(true)
34+
expect(actual.canViewUnpublishedCollection).toBe(true)
35+
}
36+
})
2037
test('should return user permissions when a valid collection alias is provided', async () => {
2138
let actual: CollectionUserPermissions
2239
try {

test/integration/collections/CollectionsRepository.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/
1616
import {
1717
createCollectionDTO,
1818
createCollectionViaApi,
19-
deleteCollectionViaApi
19+
deleteCollectionViaApi,
20+
ROOT_COLLECTION_ALIAS
2021
} from '../../testHelpers/collections/collectionHelper'
21-
import { ROOT_COLLECTION_ALIAS } from '../../../src/collections/domain/models/Collection'
2222
import { CollectionPayload } from '../../../src/collections/infra/repositories/transformers/CollectionPayload'
2323
import { uploadFileViaApi } from '../../testHelpers/files/filesHelper'
2424
import { deleteUnpublishedDatasetViaApi } from '../../testHelpers/datasets/datasetHelper'

test/integration/datasets/DatasetsRepository.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ import {
2626
DatasetContact,
2727
DatasetDescription
2828
} from '../../../src/datasets/domain/models/Dataset'
29-
import { ROOT_COLLECTION_ALIAS } from '../../../src/collections/domain/models/Collection'
3029
import {
3130
createCollectionViaApi,
32-
deleteCollectionViaApi
31+
deleteCollectionViaApi,
32+
ROOT_COLLECTION_ALIAS
3333
} from '../../testHelpers/collections/collectionHelper'
3434

3535
describe('DatasetsRepository', () => {

0 commit comments

Comments
 (0)