From 9b56f886f2a40aebf44bb8f511b64b1ce3ded81f Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 2 May 2019 21:21:18 +0200 Subject: [PATCH] Fix for restore. --- .../Validators/UniqueValuesValidator.cs | 32 ++++++++++ .../Apps/BackupApps.cs | 4 +- .../Validators/UniqueValuesValidatorTests.cs | 61 +++++++++++++++++++ tools/Migrate_01/OldEvents/AssetRenamed.cs | 3 +- tools/Migrate_01/OldEvents/AssetTagged.cs | 3 +- 5 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/UniqueValuesValidator.cs create mode 100644 tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/UniqueValuesValidatorTests.cs diff --git a/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/UniqueValuesValidator.cs b/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/UniqueValuesValidator.cs new file mode 100644 index 000000000..7c948165b --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/UniqueValuesValidator.cs @@ -0,0 +1,32 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Squidex.Infrastructure.Tasks; + +namespace Squidex.Domain.Apps.Core.ValidateContent.Validators +{ + public sealed class UniqueValuesValidator : IValidator + { + public Task ValidateAsync(object value, ValidationContext context, AddError addError) + { + if (value is IEnumerable items && items.Any()) + { + var itemsArray = items.ToArray(); + + if (itemsArray.Length != itemsArray.Distinct().Count()) + { + addError(context.Path, "Must not contain duplicate values."); + } + } + + return TaskHelper.Done; + } + } +} diff --git a/src/Squidex.Domain.Apps.Entities/Apps/BackupApps.cs b/src/Squidex.Domain.Apps.Entities/Apps/BackupApps.cs index 7e1e46ef5..04c99856d 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/BackupApps.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/BackupApps.cs @@ -127,7 +127,7 @@ namespace Squidex.Domain.Apps.Entities.Apps { if (!(isReserved = await appsByNameIndex.ReserveAppAsync(appId, appName))) { - throw new BackupRestoreException("The app id or name is not available."); + throw new BackupRestoreException("vThe app id or name is not available."); } } @@ -135,7 +135,7 @@ namespace Squidex.Domain.Apps.Entities.Apps { if (isReserved) { - await appsByNameIndex.ReserveAppAsync(appId, appName); + await appsByNameIndex.RemoveReservationAsync(appId, appName); } } diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/UniqueValuesValidatorTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/UniqueValuesValidatorTests.cs new file mode 100644 index 000000000..d85013ce7 --- /dev/null +++ b/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/UniqueValuesValidatorTests.cs @@ -0,0 +1,61 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.Collections.Generic; +using System.Threading.Tasks; +using FluentAssertions; +using Squidex.Domain.Apps.Core.ValidateContent.Validators; +using Xunit; + +namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators +{ + public class UniqueValuesValidatorTests + { + private readonly List errors = new List(); + + [Fact] + public async Task Should_not_add_error_if_value_is_null() + { + var sut = new UniqueValuesValidator(); + + await sut.ValidateAsync(null, errors); + + Assert.Empty(errors); + } + + [Fact] + public async Task Should_not_add_error_if_value_is_not_collection() + { + var sut = new UniqueValuesValidator(); + + await sut.ValidateAsync("value", errors); + + Assert.Empty(errors); + } + + [Fact] + public async Task Should_not_add_error_if_array_contains_no_duplicates() + { + var sut = new UniqueValuesValidator(); + + await sut.ValidateAsync(new[] { 1, 2, 3 }, errors); + + Assert.Empty(errors); + } + + [Fact] + public async Task Should_add_error_if_array_contains_duplicates() + { + var sut = new UniqueValuesValidator(); + + await sut.ValidateAsync(new[] { 1, 2, 2, 3 }, errors); + + errors.Should().BeEquivalentTo( + new[] { "Must not contain duplicate values." }); + } + } +} diff --git a/tools/Migrate_01/OldEvents/AssetRenamed.cs b/tools/Migrate_01/OldEvents/AssetRenamed.cs index 44c899953..427c12fec 100644 --- a/tools/Migrate_01/OldEvents/AssetRenamed.cs +++ b/tools/Migrate_01/OldEvents/AssetRenamed.cs @@ -9,6 +9,7 @@ using System; using Squidex.Domain.Apps.Events.Assets; using Squidex.Infrastructure; using Squidex.Infrastructure.EventSourcing; +using Squidex.Infrastructure.Reflection; namespace Migrate_01.OldEvents { @@ -20,7 +21,7 @@ namespace Migrate_01.OldEvents public IEvent Migrate() { - return new AssetAnnotated { FileName = FileName }; + return SimpleMapper.Map(this, new AssetAnnotated()); } } } diff --git a/tools/Migrate_01/OldEvents/AssetTagged.cs b/tools/Migrate_01/OldEvents/AssetTagged.cs index d3c12807e..a67874cce 100644 --- a/tools/Migrate_01/OldEvents/AssetTagged.cs +++ b/tools/Migrate_01/OldEvents/AssetTagged.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using Squidex.Domain.Apps.Events.Assets; using Squidex.Infrastructure; using Squidex.Infrastructure.EventSourcing; +using Squidex.Infrastructure.Reflection; namespace Migrate_01.OldEvents { @@ -21,7 +22,7 @@ namespace Migrate_01.OldEvents public IEvent Migrate() { - return new AssetAnnotated { Tags = Tags }; + return SimpleMapper.Map(this, new AssetAnnotated()); } } }