diff --git a/services/administration/EShopOnAbp.AdministrationService.sln b/services/administration/EShopOnAbp.AdministrationService.sln
new file mode 100644
index 00000000..24dec959
--- /dev/null
+++ b/services/administration/EShopOnAbp.AdministrationService.sln
@@ -0,0 +1,116 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29020.237
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.Domain", "src\EShopOnAbp.AdministrationService.Domain\EShopOnAbp.AdministrationService.Domain.csproj", "{554AD327-6DBA-4F8F-96F8-81CE7A0C863F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.Application", "src\EShopOnAbp.AdministrationService.Application\EShopOnAbp.AdministrationService.Application.csproj", "{1A94A50E-06DC-43C1-80B5-B662820EC3EB}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.EntityFrameworkCore", "src\EShopOnAbp.AdministrationService.EntityFrameworkCore\EShopOnAbp.AdministrationService.EntityFrameworkCore.csproj", "{C956DD76-69C8-4A9C-83EA-D17DF83340FD}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{CA9AC87F-097E-4F15-8393-4BC07735A5B0}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{04DBDB01-70F4-4E06-B468-8F87850B22BE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.Application.Tests", "test\EShopOnAbp.AdministrationService.Application.Tests\EShopOnAbp.AdministrationService.Application.Tests.csproj", "{50B2631D-129C-47B3-A587-029CCD6099BC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.Domain.Shared", "src\EShopOnAbp.AdministrationService.Domain.Shared\EShopOnAbp.AdministrationService.Domain.Shared.csproj", "{42F719ED-8413-4895-B5B4-5AB56079BC66}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.Application.Contracts", "src\EShopOnAbp.AdministrationService.Application.Contracts\EShopOnAbp.AdministrationService.Application.Contracts.csproj", "{520659C8-C734-4298-A3DA-B539DB9DFC0B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.HttpApi", "src\EShopOnAbp.AdministrationService.HttpApi\EShopOnAbp.AdministrationService.HttpApi.csproj", "{4164BDF7-F527-4E85-9CE6-E3C2D7426A27}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.HttpApi.Client", "src\EShopOnAbp.AdministrationService.HttpApi.Client\EShopOnAbp.AdministrationService.HttpApi.Client.csproj", "{3B5A0094-670D-4BB1-BFDD-61B88A8773DC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.EntityFrameworkCore.Tests", "test\EShopOnAbp.AdministrationService.EntityFrameworkCore.Tests\EShopOnAbp.AdministrationService.EntityFrameworkCore.Tests.csproj", "{1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.TestBase", "test\EShopOnAbp.AdministrationService.TestBase\EShopOnAbp.AdministrationService.TestBase.csproj", "{91853F21-9CD9-4132-BC29-A7D5D84FFFE7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.Domain.Tests", "test\EShopOnAbp.AdministrationService.Domain.Tests\EShopOnAbp.AdministrationService.Domain.Tests.csproj", "{E512F4D9-9375-480F-A2F6-A46509F9D824}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.HttpApi.Client.ConsoleTestApp", "test\EShopOnAbp.AdministrationService.HttpApi.Client.ConsoleTestApp\EShopOnAbp.AdministrationService.HttpApi.Client.ConsoleTestApp.csproj", "{EF480016-9127-4916-8735-D2466BDBC582}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.HttpApi.Host", "src\EShopOnAbp.AdministrationService.HttpApi.Host\EShopOnAbp.AdministrationService.HttpApi.Host.csproj", "{748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {50B2631D-129C-47B3-A587-029CCD6099BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {50B2631D-129C-47B3-A587-029CCD6099BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {50B2631D-129C-47B3-A587-029CCD6099BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {50B2631D-129C-47B3-A587-029CCD6099BC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {42F719ED-8413-4895-B5B4-5AB56079BC66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {42F719ED-8413-4895-B5B4-5AB56079BC66}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {42F719ED-8413-4895-B5B4-5AB56079BC66}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {42F719ED-8413-4895-B5B4-5AB56079BC66}.Release|Any CPU.Build.0 = Release|Any CPU
+ {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Release|Any CPU.Build.0 = Release|Any CPU
+ {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E512F4D9-9375-480F-A2F6-A46509F9D824}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E512F4D9-9375-480F-A2F6-A46509F9D824}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E512F4D9-9375-480F-A2F6-A46509F9D824}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E512F4D9-9375-480F-A2F6-A46509F9D824}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EF480016-9127-4916-8735-D2466BDBC582}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EF480016-9127-4916-8735-D2466BDBC582}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EF480016-9127-4916-8735-D2466BDBC582}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EF480016-9127-4916-8735-D2466BDBC582}.Release|Any CPU.Build.0 = Release|Any CPU
+ {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {554AD327-6DBA-4F8F-96F8-81CE7A0C863F} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {1A94A50E-06DC-43C1-80B5-B662820EC3EB} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {C956DD76-69C8-4A9C-83EA-D17DF83340FD} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {50B2631D-129C-47B3-A587-029CCD6099BC} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
+ {42F719ED-8413-4895-B5B4-5AB56079BC66} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {520659C8-C734-4298-A3DA-B539DB9DFC0B} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {4164BDF7-F527-4E85-9CE6-E3C2D7426A27} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {3B5A0094-670D-4BB1-BFDD-61B88A8773DC} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
+ {91853F21-9CD9-4132-BC29-A7D5D84FFFE7} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
+ {E512F4D9-9375-480F-A2F6-A46509F9D824} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
+ {EF480016-9127-4916-8735-D2466BDBC582} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
+ {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {6AAFA1C6-603E-13FA-45E5-7910AA9F661D}
+ EndGlobalSection
+EndGlobal
diff --git a/services/administration/EShopOnAbp.AdministrationService.sln.DotSettings b/services/administration/EShopOnAbp.AdministrationService.sln.DotSettings
new file mode 100644
index 00000000..cb0b2c91
--- /dev/null
+++ b/services/administration/EShopOnAbp.AdministrationService.sln.DotSettings
@@ -0,0 +1,23 @@
+
+ True
+ WARNING
+ WARNING
+ WARNING
+ WARNING
+ WARNING
+ WARNING
+ WARNING
+ WARNING
+ Required
+ Required
+ Required
+ Required
+ False
+ True
+ False
+ False
+ True
+ False
+ False
+ SQL
+
\ No newline at end of file
diff --git a/services/administration/aspnet-core/EShopOnAbp.AdministrationService.sln b/services/administration/aspnet-core/EShopOnAbp.AdministrationService.sln
new file mode 100644
index 00000000..24dec959
--- /dev/null
+++ b/services/administration/aspnet-core/EShopOnAbp.AdministrationService.sln
@@ -0,0 +1,116 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29020.237
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.Domain", "src\EShopOnAbp.AdministrationService.Domain\EShopOnAbp.AdministrationService.Domain.csproj", "{554AD327-6DBA-4F8F-96F8-81CE7A0C863F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.Application", "src\EShopOnAbp.AdministrationService.Application\EShopOnAbp.AdministrationService.Application.csproj", "{1A94A50E-06DC-43C1-80B5-B662820EC3EB}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.EntityFrameworkCore", "src\EShopOnAbp.AdministrationService.EntityFrameworkCore\EShopOnAbp.AdministrationService.EntityFrameworkCore.csproj", "{C956DD76-69C8-4A9C-83EA-D17DF83340FD}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{CA9AC87F-097E-4F15-8393-4BC07735A5B0}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{04DBDB01-70F4-4E06-B468-8F87850B22BE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.Application.Tests", "test\EShopOnAbp.AdministrationService.Application.Tests\EShopOnAbp.AdministrationService.Application.Tests.csproj", "{50B2631D-129C-47B3-A587-029CCD6099BC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.Domain.Shared", "src\EShopOnAbp.AdministrationService.Domain.Shared\EShopOnAbp.AdministrationService.Domain.Shared.csproj", "{42F719ED-8413-4895-B5B4-5AB56079BC66}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.Application.Contracts", "src\EShopOnAbp.AdministrationService.Application.Contracts\EShopOnAbp.AdministrationService.Application.Contracts.csproj", "{520659C8-C734-4298-A3DA-B539DB9DFC0B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.HttpApi", "src\EShopOnAbp.AdministrationService.HttpApi\EShopOnAbp.AdministrationService.HttpApi.csproj", "{4164BDF7-F527-4E85-9CE6-E3C2D7426A27}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.HttpApi.Client", "src\EShopOnAbp.AdministrationService.HttpApi.Client\EShopOnAbp.AdministrationService.HttpApi.Client.csproj", "{3B5A0094-670D-4BB1-BFDD-61B88A8773DC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.EntityFrameworkCore.Tests", "test\EShopOnAbp.AdministrationService.EntityFrameworkCore.Tests\EShopOnAbp.AdministrationService.EntityFrameworkCore.Tests.csproj", "{1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.TestBase", "test\EShopOnAbp.AdministrationService.TestBase\EShopOnAbp.AdministrationService.TestBase.csproj", "{91853F21-9CD9-4132-BC29-A7D5D84FFFE7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.Domain.Tests", "test\EShopOnAbp.AdministrationService.Domain.Tests\EShopOnAbp.AdministrationService.Domain.Tests.csproj", "{E512F4D9-9375-480F-A2F6-A46509F9D824}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.HttpApi.Client.ConsoleTestApp", "test\EShopOnAbp.AdministrationService.HttpApi.Client.ConsoleTestApp\EShopOnAbp.AdministrationService.HttpApi.Client.ConsoleTestApp.csproj", "{EF480016-9127-4916-8735-D2466BDBC582}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EShopOnAbp.AdministrationService.HttpApi.Host", "src\EShopOnAbp.AdministrationService.HttpApi.Host\EShopOnAbp.AdministrationService.HttpApi.Host.csproj", "{748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {554AD327-6DBA-4F8F-96F8-81CE7A0C863F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1A94A50E-06DC-43C1-80B5-B662820EC3EB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C956DD76-69C8-4A9C-83EA-D17DF83340FD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {50B2631D-129C-47B3-A587-029CCD6099BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {50B2631D-129C-47B3-A587-029CCD6099BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {50B2631D-129C-47B3-A587-029CCD6099BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {50B2631D-129C-47B3-A587-029CCD6099BC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {42F719ED-8413-4895-B5B4-5AB56079BC66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {42F719ED-8413-4895-B5B4-5AB56079BC66}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {42F719ED-8413-4895-B5B4-5AB56079BC66}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {42F719ED-8413-4895-B5B4-5AB56079BC66}.Release|Any CPU.Build.0 = Release|Any CPU
+ {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {520659C8-C734-4298-A3DA-B539DB9DFC0B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4164BDF7-F527-4E85-9CE6-E3C2D7426A27}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3B5A0094-670D-4BB1-BFDD-61B88A8773DC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81}.Release|Any CPU.Build.0 = Release|Any CPU
+ {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {91853F21-9CD9-4132-BC29-A7D5D84FFFE7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E512F4D9-9375-480F-A2F6-A46509F9D824}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E512F4D9-9375-480F-A2F6-A46509F9D824}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E512F4D9-9375-480F-A2F6-A46509F9D824}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E512F4D9-9375-480F-A2F6-A46509F9D824}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EF480016-9127-4916-8735-D2466BDBC582}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EF480016-9127-4916-8735-D2466BDBC582}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EF480016-9127-4916-8735-D2466BDBC582}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EF480016-9127-4916-8735-D2466BDBC582}.Release|Any CPU.Build.0 = Release|Any CPU
+ {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {554AD327-6DBA-4F8F-96F8-81CE7A0C863F} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {1A94A50E-06DC-43C1-80B5-B662820EC3EB} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {C956DD76-69C8-4A9C-83EA-D17DF83340FD} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {50B2631D-129C-47B3-A587-029CCD6099BC} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
+ {42F719ED-8413-4895-B5B4-5AB56079BC66} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {520659C8-C734-4298-A3DA-B539DB9DFC0B} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {4164BDF7-F527-4E85-9CE6-E3C2D7426A27} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {3B5A0094-670D-4BB1-BFDD-61B88A8773DC} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ {1FE30EB9-74A9-47F5-A9F6-7B1FAB672D81} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
+ {91853F21-9CD9-4132-BC29-A7D5D84FFFE7} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
+ {E512F4D9-9375-480F-A2F6-A46509F9D824} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
+ {EF480016-9127-4916-8735-D2466BDBC582} = {04DBDB01-70F4-4E06-B468-8F87850B22BE}
+ {748584B1-BA69-4F6A-81AA-F4BDE6BCE29D} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {6AAFA1C6-603E-13FA-45E5-7910AA9F661D}
+ EndGlobalSection
+EndGlobal
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Application.Contracts/AdministrationServiceApplicationContractsModule.cs b/services/administration/src/EShopOnAbp.AdministrationService.Application.Contracts/AdministrationServiceApplicationContractsModule.cs
new file mode 100644
index 00000000..7b146ca4
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Application.Contracts/AdministrationServiceApplicationContractsModule.cs
@@ -0,0 +1,20 @@
+using Volo.Abp.FeatureManagement;
+using Volo.Abp.Modularity;
+using Volo.Abp.PermissionManagement;
+using Volo.Abp.SettingManagement;
+
+namespace EShopOnAbp.AdministrationService
+{
+ [DependsOn(
+ typeof(AdministrationServiceDomainSharedModule),
+ typeof(AbpPermissionManagementApplicationContractsModule),
+ typeof(AbpFeatureManagementApplicationContractsModule),
+ typeof(AbpSettingManagementApplicationContractsModule)
+ )]
+ public class AdministrationServiceApplicationContractsModule : AbpModule
+ {
+ public override void PreConfigureServices(ServiceConfigurationContext context)
+ {
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Application.Contracts/AdministrationServiceRemoteServiceConsts.cs b/services/administration/src/EShopOnAbp.AdministrationService.Application.Contracts/AdministrationServiceRemoteServiceConsts.cs
new file mode 100644
index 00000000..41e3e434
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Application.Contracts/AdministrationServiceRemoteServiceConsts.cs
@@ -0,0 +1,7 @@
+namespace EShopOnAbp.AdministrationService
+{
+ public class AdministrationServiceRemoteServiceConsts
+ {
+ public const string RemoteServiceName = "AdministrationService";
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Application.Contracts/EShopOnAbp.AdministrationService.Application.Contracts.csproj b/services/administration/src/EShopOnAbp.AdministrationService.Application.Contracts/EShopOnAbp.AdministrationService.Application.Contracts.csproj
new file mode 100644
index 00000000..cba31454
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Application.Contracts/EShopOnAbp.AdministrationService.Application.Contracts.csproj
@@ -0,0 +1,18 @@
+
+
+
+ netstandard2.0
+ EShopOnAbp.AdministrationService
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Application/AdministrationServiceAppService.cs b/services/administration/src/EShopOnAbp.AdministrationService.Application/AdministrationServiceAppService.cs
new file mode 100644
index 00000000..8e89db9b
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Application/AdministrationServiceAppService.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using EShopOnAbp.AdministrationService.Localization;
+using Volo.Abp.Application.Services;
+
+namespace EShopOnAbp.AdministrationService
+{
+ /* Inherit your application services from this class.
+ */
+ public abstract class AdministrationServiceAppService : ApplicationService
+ {
+ protected AdministrationServiceAppService()
+ {
+ LocalizationResource = typeof(AdministrationServiceResource);
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Application/AdministrationServiceApplicationModule.cs b/services/administration/src/EShopOnAbp.AdministrationService.Application/AdministrationServiceApplicationModule.cs
new file mode 100644
index 00000000..64ed2788
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Application/AdministrationServiceApplicationModule.cs
@@ -0,0 +1,29 @@
+using Microsoft.Extensions.DependencyInjection;
+using Volo.Abp.AutoMapper;
+using Volo.Abp.FeatureManagement;
+using Volo.Abp.Modularity;
+using Volo.Abp.PermissionManagement;
+using Volo.Abp.SettingManagement;
+
+namespace EShopOnAbp.AdministrationService
+{
+ [DependsOn(
+ typeof(AdministrationServiceDomainModule),
+ typeof(AdministrationServiceApplicationContractsModule),
+ typeof(AbpPermissionManagementApplicationModule),
+ typeof(AbpFeatureManagementApplicationModule),
+ typeof(AbpSettingManagementApplicationModule)
+ )]
+ public class AdministrationServiceApplicationModule : AbpModule
+ {
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ context.Services.AddAutoMapperObjectMapper();
+
+ Configure(options =>
+ {
+ options.AddMaps(validate: true);
+ });
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Application/EShopOnAbp.AdministrationService.Application.csproj b/services/administration/src/EShopOnAbp.AdministrationService.Application/EShopOnAbp.AdministrationService.Application.csproj
new file mode 100644
index 00000000..f87d5c31
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Application/EShopOnAbp.AdministrationService.Application.csproj
@@ -0,0 +1,19 @@
+
+
+
+ netstandard2.0
+ EShopOnAbp.AdministrationService
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/AdministrationServiceDomainErrorCodes.cs b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/AdministrationServiceDomainErrorCodes.cs
new file mode 100644
index 00000000..5ed9bdbf
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/AdministrationServiceDomainErrorCodes.cs
@@ -0,0 +1,7 @@
+namespace EShopOnAbp.AdministrationService
+{
+ public static class AdministrationServiceDomainErrorCodes
+ {
+ /* You can add your business exception error codes here, as constants */
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/AdministrationServiceDomainSharedModule.cs b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/AdministrationServiceDomainSharedModule.cs
new file mode 100644
index 00000000..8faa0737
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/AdministrationServiceDomainSharedModule.cs
@@ -0,0 +1,45 @@
+using EShopOnAbp.AdministrationService.Localization;
+using Volo.Abp.AuditLogging;
+using Volo.Abp.FeatureManagement;
+using Volo.Abp.Localization;
+using Volo.Abp.Localization.ExceptionHandling;
+using Volo.Abp.Modularity;
+using Volo.Abp.PermissionManagement;
+using Volo.Abp.SettingManagement;
+using Volo.Abp.Validation.Localization;
+using Volo.Abp.VirtualFileSystem;
+
+namespace EShopOnAbp.AdministrationService
+{
+ [DependsOn(
+ typeof(AbpPermissionManagementDomainSharedModule),
+ typeof(AbpFeatureManagementDomainSharedModule),
+ typeof(AbpSettingManagementDomainSharedModule),
+ typeof(AbpAuditLoggingDomainSharedModule)
+ )]
+ public class AdministrationServiceDomainSharedModule : AbpModule
+ {
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ Configure(options =>
+ {
+ options.FileSets.AddEmbedded();
+ });
+
+ Configure(options =>
+ {
+ options.Resources
+ .Add("en")
+ .AddBaseTypes(typeof(AbpValidationResource))
+ .AddVirtualJson("/Localization/AdministrationService");
+
+ options.DefaultResourceType = typeof(AdministrationServiceResource);
+ });
+
+ Configure(options =>
+ {
+ options.MapCodeNamespace("AdministrationService", typeof(AdministrationServiceResource));
+ });
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/EShopOnAbp.AdministrationService.Domain.Shared.csproj b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/EShopOnAbp.AdministrationService.Domain.Shared.csproj
new file mode 100644
index 00000000..f0eab719
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/EShopOnAbp.AdministrationService.Domain.Shared.csproj
@@ -0,0 +1,25 @@
+
+
+
+ netstandard2.0
+ EShopOnAbp.AdministrationService
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/ar.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/ar.json
new file mode 100644
index 00000000..05cb96a9
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/ar.json
@@ -0,0 +1,8 @@
+{
+ "culture": "ar",
+ "texts": {
+ "Menu:Home": "الرئيسية",
+ "Welcome": "مرحبا",
+ "LongWelcomeMessage": "مرحبا بكم في التطبيق. هذا مشروع بدء تشغيل يعتمد على إطار عمل ABP. لمزيد من المعلومات ، يرجى زيارة abp.io."
+ }
+}
\ No newline at end of file
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/cs.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/cs.json
new file mode 100644
index 00000000..5a0bbf61
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/cs.json
@@ -0,0 +1,8 @@
+{
+ "culture": "cs",
+ "texts": {
+ "Menu:Home": "Úvod",
+ "Welcome": "Vítejte",
+ "LongWelcomeMessage": "Vítejte v aplikaci. Toto je startovací projekt založený na ABP frameworku. Pro více informací, navštivte abp.io."
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/de-DE.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/de-DE.json
new file mode 100644
index 00000000..aca4528c
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/de-DE.json
@@ -0,0 +1,8 @@
+{
+ "culture": "de-DE",
+ "texts": {
+ "Menu:Home": "Home",
+ "Welcome": "Willkommen",
+ "LongWelcomeMessage": "Willkommen bei der Anwendung. Dies ist ein Startup-Projekt, das auf dem ABP-Framework basiert. Weitere Informationen finden Sie unter abp.io."
+ }
+}
\ No newline at end of file
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/en-GB.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/en-GB.json
new file mode 100644
index 00000000..d2ca0793
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/en-GB.json
@@ -0,0 +1,8 @@
+{
+ "culture": "en-GB",
+ "texts": {
+ "Menu:Home": "Home",
+ "Welcome": "Welcome",
+ "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io."
+ }
+}
\ No newline at end of file
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/en.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/en.json
new file mode 100644
index 00000000..d2a6a983
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/en.json
@@ -0,0 +1,8 @@
+{
+ "culture": "en",
+ "texts": {
+ "Menu:Home": "Home",
+ "Welcome": "Welcome",
+ "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io."
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/es.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/es.json
new file mode 100644
index 00000000..31b4b59e
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/es.json
@@ -0,0 +1,8 @@
+{
+ "culture": "es",
+ "texts": {
+ "Menu:Home": "Inicio",
+ "Welcome": "Bienvenido",
+ "LongWelcomeMessage": "Bienvenido a la aplicación, este es un proyecto base basado en el framework ABP. Para más información, visita abp.io."
+ }
+}
\ No newline at end of file
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/fr.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/fr.json
new file mode 100644
index 00000000..e76eac0c
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/fr.json
@@ -0,0 +1,8 @@
+{
+ "culture": "fr",
+ "texts": {
+ "Menu:Home": "Accueil",
+ "Welcome": "Bienvenue",
+ "LongWelcomeMessage": "Bienvenue dans l'application. Il s'agit d'un projet de démarrage basé sur le framework ABP. Pour plus d'informations, visitez abp.io."
+ }
+}
\ No newline at end of file
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/hu.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/hu.json
new file mode 100644
index 00000000..c7b6a33a
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/hu.json
@@ -0,0 +1,8 @@
+{
+ "culture": "hu",
+ "texts": {
+ "Menu:Home": "Kezdőlap",
+ "Welcome": "Üdvözlöm",
+ "LongWelcomeMessage": "Üdvözöljük az alkalmazásban. Ez egy ABP keretrendszeren alapuló startup projekt. További információkért látogasson el az abp.io oldalra."
+ }
+}
\ No newline at end of file
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/nl.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/nl.json
new file mode 100644
index 00000000..9ba8da47
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/nl.json
@@ -0,0 +1,8 @@
+{
+ "culture": "nl",
+ "texts": {
+ "Menu:Home": "Home",
+ "Welcome": "Welkom",
+ "LongWelcomeMessage": "Welkom bij de applicatie. Dit is een startup-project gebaseerd op het ABP-framework. Bezoek abp.io voor meer informatie."
+ }
+}
\ No newline at end of file
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/pl-PL.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/pl-PL.json
new file mode 100644
index 00000000..33412f30
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/pl-PL.json
@@ -0,0 +1,8 @@
+{
+ "culture": "pl-PL",
+ "texts": {
+ "Menu:Home": "Home",
+ "Welcome": "Witaj",
+ "LongWelcomeMessage": "Witaj w aplikacji. To jest inicjalny projekt bazujący na ABP framework. Po więcej informacji odwiedź stronę abp.io."
+ }
+}
\ No newline at end of file
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/pt-BR.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/pt-BR.json
new file mode 100644
index 00000000..8c818a07
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/pt-BR.json
@@ -0,0 +1,8 @@
+{
+ "culture": "pt-BR",
+ "texts": {
+ "Menu:Home": "Principal",
+ "Welcome": "Seja bem-vindo!",
+ "LongWelcomeMessage": "Bem-vindo a esta aplicação. Este é um projeto inicial baseado no ABP framework. Para mais informações, visite abp.io."
+ }
+}
\ No newline at end of file
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/ru.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/ru.json
new file mode 100644
index 00000000..8464e443
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/ru.json
@@ -0,0 +1,8 @@
+{
+ "culture": "ru",
+ "texts": {
+ "Menu:Home": "Главная",
+ "Welcome": "Добро пожаловать",
+ "LongWelcomeMessage": "Добро пожаловать в приложение. Этот запущенный проект основан на фреймворке ABP. Для получения дополнительной информации посетите сайт abp.io."
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/sl.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/sl.json
new file mode 100644
index 00000000..a066ef26
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/sl.json
@@ -0,0 +1,8 @@
+{
+ "culture": "sl",
+ "texts": {
+ "Menu:Home": "Domov",
+ "Welcome": "Dobrodošli",
+ "LongWelcomeMessage": "Dobrodošli v aplikaciji. To je začetni projekt na osnovi okolja ABP. Za več informacij obiščite abp.io."
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/tr.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/tr.json
new file mode 100644
index 00000000..5bf83ee7
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/tr.json
@@ -0,0 +1,8 @@
+{
+ "culture": "tr",
+ "texts": {
+ "Menu:Home": "Ana sayfa",
+ "Welcome": "Hoşgeldiniz",
+ "LongWelcomeMessage": "Uygulamaya hoşgeldiniz. Bu, ABP framework'ü üzerine bina edilmiş bir başlangıç projesidir. Daha fazla bilgi için abp.io adresini ziyaret edebilirsiniz."
+ }
+}
\ No newline at end of file
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/vi.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/vi.json
new file mode 100644
index 00000000..c115a357
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/vi.json
@@ -0,0 +1,8 @@
+{
+ "culture": "vi",
+ "texts": {
+ "Menu:Home": "Trang chủ",
+ "Welcome": "Chào mừng bạn",
+ "LongWelcomeMessage": "Chào mừng bạn đến ứng dụng. Đây là một dự án khởi nghiệp dựa trên khung ABP. Để biết thêm thông tin, hãy truy cập abp.io."
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/zh-Hans.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/zh-Hans.json
new file mode 100644
index 00000000..23790bde
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/zh-Hans.json
@@ -0,0 +1,8 @@
+{
+ "culture": "zh-Hans",
+ "texts": {
+ "Menu:Home": "首页",
+ "Welcome": "欢迎",
+ "LongWelcomeMessage": "欢迎来到该应用程序. 这是一个基于ABP框架的启动项目. 有关更多信息, 请访问 abp.io."
+ }
+ }
\ No newline at end of file
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/zh-Hant.json b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/zh-Hant.json
new file mode 100644
index 00000000..31e0ab5a
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationService/zh-Hant.json
@@ -0,0 +1,8 @@
+{
+ "culture": "zh-Hant",
+ "texts": {
+ "Menu:Home": "首頁",
+ "Welcome": "歡迎",
+ "LongWelcomeMessage": "歡迎來到此應用程式. 這是一個基於ABP框架的起始專案. 有關更多訊息, 請瀏覽 abp.io."
+ }
+ }
\ No newline at end of file
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationServiceResource.cs b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationServiceResource.cs
new file mode 100644
index 00000000..3929e074
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain.Shared/Localization/AdministrationServiceResource.cs
@@ -0,0 +1,10 @@
+using Volo.Abp.Localization;
+
+namespace EShopOnAbp.AdministrationService.Localization
+{
+ [LocalizationResourceName("AdministrationService")]
+ public class AdministrationServiceResource
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain/AdministrationServiceDbProperties.cs b/services/administration/src/EShopOnAbp.AdministrationService.Domain/AdministrationServiceDbProperties.cs
new file mode 100644
index 00000000..febda3b7
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain/AdministrationServiceDbProperties.cs
@@ -0,0 +1,11 @@
+namespace EShopOnAbp.AdministrationService
+{
+ public static class AdministrationServiceDbProperties
+ {
+ public static string DbTablePrefix { get; set; } = string.Empty;
+
+ public static string DbSchema { get; set; } = null;
+
+ public const string ConnectionStringName = "AdministrationService";
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain/AdministrationServiceDomainModule.cs b/services/administration/src/EShopOnAbp.AdministrationService.Domain/AdministrationServiceDomainModule.cs
new file mode 100644
index 00000000..1be5b3e3
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain/AdministrationServiceDomainModule.cs
@@ -0,0 +1,32 @@
+using Volo.Abp.AuditLogging;
+using Volo.Abp.FeatureManagement;
+using Volo.Abp.Localization;
+using Volo.Abp.Modularity;
+using Volo.Abp.PermissionManagement;
+using Volo.Abp.SettingManagement;
+
+namespace EShopOnAbp.AdministrationService
+{
+ [DependsOn(
+ typeof(AdministrationServiceDomainSharedModule),
+ typeof(AbpPermissionManagementDomainModule),
+ typeof(AbpFeatureManagementDomainModule),
+ typeof(AbpSettingManagementDomainModule),
+ typeof(AbpAuditLoggingDomainModule)
+ )]
+ public class AdministrationServiceDomainModule : AbpModule
+ {
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ Configure(options =>
+ {
+ options.Languages.Add(new LanguageInfo("en", "en", "English", "gb"));
+ options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe", "tr"));
+ options.Languages.Add(new LanguageInfo("sl", "sl", "Slovenščina", "si"));
+ options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文", "cn"));
+ options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsche", "de"));
+ options.Languages.Add(new LanguageInfo("es", "es", "Español", "es"));
+ });
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.Domain/EShopOnAbp.AdministrationService.Domain.csproj b/services/administration/src/EShopOnAbp.AdministrationService.Domain/EShopOnAbp.AdministrationService.Domain.csproj
new file mode 100644
index 00000000..a00553b0
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.Domain/EShopOnAbp.AdministrationService.Domain.csproj
@@ -0,0 +1,19 @@
+
+
+
+ netstandard2.0
+ EShopOnAbp.AdministrationService
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/EShopOnAbp.AdministrationService.EntityFrameworkCore.csproj b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/EShopOnAbp.AdministrationService.EntityFrameworkCore.csproj
new file mode 100644
index 00000000..6e42eb2b
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/EShopOnAbp.AdministrationService.EntityFrameworkCore.csproj
@@ -0,0 +1,25 @@
+
+
+
+ net5.0
+ EShopOnAbp.AdministrationService
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/EntityFrameworkCore/AdministrationServiceDbContext.cs b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/EntityFrameworkCore/AdministrationServiceDbContext.cs
new file mode 100644
index 00000000..ae6aa8a4
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/EntityFrameworkCore/AdministrationServiceDbContext.cs
@@ -0,0 +1,60 @@
+using Microsoft.EntityFrameworkCore;
+using Volo.Abp.AuditLogging;
+using Volo.Abp.AuditLogging.EntityFrameworkCore;
+using Volo.Abp.BlobStoring.Database;
+using Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
+using Volo.Abp.Data;
+using Volo.Abp.EntityFrameworkCore;
+using Volo.Abp.EntityFrameworkCore.Modeling;
+using Volo.Abp.FeatureManagement;
+using Volo.Abp.FeatureManagement.EntityFrameworkCore;
+using Volo.Abp.PermissionManagement;
+using Volo.Abp.PermissionManagement.EntityFrameworkCore;
+using Volo.Abp.SettingManagement;
+using Volo.Abp.SettingManagement.EntityFrameworkCore;
+
+namespace EShopOnAbp.AdministrationService.EntityFrameworkCore
+{
+ /* This is your actual DbContext used on runtime.
+ * It includes only your entities.
+ * It does not include entities of the used modules, because each module has already
+ * its own DbContext class. If you want to share some database tables with the used modules,
+ * just create a structure like done for AppUser.
+ *
+ * Don't use this DbContext for database migrations since it does not contain tables of the
+ * used modules (as explained above). See AdministrationServiceMigrationsDbContext for migrations.
+ */
+ [ConnectionStringName(AdministrationServiceDbProperties.ConnectionStringName)]
+ public class AdministrationServiceDbContext
+ : AbpDbContext,
+ IPermissionManagementDbContext,
+ ISettingManagementDbContext,
+ IFeatureManagementDbContext,
+ IAuditLoggingDbContext,
+ IBlobStoringDbContext
+ {
+ public AdministrationServiceDbContext(DbContextOptions options)
+ : base(options)
+ {
+
+ }
+
+ public DbSet PermissionGrants { get; }
+ public DbSet Settings { get; }
+ public DbSet FeatureValues { get; }
+ public DbSet AuditLogs { get; }
+ public DbSet BlobContainers { get; }
+ public DbSet Blobs { get; }
+
+ protected override void OnModelCreating(ModelBuilder builder)
+ {
+ base.OnModelCreating(builder);
+
+ builder.ConfigurePermissionManagement();
+ builder.ConfigureSettingManagement();
+ builder.ConfigureFeatureManagement();
+ builder.ConfigureAuditLogging();
+ builder.ConfigureBlobStoring();
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/EntityFrameworkCore/AdministrationServiceDbContextFactory.cs b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/EntityFrameworkCore/AdministrationServiceDbContextFactory.cs
new file mode 100644
index 00000000..97ff6685
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/EntityFrameworkCore/AdministrationServiceDbContextFactory.cs
@@ -0,0 +1,41 @@
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Design;
+using Microsoft.Extensions.Configuration;
+using System.IO;
+
+namespace EShopOnAbp.AdministrationService.EntityFrameworkCore
+{
+ public class AdministrationServiceDbContextFactory : IDesignTimeDbContextFactory
+ {
+ public AdministrationServiceDbContext CreateDbContext(string[] args)
+ {
+ var builder = new DbContextOptionsBuilder()
+ .UseSqlServer(GetConnectionStringFromConfiguration(), b =>
+ {
+ b.MigrationsHistoryTable("__AdministrationService_Migrations");
+ });
+
+ return new AdministrationServiceDbContext(builder.Options);
+ }
+
+ private static string GetConnectionStringFromConfiguration()
+ {
+ return BuildConfiguration()
+ .GetConnectionString(AdministrationServiceDbProperties.ConnectionStringName);
+ }
+
+ private static IConfigurationRoot BuildConfiguration()
+ {
+ var builder = new ConfigurationBuilder()
+ .SetBasePath(
+ Path.Combine(
+ Directory.GetCurrentDirectory(),
+ $"..{Path.DirectorySeparatorChar}EShopOnAbp.AdministrationService.HttpApi.Host"
+ )
+ )
+ .AddJsonFile("appsettings.json", optional: false);
+
+ return builder.Build();
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/EntityFrameworkCore/AdministrationServiceEntityFrameworkCoreModule.cs b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/EntityFrameworkCore/AdministrationServiceEntityFrameworkCoreModule.cs
new file mode 100644
index 00000000..2f305309
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/EntityFrameworkCore/AdministrationServiceEntityFrameworkCoreModule.cs
@@ -0,0 +1,49 @@
+using Microsoft.Extensions.DependencyInjection;
+using Volo.Abp.AuditLogging.EntityFrameworkCore;
+using Volo.Abp.BlobStoring.Database.EntityFrameworkCore;
+using Volo.Abp.EntityFrameworkCore;
+using Volo.Abp.EntityFrameworkCore.SqlServer;
+using Volo.Abp.FeatureManagement.EntityFrameworkCore;
+using Volo.Abp.Modularity;
+using Volo.Abp.PermissionManagement.EntityFrameworkCore;
+using Volo.Abp.SettingManagement.EntityFrameworkCore;
+
+namespace EShopOnAbp.AdministrationService.EntityFrameworkCore
+{
+ [DependsOn(
+ typeof(AdministrationServiceDomainModule),
+ typeof(AbpEntityFrameworkCoreSqlServerModule),
+ typeof(AbpPermissionManagementEntityFrameworkCoreModule),
+ typeof(AbpSettingManagementEntityFrameworkCoreModule),
+ typeof(AbpAuditLoggingEntityFrameworkCoreModule),
+ typeof(AbpFeatureManagementEntityFrameworkCoreModule),
+ typeof(BlobStoringDatabaseEntityFrameworkCoreModule)
+ )]
+ public class AdministrationServiceEntityFrameworkCoreModule : AbpModule
+ {
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ context.Services.AddAbpDbContext(options =>
+ {
+ options.ReplaceDbContext();
+ options.ReplaceDbContext();
+ options.ReplaceDbContext();
+ options.ReplaceDbContext();
+ options.ReplaceDbContext();
+
+ options.AddDefaultRepositories(includeAllEntities: true);
+ });
+
+ Configure(options =>
+ {
+ options.Configure(c =>
+ {
+ c.UseSqlServer(b =>
+ {
+ b.MigrationsHistoryTable("__AdministrationService_Migrations");
+ });
+ });
+ });
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/Migrations/20210629102834_Initial.Designer.cs b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/Migrations/20210629102834_Initial.Designer.cs
new file mode 100644
index 00000000..6a51995d
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/Migrations/20210629102834_Initial.Designer.cs
@@ -0,0 +1,486 @@
+//
+using System;
+using EShopOnAbp.AdministrationService.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Volo.Abp.EntityFrameworkCore;
+
+namespace EShopOnAbp.AdministrationService.Migrations
+{
+ [DbContext(typeof(AdministrationServiceDbContext))]
+ [Migration("20210629102834_Initial")]
+ partial class Initial
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer)
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("ProductVersion", "5.0.7")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ApplicationName")
+ .HasMaxLength(96)
+ .HasColumnType("nvarchar(96)")
+ .HasColumnName("ApplicationName");
+
+ b.Property("BrowserInfo")
+ .HasMaxLength(512)
+ .HasColumnType("nvarchar(512)")
+ .HasColumnName("BrowserInfo");
+
+ b.Property("ClientId")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)")
+ .HasColumnName("ClientId");
+
+ b.Property("ClientIpAddress")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)")
+ .HasColumnName("ClientIpAddress");
+
+ b.Property("ClientName")
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)")
+ .HasColumnName("ClientName");
+
+ b.Property("Comments")
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)")
+ .HasColumnName("Comments");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("nvarchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CorrelationId")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)")
+ .HasColumnName("CorrelationId");
+
+ b.Property("Exceptions")
+ .HasMaxLength(4000)
+ .HasColumnType("nvarchar(4000)")
+ .HasColumnName("Exceptions");
+
+ b.Property("ExecutionDuration")
+ .HasColumnType("int")
+ .HasColumnName("ExecutionDuration");
+
+ b.Property("ExecutionTime")
+ .HasColumnType("datetime2");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("HttpMethod")
+ .HasMaxLength(16)
+ .HasColumnType("nvarchar(16)")
+ .HasColumnName("HttpMethod");
+
+ b.Property("HttpStatusCode")
+ .HasColumnType("int")
+ .HasColumnName("HttpStatusCode");
+
+ b.Property("ImpersonatorTenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("ImpersonatorTenantId");
+
+ b.Property("ImpersonatorUserId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("ImpersonatorUserId");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.Property("TenantName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Url")
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)")
+ .HasColumnName("Url");
+
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("UserId");
+
+ b.Property("UserName")
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)")
+ .HasColumnName("UserName");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TenantId", "ExecutionTime");
+
+ b.HasIndex("TenantId", "UserId", "ExecutionTime");
+
+ b.ToTable("AbpAuditLogs");
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("AuditLogId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("AuditLogId");
+
+ b.Property("ExecutionDuration")
+ .HasColumnType("int")
+ .HasColumnName("ExecutionDuration");
+
+ b.Property("ExecutionTime")
+ .HasColumnType("datetime2")
+ .HasColumnName("ExecutionTime");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("MethodName")
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)")
+ .HasColumnName("MethodName");
+
+ b.Property("Parameters")
+ .HasMaxLength(2000)
+ .HasColumnType("nvarchar(2000)")
+ .HasColumnName("Parameters");
+
+ b.Property("ServiceName")
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)")
+ .HasColumnName("ServiceName");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuditLogId");
+
+ b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime");
+
+ b.ToTable("AbpAuditLogActions");
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("AuditLogId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("AuditLogId");
+
+ b.Property("ChangeTime")
+ .HasColumnType("datetime2")
+ .HasColumnName("ChangeTime");
+
+ b.Property("ChangeType")
+ .HasColumnType("tinyint")
+ .HasColumnName("ChangeType");
+
+ b.Property("EntityId")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)")
+ .HasColumnName("EntityId");
+
+ b.Property("EntityTenantId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("EntityTypeFullName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)")
+ .HasColumnName("EntityTypeFullName");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuditLogId");
+
+ b.HasIndex("TenantId", "EntityTypeFullName", "EntityId");
+
+ b.ToTable("AbpEntityChanges");
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("EntityChangeId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("NewValue")
+ .HasMaxLength(512)
+ .HasColumnType("nvarchar(512)")
+ .HasColumnName("NewValue");
+
+ b.Property("OriginalValue")
+ .HasMaxLength(512)
+ .HasColumnType("nvarchar(512)")
+ .HasColumnName("OriginalValue");
+
+ b.Property("PropertyName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)")
+ .HasColumnName("PropertyName");
+
+ b.Property("PropertyTypeFullName")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)")
+ .HasColumnName("PropertyTypeFullName");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EntityChangeId");
+
+ b.ToTable("AbpEntityPropertyChanges");
+ });
+
+ modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("nvarchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("ContainerId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Content")
+ .HasMaxLength(2147483647)
+ .HasColumnType("varbinary(max)");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ContainerId");
+
+ b.HasIndex("TenantId", "ContainerId", "Name");
+
+ b.ToTable("AbpBlobs");
+ });
+
+ modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("nvarchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TenantId", "Name");
+
+ b.ToTable("AbpBlobContainers");
+ });
+
+ modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.Property("ProviderKey")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)");
+
+ b.Property("ProviderName")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name", "ProviderName", "ProviderKey");
+
+ b.ToTable("AbpFeatureValues");
+ });
+
+ modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.Property("ProviderKey")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)");
+
+ b.Property("ProviderName")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name", "ProviderName", "ProviderKey");
+
+ b.ToTable("AbpPermissionGrants");
+ });
+
+ modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.Property("ProviderKey")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)");
+
+ b.Property("ProviderName")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasMaxLength(2048)
+ .HasColumnType("nvarchar(2048)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name", "ProviderName", "ProviderKey");
+
+ b.ToTable("AbpSettings");
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b =>
+ {
+ b.HasOne("Volo.Abp.AuditLogging.AuditLog", null)
+ .WithMany("Actions")
+ .HasForeignKey("AuditLogId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b =>
+ {
+ b.HasOne("Volo.Abp.AuditLogging.AuditLog", null)
+ .WithMany("EntityChanges")
+ .HasForeignKey("AuditLogId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b =>
+ {
+ b.HasOne("Volo.Abp.AuditLogging.EntityChange", null)
+ .WithMany("PropertyChanges")
+ .HasForeignKey("EntityChangeId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b =>
+ {
+ b.HasOne("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", null)
+ .WithMany()
+ .HasForeignKey("ContainerId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b =>
+ {
+ b.Navigation("Actions");
+
+ b.Navigation("EntityChanges");
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b =>
+ {
+ b.Navigation("PropertyChanges");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/Migrations/20210629102834_Initial.cs b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/Migrations/20210629102834_Initial.cs
new file mode 100644
index 00000000..9a026e86
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/Migrations/20210629102834_Initial.cs
@@ -0,0 +1,294 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace EShopOnAbp.AdministrationService.Migrations
+{
+ public partial class Initial : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "AbpAuditLogs",
+ columns: table => new
+ {
+ Id = table.Column(type: "uniqueidentifier", nullable: false),
+ ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true),
+ UserId = table.Column(type: "uniqueidentifier", nullable: true),
+ UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
+ TenantId = table.Column(type: "uniqueidentifier", nullable: true),
+ TenantName = table.Column(type: "nvarchar(max)", nullable: true),
+ ImpersonatorUserId = table.Column(type: "uniqueidentifier", nullable: true),
+ ImpersonatorTenantId = table.Column(type: "uniqueidentifier", nullable: true),
+ ExecutionTime = table.Column(type: "datetime2", nullable: false),
+ ExecutionDuration = table.Column(type: "int", nullable: false),
+ ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true),
+ ClientName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true),
+ ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true),
+ CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true),
+ BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true),
+ HttpMethod = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true),
+ Url = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
+ Exceptions = table.Column(type: "nvarchar(4000)", maxLength: 4000, nullable: true),
+ Comments = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
+ HttpStatusCode = table.Column(type: "int", nullable: true),
+ ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true),
+ ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AbpAuditLogs", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AbpBlobContainers",
+ columns: table => new
+ {
+ Id = table.Column(type: "uniqueidentifier", nullable: false),
+ TenantId = table.Column(type: "uniqueidentifier", nullable: true),
+ Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false),
+ ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true),
+ ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AbpBlobContainers", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AbpFeatureValues",
+ columns: table => new
+ {
+ Id = table.Column(type: "uniqueidentifier", nullable: false),
+ Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false),
+ Value = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false),
+ ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true),
+ ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AbpFeatureValues", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AbpPermissionGrants",
+ columns: table => new
+ {
+ Id = table.Column(type: "uniqueidentifier", nullable: false),
+ TenantId = table.Column(type: "uniqueidentifier", nullable: true),
+ Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false),
+ ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false),
+ ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AbpSettings",
+ columns: table => new
+ {
+ Id = table.Column(type: "uniqueidentifier", nullable: false),
+ Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false),
+ Value = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: false),
+ ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true),
+ ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AbpSettings", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AbpAuditLogActions",
+ columns: table => new
+ {
+ Id = table.Column(type: "uniqueidentifier", nullable: false),
+ TenantId = table.Column(type: "uniqueidentifier", nullable: true),
+ AuditLogId = table.Column(type: "uniqueidentifier", nullable: false),
+ ServiceName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true),
+ MethodName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true),
+ Parameters = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true),
+ ExecutionTime = table.Column(type: "datetime2", nullable: false),
+ ExecutionDuration = table.Column(type: "int", nullable: false),
+ ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id);
+ table.ForeignKey(
+ name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId",
+ column: x => x.AuditLogId,
+ principalTable: "AbpAuditLogs",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AbpEntityChanges",
+ columns: table => new
+ {
+ Id = table.Column(type: "uniqueidentifier", nullable: false),
+ AuditLogId = table.Column(type: "uniqueidentifier", nullable: false),
+ TenantId = table.Column(type: "uniqueidentifier", nullable: true),
+ ChangeTime = table.Column(type: "datetime2", nullable: false),
+ ChangeType = table.Column(type: "tinyint", nullable: false),
+ EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true),
+ EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false),
+ EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false),
+ ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AbpEntityChanges", x => x.Id);
+ table.ForeignKey(
+ name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId",
+ column: x => x.AuditLogId,
+ principalTable: "AbpAuditLogs",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AbpBlobs",
+ columns: table => new
+ {
+ Id = table.Column(type: "uniqueidentifier", nullable: false),
+ ContainerId = table.Column(type: "uniqueidentifier", nullable: false),
+ TenantId = table.Column(type: "uniqueidentifier", nullable: true),
+ Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false),
+ Content = table.Column(type: "varbinary(max)", maxLength: 2147483647, nullable: true),
+ ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true),
+ ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AbpBlobs", x => x.Id);
+ table.ForeignKey(
+ name: "FK_AbpBlobs_AbpBlobContainers_ContainerId",
+ column: x => x.ContainerId,
+ principalTable: "AbpBlobContainers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "AbpEntityPropertyChanges",
+ columns: table => new
+ {
+ Id = table.Column(type: "uniqueidentifier", nullable: false),
+ TenantId = table.Column(type: "uniqueidentifier", nullable: true),
+ EntityChangeId = table.Column(type: "uniqueidentifier", nullable: false),
+ NewValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true),
+ OriginalValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true),
+ PropertyName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false),
+ PropertyTypeFullName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id);
+ table.ForeignKey(
+ name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId",
+ column: x => x.EntityChangeId,
+ principalTable: "AbpEntityChanges",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AbpAuditLogActions_AuditLogId",
+ table: "AbpAuditLogActions",
+ column: "AuditLogId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime",
+ table: "AbpAuditLogActions",
+ columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AbpAuditLogs_TenantId_ExecutionTime",
+ table: "AbpAuditLogs",
+ columns: new[] { "TenantId", "ExecutionTime" });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime",
+ table: "AbpAuditLogs",
+ columns: new[] { "TenantId", "UserId", "ExecutionTime" });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AbpBlobContainers_TenantId_Name",
+ table: "AbpBlobContainers",
+ columns: new[] { "TenantId", "Name" });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AbpBlobs_ContainerId",
+ table: "AbpBlobs",
+ column: "ContainerId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AbpBlobs_TenantId_ContainerId_Name",
+ table: "AbpBlobs",
+ columns: new[] { "TenantId", "ContainerId", "Name" });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AbpEntityChanges_AuditLogId",
+ table: "AbpEntityChanges",
+ column: "AuditLogId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId",
+ table: "AbpEntityChanges",
+ columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AbpEntityPropertyChanges_EntityChangeId",
+ table: "AbpEntityPropertyChanges",
+ column: "EntityChangeId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey",
+ table: "AbpFeatureValues",
+ columns: new[] { "Name", "ProviderName", "ProviderKey" });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AbpPermissionGrants_Name_ProviderName_ProviderKey",
+ table: "AbpPermissionGrants",
+ columns: new[] { "Name", "ProviderName", "ProviderKey" });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_AbpSettings_Name_ProviderName_ProviderKey",
+ table: "AbpSettings",
+ columns: new[] { "Name", "ProviderName", "ProviderKey" });
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "AbpAuditLogActions");
+
+ migrationBuilder.DropTable(
+ name: "AbpBlobs");
+
+ migrationBuilder.DropTable(
+ name: "AbpEntityPropertyChanges");
+
+ migrationBuilder.DropTable(
+ name: "AbpFeatureValues");
+
+ migrationBuilder.DropTable(
+ name: "AbpPermissionGrants");
+
+ migrationBuilder.DropTable(
+ name: "AbpSettings");
+
+ migrationBuilder.DropTable(
+ name: "AbpBlobContainers");
+
+ migrationBuilder.DropTable(
+ name: "AbpEntityChanges");
+
+ migrationBuilder.DropTable(
+ name: "AbpAuditLogs");
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/Migrations/AdministrationServiceDbContextModelSnapshot.cs b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/Migrations/AdministrationServiceDbContextModelSnapshot.cs
new file mode 100644
index 00000000..52cdc243
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.EntityFrameworkCore/Migrations/AdministrationServiceDbContextModelSnapshot.cs
@@ -0,0 +1,484 @@
+//
+using System;
+using EShopOnAbp.AdministrationService.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Volo.Abp.EntityFrameworkCore;
+
+namespace EShopOnAbp.AdministrationService.Migrations
+{
+ [DbContext(typeof(AdministrationServiceDbContext))]
+ partial class AdministrationServiceDbContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer)
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("ProductVersion", "5.0.7")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ApplicationName")
+ .HasMaxLength(96)
+ .HasColumnType("nvarchar(96)")
+ .HasColumnName("ApplicationName");
+
+ b.Property("BrowserInfo")
+ .HasMaxLength(512)
+ .HasColumnType("nvarchar(512)")
+ .HasColumnName("BrowserInfo");
+
+ b.Property("ClientId")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)")
+ .HasColumnName("ClientId");
+
+ b.Property("ClientIpAddress")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)")
+ .HasColumnName("ClientIpAddress");
+
+ b.Property("ClientName")
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)")
+ .HasColumnName("ClientName");
+
+ b.Property("Comments")
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)")
+ .HasColumnName("Comments");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("nvarchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CorrelationId")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)")
+ .HasColumnName("CorrelationId");
+
+ b.Property("Exceptions")
+ .HasMaxLength(4000)
+ .HasColumnType("nvarchar(4000)")
+ .HasColumnName("Exceptions");
+
+ b.Property("ExecutionDuration")
+ .HasColumnType("int")
+ .HasColumnName("ExecutionDuration");
+
+ b.Property("ExecutionTime")
+ .HasColumnType("datetime2");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("HttpMethod")
+ .HasMaxLength(16)
+ .HasColumnType("nvarchar(16)")
+ .HasColumnName("HttpMethod");
+
+ b.Property("HttpStatusCode")
+ .HasColumnType("int")
+ .HasColumnName("HttpStatusCode");
+
+ b.Property("ImpersonatorTenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("ImpersonatorTenantId");
+
+ b.Property("ImpersonatorUserId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("ImpersonatorUserId");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.Property("TenantName")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Url")
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)")
+ .HasColumnName("Url");
+
+ b.Property("UserId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("UserId");
+
+ b.Property("UserName")
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)")
+ .HasColumnName("UserName");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TenantId", "ExecutionTime");
+
+ b.HasIndex("TenantId", "UserId", "ExecutionTime");
+
+ b.ToTable("AbpAuditLogs");
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("AuditLogId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("AuditLogId");
+
+ b.Property("ExecutionDuration")
+ .HasColumnType("int")
+ .HasColumnName("ExecutionDuration");
+
+ b.Property("ExecutionTime")
+ .HasColumnType("datetime2")
+ .HasColumnName("ExecutionTime");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("MethodName")
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)")
+ .HasColumnName("MethodName");
+
+ b.Property("Parameters")
+ .HasMaxLength(2000)
+ .HasColumnType("nvarchar(2000)")
+ .HasColumnName("Parameters");
+
+ b.Property("ServiceName")
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)")
+ .HasColumnName("ServiceName");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuditLogId");
+
+ b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime");
+
+ b.ToTable("AbpAuditLogActions");
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("AuditLogId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("AuditLogId");
+
+ b.Property("ChangeTime")
+ .HasColumnType("datetime2")
+ .HasColumnName("ChangeTime");
+
+ b.Property("ChangeType")
+ .HasColumnType("tinyint")
+ .HasColumnName("ChangeType");
+
+ b.Property("EntityId")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)")
+ .HasColumnName("EntityId");
+
+ b.Property("EntityTenantId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("EntityTypeFullName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)")
+ .HasColumnName("EntityTypeFullName");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuditLogId");
+
+ b.HasIndex("TenantId", "EntityTypeFullName", "EntityId");
+
+ b.ToTable("AbpEntityChanges");
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("EntityChangeId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("NewValue")
+ .HasMaxLength(512)
+ .HasColumnType("nvarchar(512)")
+ .HasColumnName("NewValue");
+
+ b.Property("OriginalValue")
+ .HasMaxLength(512)
+ .HasColumnType("nvarchar(512)")
+ .HasColumnName("OriginalValue");
+
+ b.Property("PropertyName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)")
+ .HasColumnName("PropertyName");
+
+ b.Property("PropertyTypeFullName")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)")
+ .HasColumnName("PropertyTypeFullName");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EntityChangeId");
+
+ b.ToTable("AbpEntityPropertyChanges");
+ });
+
+ modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("nvarchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("ContainerId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Content")
+ .HasMaxLength(2147483647)
+ .HasColumnType("varbinary(max)");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ContainerId");
+
+ b.HasIndex("TenantId", "ContainerId", "Name");
+
+ b.ToTable("AbpBlobs");
+ });
+
+ modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("nvarchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("nvarchar(max)")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TenantId", "Name");
+
+ b.ToTable("AbpBlobContainers");
+ });
+
+ modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.Property("ProviderKey")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)");
+
+ b.Property("ProviderName")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name", "ProviderName", "ProviderKey");
+
+ b.ToTable("AbpFeatureValues");
+ });
+
+ modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.Property("ProviderKey")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)");
+
+ b.Property("ProviderName")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)");
+
+ b.Property("TenantId")
+ .HasColumnType("uniqueidentifier")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name", "ProviderName", "ProviderKey");
+
+ b.ToTable("AbpPermissionGrants");
+ });
+
+ modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.Property("ProviderKey")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)");
+
+ b.Property("ProviderName")
+ .HasMaxLength(64)
+ .HasColumnType("nvarchar(64)");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasMaxLength(2048)
+ .HasColumnType("nvarchar(2048)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name", "ProviderName", "ProviderKey");
+
+ b.ToTable("AbpSettings");
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b =>
+ {
+ b.HasOne("Volo.Abp.AuditLogging.AuditLog", null)
+ .WithMany("Actions")
+ .HasForeignKey("AuditLogId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b =>
+ {
+ b.HasOne("Volo.Abp.AuditLogging.AuditLog", null)
+ .WithMany("EntityChanges")
+ .HasForeignKey("AuditLogId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b =>
+ {
+ b.HasOne("Volo.Abp.AuditLogging.EntityChange", null)
+ .WithMany("PropertyChanges")
+ .HasForeignKey("EntityChangeId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Volo.Abp.BlobStoring.Database.DatabaseBlob", b =>
+ {
+ b.HasOne("Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", null)
+ .WithMany()
+ .HasForeignKey("ContainerId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b =>
+ {
+ b.Navigation("Actions");
+
+ b.Navigation("EntityChanges");
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b =>
+ {
+ b.Navigation("PropertyChanges");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Client/AdministrationServiceHttpApiClientModule.cs b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Client/AdministrationServiceHttpApiClientModule.cs
new file mode 100644
index 00000000..11ed358f
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Client/AdministrationServiceHttpApiClientModule.cs
@@ -0,0 +1,25 @@
+using Microsoft.Extensions.DependencyInjection;
+using Volo.Abp.FeatureManagement;
+using Volo.Abp.Modularity;
+using Volo.Abp.PermissionManagement;
+using Volo.Abp.SettingManagement;
+
+namespace EShopOnAbp.AdministrationService
+{
+ [DependsOn(
+ typeof(AdministrationServiceApplicationContractsModule),
+ typeof(AbpPermissionManagementHttpApiClientModule),
+ typeof(AbpFeatureManagementHttpApiClientModule),
+ typeof(AbpSettingManagementHttpApiClientModule)
+ )]
+ public class AdministrationServiceHttpApiClientModule : AbpModule
+ {
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ context.Services.AddHttpClientProxies(
+ typeof(AdministrationServiceApplicationContractsModule).Assembly,
+ AdministrationServiceRemoteServiceConsts.RemoteServiceName
+ );
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Client/EShopOnAbp.AdministrationService.HttpApi.Client.csproj b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Client/EShopOnAbp.AdministrationService.HttpApi.Client.csproj
new file mode 100644
index 00000000..83d06ffb
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Client/EShopOnAbp.AdministrationService.HttpApi.Client.csproj
@@ -0,0 +1,18 @@
+
+
+
+ netstandard2.0
+ EShopOnAbp.AdministrationService
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/AdministrationServiceHttpApiHostModule.cs b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/AdministrationServiceHttpApiHostModule.cs
new file mode 100644
index 00000000..1b8bd93f
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/AdministrationServiceHttpApiHostModule.cs
@@ -0,0 +1,91 @@
+using EShopOnAbp.AdministrationService.DbMigrations;
+using EShopOnAbp.AdministrationService.EntityFrameworkCore;
+using EShopOnAbp.SaasService;
+using EShopOnAbp.Shared.Hosting.Microservices;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Cors;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Microsoft.OpenApi.Models;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net.Http;
+using Volo.Abp;
+using Volo.Abp.Account;
+using Volo.Abp.AspNetCore.Mvc;
+using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy;
+using Volo.Abp.Http.Client.IdentityModel.Web;
+using Volo.Abp.Localization;
+using Volo.Abp.Modularity;
+using Volo.Abp.Threading;
+using Volo.Abp.UI.Navigation.Urls;
+using Volo.Abp.VirtualFileSystem;
+
+namespace EShopOnAbp.AdministrationService
+{
+ [DependsOn(
+ typeof(AdministrationServiceHttpApiModule),
+ typeof(AdministrationServiceApplicationModule),
+ typeof(AdministrationServiceEntityFrameworkCoreModule),
+ typeof(EShopOnAbpSharedHostingMicroservicesModule),
+ typeof(AbpAccountApplicationContractsModule),
+ typeof(AbpHttpClientIdentityModelWebModule),
+ typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
+ typeof(SaasServiceApplicationContractsModule)
+ )]
+ public class AdministrationServiceHttpApiHostModule : AbpModule
+ {
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ JwtBearerConfigurationHelper.Configure(context, "AdministrationService");
+ SwaggerConfigurationHelper.Configure(context, "Administration Service API");
+ }
+ public override void OnApplicationInitialization(ApplicationInitializationContext context)
+ {
+ var app = context.GetApplicationBuilder();
+ var env = context.GetEnvironment();
+
+ if (env.IsDevelopment())
+ {
+ app.UseDeveloperExceptionPage();
+ }
+
+ app.UseCorrelationId();
+ app.UseAbpRequestLocalization();
+ app.UseStaticFiles();
+ app.UseRouting();
+ //app.UseHttpMetrics();
+ app.UseAuthentication();
+ app.UseAbpClaimsMap();
+ app.UseMultiTenancy();
+ app.UseAuthorization();
+ app.UseSwagger();
+ app.UseSwaggerUI(options =>
+ {
+ options.SwaggerEndpoint("/swagger/v1/swagger.json", "Administration Service API");
+ });
+ app.UseAbpSerilogEnrichers();
+ app.UseAuditing();
+ app.UseUnitOfWork();
+ app.UseConfiguredEndpoints(endpoints =>
+ {
+ //endpoints.MapMetrics();
+ });
+ }
+
+ public override void OnPostApplicationInitialization(ApplicationInitializationContext context)
+ {
+ using (var scope = context.ServiceProvider.CreateScope())
+ {
+ AsyncHelper.RunSync(
+ () => scope.ServiceProvider
+ .GetRequiredService()
+ .CheckAsync()
+ );
+ }
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/Controllers/HomeController.cs b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/Controllers/HomeController.cs
new file mode 100644
index 00000000..aad4dea1
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/Controllers/HomeController.cs
@@ -0,0 +1,13 @@
+using Microsoft.AspNetCore.Mvc;
+using Volo.Abp.AspNetCore.Mvc;
+
+namespace EShopOnAbp.AdministrationService.Controllers
+{
+ public class HomeController : AbpController
+ {
+ public ActionResult Index()
+ {
+ return Redirect("~/swagger");
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/DbMigrations/AdministrationServiceDatabaseMigrationChecker.cs b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/DbMigrations/AdministrationServiceDatabaseMigrationChecker.cs
new file mode 100644
index 00000000..09c172d6
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/DbMigrations/AdministrationServiceDatabaseMigrationChecker.cs
@@ -0,0 +1,27 @@
+using EShopOnAbp.AdministrationService.EntityFrameworkCore;
+using EShopOnAbp.Shared.Hosting.Microservices.DbMigrations;
+using System;
+using Volo.Abp.EventBus.Distributed;
+using Volo.Abp.MultiTenancy;
+using Volo.Abp.Uow;
+
+namespace EShopOnAbp.AdministrationService.DbMigrations
+{
+ public class AdministrationServiceDatabaseMigrationChecker : PendingMigrationsCheckerBase
+ {
+ public AdministrationServiceDatabaseMigrationChecker(
+ IUnitOfWorkManager unitOfWorkManager,
+ IServiceProvider serviceProvider,
+ ICurrentTenant currentTenant,
+ IDistributedEventBus distributedEventBus)
+ : base(
+ unitOfWorkManager,
+ serviceProvider,
+ currentTenant,
+ distributedEventBus,
+ AdministrationServiceDbProperties.ConnectionStringName)
+ {
+
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/DbMigrations/AdministrationServiceDatabaseMigrationEventHandler.cs b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/DbMigrations/AdministrationServiceDatabaseMigrationEventHandler.cs
new file mode 100644
index 00000000..5431630d
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/DbMigrations/AdministrationServiceDatabaseMigrationEventHandler.cs
@@ -0,0 +1,112 @@
+using EShopOnAbp.AdministrationService.EntityFrameworkCore;
+using EShopOnAbp.Shared.Hosting.Microservices.DbMigrations;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Volo.Abp.Authorization.Permissions;
+using Volo.Abp.Data;
+using Volo.Abp.EventBus.Distributed;
+using Volo.Abp.MultiTenancy;
+using Volo.Abp.PermissionManagement;
+using Volo.Abp.TenantManagement;
+using Volo.Abp.Uow;
+
+namespace EShopOnAbp.AdministrationService.DbMigrations
+{
+ public class AdministrationServiceDatabaseMigrationEventHandler
+ : DatabaseMigrationEventHandlerBase,
+ IDistributedEventHandler,
+ IDistributedEventHandler
+ {
+ private readonly IPermissionDefinitionManager _permissionDefinitionManager;
+ private readonly IPermissionDataSeeder _permissionDataSeeder;
+
+ public AdministrationServiceDatabaseMigrationEventHandler(
+ ICurrentTenant currentTenant,
+ IUnitOfWorkManager unitOfWorkManager,
+ ITenantStore tenantStore,
+ IPermissionDefinitionManager permissionDefinitionManager,
+ IPermissionDataSeeder permissionDataSeeder,
+ ITenantRepository tenantRepository,
+ IDistributedEventBus distributedEventBus
+ ) : base(
+ currentTenant,
+ unitOfWorkManager,
+ tenantStore,
+ tenantRepository,
+ distributedEventBus,
+ AdministrationServiceDbProperties.ConnectionStringName)
+ {
+ _permissionDefinitionManager = permissionDefinitionManager;
+ _permissionDataSeeder = permissionDataSeeder;
+ }
+
+ public async Task HandleEventAsync(ApplyDatabaseMigrationsEto eventData)
+ {
+ if (eventData.DatabaseName != DatabaseName)
+ {
+ return;
+ }
+
+ try
+ {
+ var schemaMigrated = await MigrateDatabaseSchemaAsync(eventData.TenantId);
+ await SeedDataAsync(eventData.TenantId);
+
+ if (eventData.TenantId == null && schemaMigrated)
+ {
+ /* Migrate tenant databases after host migration */
+ await QueueTenantMigrationsAsync();
+ }
+ }
+ catch (Exception ex)
+ {
+ await HandleErrorOnApplyDatabaseMigrationAsync(eventData, ex);
+ }
+ }
+
+ public async Task HandleEventAsync(TenantCreatedEto eventData)
+ {
+ try
+ {
+ await MigrateDatabaseSchemaAsync(eventData.Id);
+ await SeedDataAsync(eventData.Id);
+ }
+ catch (Exception ex)
+ {
+ await HandleErrorTenantCreatedAsync(eventData, ex);
+ }
+ }
+
+ private async Task SeedDataAsync(Guid? tenantId)
+ {
+ using (CurrentTenant.Change(tenantId))
+ {
+ using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true))
+ {
+ var multiTenancySide = tenantId == null
+ ? MultiTenancySides.Host
+ : MultiTenancySides.Tenant;
+
+ var permissionNames = _permissionDefinitionManager
+ .GetPermissions()
+ .Where(p => p.MultiTenancySide.HasFlag(multiTenancySide))
+ .Where(p => !p.Providers.Any() || p.Providers.Contains(RolePermissionValueProvider.ProviderName))
+ .Select(p => p.Name)
+ .ToArray();
+
+ await _permissionDataSeeder.SeedAsync(
+ RolePermissionValueProvider.ProviderName,
+ "admin",
+ permissionNames,
+ tenantId
+ );
+
+ await uow.CompleteAsync();
+ }
+ }
+ }
+ }
+}
diff --git a/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/EShopOnAbp.AdministrationService.HttpApi.Host.csproj b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/EShopOnAbp.AdministrationService.HttpApi.Host.csproj
new file mode 100644
index 00000000..62e7c94f
--- /dev/null
+++ b/services/administration/src/EShopOnAbp.AdministrationService.HttpApi.Host/EShopOnAbp.AdministrationService.HttpApi.Host.csproj
@@ -0,0 +1,40 @@
+