diff --git a/Dockerfile.build b/Dockerfile.build
index 97d9d9d4b..da28673fc 100644
--- a/Dockerfile.build
+++ b/Dockerfile.build
@@ -43,9 +43,10 @@ RUN cp -a /tmp/node_modules /src/Squidex/ \
# Test Backend
RUN dotnet restore \
&& dotnet test tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj \
- && dotnet test tests/Squidex.Domain.Apps.Core.Tests/Squidex.Core.Tests.csproj \
- && dotnet test tests/Squidex.Domain.Apps.Read.Tests/Squidex.Read.Tests.csproj \
- && dotnet test tests/Squidex.Domain.Apps.Write.Tests/Squidex.Write.Tests.csproj
+ && dotnet test tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj \
+ && dotnet test tests/Squidex.Domain.Apps.Read.Tests/Squidex.Domain.Apps.Read.Tests.csproj \
+ && dotnet test tests/Squidex.Domain.Apps.Write.Tests/Squidex.Domain.Apps.Write.Tests.csproj \
+ && dotnet test tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj
# Publish
RUN dotnet publish src/Squidex/Squidex.csproj --output /out/ --configuration Release
\ No newline at end of file
diff --git a/Squidex.sln b/Squidex.sln
index ec578a43d..d365dc2c8 100644
--- a/Squidex.sln
+++ b/Squidex.sln
@@ -1,12 +1,12 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
-VisualStudioVersion = 15.0.26430.14
+VisualStudioVersion = 15.0.26430.15
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Squidex", "src\Squidex\Squidex.csproj", "{61F6BBCE-A080-4400-B194-70E2F5D2096E}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "squidex_infrastructure", "squidex_infrastructure", "{8CF53B92-5EB1-461D-98F8-70DA9B603FBF}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "infrastructure", "infrastructure", "{8CF53B92-5EB1-461D-98F8-70DA9B603FBF}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "squidex_domain", "squidex_domain", "{4C6B06C2-6D77-4E0E-AE32-D7050236433A}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "domain", "domain", "{4C6B06C2-6D77-4E0E-AE32-D7050236433A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Squidex.Domain.Apps.Core", "src\Squidex.Domain.Apps.Core\Squidex.Domain.Apps.Core.csproj", "{47F3C27E-698B-4EDF-A7E8-D7F4232AFBB0}"
EndProject
@@ -44,6 +44,18 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "migrations", "migrations",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Migrate_01", "tools\Migrate_01\Migrate_01.csproj", "{B51126A8-0D75-4A79-867D-10724EC6AC84}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Squidex.Shared", "src\Squidex.Shared\Squidex.Shared.csproj", "{5E75AB7D-6F01-4313-AFF1-7F7128FFD71F}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apps", "apps", "{C9809D59-6665-471E-AD87-5AC624C65892}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "users", "users", "{C0D540F0-9158-4528-BFD8-BEAE6EAE45EA}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Squidex.Domain.Users", "src\Squidex.Domain.Users\Squidex.Domain.Users.csproj", "{F7771E22-47BD-45C4-A133-FD7F1DE27CA0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Squidex.Domain.Users.MongoDb", "src\Squidex.Domain.Users.MongoDb\Squidex.Domain.Users.MongoDb.csproj", "{27CF800D-890F-4882-BF05-44EC3233537D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Squidex.Domain.Users.Tests", "tests\Squidex.Domain.Users.Tests\Squidex.Domain.Users.Tests.csproj", "{42184546-E3CB-4D4F-9495-43979B9C63B9}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -206,26 +218,80 @@ Global
{B51126A8-0D75-4A79-867D-10724EC6AC84}.Release|x64.Build.0 = Release|Any CPU
{B51126A8-0D75-4A79-867D-10724EC6AC84}.Release|x86.ActiveCfg = Release|Any CPU
{B51126A8-0D75-4A79-867D-10724EC6AC84}.Release|x86.Build.0 = Release|Any CPU
+ {5E75AB7D-6F01-4313-AFF1-7F7128FFD71F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5E75AB7D-6F01-4313-AFF1-7F7128FFD71F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5E75AB7D-6F01-4313-AFF1-7F7128FFD71F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5E75AB7D-6F01-4313-AFF1-7F7128FFD71F}.Debug|x64.Build.0 = Debug|Any CPU
+ {5E75AB7D-6F01-4313-AFF1-7F7128FFD71F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5E75AB7D-6F01-4313-AFF1-7F7128FFD71F}.Debug|x86.Build.0 = Debug|Any CPU
+ {5E75AB7D-6F01-4313-AFF1-7F7128FFD71F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5E75AB7D-6F01-4313-AFF1-7F7128FFD71F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5E75AB7D-6F01-4313-AFF1-7F7128FFD71F}.Release|x64.ActiveCfg = Release|Any CPU
+ {5E75AB7D-6F01-4313-AFF1-7F7128FFD71F}.Release|x64.Build.0 = Release|Any CPU
+ {5E75AB7D-6F01-4313-AFF1-7F7128FFD71F}.Release|x86.ActiveCfg = Release|Any CPU
+ {5E75AB7D-6F01-4313-AFF1-7F7128FFD71F}.Release|x86.Build.0 = Release|Any CPU
+ {F7771E22-47BD-45C4-A133-FD7F1DE27CA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F7771E22-47BD-45C4-A133-FD7F1DE27CA0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F7771E22-47BD-45C4-A133-FD7F1DE27CA0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F7771E22-47BD-45C4-A133-FD7F1DE27CA0}.Debug|x64.Build.0 = Debug|Any CPU
+ {F7771E22-47BD-45C4-A133-FD7F1DE27CA0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F7771E22-47BD-45C4-A133-FD7F1DE27CA0}.Debug|x86.Build.0 = Debug|Any CPU
+ {F7771E22-47BD-45C4-A133-FD7F1DE27CA0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F7771E22-47BD-45C4-A133-FD7F1DE27CA0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F7771E22-47BD-45C4-A133-FD7F1DE27CA0}.Release|x64.ActiveCfg = Release|Any CPU
+ {F7771E22-47BD-45C4-A133-FD7F1DE27CA0}.Release|x64.Build.0 = Release|Any CPU
+ {F7771E22-47BD-45C4-A133-FD7F1DE27CA0}.Release|x86.ActiveCfg = Release|Any CPU
+ {F7771E22-47BD-45C4-A133-FD7F1DE27CA0}.Release|x86.Build.0 = Release|Any CPU
+ {27CF800D-890F-4882-BF05-44EC3233537D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {27CF800D-890F-4882-BF05-44EC3233537D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {27CF800D-890F-4882-BF05-44EC3233537D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {27CF800D-890F-4882-BF05-44EC3233537D}.Debug|x64.Build.0 = Debug|Any CPU
+ {27CF800D-890F-4882-BF05-44EC3233537D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {27CF800D-890F-4882-BF05-44EC3233537D}.Debug|x86.Build.0 = Debug|Any CPU
+ {27CF800D-890F-4882-BF05-44EC3233537D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {27CF800D-890F-4882-BF05-44EC3233537D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {27CF800D-890F-4882-BF05-44EC3233537D}.Release|x64.ActiveCfg = Release|Any CPU
+ {27CF800D-890F-4882-BF05-44EC3233537D}.Release|x64.Build.0 = Release|Any CPU
+ {27CF800D-890F-4882-BF05-44EC3233537D}.Release|x86.ActiveCfg = Release|Any CPU
+ {27CF800D-890F-4882-BF05-44EC3233537D}.Release|x86.Build.0 = Release|Any CPU
+ {42184546-E3CB-4D4F-9495-43979B9C63B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {42184546-E3CB-4D4F-9495-43979B9C63B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {42184546-E3CB-4D4F-9495-43979B9C63B9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {42184546-E3CB-4D4F-9495-43979B9C63B9}.Debug|x64.Build.0 = Debug|Any CPU
+ {42184546-E3CB-4D4F-9495-43979B9C63B9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {42184546-E3CB-4D4F-9495-43979B9C63B9}.Debug|x86.Build.0 = Debug|Any CPU
+ {42184546-E3CB-4D4F-9495-43979B9C63B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {42184546-E3CB-4D4F-9495-43979B9C63B9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {42184546-E3CB-4D4F-9495-43979B9C63B9}.Release|x64.ActiveCfg = Release|Any CPU
+ {42184546-E3CB-4D4F-9495-43979B9C63B9}.Release|x64.Build.0 = Release|Any CPU
+ {42184546-E3CB-4D4F-9495-43979B9C63B9}.Release|x86.ActiveCfg = Release|Any CPU
+ {42184546-E3CB-4D4F-9495-43979B9C63B9}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
- {47F3C27E-698B-4EDF-A7E8-D7F4232AFBB0} = {4C6B06C2-6D77-4E0E-AE32-D7050236433A}
+ {47F3C27E-698B-4EDF-A7E8-D7F4232AFBB0} = {C9809D59-6665-471E-AD87-5AC624C65892}
{BD1C30A8-8FFA-4A92-A9BD-B67B1CDDD84C} = {8CF53B92-5EB1-461D-98F8-70DA9B603FBF}
- {25F66C64-058A-4D44-BC0C-F12A054F9A91} = {4C6B06C2-6D77-4E0E-AE32-D7050236433A}
- {A85201C6-6AF8-4B63-8365-08F741050438} = {4C6B06C2-6D77-4E0E-AE32-D7050236433A}
- {A92B4734-2587-4F6F-97A3-741BE48709A5} = {4C6B06C2-6D77-4E0E-AE32-D7050236433A}
- {28F8E9E2-FE24-41F7-A888-9FC244A9E2DD} = {4C6B06C2-6D77-4E0E-AE32-D7050236433A}
- {9A3DEA7E-1681-4D48-AC5C-1F0DE421A203} = {4C6B06C2-6D77-4E0E-AE32-D7050236433A}
+ {25F66C64-058A-4D44-BC0C-F12A054F9A91} = {C9809D59-6665-471E-AD87-5AC624C65892}
+ {A85201C6-6AF8-4B63-8365-08F741050438} = {C9809D59-6665-471E-AD87-5AC624C65892}
+ {A92B4734-2587-4F6F-97A3-741BE48709A5} = {C9809D59-6665-471E-AD87-5AC624C65892}
+ {28F8E9E2-FE24-41F7-A888-9FC244A9E2DD} = {C9809D59-6665-471E-AD87-5AC624C65892}
+ {9A3DEA7E-1681-4D48-AC5C-1F0DE421A203} = {C9809D59-6665-471E-AD87-5AC624C65892}
{7FD0A92B-7862-4BB1-932B-B52A9CACB56B} = {8CF53B92-5EB1-461D-98F8-70DA9B603FBF}
- {FD0AFD44-7A93-4F9E-B5ED-72582392E435} = {4C6B06C2-6D77-4E0E-AE32-D7050236433A}
+ {FD0AFD44-7A93-4F9E-B5ED-72582392E435} = {C9809D59-6665-471E-AD87-5AC624C65892}
{6A811927-3C37-430A-90F4-503E37123956} = {8CF53B92-5EB1-461D-98F8-70DA9B603FBF}
- {8B074219-F69A-4E41-83C6-12EE1E647779} = {4C6B06C2-6D77-4E0E-AE32-D7050236433A}
+ {8B074219-F69A-4E41-83C6-12EE1E647779} = {C9809D59-6665-471E-AD87-5AC624C65892}
{D7166C56-178A-4457-B56A-C615C7450DEE} = {8CF53B92-5EB1-461D-98F8-70DA9B603FBF}
{C1E5BBB6-6B6A-4DE5-B19D-0538304DE343} = {8CF53B92-5EB1-461D-98F8-70DA9B603FBF}
{945871B1-77B8-43FB-B53C-27CF385AB756} = {8CF53B92-5EB1-461D-98F8-70DA9B603FBF}
{D48A03DF-BCD3-4667-8747-2F251347E2B6} = {B56EBCEC-9C50-46A7-848C-65502DE69C5C}
{B51126A8-0D75-4A79-867D-10724EC6AC84} = {94207AA6-4923-4183-A558-E0F8196B8CA3}
+ {5E75AB7D-6F01-4313-AFF1-7F7128FFD71F} = {4C6B06C2-6D77-4E0E-AE32-D7050236433A}
+ {C9809D59-6665-471E-AD87-5AC624C65892} = {4C6B06C2-6D77-4E0E-AE32-D7050236433A}
+ {C0D540F0-9158-4528-BFD8-BEAE6EAE45EA} = {4C6B06C2-6D77-4E0E-AE32-D7050236433A}
+ {F7771E22-47BD-45C4-A133-FD7F1DE27CA0} = {C0D540F0-9158-4528-BFD8-BEAE6EAE45EA}
+ {27CF800D-890F-4882-BF05-44EC3233537D} = {C0D540F0-9158-4528-BFD8-BEAE6EAE45EA}
+ {42184546-E3CB-4D4F-9495-43979B9C63B9} = {C0D540F0-9158-4528-BFD8-BEAE6EAE45EA}
EndGlobalSection
EndGlobal
diff --git a/src/Squidex.Domain.Apps.Core/Identity/SquidexClaimTypes.cs b/src/Squidex.Domain.Apps.Core/Identity/SquidexClaimTypes.cs
deleted file mode 100644
index b0b071e50..000000000
--- a/src/Squidex.Domain.Apps.Core/Identity/SquidexClaimTypes.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-// ==========================================================================
-// SquidexClaimTypes.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-namespace Squidex.Domain.Apps.Core.Identity
-{
- public static class SquidexClaimTypes
- {
- public static readonly string SquidexDisplayName = "urn:squidex:name";
-
- public static readonly string SquidexPictureUrl = "urn:squidex:picture";
-
- public static readonly string Prefix = "urn:squidex:";
- }
-}
diff --git a/src/Squidex.Domain.Apps.Core/Identity/SquidexRoles.cs b/src/Squidex.Domain.Apps.Core/Identity/SquidexRoles.cs
deleted file mode 100644
index 3031c17e4..000000000
--- a/src/Squidex.Domain.Apps.Core/Identity/SquidexRoles.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-// ==========================================================================
-// SquidexRoles.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-namespace Squidex.Domain.Apps.Core.Identity
-{
- public static class SquidexRoles
- {
- public static readonly string Administrator = "ADMINISTRATOR";
-
- public static readonly string AppOwner = "APP-OWNER";
-
- public static readonly string AppEditor = "APP-EDITOR";
-
- public static readonly string AppDeveloper = "APP-DEVELOPER";
- }
-}
diff --git a/src/Squidex.Domain.Apps.Core/Squidex.Domain.Apps.Core.csproj b/src/Squidex.Domain.Apps.Core/Squidex.Domain.Apps.Core.csproj
index d8a4583d2..14f1c6e41 100644
--- a/src/Squidex.Domain.Apps.Core/Squidex.Domain.Apps.Core.csproj
+++ b/src/Squidex.Domain.Apps.Core/Squidex.Domain.Apps.Core.csproj
@@ -11,10 +11,9 @@
-
-
-
+
+
diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Squidex.Domain.Apps.Read.MongoDb.csproj b/src/Squidex.Domain.Apps.Read.MongoDb/Squidex.Domain.Apps.Read.MongoDb.csproj
index 668717ccb..af944fed3 100644
--- a/src/Squidex.Domain.Apps.Read.MongoDb/Squidex.Domain.Apps.Read.MongoDb.csproj
+++ b/src/Squidex.Domain.Apps.Read.MongoDb/Squidex.Domain.Apps.Read.MongoDb.csproj
@@ -15,9 +15,6 @@
-
-
-
diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Users/MongoRoleStore.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Users/MongoRoleStore.cs
deleted file mode 100644
index ea28ce60f..000000000
--- a/src/Squidex.Domain.Apps.Read.MongoDb/Users/MongoRoleStore.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-// ==========================================================================
-// MongoRoleStore.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System.Threading;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Identity;
-using Microsoft.AspNetCore.Identity.MongoDB;
-using MongoDB.Driver;
-using Squidex.Domain.Apps.Read.Users;
-
-namespace Squidex.Domain.Apps.Read.MongoDb.Users
-{
- public sealed class MongoRoleStore :
- IRoleStore,
- IRoleFactory
- {
- private readonly RoleStore innerStore;
-
- public MongoRoleStore(IMongoDatabase database)
- {
- var rolesCollection = database.GetCollection("Identity_Roles");
-
- IndexChecks.EnsureUniqueIndexOnNormalizedRoleName(rolesCollection);
-
- innerStore = new RoleStore(rolesCollection);
- }
-
- public void Dispose()
- {
- innerStore.Dispose();
- }
-
- public IRole Create(string name)
- {
- return new WrappedIdentityRole { Name = name };
- }
-
- public async Task FindByIdAsync(string roleId, CancellationToken cancellationToken)
- {
- return await innerStore.FindByIdAsync(roleId, cancellationToken);
- }
-
- public async Task FindByNameAsync(string normalizedRoleName, CancellationToken cancellationToken)
- {
- return await innerStore.FindByNameAsync(normalizedRoleName, cancellationToken);
- }
-
- public Task CreateAsync(IRole role, CancellationToken cancellationToken)
- {
- return innerStore.CreateAsync((WrappedIdentityRole)role, cancellationToken);
- }
-
- public Task UpdateAsync(IRole role, CancellationToken cancellationToken)
- {
- return innerStore.UpdateAsync((WrappedIdentityRole)role, cancellationToken);
- }
-
- public Task DeleteAsync(IRole role, CancellationToken cancellationToken)
- {
- return innerStore.DeleteAsync((WrappedIdentityRole)role, cancellationToken);
- }
-
- public Task GetRoleIdAsync(IRole role, CancellationToken cancellationToken)
- {
- return innerStore.GetRoleIdAsync((WrappedIdentityRole)role, cancellationToken);
- }
-
- public Task GetRoleNameAsync(IRole role, CancellationToken cancellationToken)
- {
- return innerStore.GetRoleNameAsync((WrappedIdentityRole)role, cancellationToken);
- }
-
- public Task SetRoleNameAsync(IRole role, string roleName, CancellationToken cancellationToken)
- {
- return innerStore.SetRoleNameAsync((WrappedIdentityRole)role, roleName, cancellationToken);
- }
-
- public Task GetNormalizedRoleNameAsync(IRole role, CancellationToken cancellationToken)
- {
- return innerStore.GetNormalizedRoleNameAsync((WrappedIdentityRole)role, cancellationToken);
- }
-
- public Task SetNormalizedRoleNameAsync(IRole role, string normalizedName, CancellationToken cancellationToken)
- {
- return innerStore.SetNormalizedRoleNameAsync((WrappedIdentityRole)role, normalizedName, cancellationToken);
- }
- }
-}
diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Users/MongoUserStore.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Users/MongoUserStore.cs
deleted file mode 100644
index f54f6ccc1..000000000
--- a/src/Squidex.Domain.Apps.Read.MongoDb/Users/MongoUserStore.cs
+++ /dev/null
@@ -1,329 +0,0 @@
-// ==========================================================================
-// MongoUserStore.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Security.Claims;
-using System.Threading;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Identity;
-using Microsoft.AspNetCore.Identity.MongoDB;
-using MongoDB.Driver;
-using Squidex.Domain.Apps.Read.Users;
-
-namespace Squidex.Domain.Apps.Read.MongoDb.Users
-{
- public sealed class MongoUserStore :
- IUserPasswordStore,
- IUserRoleStore,
- IUserLoginStore,
- IUserSecurityStampStore,
- IUserEmailStore,
- IUserClaimStore,
- IUserPhoneNumberStore,
- IUserTwoFactorStore,
- IUserLockoutStore,
- IUserAuthenticationTokenStore,
- IUserFactory,
- IUserResolver,
- IQueryableUserStore
- {
- private readonly UserStore innerStore;
-
- public MongoUserStore(IMongoDatabase database)
- {
- var usersCollection = database.GetCollection("Identity_Users");
-
- IndexChecks.EnsureUniqueIndexOnNormalizedEmail(usersCollection);
- IndexChecks.EnsureUniqueIndexOnNormalizedUserName(usersCollection);
-
- innerStore = new UserStore(usersCollection);
- }
-
- public void Dispose()
- {
- innerStore.Dispose();
- }
-
- public IQueryable Users
- {
- get { return innerStore.Users; }
- }
-
- public IUser Create(string email)
- {
- return new WrappedIdentityUser { Email = email, UserName = email };
- }
-
- public async Task FindByIdAsync(string userId)
- {
- return await innerStore.FindByIdAsync(userId, CancellationToken.None);
- }
-
- public async Task FindByIdAsync(string userId, CancellationToken cancellationToken)
- {
- return await innerStore.FindByIdAsync(userId, cancellationToken);
- }
-
- public async Task FindByEmailAsync(string normalizedEmail, CancellationToken cancellationToken)
- {
- return await innerStore.FindByEmailAsync(normalizedEmail, cancellationToken);
- }
-
- public async Task FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken)
- {
- return await innerStore.FindByNameAsync(normalizedUserName, cancellationToken);
- }
-
- public async Task FindByLoginAsync(string loginProvider, string providerKey, CancellationToken cancellationToken)
- {
- return await innerStore.FindByLoginAsync(loginProvider, providerKey, cancellationToken);
- }
-
- public async Task> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken)
- {
- return (await innerStore.GetUsersForClaimAsync(claim, cancellationToken)).OfType().ToList();
- }
-
- public async Task> GetUsersInRoleAsync(string roleName, CancellationToken cancellationToken)
- {
- return (await innerStore.GetUsersInRoleAsync(roleName, cancellationToken)).OfType().ToList();
- }
-
- public Task CreateAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.CreateAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task UpdateAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.UpdateAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task DeleteAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.DeleteAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task GetUserIdAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetUserIdAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task GetUserNameAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetUserNameAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task SetUserNameAsync(IUser user, string userName, CancellationToken cancellationToken)
- {
- return innerStore.SetUserNameAsync((WrappedIdentityUser)user, userName, cancellationToken);
- }
-
- public Task GetNormalizedUserNameAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetNormalizedUserNameAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task SetNormalizedUserNameAsync(IUser user, string normalizedName, CancellationToken cancellationToken)
- {
- return innerStore.SetNormalizedUserNameAsync((WrappedIdentityUser)user, normalizedName, cancellationToken);
- }
-
- public Task GetPasswordHashAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetPasswordHashAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task SetPasswordHashAsync(IUser user, string passwordHash, CancellationToken cancellationToken)
- {
- return innerStore.SetPasswordHashAsync((WrappedIdentityUser)user, passwordHash, cancellationToken);
- }
-
- public Task AddToRoleAsync(IUser user, string roleName, CancellationToken cancellationToken)
- {
- return innerStore.AddToRoleAsync((WrappedIdentityUser)user, roleName, cancellationToken);
- }
-
- public Task RemoveFromRoleAsync(IUser user, string roleName, CancellationToken cancellationToken)
- {
- return innerStore.RemoveFromRoleAsync((WrappedIdentityUser)user, roleName, cancellationToken);
- }
-
- public Task> GetRolesAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetRolesAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task IsInRoleAsync(IUser user, string roleName, CancellationToken cancellationToken)
- {
- return innerStore.IsInRoleAsync((WrappedIdentityUser)user, roleName, cancellationToken);
- }
-
- public Task AddLoginAsync(IUser user, UserLoginInfo login, CancellationToken cancellationToken)
- {
- return innerStore.AddLoginAsync((WrappedIdentityUser)user, login, cancellationToken);
- }
-
- public Task RemoveLoginAsync(IUser user, string loginProvider, string providerKey, CancellationToken cancellationToken)
- {
- return innerStore.RemoveLoginAsync((WrappedIdentityUser)user, loginProvider, providerKey, cancellationToken);
- }
-
- public Task> GetLoginsAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetLoginsAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task GetSecurityStampAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetSecurityStampAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task SetSecurityStampAsync(IUser user, string stamp, CancellationToken cancellationToken)
- {
- return innerStore.SetSecurityStampAsync((WrappedIdentityUser)user, stamp, cancellationToken);
- }
-
- public Task GetEmailAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetEmailAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task SetEmailAsync(IUser user, string email, CancellationToken cancellationToken)
- {
- return innerStore.SetEmailAsync((WrappedIdentityUser)user, email, cancellationToken);
- }
-
- public Task GetEmailConfirmedAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetEmailConfirmedAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task SetEmailConfirmedAsync(IUser user, bool confirmed, CancellationToken cancellationToken)
- {
- return innerStore.SetEmailConfirmedAsync((WrappedIdentityUser)user, confirmed, cancellationToken);
- }
-
- public Task GetNormalizedEmailAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetNormalizedEmailAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task SetNormalizedEmailAsync(IUser user, string normalizedEmail, CancellationToken cancellationToken)
- {
- return innerStore.SetNormalizedEmailAsync((WrappedIdentityUser)user, normalizedEmail, cancellationToken);
- }
-
- public Task> GetClaimsAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetClaimsAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task AddClaimsAsync(IUser user, IEnumerable claims, CancellationToken cancellationToken)
- {
- return innerStore.AddClaimsAsync((WrappedIdentityUser)user, claims, cancellationToken);
- }
-
- public Task ReplaceClaimAsync(IUser user, Claim claim, Claim newClaim, CancellationToken cancellationToken)
- {
- return innerStore.ReplaceClaimAsync((WrappedIdentityUser)user, claim, newClaim, cancellationToken);
- }
-
- public Task RemoveClaimsAsync(IUser user, IEnumerable claims, CancellationToken cancellationToken)
- {
- return innerStore.RemoveClaimsAsync((WrappedIdentityUser)user, claims, cancellationToken);
- }
-
- public Task GetPhoneNumberAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetPhoneNumberAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task SetPhoneNumberAsync(IUser user, string phoneNumber, CancellationToken cancellationToken)
- {
- return innerStore.SetPhoneNumberAsync((WrappedIdentityUser)user, phoneNumber, cancellationToken);
- }
-
- public Task GetPhoneNumberConfirmedAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetPhoneNumberConfirmedAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task SetPhoneNumberConfirmedAsync(IUser user, bool confirmed, CancellationToken cancellationToken)
- {
- return innerStore.SetPhoneNumberConfirmedAsync((WrappedIdentityUser)user, confirmed, cancellationToken);
- }
-
- public Task GetTwoFactorEnabledAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetTwoFactorEnabledAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task SetTwoFactorEnabledAsync(IUser user, bool enabled, CancellationToken cancellationToken)
- {
- return innerStore.SetTwoFactorEnabledAsync((WrappedIdentityUser)user, enabled, cancellationToken);
- }
-
- public Task GetLockoutEndDateAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetLockoutEndDateAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task SetLockoutEndDateAsync(IUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken)
- {
- return innerStore.SetLockoutEndDateAsync((WrappedIdentityUser)user, lockoutEnd, cancellationToken);
- }
-
- public Task GetAccessFailedCountAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetAccessFailedCountAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task IncrementAccessFailedCountAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.IncrementAccessFailedCountAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task ResetAccessFailedCountAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.ResetAccessFailedCountAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task GetLockoutEnabledAsync(IUser user, CancellationToken cancellationToken)
- {
- return innerStore.GetLockoutEnabledAsync((WrappedIdentityUser)user, cancellationToken);
- }
-
- public Task SetLockoutEnabledAsync(IUser user, bool enabled, CancellationToken cancellationToken)
- {
- return innerStore.SetLockoutEnabledAsync((WrappedIdentityUser)user, enabled, cancellationToken);
- }
-
- public Task SetTokenAsync(IUser user, string loginProvider, string name, string value, CancellationToken cancellationToken)
- {
- return innerStore.SetTokenAsync((WrappedIdentityUser)user, loginProvider, name, value, cancellationToken);
- }
-
- public Task RemoveTokenAsync(IUser user, string loginProvider, string name, CancellationToken cancellationToken)
- {
- return innerStore.RemoveTokenAsync((WrappedIdentityUser)user, loginProvider, name, cancellationToken);
- }
-
- public Task GetTokenAsync(IUser user, string loginProvider, string name, CancellationToken cancellationToken)
- {
- return innerStore.GetTokenAsync((WrappedIdentityUser)user, loginProvider, name, cancellationToken);
- }
-
- public Task HasPasswordAsync(IUser user, CancellationToken cancellationToken)
- {
- return Task.FromResult(!string.IsNullOrWhiteSpace(((WrappedIdentityUser)user).PasswordHash));
- }
- }
-}
diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Users/WrappedIdentityRole.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Users/WrappedIdentityRole.cs
deleted file mode 100644
index 079e3e05d..000000000
--- a/src/Squidex.Domain.Apps.Read.MongoDb/Users/WrappedIdentityRole.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-// ==========================================================================
-// WrappedIdentityRole.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using Microsoft.AspNetCore.Identity.MongoDB;
-using Squidex.Domain.Apps.Read.Users;
-
-namespace Squidex.Domain.Apps.Read.MongoDb.Users
-{
- public sealed class WrappedIdentityRole : IdentityRole, IRole
- {
- }
-}
diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Users/WrappedIdentityUser.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Users/WrappedIdentityUser.cs
deleted file mode 100644
index 89da563b8..000000000
--- a/src/Squidex.Domain.Apps.Read.MongoDb/Users/WrappedIdentityUser.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-// ==========================================================================
-// WrappedIdentityUser.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Security.Claims;
-using Microsoft.AspNetCore.Identity.MongoDB;
-using Squidex.Domain.Apps.Read.Users;
-
-namespace Squidex.Domain.Apps.Read.MongoDb.Users
-{
- public sealed class WrappedIdentityUser : IdentityUser, IUser
- {
- public bool IsLocked
- {
- get { return LockoutEndDateUtc != null && LockoutEndDateUtc.Value > DateTime.UtcNow; }
- }
-
- IReadOnlyList IUser.Claims
- {
- get { return Claims.Select(x => new Claim(x.Type, x.Value)).ToList(); }
- }
-
- IReadOnlyList IUser.Logins
- {
- get { return Logins.Select(x => new ExternalLogin(x.LoginProvider, x.ProviderKey, x.ProviderDisplayName)).ToList(); }
- }
-
- public void UpdateEmail(string email)
- {
- Email = UserName = email;
- }
-
- public void SetClaim(string type, string value)
- {
- Claims.RemoveAll(x => string.Equals(x.Type, type, StringComparison.OrdinalIgnoreCase));
- Claims.Add(new IdentityUserClaim { Type = type, Value = value });
- }
- }
-}
diff --git a/src/Squidex.Domain.Apps.Read/Squidex.Domain.Apps.Read.csproj b/src/Squidex.Domain.Apps.Read/Squidex.Domain.Apps.Read.csproj
index 5be3075ef..3fb44e66a 100644
--- a/src/Squidex.Domain.Apps.Read/Squidex.Domain.Apps.Read.csproj
+++ b/src/Squidex.Domain.Apps.Read/Squidex.Domain.Apps.Read.csproj
@@ -13,10 +13,8 @@
-
-
diff --git a/src/Squidex.Domain.Apps.Read/Users/AssetUserPictureStore.cs b/src/Squidex.Domain.Apps.Read/Users/AssetUserPictureStore.cs
deleted file mode 100644
index da23947e3..000000000
--- a/src/Squidex.Domain.Apps.Read/Users/AssetUserPictureStore.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-// ==========================================================================
-// AssetUserPictureStore.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System.IO;
-using System.Threading.Tasks;
-using Squidex.Infrastructure;
-using Squidex.Infrastructure.Assets;
-
-namespace Squidex.Domain.Apps.Read.Users
-{
- public sealed class AssetUserPictureStore : IUserPictureStore
- {
- private readonly IAssetStore assetStore;
-
- public AssetUserPictureStore(IAssetStore assetStore)
- {
- Guard.NotNull(assetStore, nameof(assetStore));
-
- this.assetStore = assetStore;
- }
-
- public Task UploadAsync(string userId, Stream stream)
- {
- return assetStore.UploadAsync(userId, 0, "picture", stream);
- }
-
- public async Task DownloadAsync(string userId)
- {
- var memoryStream = new MemoryStream();
-
- await assetStore.DownloadAsync(userId, 0, "picture", memoryStream);
-
- memoryStream.Position = 0;
-
- return memoryStream;
- }
- }
-}
diff --git a/src/Squidex.Domain.Apps.Read/Users/ExternalLogin.cs b/src/Squidex.Domain.Apps.Read/Users/ExternalLogin.cs
deleted file mode 100644
index a618757ff..000000000
--- a/src/Squidex.Domain.Apps.Read/Users/ExternalLogin.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-// ==========================================================================
-// ExternalLogin.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-namespace Squidex.Domain.Apps.Read.Users
-{
- public sealed class ExternalLogin
- {
- public string LoginProvider { get; }
-
- public string ProviderKey { get; }
-
- public string ProviderDisplayName { get; }
-
- public ExternalLogin(string loginProvider, string providerKey, string providerDisplayName)
- {
- LoginProvider = loginProvider;
-
- ProviderKey = providerKey;
- ProviderDisplayName = providerDisplayName;
-
- if (string.IsNullOrWhiteSpace(ProviderDisplayName))
- {
- ProviderDisplayName = loginProvider;
- }
- }
- }
-}
diff --git a/src/Squidex.Domain.Apps.Read/Users/IRole.cs b/src/Squidex.Domain.Apps.Read/Users/IRole.cs
deleted file mode 100644
index 558e520e1..000000000
--- a/src/Squidex.Domain.Apps.Read/Users/IRole.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-// ==========================================================================
-// IRole.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-namespace Squidex.Domain.Apps.Read.Users
-{
- public interface IRole
- {
- string Name { get; }
- }
-}
diff --git a/src/Squidex.Domain.Apps.Read/Users/IRoleFactory.cs b/src/Squidex.Domain.Apps.Read/Users/IRoleFactory.cs
deleted file mode 100644
index 930dea5ac..000000000
--- a/src/Squidex.Domain.Apps.Read/Users/IRoleFactory.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-// ==========================================================================
-// IRoleFactory.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-namespace Squidex.Domain.Apps.Read.Users
-{
- public interface IRoleFactory
- {
- IRole Create(string name);
- }
-}
diff --git a/src/Squidex.Domain.Apps.Read/Users/IUser.cs b/src/Squidex.Domain.Apps.Read/Users/IUser.cs
deleted file mode 100644
index 604b4bb72..000000000
--- a/src/Squidex.Domain.Apps.Read/Users/IUser.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-// ==========================================================================
-// IUser.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System.Collections.Generic;
-using System.Security.Claims;
-
-namespace Squidex.Domain.Apps.Read.Users
-{
- public interface IUser
- {
- bool IsLocked { get; }
-
- string Id { get; }
-
- string Email { get; }
-
- string NormalizedEmail { get; }
-
- IReadOnlyList Claims { get; }
-
- IReadOnlyList Logins { get; }
-
- void UpdateEmail(string email);
-
- void AddClaim(Claim claim);
-
- void SetClaim(string type, string value);
- }
-}
diff --git a/src/Squidex.Domain.Apps.Read/Users/IUserFactory.cs b/src/Squidex.Domain.Apps.Read/Users/IUserFactory.cs
deleted file mode 100644
index 573b8715b..000000000
--- a/src/Squidex.Domain.Apps.Read/Users/IUserFactory.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-// ==========================================================================
-// IUserFactory.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-namespace Squidex.Domain.Apps.Read.Users
-{
- public interface IUserFactory
- {
- IUser Create(string email);
- }
-}
diff --git a/src/Squidex.Domain.Apps.Read/Users/IUserPictureStore.cs b/src/Squidex.Domain.Apps.Read/Users/IUserPictureStore.cs
deleted file mode 100644
index 39489c897..000000000
--- a/src/Squidex.Domain.Apps.Read/Users/IUserPictureStore.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-// ==========================================================================
-// IUserPictureStore.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System.IO;
-using System.Threading.Tasks;
-
-namespace Squidex.Domain.Apps.Read.Users
-{
- public interface IUserPictureStore
- {
- Task UploadAsync(string userId, Stream stream);
-
- Task DownloadAsync(string userId);
- }
-}
diff --git a/src/Squidex.Domain.Apps.Read/Users/IUserResolver.cs b/src/Squidex.Domain.Apps.Read/Users/IUserResolver.cs
deleted file mode 100644
index 3e15cc3fd..000000000
--- a/src/Squidex.Domain.Apps.Read/Users/IUserResolver.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-// ==========================================================================
-// IUserResolver.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System.Threading.Tasks;
-
-namespace Squidex.Domain.Apps.Read.Users
-{
- public interface IUserResolver
- {
- Task FindByIdAsync(string id);
- }
-}
diff --git a/src/Squidex.Domain.Apps.Read/Users/UserExtensions.cs b/src/Squidex.Domain.Apps.Read/Users/UserExtensions.cs
deleted file mode 100644
index 70173b611..000000000
--- a/src/Squidex.Domain.Apps.Read/Users/UserExtensions.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-// ==========================================================================
-// UserExtensions.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System;
-using System.Linq;
-using Squidex.Domain.Apps.Core.Identity;
-using Squidex.Infrastructure;
-
-// ReSharper disable InvertIf
-
-namespace Squidex.Domain.Apps.Read.Users
-{
- public static class UserExtensions
- {
- public static void UpdateDisplayName(this IUser user, string displayName)
- {
- user.SetClaim(SquidexClaimTypes.SquidexDisplayName, displayName);
- }
-
- public static void SetPictureUrl(this IUser user, string pictureUrl)
- {
- user.SetClaim(SquidexClaimTypes.SquidexPictureUrl, pictureUrl);
- }
-
- public static void SetPictureUrlToStore(this IUser user)
- {
- user.SetClaim(SquidexClaimTypes.SquidexPictureUrl, "store");
- }
-
- public static void SetPictureUrlFromGravatar(this IUser user, string email)
- {
- user.SetClaim(SquidexClaimTypes.SquidexPictureUrl, GravatarHelper.CreatePictureUrl(email));
- }
-
- public static bool IsPictureUrlStored(this IUser user)
- {
- return string.Equals(user.Claims.FirstOrDefault(x => x.Type == SquidexClaimTypes.SquidexPictureUrl)?.Value, "store", StringComparison.OrdinalIgnoreCase);
- }
-
- public static string PictureUrl(this IUser user)
- {
- return user.Claims.FirstOrDefault(x => x.Type == SquidexClaimTypes.SquidexPictureUrl)?.Value;
- }
-
- public static string DisplayName(this IUser user)
- {
- return user.Claims.FirstOrDefault(x => x.Type == SquidexClaimTypes.SquidexDisplayName)?.Value;
- }
-
- public static string PictureNormalizedUrl(this IUser user)
- {
- var url = user.Claims.FirstOrDefault(x => x.Type == SquidexClaimTypes.SquidexPictureUrl)?.Value;
-
- if (!string.IsNullOrWhiteSpace(url) && Uri.IsWellFormedUriString(url, UriKind.Absolute) && url.Contains("gravatar"))
- {
- if (url.Contains("?"))
- {
- url += "&d=404";
- }
- else
- {
- url += "?d=404";
- }
- }
-
- return url;
- }
- }
-}
diff --git a/src/Squidex.Domain.Apps.Read/Users/UserManagerExtensions.cs b/src/Squidex.Domain.Apps.Read/Users/UserManagerExtensions.cs
deleted file mode 100644
index b47600a71..000000000
--- a/src/Squidex.Domain.Apps.Read/Users/UserManagerExtensions.cs
+++ /dev/null
@@ -1,131 +0,0 @@
-// ==========================================================================
-// UserManagerExtensions.cs
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex Group
-// All rights reserved.
-// ==========================================================================
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Identity;
-using Squidex.Infrastructure;
-
-// ReSharper disable ImplicitlyCapturedClosure
-// ReSharper disable InvertIf
-// ReSharper disable ReturnTypeCanBeEnumerable.Local
-
-namespace Squidex.Domain.Apps.Read.Users
-{
- public static class UserManagerExtensions
- {
- public static Task> QueryByEmailAsync(this UserManager userManager, string email = null, int take = 10, int skip = 0)
- {
- var users = QueryUsers(userManager, email).Skip(skip).Take(take).ToList();
-
- return Task.FromResult>(users);
- }
-
- public static Task CountByEmailAsync(this UserManager userManager, string email = null)
- {
- var count = QueryUsers(userManager, email).LongCount();
-
- return Task.FromResult(count);
- }
-
- private static IQueryable QueryUsers(UserManager userManager, string email = null)
- {
- var result = userManager.Users;
-
- if (!string.IsNullOrWhiteSpace(email))
- {
- var upperEmail = email.ToUpperInvariant();
-
- result = result.Where(x => x.NormalizedEmail.Contains(upperEmail));
- }
-
- return result;
- }
-
- public static async Task CreateAsync(this UserManager userManager, IUserFactory factory, string email, string displayName, string password)
- {
- var user = factory.Create(email);
-
- user.UpdateDisplayName(displayName);
- user.SetPictureUrlFromGravatar(email);
-
- await DoChecked(() => userManager.CreateAsync(user), "Cannot create user.");
-
- if (!string.IsNullOrWhiteSpace(password))
- {
- await DoChecked(() => userManager.AddPasswordAsync(user, password), "Cannot create user.");
- }
-
- return user;
- }
-
- public static async Task UpdateAsync(this UserManager userManager, string id, string email, string displayName, string password)
- {
- var user = await userManager.FindByIdAsync(id);
-
- if (user == null)
- {
- throw new DomainObjectNotFoundException(id, typeof(IUser));
- }
-
- if (!string.IsNullOrWhiteSpace(email))
- {
- user.UpdateEmail(email);
- }
-
- if (!string.IsNullOrWhiteSpace(displayName))
- {
- user.UpdateDisplayName(displayName);
- }
-
- await DoChecked(() => userManager.UpdateAsync(user), "Cannot update user.");
-
- if (!string.IsNullOrWhiteSpace(password))
- {
- await DoChecked(() => userManager.RemovePasswordAsync(user), "Cannot update user.");
- await DoChecked(() => userManager.AddPasswordAsync(user, password), "Cannot update user.");
- }
- }
-
- public static async Task LockAsync(this UserManager userManager, string id)
- {
- var user = await userManager.FindByIdAsync(id);
-
- if (user == null)
- {
- throw new DomainObjectNotFoundException(id, typeof(IUser));
- }
-
- await DoChecked(() => userManager.SetLockoutEndDateAsync(user, DateTimeOffset.UtcNow.AddYears(100)), "Cannot lock user.");
- }
-
- public static async Task UnlockAsync(this UserManager userManager, string id)
- {
- var user = await userManager.FindByIdAsync(id);
-
- if (user == null)
- {
- throw new DomainObjectNotFoundException(id, typeof(IUser));
- }
-
- await DoChecked(() => userManager.SetLockoutEndDateAsync(user, null), "Cannot unlock user.");
- }
-
- private static async Task DoChecked(Func> action, string message)
- {
- var result = await action();
-
- if (!result.Succeeded)
- {
- throw new ValidationException(message, result.Errors.Select(x => new ValidationError(x.Description)).ToArray());
- }
- }
- }
-}
diff --git a/src/Squidex.Domain.Apps.Write/Apps/AppCommandHandler.cs b/src/Squidex.Domain.Apps.Write/Apps/AppCommandHandler.cs
index 3a46e810d..b533a84c3 100644
--- a/src/Squidex.Domain.Apps.Write/Apps/AppCommandHandler.cs
+++ b/src/Squidex.Domain.Apps.Write/Apps/AppCommandHandler.cs
@@ -9,12 +9,12 @@
using System.Threading.Tasks;
using Squidex.Domain.Apps.Read.Apps.Repositories;
using Squidex.Domain.Apps.Read.Apps.Services;
-using Squidex.Domain.Apps.Read.Users;
using Squidex.Domain.Apps.Write.Apps.Commands;
using Squidex.Infrastructure;
using Squidex.Infrastructure.CQRS.Commands;
using Squidex.Infrastructure.Dispatching;
using Squidex.Infrastructure.Tasks;
+using Squidex.Shared.Users;
// ReSharper disable InvertIf
diff --git a/src/Squidex.Domain.Apps.Write/Squidex.Domain.Apps.Write.csproj b/src/Squidex.Domain.Apps.Write/Squidex.Domain.Apps.Write.csproj
index b459c159e..5358b47de 100644
--- a/src/Squidex.Domain.Apps.Write/Squidex.Domain.Apps.Write.csproj
+++ b/src/Squidex.Domain.Apps.Write/Squidex.Domain.Apps.Write.csproj
@@ -12,6 +12,7 @@
+
diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Infrastructure/MongoPersistedGrantStore.cs b/src/Squidex.Domain.Users.MongoDb/Infrastructure/MongoPersistedGrantStore.cs
similarity index 97%
rename from src/Squidex.Domain.Apps.Read.MongoDb/Infrastructure/MongoPersistedGrantStore.cs
rename to src/Squidex.Domain.Users.MongoDb/Infrastructure/MongoPersistedGrantStore.cs
index dd64cb8c7..e56ff2895 100644
--- a/src/Squidex.Domain.Apps.Read.MongoDb/Infrastructure/MongoPersistedGrantStore.cs
+++ b/src/Squidex.Domain.Users.MongoDb/Infrastructure/MongoPersistedGrantStore.cs
@@ -14,7 +14,7 @@ using MongoDB.Bson.Serialization;
using MongoDB.Driver;
using Squidex.Infrastructure.MongoDb;
-namespace Squidex.Domain.Apps.Read.MongoDb.Infrastructure
+namespace Squidex.Domain.Users.MongoDb.Infrastructure
{
public class MongoPersistedGrantStore : MongoRepositoryBase, IPersistedGrantStore
{
diff --git a/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj b/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj
index b6da5d210..60c3f160f 100644
--- a/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj
+++ b/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj
@@ -8,10 +8,12 @@
+
+
diff --git a/src/Squidex/Config/Domain/ReadModule.cs b/src/Squidex/Config/Domain/ReadModule.cs
index 6c7c3e1da..9fdd146f0 100644
--- a/src/Squidex/Config/Domain/ReadModule.cs
+++ b/src/Squidex/Config/Domain/ReadModule.cs
@@ -20,7 +20,7 @@ using Squidex.Domain.Apps.Read.History;
using Squidex.Domain.Apps.Read.Schemas;
using Squidex.Domain.Apps.Read.Schemas.Services;
using Squidex.Domain.Apps.Read.Schemas.Services.Implementations;
-using Squidex.Domain.Apps.Read.Users;
+using Squidex.Domain.Users;
using Squidex.Infrastructure.CQRS.Events;
// ReSharper disable UnusedAutoPropertyAccessor.Local
diff --git a/src/Squidex/Config/Domain/StoreMongoDbModule.cs b/src/Squidex/Config/Domain/StoreMongoDbModule.cs
index 2f07d74a2..903d9dd27 100644
--- a/src/Squidex/Config/Domain/StoreMongoDbModule.cs
+++ b/src/Squidex/Config/Domain/StoreMongoDbModule.cs
@@ -21,17 +21,18 @@ using Squidex.Domain.Apps.Read.MongoDb.Apps;
using Squidex.Domain.Apps.Read.MongoDb.Assets;
using Squidex.Domain.Apps.Read.MongoDb.Contents;
using Squidex.Domain.Apps.Read.MongoDb.History;
-using Squidex.Domain.Apps.Read.MongoDb.Infrastructure;
using Squidex.Domain.Apps.Read.MongoDb.Schemas;
-using Squidex.Domain.Apps.Read.MongoDb.Users;
using Squidex.Domain.Apps.Read.Schemas.Repositories;
using Squidex.Domain.Apps.Read.Schemas.Services.Implementations;
-using Squidex.Domain.Apps.Read.Users;
+using Squidex.Domain.Users;
+using Squidex.Domain.Users.MongoDb;
+using Squidex.Domain.Users.MongoDb.Infrastructure;
using Squidex.Infrastructure;
using Squidex.Infrastructure.CQRS.Events;
using Squidex.Infrastructure.MongoDb;
using Squidex.Infrastructure.MongoDb.UsageTracker;
using Squidex.Infrastructure.UsageTracking;
+using Squidex.Shared.Users;
namespace Squidex.Config.Domain
{
diff --git a/src/Squidex/Config/Identity/GithubHandler.cs b/src/Squidex/Config/Identity/GithubHandler.cs
index aae62ba8d..5a9f24b9e 100644
--- a/src/Squidex/Config/Identity/GithubHandler.cs
+++ b/src/Squidex/Config/Identity/GithubHandler.cs
@@ -9,7 +9,7 @@
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.OAuth;
-using Squidex.Domain.Apps.Core.Identity;
+using Squidex.Shared.Identity;
namespace Squidex.Config.Identity
{
diff --git a/src/Squidex/Config/Identity/GoogleHandler.cs b/src/Squidex/Config/Identity/GoogleHandler.cs
index 957aadd9a..3f8295683 100644
--- a/src/Squidex/Config/Identity/GoogleHandler.cs
+++ b/src/Squidex/Config/Identity/GoogleHandler.cs
@@ -10,8 +10,8 @@ using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.OAuth;
-using Squidex.Domain.Apps.Core.Identity;
using Squidex.Infrastructure.Tasks;
+using Squidex.Shared.Identity;
// ReSharper disable InvertIf
diff --git a/src/Squidex/Config/Identity/IdentityServices.cs b/src/Squidex/Config/Identity/IdentityServices.cs
index 493f3039c..75457bf4c 100644
--- a/src/Squidex/Config/Identity/IdentityServices.cs
+++ b/src/Squidex/Config/Identity/IdentityServices.cs
@@ -17,9 +17,10 @@ using IdentityServer4.Stores;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
-using Squidex.Domain.Apps.Core.Identity;
-using Squidex.Domain.Apps.Read.Users;
+using Squidex.Domain.Users;
using Squidex.Infrastructure;
+using Squidex.Shared.Identity;
+using Squidex.Shared.Users;
using StackExchange.Redis;
namespace Squidex.Config.Identity
diff --git a/src/Squidex/Config/Identity/IdentityUsage.cs b/src/Squidex/Config/Identity/IdentityUsage.cs
index 27aef487a..2b0a7fb6a 100644
--- a/src/Squidex/Config/Identity/IdentityUsage.cs
+++ b/src/Squidex/Config/Identity/IdentityUsage.cs
@@ -12,8 +12,9 @@ using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
-using Squidex.Domain.Apps.Core.Identity;
-using Squidex.Domain.Apps.Read.Users;
+using Squidex.Domain.Users;
+using Squidex.Shared.Identity;
+using Squidex.Shared.Users;
// ReSharper disable InvertIf
diff --git a/src/Squidex/Config/Identity/MicrosoftHandler.cs b/src/Squidex/Config/Identity/MicrosoftHandler.cs
index 65c7a442c..0bcd010b0 100644
--- a/src/Squidex/Config/Identity/MicrosoftHandler.cs
+++ b/src/Squidex/Config/Identity/MicrosoftHandler.cs
@@ -9,7 +9,7 @@
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.OAuth;
-using Squidex.Domain.Apps.Core.Identity;
+using Squidex.Shared.Identity;
// ReSharper disable InvertIf
diff --git a/src/Squidex/Controllers/Api/Users/UserManagementController.cs b/src/Squidex/Controllers/Api/Users/UserManagementController.cs
index c288e0a5e..4774350c0 100644
--- a/src/Squidex/Controllers/Api/Users/UserManagementController.cs
+++ b/src/Squidex/Controllers/Api/Users/UserManagementController.cs
@@ -13,11 +13,12 @@ using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using NSwag.Annotations;
using Squidex.Controllers.Api.Users.Models;
-using Squidex.Domain.Apps.Read.Users;
+using Squidex.Domain.Users;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Security;
using Squidex.Pipeline;
+using Squidex.Shared.Users;
namespace Squidex.Controllers.Api.Users
{
@@ -48,7 +49,7 @@ namespace Squidex.Controllers.Api.Users
var response = new UsersDto
{
Total = taskForCount.Result,
- Items = taskForItems.Result.Select(x => SimpleMapper.Map(x, new UserDto { DisplayName = x.DisplayName(), PictureUrl = x.PictureUrl() })).ToArray()
+ Items = taskForItems.Result.Select(Map).ToArray()
};
return Ok(response);
@@ -66,7 +67,7 @@ namespace Squidex.Controllers.Api.Users
return NotFound();
}
- var response = SimpleMapper.Map(entity, new UserDto { DisplayName = entity.DisplayName(), PictureUrl = entity.PictureUrl() });
+ var response = Map(entity);
return Ok(response);
}
@@ -123,6 +124,11 @@ namespace Squidex.Controllers.Api.Users
return NoContent();
}
+ private static UserDto Map(IUser user)
+ {
+ return SimpleMapper.Map(user, new UserDto { DisplayName = user.DisplayName(), PictureUrl = user.PictureUrl() });
+ }
+
private bool IsSelf(string id)
{
var subject = User.OpenIdSubject();
diff --git a/src/Squidex/Controllers/Api/Users/UsersController.cs b/src/Squidex/Controllers/Api/Users/UsersController.cs
index 88d13468a..fbc5ddba2 100644
--- a/src/Squidex/Controllers/Api/Users/UsersController.cs
+++ b/src/Squidex/Controllers/Api/Users/UsersController.cs
@@ -16,9 +16,10 @@ using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using NSwag.Annotations;
using Squidex.Controllers.Api.Users.Models;
-using Squidex.Domain.Apps.Read.Users;
+using Squidex.Domain.Users;
using Squidex.Infrastructure.Reflection;
using Squidex.Pipeline;
+using Squidex.Shared.Users;
// ReSharper disable InvertIf
@@ -144,7 +145,9 @@ namespace Squidex.Controllers.Api.Users
if (response.IsSuccessStatusCode)
{
- return new FileStreamResult(await response.Content.ReadAsStreamAsync(), response.Content.Headers.ContentType.ToString());
+ var contentType = response.Content.Headers.ContentType.ToString();
+
+ return new FileStreamResult(await response.Content.ReadAsStreamAsync(), contentType);
}
}
}
diff --git a/src/Squidex/Controllers/ContentApi/Generator/SchemasSwaggerGenerator.cs b/src/Squidex/Controllers/ContentApi/Generator/SchemasSwaggerGenerator.cs
index 5fef9a063..08925396b 100644
--- a/src/Squidex/Controllers/ContentApi/Generator/SchemasSwaggerGenerator.cs
+++ b/src/Squidex/Controllers/ContentApi/Generator/SchemasSwaggerGenerator.cs
@@ -16,11 +16,11 @@ using NSwag;
using NSwag.AspNetCore;
using NSwag.SwaggerGeneration;
using Squidex.Config;
-using Squidex.Domain.Apps.Core.Identity;
using Squidex.Domain.Apps.Read.Apps;
using Squidex.Domain.Apps.Read.Schemas;
using Squidex.Infrastructure;
using Squidex.Pipeline.Swagger;
+using Squidex.Shared.Identity;
// ReSharper disable InvertIf
// ReSharper disable SuggestBaseTypeForParameter
diff --git a/src/Squidex/Controllers/UI/Account/AccountController.cs b/src/Squidex/Controllers/UI/Account/AccountController.cs
index 76979e157..a50d04f6a 100644
--- a/src/Squidex/Controllers/UI/Account/AccountController.cs
+++ b/src/Squidex/Controllers/UI/Account/AccountController.cs
@@ -20,11 +20,12 @@ using Microsoft.Extensions.Options;
using NSwag.Annotations;
using Squidex.Config;
using Squidex.Config.Identity;
-using Squidex.Domain.Apps.Core.Identity;
-using Squidex.Domain.Apps.Read.Users;
+using Squidex.Domain.Users;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Log;
using Squidex.Infrastructure.Tasks;
+using Squidex.Shared.Identity;
+using Squidex.Shared.Users;
// ReSharper disable InvertIf
// ReSharper disable RedundantIfElseBlock
diff --git a/src/Squidex/Controllers/UI/Extensions.cs b/src/Squidex/Controllers/UI/Extensions.cs
index 3dc45a94b..5e5fc484a 100644
--- a/src/Squidex/Controllers/UI/Extensions.cs
+++ b/src/Squidex/Controllers/UI/Extensions.cs
@@ -9,7 +9,8 @@
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
-using Squidex.Domain.Apps.Read.Users;
+using Squidex.Domain.Users;
+using Squidex.Shared.Users;
namespace Squidex.Controllers.UI
{
diff --git a/src/Squidex/Controllers/UI/Profile/ProfileController.cs b/src/Squidex/Controllers/UI/Profile/ProfileController.cs
index 00af9e4b4..e654513dc 100644
--- a/src/Squidex/Controllers/UI/Profile/ProfileController.cs
+++ b/src/Squidex/Controllers/UI/Profile/ProfileController.cs
@@ -18,9 +18,10 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using NSwag.Annotations;
using Squidex.Config.Identity;
-using Squidex.Domain.Apps.Read.Users;
+using Squidex.Domain.Users;
using Squidex.Infrastructure.Assets;
using Squidex.Infrastructure.Reflection;
+using Squidex.Shared.Users;
namespace Squidex.Controllers.UI.Profile
{
diff --git a/src/Squidex/Controllers/UI/Profile/ProfileVM.cs b/src/Squidex/Controllers/UI/Profile/ProfileVM.cs
index 499dbae1f..730589a46 100644
--- a/src/Squidex/Controllers/UI/Profile/ProfileVM.cs
+++ b/src/Squidex/Controllers/UI/Profile/ProfileVM.cs
@@ -7,7 +7,7 @@
// ==========================================================================
using System.Collections.Generic;
-using Squidex.Domain.Apps.Read.Users;
+using Squidex.Shared.Users;
namespace Squidex.Controllers.UI.Profile
{
diff --git a/src/Squidex/Pipeline/AppApiFilter.cs b/src/Squidex/Pipeline/AppApiFilter.cs
index 355e82131..0f095aafb 100644
--- a/src/Squidex/Pipeline/AppApiFilter.cs
+++ b/src/Squidex/Pipeline/AppApiFilter.cs
@@ -13,11 +13,11 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Squidex.Domain.Apps.Core.Apps;
-using Squidex.Domain.Apps.Core.Identity;
using Squidex.Domain.Apps.Read.Apps;
using Squidex.Domain.Apps.Read.Apps.Services;
using Squidex.Infrastructure.Security;
using Squidex.Infrastructure.UsageTracking;
+using Squidex.Shared.Identity;
// ReSharper disable SwitchStatementMissingSomeCases
diff --git a/src/Squidex/Pipeline/MustBeAdministratorAttribute.cs b/src/Squidex/Pipeline/MustBeAdministratorAttribute.cs
index 7df29aff8..fa9a0ba76 100644
--- a/src/Squidex/Pipeline/MustBeAdministratorAttribute.cs
+++ b/src/Squidex/Pipeline/MustBeAdministratorAttribute.cs
@@ -7,7 +7,7 @@
// ==========================================================================
using Microsoft.AspNetCore.Authorization;
-using Squidex.Domain.Apps.Core.Identity;
+using Squidex.Shared.Identity;
namespace Squidex.Pipeline
{
diff --git a/src/Squidex/Pipeline/MustBeAppDeveloperAttribute.cs b/src/Squidex/Pipeline/MustBeAppDeveloperAttribute.cs
index 3779a694e..28ce12b41 100644
--- a/src/Squidex/Pipeline/MustBeAppDeveloperAttribute.cs
+++ b/src/Squidex/Pipeline/MustBeAppDeveloperAttribute.cs
@@ -7,7 +7,7 @@
// ==========================================================================
using Microsoft.AspNetCore.Authorization;
-using Squidex.Domain.Apps.Core.Identity;
+using Squidex.Shared.Identity;
namespace Squidex.Pipeline
{
diff --git a/src/Squidex/Pipeline/MustBeAppEditorAttribute.cs b/src/Squidex/Pipeline/MustBeAppEditorAttribute.cs
index 55f373cef..965cf123d 100644
--- a/src/Squidex/Pipeline/MustBeAppEditorAttribute.cs
+++ b/src/Squidex/Pipeline/MustBeAppEditorAttribute.cs
@@ -7,7 +7,7 @@
// ==========================================================================
using Microsoft.AspNetCore.Authorization;
-using Squidex.Domain.Apps.Core.Identity;
+using Squidex.Shared.Identity;
namespace Squidex.Pipeline
{
diff --git a/src/Squidex/Pipeline/MustBeAppOwnerAttribute.cs b/src/Squidex/Pipeline/MustBeAppOwnerAttribute.cs
index 3d53bf226..20ad0e605 100644
--- a/src/Squidex/Pipeline/MustBeAppOwnerAttribute.cs
+++ b/src/Squidex/Pipeline/MustBeAppOwnerAttribute.cs
@@ -7,7 +7,7 @@
// ==========================================================================
using Microsoft.AspNetCore.Authorization;
-using Squidex.Domain.Apps.Core.Identity;
+using Squidex.Shared.Identity;
namespace Squidex.Pipeline
{
diff --git a/src/Squidex/Pipeline/Swagger/SwaggerHelper.cs b/src/Squidex/Pipeline/Swagger/SwaggerHelper.cs
index b0bb1c94f..8a1420652 100644
--- a/src/Squidex/Pipeline/Swagger/SwaggerHelper.cs
+++ b/src/Squidex/Pipeline/Swagger/SwaggerHelper.cs
@@ -16,7 +16,7 @@ using NSwag;
using NSwag.SwaggerGeneration;
using Squidex.Config;
using Squidex.Controllers.Api;
-using Squidex.Domain.Apps.Core.Identity;
+using Squidex.Shared.Identity;
namespace Squidex.Pipeline.Swagger
{
diff --git a/src/Squidex/Squidex.csproj b/src/Squidex/Squidex.csproj
index a84906c70..db06536e1 100644
--- a/src/Squidex/Squidex.csproj
+++ b/src/Squidex/Squidex.csproj
@@ -28,6 +28,8 @@
+
+
@@ -36,6 +38,7 @@
+
diff --git a/tests/Benchmarks/IBenchmark.cs b/tests/Benchmarks/IBenchmark.cs
index a67b4171f..19eff0e07 100644
--- a/tests/Benchmarks/IBenchmark.cs
+++ b/tests/Benchmarks/IBenchmark.cs
@@ -5,6 +5,7 @@
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
+
namespace Benchmarks
{
public interface IBenchmark
diff --git a/tests/RunCoverage.ps1 b/tests/RunCoverage.ps1
index ffbabc35f..f2918b847 100644
--- a/tests/RunCoverage.ps1
+++ b/tests/RunCoverage.ps1
@@ -26,7 +26,7 @@ New-Item -ItemType directory -Path $reportsFolder
&"$userProfile\.nuget\packages\OpenCover\4.6.519\tools\OpenCover.Console.exe" `
-register:user `
-target:"C:\Program Files\dotnet\dotnet.exe" `
--targetargs:"test $workingFolder\Squidex.Domain.Apps.Core.Tests\Squidex.Core.Tests.csproj" `
+-targetargs:"test $workingFolder\Squidex.Domain.Apps.Core.Tests\Squidex.Domain.Apps.Core.Tests.csproj" `
-filter:"+[Squidex*]*" `
-skipautoprops `
-output:"$workingFolder\$reportsFolder\Core.xml" `
@@ -35,7 +35,16 @@ New-Item -ItemType directory -Path $reportsFolder
&"$userProfile\.nuget\packages\OpenCover\4.6.519\tools\OpenCover.Console.exe" `
-register:user `
-target:"C:\Program Files\dotnet\dotnet.exe" `
--targetargs:"test $workingFolder\Squidex.Domain.Apps.Write.Tests\Squidex.Write.Tests.csproj" `
+-targetargs:"test $workingFolder\Squidex.Domain.Apps.Read.Tests\Squidex.Domain.Apps.Read.Tests.csproj" `
+-filter:"+[Squidex*]*" `
+-skipautoprops `
+-output:"$workingFolder\$reportsFolder\Read.xml" `
+-oldStyle
+
+&"$userProfile\.nuget\packages\OpenCover\4.6.519\tools\OpenCover.Console.exe" `
+-register:user `
+-target:"C:\Program Files\dotnet\dotnet.exe" `
+-targetargs:"test $workingFolder\Squidex.Domain.Apps.Write.Tests\Squidex.Domain.Apps.Write.Tests.csproj" `
-filter:"+[Squidex*]*" `
-skipautoprops `
-output:"$workingFolder\$reportsFolder\Write.xml" `
@@ -44,10 +53,10 @@ New-Item -ItemType directory -Path $reportsFolder
&"$userProfile\.nuget\packages\OpenCover\4.6.519\tools\OpenCover.Console.exe" `
-register:user `
-target:"C:\Program Files\dotnet\dotnet.exe" `
--targetargs:"test $workingFolder\Squidex.Domain.Apps.Read.Tests\Squidex.Read.Tests.csproj" `
+-targetargs:"test $workingFolder\Squidex.Domain.Users.Tests\Squidex.Domain.Users.Tests.csproj" `
-filter:"+[Squidex*]*" `
-skipautoprops `
--output:"$workingFolder\$reportsFolder\Read.xml" `
+-output:"$workingFolder\$reportsFolder\Users.xml" `
-oldStyle
&"$userProfile\.nuget\packages\ReportGenerator\2.5.9\tools\ReportGenerator.exe" `
diff --git a/tests/Squidex.Domain.Apps.Write.Tests/Apps/AppCommandHandlerTests.cs b/tests/Squidex.Domain.Apps.Write.Tests/Apps/AppCommandHandlerTests.cs
index 49eb623c5..b3b4b429a 100644
--- a/tests/Squidex.Domain.Apps.Write.Tests/Apps/AppCommandHandlerTests.cs
+++ b/tests/Squidex.Domain.Apps.Write.Tests/Apps/AppCommandHandlerTests.cs
@@ -13,11 +13,11 @@ using Squidex.Domain.Apps.Read.Apps;
using Squidex.Domain.Apps.Read.Apps.Repositories;
using Squidex.Domain.Apps.Read.Apps.Services;
using Squidex.Domain.Apps.Read.Apps.Services.Implementations;
-using Squidex.Domain.Apps.Read.Users;
using Squidex.Domain.Apps.Write.Apps.Commands;
using Squidex.Domain.Apps.Write.TestHelpers;
using Squidex.Infrastructure;
using Squidex.Infrastructure.CQRS.Commands;
+using Squidex.Shared.Users;
using Xunit;
// ReSharper disable ImplicitlyCapturedClosure
diff --git a/tests/Squidex.Domain.Apps.Write.Tests/Squidex.Domain.Apps.Write.Tests.csproj b/tests/Squidex.Domain.Apps.Write.Tests/Squidex.Domain.Apps.Write.Tests.csproj
index 68dfedbcf..fea02de46 100644
--- a/tests/Squidex.Domain.Apps.Write.Tests/Squidex.Domain.Apps.Write.Tests.csproj
+++ b/tests/Squidex.Domain.Apps.Write.Tests/Squidex.Domain.Apps.Write.Tests.csproj
@@ -13,7 +13,6 @@
-
diff --git a/tests/Squidex.Domain.Apps.Read.Tests/Users/AssetUserPictureStoreTests.cs b/tests/Squidex.Domain.Users.Tests/AssetUserPictureStoreTests.cs
similarity index 97%
rename from tests/Squidex.Domain.Apps.Read.Tests/Users/AssetUserPictureStoreTests.cs
rename to tests/Squidex.Domain.Users.Tests/AssetUserPictureStoreTests.cs
index 2d3203e87..693f474c4 100644
--- a/tests/Squidex.Domain.Apps.Read.Tests/Users/AssetUserPictureStoreTests.cs
+++ b/tests/Squidex.Domain.Users.Tests/AssetUserPictureStoreTests.cs
@@ -14,7 +14,7 @@ using Squidex.Infrastructure.Assets;
using Squidex.Infrastructure.Tasks;
using Xunit;
-namespace Squidex.Domain.Apps.Read.Users
+namespace Squidex.Domain.Users
{
public class AssetUserPictureStoreTests
{
diff --git a/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj b/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj
new file mode 100644
index 000000000..40788d319
--- /dev/null
+++ b/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj
@@ -0,0 +1,28 @@
+
+
+ Exe
+ netcoreapp1.1
+ $(PackageTargetFallback);dnxcore50
+ Squidex.Domain.Users
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file