Skip to content

Commit f3351a8

Browse files
refactor(rule-engine): improve error handling and UI feedback
1 parent ab08a64 commit f3351a8

4 files changed

Lines changed: 32 additions & 35 deletions

File tree

core-web/libs/dot-rules/src/lib/features/rule-engine/container/dot-rule-engine-container.component.ts

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { from as observableFrom, Observable, merge, Subject } from 'rxjs';
1+
import { Observable, Subject, merge, from as observableFrom } from 'rxjs';
22

33
import { Component, OnDestroy, inject, signal } from '@angular/core';
44
import { ActivatedRoute, Params } from '@angular/router';
55

6-
import { reduce, mergeMap, take, map, filter, takeUntil } from 'rxjs/operators';
6+
import { filter, map, mergeMap, reduce, take, takeUntil } from 'rxjs/operators';
77

88
import { CwError, HttpCode, LoggerService } from '@dotcms/dotcms-js';
99

@@ -12,28 +12,28 @@ import { BundleService, IPublishEnvironment } from '../../../services/api/bundle
1212
import { ConditionService } from '../../../services/api/condition/Condition';
1313
import { ConditionGroupService } from '../../../services/api/condition-group/ConditionGroup';
1414
import {
15-
RuleModel,
16-
RuleService,
15+
ActionModel,
1716
ConditionGroupModel,
1817
ConditionModel,
19-
ActionModel
18+
RuleModel,
19+
RuleService
2020
} from '../../../services/api/rule/Rule';
2121
import { ServerSideTypeModel } from '../../../services/api/serverside-field/ServerSideFieldModel';
2222
import {
23-
RuleActionEvent,
24-
RuleActionActionEvent,
23+
ConditionActionEvent,
2524
ConditionGroupActionEvent,
26-
ConditionActionEvent
25+
RuleActionActionEvent,
26+
RuleActionEvent
2727
} from '../../../services/models/rule-event.model';
2828
import { RuleViewService } from '../../../services/ui/dot-view-rule-service';
2929
import { DotRuleEngineComponent } from '../dot-rule-engine.component';
3030

3131
// Re-export for backward compatibility
3232
export {
33-
RuleActionEvent,
34-
RuleActionActionEvent,
33+
ConditionActionEvent,
3534
ConditionGroupActionEvent,
36-
ConditionActionEvent
35+
RuleActionActionEvent,
36+
RuleActionEvent
3737
} from '../../../services/models/rule-event.model';
3838

3939
/**
@@ -95,11 +95,9 @@ export class DotRuleEngineContainerComponent implements OnDestroy {
9595
});
9696

9797
this._ruleService._errors$.subscribe((res) => {
98-
this.ruleViewService.showErrorMessage(
99-
res.message,
100-
false,
101-
res.response.headers.get('error-key')
102-
);
98+
const message = (res.error?.message || '').replace(/ user-\S+/gi, '');
99+
const errorKey = res.headers?.get('error-key') ?? '';
100+
this.ruleViewService.showErrorMessage(message, false, errorKey);
103101
this.loading.set(false);
104102
this.showRules.set(false);
105103
});
@@ -710,14 +708,18 @@ export class DotRuleEngineContainerComponent implements OnDestroy {
710708
this.loading.set(false);
711709
}
712710

713-
private _handle403Error(e: CwError): boolean {
711+
private _handle403Error(e): boolean {
714712
let handled = false;
713+
715714
try {
716-
if (e && e.response.status === HttpCode.FORBIDDEN) {
717-
const errorJson = e.response;
715+
if (e && e?.status === HttpCode.FORBIDDEN) {
716+
const errorJson = e.error;
717+
718718
if (errorJson && errorJson.error) {
719719
this.ruleViewService.showErrorMessage(
720-
errorJson.error.message.replace('dotcms.api.error.forbidden: ', '')
720+
errorJson.error
721+
.replace('dotcms.api.error.forbidden: ', '')
722+
.replace(/ user-\S+/gi, '')
721723
);
722724
handled = true;
723725
}

core-web/libs/dot-rules/src/lib/features/rule-engine/dot-rule-engine.component.html

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,9 @@
88
<div class="bg-(--color-palette-black-op-30) w-full h-full"></div>
99
}
1010
@if (!loading && globalError()?.message) {
11-
<div class="ui negative message first:my-8 first:mx-8 first:mb-4">
11+
<div class="ui negative message first:my-8 first:mx-8 first:mb-4 font-bold text-red-600">
1212
<div class="header">{{ globalError().message }}</div>
1313
<p>{{ getI18nLabel('contact.admin.error') | async }}</p>
14-
@if (showCloseButton()) {
15-
<i
16-
(click)="clearGlobalError()"
17-
class="pi pi-times text-sm absolute right-2 top-2 cursor-pointer not-italic"></i>
18-
}
1914
</div>
2015
}
2116
@if (!loading && showRules) {

core-web/libs/dot-rules/src/lib/features/rule-engine/dot-rule-engine.component.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@ import { take } from 'rxjs/operators';
1212
import { DotPushPublishDialogService } from '@dotcms/dotcms-js';
1313

1414
import { IPublishEnvironment } from '../../services/api/bundle/bundle-service';
15-
import { RuleModel, RULE_CREATE } from '../../services/api/rule/Rule';
15+
import { RULE_CREATE, RuleModel } from '../../services/api/rule/Rule';
1616
import { ServerSideTypeModel } from '../../services/api/serverside-field/ServerSideFieldModel';
1717
import { I18nService } from '../../services/i18n/i18n.service';
1818
import {
1919
ConditionActionEvent,
20+
ConditionGroupActionEvent,
2021
RuleActionActionEvent,
21-
RuleActionEvent,
22-
ConditionGroupActionEvent
22+
RuleActionEvent
2323
} from '../../services/models/rule-event.model';
24-
import { RuleViewService, DotRuleMessage } from '../../services/ui/dot-view-rule-service';
24+
import { DotRuleMessage, RuleViewService } from '../../services/ui/dot-view-rule-service';
2525
import { RuleFilter } from '../../services/utils/filter.util';
2626
import { DotRuleComponent } from '../rule/dot-rule.component';
2727

core-web/libs/dot-rules/src/lib/services/api/rule/Rule.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { from as observableFrom, Subject, Observable, BehaviorSubject } from 'rxjs';
1+
import { BehaviorSubject, Observable, from as observableFrom, Subject } from 'rxjs';
22

3-
import { HttpClient } from '@angular/common/http';
4-
import { Injectable, inject } from '@angular/core';
3+
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
4+
import { inject, Injectable } from '@angular/core';
55

6-
import { mergeMap, reduce, map, tap } from 'rxjs/operators';
6+
import { map, mergeMap, reduce, tap } from 'rxjs/operators';
77
// tslint:disable-next-line:max-file-line-count
88

99
import { ApiRoot, CwError, SiteService } from '@dotcms/dotcms-js';
@@ -268,7 +268,7 @@ export class RuleService {
268268
_ruleActionTypes: { [key: string]: ServerSideTypeModel } = {};
269269
_conditionTypes: { [key: string]: ServerSideTypeModel } = {};
270270

271-
public _errors$: Subject<{ message: string; response: Response }> = new Subject();
271+
public _errors$: Subject<HttpErrorResponse> = new Subject();
272272

273273
protected _actionsEndpointUrl: string;
274274
// tslint:disable-next-line:no-unused-variable

0 commit comments

Comments
 (0)