From b57da70846222b825b934df1be513bdb942d7403 Mon Sep 17 00:00:00 2001 From: MichalKinas <113341662+MichalKinas@users.noreply.github.com> Date: Tue, 17 Jun 2025 10:57:21 +0200 Subject: [PATCH] [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 --- .../rule-list-item.ui-component.ts | 1 - .../src/services/folder-rules.service.spec.ts | 17 +++++++++++++++-- .../src/services/folder-rules.service.ts | 14 +++++++++++--- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/projects/aca-content/folder-rules/src/rule-list/rule-list-item/rule-list-item.ui-component.ts b/projects/aca-content/folder-rules/src/rule-list/rule-list-item/rule-list-item.ui-component.ts index 344a53101..0843c7252 100644 --- a/projects/aca-content/folder-rules/src/rule-list/rule-list-item/rule-list-item.ui-component.ts +++ b/projects/aca-content/folder-rules/src/rule-list/rule-list-item/rule-list-item.ui-component.ts @@ -51,7 +51,6 @@ export class RuleListItemUiComponent { onToggleClick(isEnabled: boolean, event: Event) { event.stopPropagation(); - this.rule.isEnabled = !this.rule.isEnabled; this.enabledChanged.emit(isEnabled); } } diff --git a/projects/aca-content/folder-rules/src/services/folder-rules.service.spec.ts b/projects/aca-content/folder-rules/src/services/folder-rules.service.spec.ts index 95d3abdd7..29ab4ef8e 100644 --- a/projects/aca-content/folder-rules/src/services/folder-rules.service.spec.ts +++ b/projects/aca-content/folder-rules/src/services/folder-rules.service.spec.ts @@ -23,7 +23,7 @@ */ import { TestBed } from '@angular/core/testing'; -import { CoreTestingModule } from '@alfresco/adf-core'; +import { CoreTestingModule, NotificationService } from '@alfresco/adf-core'; import { of } from 'rxjs'; import { FolderRulesService } from './folder-rules.service'; import { @@ -42,6 +42,7 @@ import { AlfrescoApiService, AlfrescoApiServiceMock } from '@alfresco/adf-conten describe('FolderRulesService', () => { let folderRulesService: FolderRulesService; + let notificationService: NotificationService; let callApiSpy: jasmine.Spy; @@ -60,7 +61,8 @@ describe('FolderRulesService', () => { providers: [FolderRulesService, { provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock }] }); - folderRulesService = TestBed.inject(FolderRulesService); + folderRulesService = TestBed.inject(FolderRulesService); + notificationService = TestBed.inject(NotificationService); callApiSpy = spyOn(folderRulesService, 'callApi'); }); @@ -148,6 +150,17 @@ describe('FolderRulesService', () => { 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 () => { callApiSpy.withArgs(`/nodes/${nodeId}/rule-settings/${key}`, 'GET').and.returnValue(Promise.resolve(mockedRuleSettingsEntry)); diff --git a/projects/aca-content/folder-rules/src/services/folder-rules.service.ts b/projects/aca-content/folder-rules/src/services/folder-rules.service.ts index 4e6f504c5..fb81772a9 100644 --- a/projects/aca-content/folder-rules/src/services/folder-rules.service.ts +++ b/projects/aca-content/folder-rules/src/services/folder-rules.service.ts @@ -30,6 +30,7 @@ import { Rule, RuleForForm, RuleOptions, RuleSettings } from '../model/rule.mode import { RuleCompositeCondition } from '../model/rule-composite-condition.model'; import { RuleSimpleCondition } from '../model/rule-simple-condition.model'; import { RuleSet } from '../model/rule-set.model'; +import { NotificationService } from '@alfresco/adf-core'; interface GetRulesResult { rules: Rule[]; @@ -90,7 +91,10 @@ export class FolderRulesService { selectedRule$ = this.selectedRuleSource.asObservable(); deletedRuleId$: Observable = 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 { // 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 { - const response = await this.callApi(`/nodes/${nodeId}/rule-sets/${ruleSetId}/rules/${ruleId}`, 'PUT', { ...rule }); - return this.formatRule(response.entry); + const response = await this.callApi(`/nodes/${nodeId}/rule-sets/${ruleSetId}/rules/${ruleId}`, 'PUT', { ...rule }).catch((error) => { + 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-') {