From 930083b61e1cf7c7515d1ed87a75f10614377796 Mon Sep 17 00:00:00 2001 From: Ilia Orlov <66363651+illfixit@users.noreply.github.com> Date: Mon, 16 Sep 2024 13:20:49 +0200 Subject: [PATCH] feat: data offer id validators (#826) --- CHANGELOG.md | 2 + .../validators/data-offer-form-validators.ts | 58 +++++++++++++++++++ .../contract-definition-editor-dialog-form.ts | 12 +++- ...ct-definition-editor-dialog.component.html | 3 + .../policy-definition-create-page-form.ts | 8 ++- ...licy-definition-create-page.component.html | 3 + 6 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 src/app/core/validators/data-offer-form-validators.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index f020d1210..2c2b1c075 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ the detailed section referring to by linking pull requests or issues. - Changed wording on the data offer creation page - Data Offer details now display the contract ID for each contract offer +- Added validator for the Policy Id +- Added validator for the Data Offer Id ## [v4.1.3] - 2024-09-03 diff --git a/src/app/core/validators/data-offer-form-validators.ts b/src/app/core/validators/data-offer-form-validators.ts new file mode 100644 index 000000000..eba7ccb6e --- /dev/null +++ b/src/app/core/validators/data-offer-form-validators.ts @@ -0,0 +1,58 @@ +import {Injectable} from '@angular/core'; +import {AbstractControl, ValidationErrors, ValidatorFn} from '@angular/forms'; +import {Observable, of} from 'rxjs'; +import {catchError, map} from 'rxjs/operators'; +import {IdAvailabilityResponse} from '@sovity.de/edc-client'; +import {EdcApiService} from '../services/api/edc-api.service'; + +@Injectable({ + providedIn: 'root', +}) +export class DataOfferFormValidators { + constructor(private edcApiService: EdcApiService) {} + + policyIdExistsValidator: ValidatorFn = ( + control: AbstractControl, + ): Observable => { + const value = control.value; + if (value) { + return this.edcApiService.isPolicyIdAvailable(value).pipe( + catchError(() => + of({id: value, available: false}), + ), + map((it) => (it.available ? null : {idAlreadyExists: true})), + ); + } + return of(null); + }; + + contractDefinitionIdExistsValidator: ValidatorFn = ( + control: AbstractControl, + ): Observable => { + const value = control.value; + if (value) { + return this.edcApiService.isContractDefinitionIdAvailable(value).pipe( + catchError(() => + of({id: value, available: false}), + ), + map((it) => (it.available ? null : {idAlreadyExists: true})), + ); + } + return of(null); + }; + + assetIdExistsValidator: ValidatorFn = ( + control: AbstractControl, + ): Observable => { + const value = control.value; + if (value) { + return this.edcApiService.isAssetIdAvailable(value).pipe( + catchError(() => + of({id: value, available: false}), + ), + map((it) => (it.available ? null : {idAlreadyExists: true})), + ); + } + return of(null); + }; +} diff --git a/src/app/routes/connector-ui/contract-definition-page/contract-definition-editor-dialog/contract-definition-editor-dialog-form.ts b/src/app/routes/connector-ui/contract-definition-page/contract-definition-editor-dialog/contract-definition-editor-dialog-form.ts index 01dd658af..8cdc29a37 100644 --- a/src/app/routes/connector-ui/contract-definition-page/contract-definition-editor-dialog/contract-definition-editor-dialog-form.ts +++ b/src/app/routes/connector-ui/contract-definition-page/contract-definition-editor-dialog/contract-definition-editor-dialog-form.ts @@ -1,6 +1,7 @@ import {Injectable} from '@angular/core'; import {FormBuilder, FormGroup, Validators} from '@angular/forms'; import {PolicyDefinitionDto} from '@sovity.de/edc-client'; +import {DataOfferFormValidators} from 'src/app/core/validators/data-offer-form-validators'; import {UiAssetMapped} from '../../../../core/services/models/ui-asset-mapped'; import {noWhitespacesOrColonsValidator} from '../../../../core/validators/no-whitespaces-or-colons-validator'; import { @@ -22,11 +23,18 @@ export class ContractDefinitionEditorDialogForm { return this.group.value; } - constructor(private formBuilder: FormBuilder) {} + constructor( + private formBuilder: FormBuilder, + private validators: DataOfferFormValidators, + ) {} buildFormGroup(): FormGroup { return this.formBuilder.nonNullable.group({ - id: ['', [Validators.required, noWhitespacesOrColonsValidator]], + id: [ + '', + [Validators.required, noWhitespacesOrColonsValidator], + [this.validators.contractDefinitionIdExistsValidator], + ], accessPolicy: [null as PolicyDefinitionDto | null, Validators.required], contractPolicy: [null as PolicyDefinitionDto | null, Validators.required], assets: [[] as UiAssetMapped[], Validators.required], diff --git a/src/app/routes/connector-ui/contract-definition-page/contract-definition-editor-dialog/contract-definition-editor-dialog.component.html b/src/app/routes/connector-ui/contract-definition-page/contract-definition-editor-dialog/contract-definition-editor-dialog.component.html index dbf2939a7..eb7c68dcd 100644 --- a/src/app/routes/connector-ui/contract-definition-page/contract-definition-editor-dialog/contract-definition-editor-dialog.component.html +++ b/src/app/routes/connector-ui/contract-definition-page/contract-definition-editor-dialog/contract-definition-editor-dialog.component.html @@ -12,6 +12,9 @@

Publish New Data Offer

{{ validationMessages.invalidWhitespacesOrColonsMessage }} + + {{ validationMessages.idExistsErrorMessage }} + diff --git a/src/app/routes/connector-ui/policy-definition-create-page/policy-definition-create-page/policy-definition-create-page-form.ts b/src/app/routes/connector-ui/policy-definition-create-page/policy-definition-create-page/policy-definition-create-page-form.ts index 1c2af7cc9..ad66bdab3 100644 --- a/src/app/routes/connector-ui/policy-definition-create-page/policy-definition-create-page/policy-definition-create-page-form.ts +++ b/src/app/routes/connector-ui/policy-definition-create-page/policy-definition-create-page/policy-definition-create-page-form.ts @@ -1,5 +1,6 @@ import {Injectable} from '@angular/core'; import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {DataOfferFormValidators} from 'src/app/core/validators/data-offer-form-validators'; import {ExpressionFormControls} from '../../../../component-library/policy-editor/editor/expression-form-controls'; import {noWhitespacesOrColonsValidator} from '../../../../core/validators/no-whitespaces-or-colons-validator'; import { @@ -24,11 +25,16 @@ export class PolicyDefinitionCreatePageForm { constructor( private formBuilder: FormBuilder, private expressionFormControls: ExpressionFormControls, + private validators: DataOfferFormValidators, ) {} buildFormGroup(): FormGroup { return this.formBuilder.nonNullable.group({ - id: ['', [Validators.required, noWhitespacesOrColonsValidator]], + id: [ + '', + [Validators.required, noWhitespacesOrColonsValidator], + [this.validators.policyIdExistsValidator], + ], treeControls: this.expressionFormControls.formGroup, }); } diff --git a/src/app/routes/connector-ui/policy-definition-create-page/policy-definition-create-page/policy-definition-create-page.component.html b/src/app/routes/connector-ui/policy-definition-create-page/policy-definition-create-page/policy-definition-create-page.component.html index 06b7ef5d3..79c30368a 100644 --- a/src/app/routes/connector-ui/policy-definition-create-page/policy-definition-create-page/policy-definition-create-page.component.html +++ b/src/app/routes/connector-ui/policy-definition-create-page/policy-definition-create-page/policy-definition-create-page.component.html @@ -10,6 +10,9 @@ {{ validationMessages.invalidWhitespacesOrColonsMessage }} + {{ + validationMessages.idExistsErrorMessage + }}
Policy Expression