From fa8fe0fe540e6b69a8494cb25019fd3ebf8a2806 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 26 Jul 2018 09:49:36 -0700 Subject: [PATCH] SHIBUI-685 Added validation for unique IDs in XML --- .../app/metadata/domain/model/metadata-provider.ts | 1 + .../container/provider-edit-step.component.ts | 13 ++++++++++--- .../model/file-backed-http.provider.form.ts | 13 +++++++++++++ .../provider/reducer/collection.reducer.spec.ts | 2 ++ ui/src/app/metadata/provider/reducer/index.ts | 1 + ui/src/app/wizard/model/wizard.ts | 2 +- 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/ui/src/app/metadata/domain/model/metadata-provider.ts b/ui/src/app/metadata/domain/model/metadata-provider.ts index 4b0a7bc46..f068ec718 100644 --- a/ui/src/app/metadata/domain/model/metadata-provider.ts +++ b/ui/src/app/metadata/domain/model/metadata-provider.ts @@ -8,6 +8,7 @@ export interface MetadataProvider extends MetadataBase { '@type': string; enabled: boolean; resourceId: string; + xmlId: string; sortKey: number; metadataFilters: MetadataFilter[]; } diff --git a/ui/src/app/metadata/provider/container/provider-edit-step.component.ts b/ui/src/app/metadata/provider/container/provider-edit-step.component.ts index 7811590ed..6ffc7e13c 100644 --- a/ui/src/app/metadata/provider/container/provider-edit-step.component.ts +++ b/ui/src/app/metadata/provider/container/provider-edit-step.component.ts @@ -58,9 +58,16 @@ export class ProviderEditStepComponent implements OnDestroy { this.lock.valueChanges.subscribe(locked => this.store.dispatch(locked ? new LockEditor() : new UnlockEditor())); - this.validators$ = this.store.select(fromProvider.getProviderNames).pipe( - withLatestFrom(this.definition$, this.provider$), - map(([names, def, provider]) => def.getValidators(names.filter(n => n !== provider.name))) + this.validators$ = this.definition$.pipe( + withLatestFrom( + this.store.select(fromProvider.getProviderNames), + this.store.select(fromProvider.getProviderXmlIds), + this.provider$ + ), + map(([def, names, ids, provider]) => def.getValidators( + names.filter(n => n !== provider.name), + ids.filter(id => id !== provider.xmlId) + )) ); this.model$ = this.schema$.pipe( diff --git a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts b/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts index b4faa696f..8d091c463 100644 --- a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts +++ b/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts @@ -6,6 +6,19 @@ export const FileBackedHttpMetadataProviderWizard: Wizard { + const err = xmlIdList.indexOf(value) > -1 ? { + code: 'INVALID_ID', + path: `#${property.path}`, + message: 'ID must be unique.', + params: [value] + } : null; + return err; + }; + return validators; + }, steps: [ { id: 'common', diff --git a/ui/src/app/metadata/provider/reducer/collection.reducer.spec.ts b/ui/src/app/metadata/provider/reducer/collection.reducer.spec.ts index 700dd5a1e..3e716c212 100644 --- a/ui/src/app/metadata/provider/reducer/collection.reducer.spec.ts +++ b/ui/src/app/metadata/provider/reducer/collection.reducer.spec.ts @@ -33,6 +33,7 @@ describe('Provider Collection Reducer', () => { enabled: true, createdDate: new Date().toLocaleDateString(), sortKey: 1, + xmlId: 'foo', metadataFilters: [] }, { @@ -42,6 +43,7 @@ describe('Provider Collection Reducer', () => { enabled: false, createdDate: new Date().toLocaleDateString(), sortKey: 2, + xmlId: 'bar', metadataFilters: [] } ]; diff --git a/ui/src/app/metadata/provider/reducer/index.ts b/ui/src/app/metadata/provider/reducer/index.ts index 4b7e4d45b..7655e4314 100644 --- a/ui/src/app/metadata/provider/reducer/index.ts +++ b/ui/src/app/metadata/provider/reducer/index.ts @@ -95,3 +95,4 @@ export const getProviderIds = createSelector(getCollectionState, fromCollection. export const getProviderCollectionIsLoaded = createSelector(getCollectionState, fromCollection.getIsLoaded); export const getProviderNames = createSelector(getAllProviders, (providers: MetadataProvider[]) => providers.map(p => p.name)); +export const getProviderXmlIds = createSelector(getAllProviders, (providers: MetadataProvider[]) => providers.map(p => p.xmlId)); diff --git a/ui/src/app/wizard/model/wizard.ts b/ui/src/app/wizard/model/wizard.ts index 10e73b739..b3f598ad6 100644 --- a/ui/src/app/wizard/model/wizard.ts +++ b/ui/src/app/wizard/model/wizard.ts @@ -7,7 +7,7 @@ export interface Wizard { formatter(changes: Partial, schema?: any) }; - getValidators?(params: any): { [key: string]: any }; + getValidators?(...args: any[]): { [key: string]: any }; } export interface WizardStep {