diff --git a/backend/src/Squidex.Domain.Apps.Entities/Rules/Queries/RuleQueryService.cs b/backend/src/Squidex.Domain.Apps.Entities/Rules/Queries/RuleQueryService.cs index a470206e1..7ee10f429 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Rules/Queries/RuleQueryService.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Rules/Queries/RuleQueryService.cs @@ -14,6 +14,7 @@ namespace Squidex.Domain.Apps.Entities.Rules.Queries { public sealed class RuleQueryService : IRuleQueryService { + private static readonly List EmptyResults = new List(); private readonly IRulesIndex rulesIndex; private readonly IRuleEnricher ruleEnricher; @@ -30,9 +31,16 @@ namespace Squidex.Domain.Apps.Entities.Rules.Queries { var rules = await rulesIndex.GetRulesAsync(context.App.Id); - var enriched = await ruleEnricher.EnrichAsync(rules, context); + rules.RemoveAll(x => x.IsDeleted); - return enriched; + if (rules.Count > 0) + { + var enriched = await ruleEnricher.EnrichAsync(rules, context); + + return enriched; + } + + return EmptyResults; } } } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RulesIndexTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RulesIndexTests.cs index c9700f957..d3ee3bddd 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RulesIndexTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RulesIndexTests.cs @@ -48,7 +48,7 @@ namespace Squidex.Domain.Apps.Entities.Rules.Indexes } [Fact] - public async Task Should_return_empty_rule_if_rule_not_created() + public async Task Should_return_empty_rules_if_rule_not_created() { var rule = SetupRule(-1); @@ -61,16 +61,16 @@ namespace Squidex.Domain.Apps.Entities.Rules.Indexes } [Fact] - public async Task Should_return_empty_rule_if_rule_deleted() + public async Task Should_return_rule_if_deleted() { - var rule = SetupRule(-1); + var rule = SetupRule(0, true); A.CallTo(() => index.GetIdsAsync()) .Returns(new List { rule.Id }); var actual = await sut.GetRulesAsync(appId.Id); - Assert.Empty(actual); + Assert.Same(actual[0], rule); } [Fact] @@ -118,11 +118,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Indexes .MustHaveHappened(); } - private IRuleEntity SetupRule(long version) + private IRuleEntity SetupRule(long version, bool isDeleted = false) { var ruleId = Guid.NewGuid(); - var ruleEntity = new RuleEntity { Id = ruleId, AppId = appId, Version = version }; + var ruleEntity = new RuleEntity { Id = ruleId, AppId = appId, Version = version, IsDeleted = isDeleted }; var ruleGrain = A.Fake(); A.CallTo(() => ruleGrain.GetStateAsync()) diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Queries/RuleQueryServiceTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Queries/RuleQueryServiceTests.cs index 6c04345c2..2e09ca174 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Queries/RuleQueryServiceTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Queries/RuleQueryServiceTests.cs @@ -54,5 +54,24 @@ namespace Squidex.Domain.Apps.Entities.Rules.Queries Assert.Same(enriched, result); } + + [Fact] + public async Task Should_not_get_deleted_rules() + { + var original = new List + { + new RuleEntity { IsDeleted = true } + }; + + A.CallTo(() => rulesIndex.GetRulesAsync(appId.Id)) + .Returns(original); + + var result = await sut.QueryAsync(requestContext); + + Assert.Empty(result); + + A.CallTo(() => ruleEnricher.EnrichAsync(A>._, requestContext)) + .MustNotHaveHappened(); + } } } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasIndexTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasIndexTests.cs index 434754998..832e0b513 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasIndexTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasIndexTests.cs @@ -142,7 +142,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Indexes } [Fact] - public async Task Should_return_empty_schema_if_schema_not_created() + public async Task Should_return_empty_schemas_if_schema_not_created() { var schema = SetupSchema(EtagVersion.NotFound); @@ -155,16 +155,16 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Indexes } [Fact] - public async Task Should_return_empty_schema_if_schema_deleted() + public async Task Should_return_schema_if_deleted() { - var schema = SetupSchema(); + var schema = SetupSchema(0, true); - A.CallTo(() => index.GetIdAsync(schema.SchemaDef.Name)) - .Returns(schema.Id); + A.CallTo(() => index.GetIdsAsync()) + .Returns(new List { schema.Id }); var actual = await sut.GetSchemasAsync(appId.Id); - Assert.Empty(actual); + Assert.Same(actual[0], schema); } [Fact] @@ -276,7 +276,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Indexes return new CreateSchema { SchemaId = schemaId.Id, Name = name, AppId = appId }; } - private ISchemaEntity SetupSchema(long version = 0) + private ISchemaEntity SetupSchema(long version = 0, bool isDeleted = false) { var schemaEntity = A.Fake(); @@ -288,6 +288,8 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Indexes .Returns(appId); A.CallTo(() => schemaEntity.Version) .Returns(version); + A.CallTo(() => schemaEntity.IsDeleted) + .Returns(isDeleted); var schemaGrain = A.Fake(); diff --git a/frontend/app/shared/services/assets.service.ts b/frontend/app/shared/services/assets.service.ts index 6f0c14733..06508a231 100644 --- a/frontend/app/shared/services/assets.service.ts +++ b/frontend/app/shared/services/assets.service.ts @@ -35,15 +35,13 @@ export class AssetDto { public readonly canMove: boolean; public get fileNameWithoutExtension() { - let fileName = this.fileName; - - const index = fileName.lastIndexOf('.'); + const index = this.fileName.lastIndexOf('.'); if (index > 0) { - fileName = fileName.substr(0, index); + return this.fileName.substr(0, index); + } else { + return this.fileName; } - - return fileName; } public get isDuplicate() { diff --git a/frontend/app/shared/state/assets.forms.spec.ts b/frontend/app/shared/state/assets.forms.spec.ts index 8fbac582a..d9260a457 100644 --- a/frontend/app/shared/state/assets.forms.spec.ts +++ b/frontend/app/shared/state/assets.forms.spec.ts @@ -31,7 +31,7 @@ describe('AnnotateAssetForm', () => { form = new AnnotateAssetForm(new FormBuilder()); }); - it('shoulde remov extension when loading asset file name', () => { + it('shoulde remove extension when loading asset file name', () => { form.load(asset); const slug = form.form.get('fileName')!.value; diff --git a/frontend/app/shared/state/assets.forms.ts b/frontend/app/shared/state/assets.forms.ts index ce9f7747b..68f5b481b 100644 --- a/frontend/app/shared/state/assets.forms.ts +++ b/frontend/app/shared/state/assets.forms.ts @@ -125,7 +125,19 @@ export class AnnotateAssetForm extends Form) { - const result = { ...value, fileName: value.fileNameWithoutExtension }; + const result = { ...value }; + + let fileName = value.fileName; + + if (fileName) { + const index = fileName.lastIndexOf('.'); + + if (index > 0) { + fileName = fileName.substr(0, index); + } + + result.fileName = fileName; + } if (Types.isObject(value.metadata)) { const length = Object.keys(value.metadata).length;