Skip to content

Commit 1db9726

Browse files
committed
initial work
1 parent 68315ed commit 1db9726

File tree

10 files changed

+296
-126
lines changed

10 files changed

+296
-126
lines changed
Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1-
export type CollectionFeaturedItemsDTO = CollectionFeaturedItemDTO[]
1+
import { CustomFeaturedItem, DvObjectFeaturedItem } from '../models/CollectionFeaturedItem'
22

3-
export interface CollectionFeaturedItemDTO {
3+
export type CollectionFeaturedItemsDTO = (CustomFeaturedItemDTO | DvObjectFeaturedItemDTO)[]
4+
5+
export interface CustomFeaturedItemDTO {
46
id?: number
7+
type: CustomFeaturedItem['type']
58
content: string
69
displayOrder: number
710
file?: File
811
keepFile: boolean
912
}
13+
14+
export interface DvObjectFeaturedItemDTO {
15+
id?: number
16+
type: DvObjectFeaturedItem['type']
17+
dvObjectIdentifier: string
18+
displayOrder: number
19+
}
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
1-
export interface CollectionFeaturedItem {
1+
export type CollectionFeaturedItem = CustomFeaturedItem | DvObjectFeaturedItem
2+
3+
export interface CustomFeaturedItem {
24
id: number
5+
type: 'custom'
36
content: string
47
imageFileName?: string
58
imageFileUrl?: string
69
displayOrder: number
710
}
11+
12+
export interface DvObjectFeaturedItem {
13+
id: number
14+
type: 'collection' | 'dataset' | 'file'
15+
dvObjectIdentifier: string
16+
displayOrder: number
17+
}

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ import {
2020
import { CollectionItemType } from '../../domain/models/CollectionItemType'
2121
import { CollectionFeaturedItem } from '../../domain/models/CollectionFeaturedItem'
2222
import { transformCollectionFeaturedItemsPayloadToCollectionFeaturedItems } from './transformers/collectionFeaturedItemsTransformer'
23-
import { CollectionFeaturedItemsDTO } from '../../domain/dtos/CollectionFeaturedItemsDTO'
23+
import {
24+
CollectionFeaturedItemsDTO,
25+
CustomFeaturedItemDTO,
26+
DvObjectFeaturedItemDTO
27+
} from '../../domain/dtos/CollectionFeaturedItemsDTO'
2428
import { ApiConstants } from '../../../core/infra/repositories/ApiConstants'
2529
import { PublicationStatus } from '../../../../src/core/domain/models/PublicationStatus'
2630
import { ReadError } from '../../../core/domain/repositories/ReadError'
@@ -382,18 +386,40 @@ export class CollectionsRepository extends ApiRepository implements ICollections
382386

383387
const formData = new FormData()
384388

385-
orderedFeaturedItemsDTO.forEach((item) => {
386-
const { id, content, displayOrder, file, keepFile } = item
387-
const fileName = file ? file.name : ''
388-
389-
formData.append('id', id ? id.toString() : '0')
390-
formData.append('content', content)
391-
formData.append('displayOrder', displayOrder.toString())
392-
formData.append('keepFile', keepFile.toString())
393-
formData.append('fileName', fileName)
394-
if (file) {
395-
formData.append('file', file)
389+
orderedFeaturedItemsDTO.forEach((item: CustomFeaturedItemDTO | DvObjectFeaturedItemDTO) => {
390+
formData.append('id', item.id !== undefined ? item.id.toString() : '0')
391+
formData.append('type', item.type)
392+
formData.append('displayOrder', item.displayOrder.toString())
393+
394+
if (item.type === 'custom') {
395+
// CustomFeaturedItemDTO
396+
formData.append('content', item.content)
397+
formData.append('keepFile', item.keepFile.toString())
398+
formData.append('fileName', item.file ? item.file.name : '')
399+
if (item.file) {
400+
formData.append('file', item.file)
401+
}
402+
} else {
403+
// DvObjectFeaturedItemDTO
404+
formData.append('dvObjectIdentifier', item.dvObjectIdentifier)
405+
406+
// We still need to append content, keepFile, and fileName as they are expected by the backend even empty
407+
formData.append('content', '')
408+
formData.append('keepFile', '')
409+
formData.append('fileName', '')
396410
}
411+
412+
// const { id, content, displayOrder, file, keepFile } = item
413+
// const fileName = file ? file.name : ''
414+
415+
// formData.append('id', id ? id.toString() : '0')
416+
// formData.append('content', content)
417+
// formData.append('displayOrder', displayOrder.toString())
418+
// formData.append('keepFile', keepFile.toString())
419+
// formData.append('fileName', fileName)
420+
// if (file) {
421+
// formData.append('file', file)
422+
// }
397423
})
398424

399425
return formData
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
1-
export interface CollectionFeaturedItemPayload {
1+
export type CollectionFeaturedItemPayload = CustomFeaturedItemPayload | DvObjectFeaturedItemPayload
2+
3+
export interface CustomFeaturedItemPayload {
24
id: number
5+
type: 'custom'
36
content: string
47
imageFileName: string | null
58
imageFileUrl: string | null
69
displayOrder: number
710
}
11+
12+
export interface DvObjectFeaturedItemPayload {
13+
id: number
14+
type: 'dataverse' | 'dataset' | 'datafile'
15+
dvObjectIdentifier: string
16+
displayOrder: number
17+
}
Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,52 @@
1-
import { CollectionFeaturedItem } from '../../../domain/models/CollectionFeaturedItem'
2-
import { CollectionFeaturedItemPayload } from './CollectionFeaturedItemPayload'
1+
import {
2+
CollectionFeaturedItem,
3+
CustomFeaturedItem,
4+
DvObjectFeaturedItem
5+
} from '../../../domain/models/CollectionFeaturedItem'
6+
import {
7+
CollectionFeaturedItemPayload,
8+
DvObjectFeaturedItemPayload
9+
} from './CollectionFeaturedItemPayload'
10+
11+
const dvObjectTypeMap: Record<DvObjectFeaturedItemPayload['type'], DvObjectFeaturedItem['type']> = {
12+
dataverse: 'collection',
13+
dataset: 'dataset',
14+
datafile: 'file'
15+
}
316

417
export const transformCollectionFeaturedItemsPayloadToCollectionFeaturedItems = (
5-
collectionFeaturedItemsPayload: CollectionFeaturedItemPayload[]
18+
payload: CollectionFeaturedItemPayload[]
619
): CollectionFeaturedItem[] => {
7-
return collectionFeaturedItemsPayload
8-
.map((collectionFeaturedItemPayload) => ({
9-
id: collectionFeaturedItemPayload.id,
10-
content: collectionFeaturedItemPayload.content,
11-
imageFileUrl: collectionFeaturedItemPayload.imageFileUrl || undefined,
12-
imageFileName: collectionFeaturedItemPayload.imageFileName || undefined,
13-
displayOrder: collectionFeaturedItemPayload.displayOrder
14-
}))
20+
return payload
21+
.map((item) => {
22+
if (item.type === 'custom') {
23+
const customFeaturedItem: CustomFeaturedItem = {
24+
id: item.id,
25+
type: 'custom',
26+
content: item.content,
27+
imageFileUrl: item.imageFileUrl || undefined,
28+
imageFileName: item.imageFileName || undefined,
29+
displayOrder: item.displayOrder
30+
}
31+
32+
return customFeaturedItem
33+
} else {
34+
// Map API types to domain types
35+
const type = dvObjectTypeMap[item.type]
36+
37+
if (!type) {
38+
throw new Error(`Unknown dvObject type: ${item.type}`)
39+
}
40+
41+
const dvObjectFeaturedItem: DvObjectFeaturedItem = {
42+
id: item.id,
43+
type,
44+
dvObjectIdentifier: item.dvObjectIdentifier,
45+
displayOrder: item.displayOrder
46+
}
47+
48+
return dvObjectFeaturedItem
49+
}
50+
})
1551
.sort((a, b) => a.displayOrder - b.displayOrder)
1652
}

test/functional/collections/DeleteCollectionFeaturedItems.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
deleteCollectionViaApi
77
} from '../../testHelpers/collections/collectionHelper'
88
import {
9-
createCollectionFeaturedItemViaApi,
9+
createCollectionCustomFeaturedItemViaApi,
1010
deleteCollectionFeaturedItemsViaApi
1111
} from '../../testHelpers/collections/collectionFeaturedItemsHelper'
1212

@@ -24,18 +24,18 @@ describe('execute', () => {
2424
beforeAll(async () => {
2525
try {
2626
await createCollectionViaApi(testCollectionAlias)
27-
await createCollectionFeaturedItemViaApi(testCollectionAlias, {
27+
await createCollectionCustomFeaturedItemViaApi(testCollectionAlias, {
2828
content: '<p class="rte-paragraph">Test content</p>',
2929
displayOrder: 1,
3030
withFile: true,
3131
fileName: 'featured-item-test-image.png'
3232
})
33-
await createCollectionFeaturedItemViaApi(testCollectionAlias, {
33+
await createCollectionCustomFeaturedItemViaApi(testCollectionAlias, {
3434
content: '<p class="rte-paragraph">Test content 2</p>',
3535
displayOrder: 2,
3636
withFile: false
3737
})
38-
await createCollectionFeaturedItemViaApi(testCollectionAlias, {
38+
await createCollectionCustomFeaturedItemViaApi(testCollectionAlias, {
3939
content: '<p class="rte-paragraph">Test content 3</p>',
4040
displayOrder: 3,
4141
withFile: false

test/functional/collections/GetCollectionFeaturedItems.test.ts

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import { ApiConfig, ReadError, getCollectionFeaturedItems } from '../../../src'
22
import { TestConstants } from '../../testHelpers/TestConstants'
33
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
44
import {
5-
createCollectionFeaturedItemViaApi,
5+
createCollectionCustomFeaturedItemViaApi,
66
deleteCollectionFeaturedItemViaApi
77
} from '../../testHelpers/collections/collectionFeaturedItemsHelper'
88
import {
99
createCollectionViaApi,
1010
deleteCollectionViaApi
1111
} from '../../testHelpers/collections/collectionHelper'
1212
import { ROOT_COLLECTION_ID } from '../../../src/collections/domain/models/Collection'
13+
import { CustomFeaturedItem } from '../../../src/collections/domain/models/CollectionFeaturedItem'
1314

1415
describe('execute', () => {
1516
const testCollectionAlias = 'getCollectionsFeaturedItemsTest'
@@ -27,12 +28,15 @@ describe('execute', () => {
2728
try {
2829
await createCollectionViaApi(testCollectionAlias)
2930

30-
const featuredItemCreated = await createCollectionFeaturedItemViaApi(testCollectionAlias, {
31-
content: '<p class="rte-paragraph">Test content</p>',
32-
displayOrder: 1,
33-
withFile: true,
34-
fileName: 'featured-item-test-image.png'
35-
})
31+
const featuredItemCreated = await createCollectionCustomFeaturedItemViaApi(
32+
testCollectionAlias,
33+
{
34+
content: '<p class="rte-paragraph">Test content</p>',
35+
displayOrder: 1,
36+
withFile: true,
37+
fileName: 'featured-item-test-image.png'
38+
}
39+
)
3640

3741
testFeaturedItemId = featuredItemCreated.id
3842
} catch (error) {
@@ -54,30 +58,37 @@ describe('execute', () => {
5458
test('should return featured items array given a valid collection alias that has featured items', async () => {
5559
const featuredItemsResponse = await getCollectionFeaturedItems.execute(testCollectionAlias)
5660

61+
const featuredItemOne = featuredItemsResponse[0] as CustomFeaturedItem
62+
5763
expect(featuredItemsResponse.length).toBe(1)
58-
expect(featuredItemsResponse[0].id).toBe(testFeaturedItemId)
59-
expect(featuredItemsResponse[0].displayOrder).toBe(1)
60-
expect(featuredItemsResponse[0].content).toBe('<p class="rte-paragraph">Test content</p>')
61-
expect(featuredItemsResponse[0].imageFileUrl).toBe(
62-
`http://localhost:8080/api/access/dataverseFeaturedItemImage/${featuredItemsResponse[0].id}`
64+
expect(featuredItemOne.id).toBe(testFeaturedItemId)
65+
expect(featuredItemOne.displayOrder).toBe(1)
66+
expect(featuredItemOne.content).toBe('<p class="rte-paragraph">Test content</p>')
67+
expect(featuredItemOne.imageFileUrl).toBe(
68+
`http://localhost:8080/api/access/dataverseFeaturedItemImage/${featuredItemOne.id}`
6369
)
64-
expect(featuredItemsResponse[0].imageFileName).toBe('featured-item-test-image.png')
70+
expect(featuredItemOne.imageFileName).toBe('featured-item-test-image.png')
6571
})
6672

6773
it('should return imageFileUrl and imageFileName as undefined when featured item does not have an image', async () => {
68-
const featuredItemCreated = await createCollectionFeaturedItemViaApi(testCollectionAlias, {
69-
content: '<p class="rte-paragraph">Test content</p>',
70-
displayOrder: 2
71-
})
74+
const featuredItemCreated = await createCollectionCustomFeaturedItemViaApi(
75+
testCollectionAlias,
76+
{
77+
content: '<p class="rte-paragraph">Test content</p>',
78+
displayOrder: 2
79+
}
80+
)
7281

7382
const featuredItemsResponse = await getCollectionFeaturedItems.execute(testCollectionAlias)
7483

84+
const featuredItemTwo = featuredItemsResponse[1] as CustomFeaturedItem
85+
7586
expect(featuredItemsResponse.length).toBe(2)
76-
expect(featuredItemsResponse[1].id).toBe(featuredItemCreated.id)
77-
expect(featuredItemsResponse[1].displayOrder).toBe(2)
78-
expect(featuredItemsResponse[1].content).toBe('<p class="rte-paragraph">Test content</p>')
79-
expect(featuredItemsResponse[1].imageFileUrl).toBeUndefined()
80-
expect(featuredItemsResponse[1].imageFileName).toBeUndefined()
87+
expect(featuredItemTwo.id).toBe(featuredItemCreated.id)
88+
expect(featuredItemTwo.displayOrder).toBe(2)
89+
expect(featuredItemTwo.content).toBe('<p class="rte-paragraph">Test content</p>')
90+
expect(featuredItemTwo.imageFileUrl).toBeUndefined()
91+
expect(featuredItemTwo.imageFileName).toBeUndefined()
8192

8293
await deleteCollectionFeaturedItemViaApi(featuredItemCreated.id)
8394
})

0 commit comments

Comments
 (0)