[ACS-5503] Folder rules rule update with correct error message when definition is invalid (#4610)

* [ACS-5503] Folder rules rule update with correct error message when definition is invalid

* [ACS-5503] Sonarlint fixes

* [ACS-5503] CR fixes
This commit is contained in:
MichalKinas
2025-06-17 10:57:21 +02:00
committed by GitHub
parent f48fc8c2d7
commit b57da70846
3 changed files with 26 additions and 6 deletions

View File

@@ -51,7 +51,6 @@ export class RuleListItemUiComponent {
onToggleClick(isEnabled: boolean, event: Event) { onToggleClick(isEnabled: boolean, event: Event) {
event.stopPropagation(); event.stopPropagation();
this.rule.isEnabled = !this.rule.isEnabled;
this.enabledChanged.emit(isEnabled); this.enabledChanged.emit(isEnabled);
} }
} }

View File

@@ -23,7 +23,7 @@
*/ */
import { TestBed } from '@angular/core/testing'; import { TestBed } from '@angular/core/testing';
import { CoreTestingModule } from '@alfresco/adf-core'; import { CoreTestingModule, NotificationService } from '@alfresco/adf-core';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { FolderRulesService } from './folder-rules.service'; import { FolderRulesService } from './folder-rules.service';
import { import {
@@ -42,6 +42,7 @@ import { AlfrescoApiService, AlfrescoApiServiceMock } from '@alfresco/adf-conten
describe('FolderRulesService', () => { describe('FolderRulesService', () => {
let folderRulesService: FolderRulesService; let folderRulesService: FolderRulesService;
let notificationService: NotificationService;
let callApiSpy: jasmine.Spy; let callApiSpy: jasmine.Spy;
@@ -60,7 +61,8 @@ describe('FolderRulesService', () => {
providers: [FolderRulesService, { provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock }] providers: [FolderRulesService, { provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock }]
}); });
folderRulesService = TestBed.inject<FolderRulesService>(FolderRulesService); folderRulesService = TestBed.inject(FolderRulesService);
notificationService = TestBed.inject(NotificationService);
callApiSpy = spyOn<any>(folderRulesService, 'callApi'); callApiSpy = spyOn<any>(folderRulesService, 'callApi');
}); });
@@ -148,6 +150,17 @@ describe('FolderRulesService', () => {
expect(result).toEqual(mockedRule); expect(result).toEqual(mockedRule);
}); });
it('should display error message and revert enabled state when updating rule fails', async () => {
callApiSpy
.withArgs(`/nodes/${nodeId}/rule-sets/${ruleSetId}/rules/${ruleId}`, 'PUT', mockedRule)
.and.returnValue(Promise.reject(new Error(JSON.stringify({ error: { briefSummary: 'Error updating rule' } }))));
spyOn(notificationService, 'showError');
const result = await folderRulesService.updateRule(nodeId, ruleId, mockedRule, ruleSetId);
expect(notificationService.showError).toHaveBeenCalledWith('Error updating rule');
expect(result.isEnabled).toBe(false);
});
it('should send correct GET request and return rule settings', async () => { it('should send correct GET request and return rule settings', async () => {
callApiSpy.withArgs(`/nodes/${nodeId}/rule-settings/${key}`, 'GET').and.returnValue(Promise.resolve(mockedRuleSettingsEntry)); callApiSpy.withArgs(`/nodes/${nodeId}/rule-settings/${key}`, 'GET').and.returnValue(Promise.resolve(mockedRuleSettingsEntry));

View File

@@ -30,6 +30,7 @@ import { Rule, RuleForForm, RuleOptions, RuleSettings } from '../model/rule.mode
import { RuleCompositeCondition } from '../model/rule-composite-condition.model'; import { RuleCompositeCondition } from '../model/rule-composite-condition.model';
import { RuleSimpleCondition } from '../model/rule-simple-condition.model'; import { RuleSimpleCondition } from '../model/rule-simple-condition.model';
import { RuleSet } from '../model/rule-set.model'; import { RuleSet } from '../model/rule-set.model';
import { NotificationService } from '@alfresco/adf-core';
interface GetRulesResult { interface GetRulesResult {
rules: Rule[]; rules: Rule[];
@@ -90,7 +91,10 @@ export class FolderRulesService {
selectedRule$ = this.selectedRuleSource.asObservable(); selectedRule$ = this.selectedRuleSource.asObservable();
deletedRuleId$: Observable<string> = this.deletedRuleIdSource.asObservable(); deletedRuleId$: Observable<string> = this.deletedRuleIdSource.asObservable();
constructor(private apiService: AlfrescoApiService) {} constructor(
private readonly apiService: AlfrescoApiService,
private readonly notificationService: NotificationService
) {}
private callApi(path: string, httpMethod: string, body: object = {}): Promise<any> { private callApi(path: string, httpMethod: string, body: object = {}): Promise<any> {
// APIs used by this service are still private and not yet available for public use // APIs used by this service are still private and not yet available for public use
@@ -136,8 +140,12 @@ export class FolderRulesService {
} }
async updateRule(nodeId: string, ruleId: string, rule: Rule, ruleSetId: string = '-default-'): Promise<Rule> { async updateRule(nodeId: string, ruleId: string, rule: Rule, ruleSetId: string = '-default-'): Promise<Rule> {
const response = await this.callApi(`/nodes/${nodeId}/rule-sets/${ruleSetId}/rules/${ruleId}`, 'PUT', { ...rule }); const response = await this.callApi(`/nodes/${nodeId}/rule-sets/${ruleSetId}/rules/${ruleId}`, 'PUT', { ...rule }).catch((error) => {
return this.formatRule(response.entry); this.notificationService.showError(JSON.parse(error.message).error.briefSummary);
rule.isEnabled = !rule.isEnabled;
return rule;
});
return this.formatRule(response.entry ?? response);
} }
deleteRule(nodeId: string, ruleId: string, ruleSetId: string = '-default-') { deleteRule(nodeId: string, ruleId: string, ruleSetId: string = '-default-') {