From 21a079bde81f2c778faf00ecd82aa0dbbef9d526 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Wed, 4 Oct 2017 11:10:00 +0200 Subject: [PATCH] Specific enums. --- .../Apps/AppClientPermission.cs | 17 +++++++ .../Apps/AppContributorPermission.cs | 17 +++++++ .../{PermissionLevel.cs => AppPermission.cs} | 4 +- .../Apps/RoleExtension.cs | 30 +++++++++++++ .../Apps/AppContributorAssigned.cs | 2 +- .../Apps/MongoAppEntityContributor.cs | 2 +- .../Apps/IAppContributorEntity.cs | 2 +- .../Apps/AppContributors.cs | 12 ++--- .../Apps/AppDomainObject.cs | 2 +- .../Apps/Commands/AssignContributor.cs | 7 ++- .../Controllers/Api/Apps/Models/AppDto.cs | 2 +- .../Apps/Models/AssignAppContributorDto.cs | 2 +- .../Api/Apps/Models/ContributorDto.cs | 2 +- src/Squidex/Pipeline/AppApiFilter.cs | 14 +++--- .../Apps/RoleExtensionTests.cs | 44 +++++++++++++++++++ .../Apps/AppDomainObjectTests.cs | 14 +++--- 16 files changed, 143 insertions(+), 30 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Core/Apps/AppClientPermission.cs create mode 100644 src/Squidex.Domain.Apps.Core/Apps/AppContributorPermission.cs rename src/Squidex.Domain.Apps.Core/Apps/{PermissionLevel.cs => AppPermission.cs} (88%) create mode 100644 src/Squidex.Domain.Apps.Core/Apps/RoleExtension.cs create mode 100644 tests/Squidex.Domain.Apps.Core.Tests/Apps/RoleExtensionTests.cs diff --git a/src/Squidex.Domain.Apps.Core/Apps/AppClientPermission.cs b/src/Squidex.Domain.Apps.Core/Apps/AppClientPermission.cs new file mode 100644 index 000000000..cbc4cdaf2 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core/Apps/AppClientPermission.cs @@ -0,0 +1,17 @@ +// ========================================================================== +// AppClientPermission.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +namespace Squidex.Domain.Apps.Core.Apps +{ + public enum AppClientPermission + { + Developer, + Editor, + Reader + } +} diff --git a/src/Squidex.Domain.Apps.Core/Apps/AppContributorPermission.cs b/src/Squidex.Domain.Apps.Core/Apps/AppContributorPermission.cs new file mode 100644 index 000000000..c05d7527a --- /dev/null +++ b/src/Squidex.Domain.Apps.Core/Apps/AppContributorPermission.cs @@ -0,0 +1,17 @@ +// ========================================================================== +// AppContributorPermission.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +namespace Squidex.Domain.Apps.Core.Apps +{ + public enum AppContributorPermission + { + Owner, + Developer, + Editor + } +} diff --git a/src/Squidex.Domain.Apps.Core/Apps/PermissionLevel.cs b/src/Squidex.Domain.Apps.Core/Apps/AppPermission.cs similarity index 88% rename from src/Squidex.Domain.Apps.Core/Apps/PermissionLevel.cs rename to src/Squidex.Domain.Apps.Core/Apps/AppPermission.cs index 1d91075f1..e9bf142a6 100644 --- a/src/Squidex.Domain.Apps.Core/Apps/PermissionLevel.cs +++ b/src/Squidex.Domain.Apps.Core/Apps/AppPermission.cs @@ -1,5 +1,5 @@ // ========================================================================== -// PermissionLevel.cs +// AppPermission.cs // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex Group @@ -8,7 +8,7 @@ namespace Squidex.Domain.Apps.Core.Apps { - public enum PermissionLevel + public enum AppPermission { Owner, Developer, diff --git a/src/Squidex.Domain.Apps.Core/Apps/RoleExtension.cs b/src/Squidex.Domain.Apps.Core/Apps/RoleExtension.cs new file mode 100644 index 000000000..40245615f --- /dev/null +++ b/src/Squidex.Domain.Apps.Core/Apps/RoleExtension.cs @@ -0,0 +1,30 @@ +// ========================================================================== +// RoleExtension.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using Squidex.Infrastructure; + +namespace Squidex.Domain.Apps.Core.Apps +{ + public static class RoleExtension + { + public static AppPermission ToAppPermission(this AppClientPermission clientPermission) + { + Guard.Enum(clientPermission, nameof(clientPermission)); + + return (AppPermission)Enum.Parse(typeof(AppPermission), clientPermission.ToString()); + } + + public static AppPermission ToAppPermission(this AppContributorPermission contributorPermission) + { + Guard.Enum(contributorPermission, nameof(contributorPermission)); + + return (AppPermission)Enum.Parse(typeof(AppPermission), contributorPermission.ToString()); + } + } +} diff --git a/src/Squidex.Domain.Apps.Events/Apps/AppContributorAssigned.cs b/src/Squidex.Domain.Apps.Events/Apps/AppContributorAssigned.cs index 3924c2ef1..aec913c5a 100644 --- a/src/Squidex.Domain.Apps.Events/Apps/AppContributorAssigned.cs +++ b/src/Squidex.Domain.Apps.Events/Apps/AppContributorAssigned.cs @@ -16,6 +16,6 @@ namespace Squidex.Domain.Apps.Events.Apps { public string ContributorId { get; set; } - public PermissionLevel Permission { get; set; } + public AppPermission Permission { get; set; } } } diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Apps/MongoAppEntityContributor.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Apps/MongoAppEntityContributor.cs index 7959e2252..00b82ba09 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/Apps/MongoAppEntityContributor.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/Apps/MongoAppEntityContributor.cs @@ -20,6 +20,6 @@ namespace Squidex.Domain.Apps.Read.MongoDb.Apps [BsonRequired] [BsonElement] - public PermissionLevel Permission { get; set; } + public AppPermission Permission { get; set; } } } diff --git a/src/Squidex.Domain.Apps.Read/Apps/IAppContributorEntity.cs b/src/Squidex.Domain.Apps.Read/Apps/IAppContributorEntity.cs index d682a40e2..ee63763a4 100644 --- a/src/Squidex.Domain.Apps.Read/Apps/IAppContributorEntity.cs +++ b/src/Squidex.Domain.Apps.Read/Apps/IAppContributorEntity.cs @@ -14,6 +14,6 @@ namespace Squidex.Domain.Apps.Read.Apps { string ContributorId { get; } - PermissionLevel Permission { get; } + AppPermission Permission { get; } } } diff --git a/src/Squidex.Domain.Apps.Write/Apps/AppContributors.cs b/src/Squidex.Domain.Apps.Write/Apps/AppContributors.cs index 94db67c9a..7b79782b2 100644 --- a/src/Squidex.Domain.Apps.Write/Apps/AppContributors.cs +++ b/src/Squidex.Domain.Apps.Write/Apps/AppContributors.cs @@ -16,14 +16,14 @@ namespace Squidex.Domain.Apps.Write.Apps { public class AppContributors { - private readonly Dictionary contributors = new Dictionary(); + private readonly Dictionary contributors = new Dictionary(); public int Count { get { return contributors.Count; } } - public void Assign(string contributorId, PermissionLevel permission) + public void Assign(string contributorId, AppPermission permission) { string Message() => "Cannot assign contributor"; @@ -51,7 +51,7 @@ namespace Squidex.Domain.Apps.Write.Apps } } - private void ThrowIfFound(string contributorId, PermissionLevel permission, Func message) + private void ThrowIfFound(string contributorId, AppPermission permission, Func message) { if (contributors.TryGetValue(contributorId, out var currentPermission) && currentPermission == permission) { @@ -61,13 +61,13 @@ namespace Squidex.Domain.Apps.Write.Apps } } - private void ThrowIfNoOwner(Action> change, Func message) + private void ThrowIfNoOwner(Action> change, Func message) { - var contributorsCopy = new Dictionary(contributors); + var contributorsCopy = new Dictionary(contributors); change(contributorsCopy); - if (contributorsCopy.All(x => x.Value != PermissionLevel.Owner)) + if (contributorsCopy.All(x => x.Value != AppPermission.Owner)) { var error = new ValidationError("Contributor is the last owner", "ContributorId"); diff --git a/src/Squidex.Domain.Apps.Write/Apps/AppDomainObject.cs b/src/Squidex.Domain.Apps.Write/Apps/AppDomainObject.cs index cdc629406..efb37d76f 100644 --- a/src/Squidex.Domain.Apps.Write/Apps/AppDomainObject.cs +++ b/src/Squidex.Domain.Apps.Write/Apps/AppDomainObject.cs @@ -253,7 +253,7 @@ namespace Squidex.Domain.Apps.Write.Apps private static AppContributorAssigned CreateInitialOwner(NamedId id, SquidexCommand command) { - return new AppContributorAssigned { AppId = id, ContributorId = command.Actor.Identifier, Permission = PermissionLevel.Owner }; + return new AppContributorAssigned { AppId = id, ContributorId = command.Actor.Identifier, Permission = AppPermission.Owner }; } private void ThrowIfOtherUser(ChangePlan command) diff --git a/src/Squidex.Domain.Apps.Write/Apps/Commands/AssignContributor.cs b/src/Squidex.Domain.Apps.Write/Apps/Commands/AssignContributor.cs index 0ba37d8e6..2bf25ae5a 100644 --- a/src/Squidex.Domain.Apps.Write/Apps/Commands/AssignContributor.cs +++ b/src/Squidex.Domain.Apps.Write/Apps/Commands/AssignContributor.cs @@ -16,10 +16,15 @@ namespace Squidex.Domain.Apps.Write.Apps.Commands { public string ContributorId { get; set; } - public PermissionLevel Permission { get; set; } + public AppPermission Permission { get; set; } public void Validate(IList errors) { + if (Permission.IsEnumValue()) + { + errors.Add(new ValidationError("Permission is not valid", nameof(Permission))); + } + if (string.IsNullOrWhiteSpace(ContributorId)) { errors.Add(new ValidationError("Contributor id not assigned", nameof(ContributorId))); diff --git a/src/Squidex/Controllers/Api/Apps/Models/AppDto.cs b/src/Squidex/Controllers/Api/Apps/Models/AppDto.cs index 0a3d6a935..09883dae1 100644 --- a/src/Squidex/Controllers/Api/Apps/Models/AppDto.cs +++ b/src/Squidex/Controllers/Api/Apps/Models/AppDto.cs @@ -48,6 +48,6 @@ namespace Squidex.Controllers.Api.Apps.Models /// The permission level of the user. /// [JsonConverter(typeof(StringEnumConverter))] - public PermissionLevel Permission { get; set; } + public AppPermission Permission { get; set; } } } diff --git a/src/Squidex/Controllers/Api/Apps/Models/AssignAppContributorDto.cs b/src/Squidex/Controllers/Api/Apps/Models/AssignAppContributorDto.cs index 723102960..d200b687e 100644 --- a/src/Squidex/Controllers/Api/Apps/Models/AssignAppContributorDto.cs +++ b/src/Squidex/Controllers/Api/Apps/Models/AssignAppContributorDto.cs @@ -25,6 +25,6 @@ namespace Squidex.Controllers.Api.Apps.Models /// The permission level as a contributor. /// [JsonConverter(typeof(StringEnumConverter))] - public PermissionLevel Permission { get; set; } + public AppPermission Permission { get; set; } } } \ No newline at end of file diff --git a/src/Squidex/Controllers/Api/Apps/Models/ContributorDto.cs b/src/Squidex/Controllers/Api/Apps/Models/ContributorDto.cs index f275f9bdd..a75caae16 100644 --- a/src/Squidex/Controllers/Api/Apps/Models/ContributorDto.cs +++ b/src/Squidex/Controllers/Api/Apps/Models/ContributorDto.cs @@ -25,6 +25,6 @@ namespace Squidex.Controllers.Api.Apps.Models /// The permission level as a contributor. /// [JsonConverter(typeof(StringEnumConverter))] - public PermissionLevel Permission { get; set; } + public AppPermission Permission { get; set; } } } diff --git a/src/Squidex/Pipeline/AppApiFilter.cs b/src/Squidex/Pipeline/AppApiFilter.cs index 96eb967c8..fdd46a42e 100644 --- a/src/Squidex/Pipeline/AppApiFilter.cs +++ b/src/Squidex/Pipeline/AppApiFilter.cs @@ -91,22 +91,22 @@ namespace Squidex.Pipeline switch (permission.Value) { - case PermissionLevel.Owner: + case AppPermission.Owner: defaultIdentity.AddClaim(new Claim(defaultIdentity.RoleClaimType, SquidexRoles.AppOwner)); defaultIdentity.AddClaim(new Claim(defaultIdentity.RoleClaimType, SquidexRoles.AppDeveloper)); defaultIdentity.AddClaim(new Claim(defaultIdentity.RoleClaimType, SquidexRoles.AppEditor)); defaultIdentity.AddClaim(new Claim(defaultIdentity.RoleClaimType, SquidexRoles.AppReader)); break; - case PermissionLevel.Developer: + case AppPermission.Developer: defaultIdentity.AddClaim(new Claim(defaultIdentity.RoleClaimType, SquidexRoles.AppDeveloper)); defaultIdentity.AddClaim(new Claim(defaultIdentity.RoleClaimType, SquidexRoles.AppEditor)); defaultIdentity.AddClaim(new Claim(defaultIdentity.RoleClaimType, SquidexRoles.AppReader)); break; - case PermissionLevel.Editor: + case AppPermission.Editor: defaultIdentity.AddClaim(new Claim(defaultIdentity.RoleClaimType, SquidexRoles.AppEditor)); defaultIdentity.AddClaim(new Claim(defaultIdentity.RoleClaimType, SquidexRoles.AppReader)); break; - case PermissionLevel.Reader: + case AppPermission.Reader: defaultIdentity.AddClaim(new Claim(defaultIdentity.RoleClaimType, SquidexRoles.AppReader)); break; } @@ -115,7 +115,7 @@ namespace Squidex.Pipeline } } - private static PermissionLevel? FindByOpenIdClient(IAppEntity app, ClaimsPrincipal user) + private static AppPermission? FindByOpenIdClient(IAppEntity app, ClaimsPrincipal user) { var client = app.Clients.FirstOrDefault(x => string.Equals(x.Id, user.GetClientId(), StringComparison.OrdinalIgnoreCase)); @@ -124,10 +124,10 @@ namespace Squidex.Pipeline return null; } - return client.IsReader ? PermissionLevel.Reader : PermissionLevel.Editor; + return client.IsReader ? AppPermission.Reader : AppPermission.Editor; } - private static PermissionLevel? FindByOpenIdSubject(IAppEntity app, ClaimsPrincipal user) + private static AppPermission? FindByOpenIdSubject(IAppEntity app, ClaimsPrincipal user) { var subject = user.FindFirst(OpenIdClaims.Subject)?.Value; diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Apps/RoleExtensionTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Apps/RoleExtensionTests.cs new file mode 100644 index 000000000..dc9228079 --- /dev/null +++ b/tests/Squidex.Domain.Apps.Core.Tests/Apps/RoleExtensionTests.cs @@ -0,0 +1,44 @@ +// ========================================================================== +// RoleExtensionTests.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using Xunit; + +namespace Squidex.Domain.Apps.Core.Apps +{ + public class RoleExtensionTests + { + [Fact] + public void Should_convert_from_client_permission_to_app_permission() + { + Assert.Equal(AppPermission.Developer, AppClientPermission.Developer.ToAppPermission()); + Assert.Equal(AppPermission.Editor, AppClientPermission.Editor.ToAppPermission()); + Assert.Equal(AppPermission.Reader, AppClientPermission.Reader.ToAppPermission()); + } + + [Fact] + public void Should_throw_when_converting_from_invalid_client_permission() + { + Assert.Throws(() => ((AppClientPermission)10).ToAppPermission()); + } + + [Fact] + public void Should_convert_from_contributor_permission_to_app_permission() + { + Assert.Equal(AppPermission.Developer, AppContributorPermission.Developer.ToAppPermission()); + Assert.Equal(AppPermission.Editor, AppContributorPermission.Editor.ToAppPermission()); + Assert.Equal(AppPermission.Owner, AppContributorPermission.Owner.ToAppPermission()); + } + + [Fact] + public void Should_throw_when_converting_from_invalid_contributor_permission() + { + Assert.Throws(() => ((AppContributorPermission) 10).ToAppPermission()); + } + } +} diff --git a/tests/Squidex.Domain.Apps.Write.Tests/Apps/AppDomainObjectTests.cs b/tests/Squidex.Domain.Apps.Write.Tests/Apps/AppDomainObjectTests.cs index 7ee633ac5..fbaba6524 100644 --- a/tests/Squidex.Domain.Apps.Write.Tests/Apps/AppDomainObjectTests.cs +++ b/tests/Squidex.Domain.Apps.Write.Tests/Apps/AppDomainObjectTests.cs @@ -62,7 +62,7 @@ namespace Squidex.Domain.Apps.Write.Apps sut.GetUncomittedEvents() .ShouldHaveSameEvents( CreateEvent(new AppCreated { Name = AppName }), - CreateEvent(new AppContributorAssigned { ContributorId = User.Identifier, Permission = PermissionLevel.Owner }), + CreateEvent(new AppContributorAssigned { ContributorId = User.Identifier, Permission = AppPermission.Owner }), CreateEvent(new AppLanguageAdded { Language = Language.EN }) ); } @@ -148,7 +148,7 @@ namespace Squidex.Domain.Apps.Write.Apps Assert.Throws(() => { - sut.AssignContributor(CreateCommand(new AssignContributor { ContributorId = User.Identifier, Permission = PermissionLevel.Editor })); + sut.AssignContributor(CreateCommand(new AssignContributor { ContributorId = User.Identifier, Permission = AppPermission.Editor })); }); } @@ -157,11 +157,11 @@ namespace Squidex.Domain.Apps.Write.Apps { CreateApp(); - sut.AssignContributor(CreateCommand(new AssignContributor { ContributorId = contributorId, Permission = PermissionLevel.Editor })); + sut.AssignContributor(CreateCommand(new AssignContributor { ContributorId = contributorId, Permission = AppPermission.Editor })); Assert.Throws(() => { - sut.AssignContributor(CreateCommand(new AssignContributor { ContributorId = contributorId, Permission = PermissionLevel.Editor })); + sut.AssignContributor(CreateCommand(new AssignContributor { ContributorId = contributorId, Permission = AppPermission.Editor })); }); } @@ -170,11 +170,11 @@ namespace Squidex.Domain.Apps.Write.Apps { CreateApp(); - sut.AssignContributor(CreateCommand(new AssignContributor { ContributorId = contributorId, Permission = PermissionLevel.Editor })); + sut.AssignContributor(CreateCommand(new AssignContributor { ContributorId = contributorId, Permission = AppPermission.Editor })); sut.GetUncomittedEvents() .ShouldHaveSameEvents( - CreateEvent(new AppContributorAssigned { ContributorId = contributorId, Permission = PermissionLevel.Editor }) + CreateEvent(new AppContributorAssigned { ContributorId = contributorId, Permission = AppPermission.Editor }) ); } @@ -223,7 +223,7 @@ namespace Squidex.Domain.Apps.Write.Apps { CreateApp(); - sut.AssignContributor(CreateCommand(new AssignContributor { ContributorId = contributorId, Permission = PermissionLevel.Editor })); + sut.AssignContributor(CreateCommand(new AssignContributor { ContributorId = contributorId, Permission = AppPermission.Editor })); sut.RemoveContributor(CreateCommand(new RemoveContributor { ContributorId = contributorId })); sut.GetUncomittedEvents().Skip(1)