Skip to content

Commit

Permalink
feat: data offer id validators (#826)
Browse files Browse the repository at this point in the history
  • Loading branch information
illfixit committed Sep 16, 2024
1 parent d762618 commit 930083b
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 3 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
58 changes: 58 additions & 0 deletions src/app/core/validators/data-offer-form-validators.ts
Original file line number Diff line number Diff line change
@@ -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<ValidationErrors | null> => {
const value = control.value;
if (value) {
return this.edcApiService.isPolicyIdAvailable(value).pipe(
catchError(() =>
of<IdAvailabilityResponse>({id: value, available: false}),
),
map((it) => (it.available ? null : {idAlreadyExists: true})),
);
}
return of(null);
};

contractDefinitionIdExistsValidator: ValidatorFn = (
control: AbstractControl,
): Observable<ValidationErrors | null> => {
const value = control.value;
if (value) {
return this.edcApiService.isContractDefinitionIdAvailable(value).pipe(
catchError(() =>
of<IdAvailabilityResponse>({id: value, available: false}),
),
map((it) => (it.available ? null : {idAlreadyExists: true})),
);
}
return of(null);
};

assetIdExistsValidator: ValidatorFn = (
control: AbstractControl,
): Observable<ValidationErrors | null> => {
const value = control.value;
if (value) {
return this.edcApiService.isAssetIdAvailable(value).pipe(
catchError(() =>
of<IdAvailabilityResponse>({id: value, available: false}),
),
map((it) => (it.available ? null : {idAlreadyExists: true})),
);
}
return of(null);
};
}
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -22,11 +23,18 @@ export class ContractDefinitionEditorDialogForm {
return this.group.value;
}

constructor(private formBuilder: FormBuilder) {}
constructor(
private formBuilder: FormBuilder,
private validators: DataOfferFormValidators,
) {}

buildFormGroup(): FormGroup<ContractDefinitionEditorDialogFormModel> {
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],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ <h1 mat-dialog-title>Publish New Data Offer</h1>
<mat-error *ngIf="ctrl.invalid && ctrl.errors?.pattern">{{
validationMessages.invalidWhitespacesOrColonsMessage
}}</mat-error>
<mat-error *ngIf="ctrl.invalid && ctrl.errors?.idAlreadyExists">
{{ validationMessages.idExistsErrorMessage }}
</mat-error>
</mat-form-field>

<!-- Access Policy -->
Expand Down
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -24,11 +25,16 @@ export class PolicyDefinitionCreatePageForm {
constructor(
private formBuilder: FormBuilder,
private expressionFormControls: ExpressionFormControls,
private validators: DataOfferFormValidators,
) {}

buildFormGroup(): FormGroup<PolicyDefinitionCreatePageFormModel> {
return this.formBuilder.nonNullable.group({
id: ['', [Validators.required, noWhitespacesOrColonsValidator]],
id: [
'',
[Validators.required, noWhitespacesOrColonsValidator],
[this.validators.policyIdExistsValidator],
],
treeControls: this.expressionFormControls.formGroup,
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
<mat-error *ngIf="ctrl.invalid && ctrl.errors?.pattern">{{
validationMessages.invalidWhitespacesOrColonsMessage
}}</mat-error>
<mat-error *ngIf="ctrl.invalid && ctrl.errors?.idAlreadyExists">{{
validationMessages.idExistsErrorMessage
}}</mat-error>
</mat-form-field>

<div class="form-section-title">Policy Expression</div>
Expand Down

0 comments on commit 930083b

Please sign in to comment.