Skip to content

Commit

Permalink
add advertconfig service
Browse files Browse the repository at this point in the history
  • Loading branch information
Petter Andersson committed Dec 14, 2023
1 parent 80d77c9 commit 25088c3
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 24 deletions.
60 changes: 58 additions & 2 deletions src/advert-field-config/mappers.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { normalizeFieldConfig } from './mappers'
import type { FieldConfig } from './types'

it('should override default values with input', () => {
const output = normalizeFieldConfig([
Expand All @@ -7,7 +8,9 @@ it('should override default values with input', () => {
{ name: 'width', visible: true, mandatory: true },
])
expect(output).toEqual([
{ name: 'title', visible: true, mandatory: false },
{ name: 'description', visible: true, mandatory: false },
{ name: 'quantity', visible: true, mandatory: false },
{ name: 'unit', visible: true, mandatory: false },
{ name: 'width', visible: true, mandatory: true },
{ name: 'height', visible: true, mandatory: false },
Expand All @@ -19,15 +22,22 @@ it('should override default values with input', () => {
{ name: 'usage', visible: true, mandatory: false },
{ name: 'category', visible: true, mandatory: false },
{ name: 'reference', visible: true, mandatory: false },
{ name: 'organization', visible: true, mandatory: false },
{ name: 'tags', visible: false, mandatory: true },
{ name: 'organization', visible: true, mandatory: false },
{ name: 'adress', visible: true, mandatory: false },
{ name: 'zipCode', visible: true, mandatory: false },
{ name: 'city', visible: true, mandatory: false },
{ name: 'email', visible: true, mandatory: false },
{ name: 'phone', visible: true, mandatory: false },
])
})

it('should handle null document', () => {
const output = normalizeFieldConfig(null)
expect(output).toEqual([
{ name: 'title', visible: true, mandatory: false },
{ name: 'description', visible: true, mandatory: false },
{ name: 'quantity', visible: true, mandatory: false },
{ name: 'unit', visible: true, mandatory: false },
{ name: 'width', visible: true, mandatory: false },
{ name: 'height', visible: true, mandatory: false },
Expand All @@ -39,7 +49,53 @@ it('should handle null document', () => {
{ name: 'usage', visible: true, mandatory: false },
{ name: 'category', visible: true, mandatory: false },
{ name: 'reference', visible: true, mandatory: false },
{ name: 'organization', visible: true, mandatory: false },
{ name: 'tags', visible: true, mandatory: false },
{ name: 'organization', visible: true, mandatory: false },
{ name: 'adress', visible: true, mandatory: false },
{ name: 'zipCode', visible: true, mandatory: false },
{ name: 'city', visible: true, mandatory: false },
{ name: 'email', visible: true, mandatory: false },
{ name: 'phone', visible: true, mandatory: false },
])
})

it('should remove unsupported keys', () => {
const output = normalizeFieldConfig([
{ name: 'tags', visible: false, mandatory: true },
{ name: 'material', visible: false, mandatory: true },
{
name: 'BOGUS1',
visible: false,
mandatory: true,
} as unknown as FieldConfig,
{ name: 'width', visible: false, mandatory: true },
{
name: 'BOGUS2',
visible: false,
mandatory: true,
} as unknown as FieldConfig,
])
expect(output).toEqual([
{ name: 'title', visible: true, mandatory: false },
{ name: 'description', visible: true, mandatory: false },
{ name: 'quantity', visible: true, mandatory: false },
{ name: 'unit', visible: true, mandatory: false },
{ name: 'width', visible: false, mandatory: true },
{ name: 'height', visible: true, mandatory: false },
{ name: 'depth', visible: true, mandatory: false },
{ name: 'weight', visible: true, mandatory: false },
{ name: 'size', visible: true, mandatory: false },
{ name: 'material', visible: false, mandatory: true },
{ name: 'condition', visible: true, mandatory: false },
{ name: 'usage', visible: true, mandatory: false },
{ name: 'category', visible: true, mandatory: false },
{ name: 'reference', visible: true, mandatory: false },
{ name: 'tags', visible: false, mandatory: true },
{ name: 'organization', visible: true, mandatory: false },
{ name: 'adress', visible: true, mandatory: false },
{ name: 'zipCode', visible: true, mandatory: false },
{ name: 'city', visible: true, mandatory: false },
{ name: 'email', visible: true, mandatory: false },
{ name: 'phone', visible: true, mandatory: false },
])
})
9 changes: 8 additions & 1 deletion src/advert-field-config/mappers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,16 @@ const createEmptyConfiguration = (): AdvertFieldConfig =>
export const normalizeFieldConfig = (fieldConfig: AdvertFieldConfig | null) => {
const fieldList = [...createEmptyConfiguration(), ...(fieldConfig || [])]

const filteredList = fieldList
.reduce<Array<FieldConfig | null>>(
(p, c) => [...p, ConfigurableFields.includes(c.name) ? c : null],
[]
)
.filter(v => v) as AdvertFieldConfig

const mapper = new Map<string, FieldConfig>()

fieldList.forEach(f => {
filteredList.forEach(f => {
mapper.set(f.name, {
...(mapper.get(f.name) || {}),
...f,
Expand Down
42 changes: 21 additions & 21 deletions src/advert-field-config/types.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,20 @@
import type { Advert, AdvertContact } from '../adverts/types'
import type {
AdvertContact,
AdvertInput,
AdvertLocation,
} from '../adverts/types'

export type Fields = Pick<
Advert & AdvertContact,
| 'description'
| 'unit'
| 'width'
| 'height'
| 'depth'
| 'weight'
| 'size'
| 'material'
| 'condition'
| 'usage'
| 'category'
| 'reference'
| 'organization'
| 'tags'
>
type Fields = keyof (Omit<
AdvertInput,
'images' | 'externalId' | 'location' | 'contact'
> &
AdvertContact &
AdvertLocation)

export const ConfigurableFields: Array<keyof Fields> = [
export const ConfigurableFields: Array<Fields> = [
'title',
'description',
'quantity',
'unit',
'width',
'height',
Expand All @@ -31,12 +26,17 @@ export const ConfigurableFields: Array<keyof Fields> = [
'usage',
'category',
'reference',
'organization',
'tags',
'organization',
'adress',
'zipCode',
'city',
'email',
'phone',
]

export interface FieldConfig {
name: keyof Fields
name: Fields
visible: boolean
mandatory: boolean
}
Expand Down

0 comments on commit 25088c3

Please sign in to comment.