Browse Source

Stage All

feature/AuthApi_ValidateTenancy
sg-trinjoy 2 years ago
commit
97e651b2ae
901 changed files with 510775 additions and 0 deletions
  1. +2
    -0
      .gitattributes
  2. +63
    -0
      BCS.BMC/.gitattributes
  3. +256
    -0
      BCS.BMC/.gitignore
  4. +88
    -0
      BCS.BMC/BCS.BMC.sln
  5. +37
    -0
      BCS.BMC/build/build-mvc.ps1
  6. +12
    -0
      BCS.BMC/docker/mvc/docker-compose.yml
  7. +1
    -0
      BCS.BMC/docker/mvc/down.ps1
  8. +1
    -0
      BCS.BMC/docker/mvc/up.ps1
  9. +64
    -0
      BCS.BMC/src/BCS.BMC.Application/Authorization/AbpLoginResultTypeHelper.cs
  10. +57
    -0
      BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/AccountAppService.cs
  11. +12
    -0
      BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/Dto/IsTenantAvailableInput.cs
  12. +19
    -0
      BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/Dto/IsTenantAvailableOutput.cs
  13. +48
    -0
      BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/Dto/RegisterInput.cs
  14. +7
    -0
      BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/Dto/RegisterOutput.cs
  15. +9
    -0
      BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/Dto/TenantAvailabilityState.cs
  16. +13
    -0
      BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/IAccountAppService.cs
  17. +24
    -0
      BCS.BMC/src/BCS.BMC.Application/BCS.BMC.Application.csproj
  18. +47
    -0
      BCS.BMC/src/BCS.BMC.Application/BMCAppServiceBase.cs
  19. +30
    -0
      BCS.BMC/src/BCS.BMC.Application/BMCApplicationModule.cs
  20. +46
    -0
      BCS.BMC/src/BCS.BMC.Application/CheckCompanies/CheckCompanyAppService.cs
  21. +17
    -0
      BCS.BMC/src/BCS.BMC.Application/CheckCompanies/Dto/GetCompanyListDto.cs
  22. +14
    -0
      BCS.BMC/src/BCS.BMC.Application/CheckCompanies/Dto/GetCompanyListInput.cs
  23. +19
    -0
      BCS.BMC/src/BCS.BMC.Application/CheckCompanies/ICheckCompanyAppService.cs
  24. +237
    -0
      BCS.BMC/src/BCS.BMC.Application/CompanyMasters/CompanyMasterAppService.cs
  25. +22
    -0
      BCS.BMC/src/BCS.BMC.Application/CompanyMasters/Dto/CompanyListDto.cs
  26. +21
    -0
      BCS.BMC/src/BCS.BMC.Application/CompanyMasters/Dto/CreateOrUpdateCompanyMasterInput.cs
  27. +28
    -0
      BCS.BMC/src/BCS.BMC.Application/CompanyMasters/Dto/GetCompanyInput.cs
  28. +28
    -0
      BCS.BMC/src/BCS.BMC.Application/CompanyMasters/Dto/GetCompanyMasterForEditOutput.cs
  29. +17
    -0
      BCS.BMC/src/BCS.BMC.Application/CompanyMasters/Dto/GetInputUrl.cs
  30. +13
    -0
      BCS.BMC/src/BCS.BMC.Application/CompanyMasters/Dto/InputCompanyId.cs
  31. +32
    -0
      BCS.BMC/src/BCS.BMC.Application/CompanyMasters/ICompanyMasterAppService.cs
  32. +16
    -0
      BCS.BMC/src/BCS.BMC.Application/Configuration/ConfigurationAppService.cs
  33. +11
    -0
      BCS.BMC/src/BCS.BMC.Application/Configuration/Dto/ChangeUiThemeInput.cs
  34. +10
    -0
      BCS.BMC/src/BCS.BMC.Application/Configuration/IConfigurationAppService.cs
  35. +14
    -0
      BCS.BMC/src/BCS.BMC.Application/Configuration/Ui/UiThemeInfo.cs
  36. +36
    -0
      BCS.BMC/src/BCS.BMC.Application/Configuration/Ui/UiThemes.cs
  37. +29
    -0
      BCS.BMC/src/BCS.BMC.Application/MultiTenancy/Dto/CreateTenantDto.cs
  38. +11
    -0
      BCS.BMC/src/BCS.BMC.Application/MultiTenancy/Dto/PagedTenantResultRequestDto.cs
  39. +22
    -0
      BCS.BMC/src/BCS.BMC.Application/MultiTenancy/Dto/TenantDto.cs
  40. +10
    -0
      BCS.BMC/src/BCS.BMC.Application/MultiTenancy/ITenantAppService.cs
  41. +123
    -0
      BCS.BMC/src/BCS.BMC.Application/MultiTenancy/TenantAppService.cs
  42. +311
    -0
      BCS.BMC/src/BCS.BMC.Application/Net/MimeTypes/MimeTypeNames.cs
  43. +24
    -0
      BCS.BMC/src/BCS.BMC.Application/PagedInputDto.cs
  44. +15
    -0
      BCS.BMC/src/BCS.BMC.Application/PagedSortedFilteredInputDto.cs
  45. +18
    -0
      BCS.BMC/src/BCS.BMC.Application/Properties/AssemblyInfo.cs
  46. +30
    -0
      BCS.BMC/src/BCS.BMC.Application/Roles/Dto/CreateRoleDto.cs
  47. +11
    -0
      BCS.BMC/src/BCS.BMC.Application/Roles/Dto/FlatPermissionDto.cs
  48. +13
    -0
      BCS.BMC/src/BCS.BMC.Application/Roles/Dto/GetRoleForEditOutput.cs
  49. +7
    -0
      BCS.BMC/src/BCS.BMC.Application/Roles/Dto/GetRolesInput.cs
  50. +10
    -0
      BCS.BMC/src/BCS.BMC.Application/Roles/Dto/PagedRoleResultRequestDto.cs
  51. +16
    -0
      BCS.BMC/src/BCS.BMC.Application/Roles/Dto/PermissionDto.cs
  52. +27
    -0
      BCS.BMC/src/BCS.BMC.Application/Roles/Dto/RoleDto.cs
  53. +23
    -0
      BCS.BMC/src/BCS.BMC.Application/Roles/Dto/RoleEditDto.cs
  54. +19
    -0
      BCS.BMC/src/BCS.BMC.Application/Roles/Dto/RoleListDto.cs
  55. +29
    -0
      BCS.BMC/src/BCS.BMC.Application/Roles/Dto/RoleMapProfile.cs
  56. +16
    -0
      BCS.BMC/src/BCS.BMC.Application/Roles/IRoleAppService.cs
  57. +148
    -0
      BCS.BMC/src/BCS.BMC.Application/Roles/RoleAppService.cs
  58. +14
    -0
      BCS.BMC/src/BCS.BMC.Application/Sessions/Dto/ApplicationInfoDto.cs
  59. +11
    -0
      BCS.BMC/src/BCS.BMC.Application/Sessions/Dto/GetCurrentLoginInformationsOutput.cs
  60. +14
    -0
      BCS.BMC/src/BCS.BMC.Application/Sessions/Dto/TenantLoginInfoDto.cs
  61. +18
    -0
      BCS.BMC/src/BCS.BMC.Application/Sessions/Dto/UserLoginInfoDto.cs
  62. +11
    -0
      BCS.BMC/src/BCS.BMC.Application/Sessions/ISessionAppService.cs
  63. +36
    -0
      BCS.BMC/src/BCS.BMC.Application/Sessions/SessionAppService.cs
  64. +13
    -0
      BCS.BMC/src/BCS.BMC.Application/Users/Dto/ChangePasswordDto.cs
  65. +10
    -0
      BCS.BMC/src/BCS.BMC.Application/Users/Dto/ChangeUserLanguageDto.cs
  66. +47
    -0
      BCS.BMC/src/BCS.BMC.Application/Users/Dto/CreateUserDto.cs
  67. +12
    -0
      BCS.BMC/src/BCS.BMC.Application/Users/Dto/PagedUserResultRequestDto.cs
  68. +16
    -0
      BCS.BMC/src/BCS.BMC.Application/Users/Dto/ResetPasswordDto.cs
  69. +40
    -0
      BCS.BMC/src/BCS.BMC.Application/Users/Dto/UserDto.cs
  70. +19
    -0
      BCS.BMC/src/BCS.BMC.Application/Users/Dto/UserMapProfile.cs
  71. +18
    -0
      BCS.BMC/src/BCS.BMC.Application/Users/IUserAppService.cs
  72. +251
    -0
      BCS.BMC/src/BCS.BMC.Application/Users/UserAppService.cs
  73. +26
    -0
      BCS.BMC/src/BCS.BMC.Core/AppVersionHelper.cs
  74. +23
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/BMCAuthorizationProvider.cs
  75. +45
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/LoginManager.cs
  76. +14
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/PermissionChecker.cs
  77. +13
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/PermissionNames.cs
  78. +29
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/Roles/AppRoleConfig.cs
  79. +28
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/Roles/Role.cs
  80. +43
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/Roles/RoleManager.cs
  81. +21
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/Roles/RoleStore.cs
  82. +15
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/Roles/StaticRoleNames.cs
  83. +34
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/Users/User.cs
  84. +24
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/Users/UserClaimsPrincipalFactory.cs
  85. +61
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/Users/UserManager.cs
  86. +112
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/Users/UserRegistrationManager.cs
  87. +35
    -0
      BCS.BMC/src/BCS.BMC.Core/Authorization/Users/UserStore.cs
  88. +22
    -0
      BCS.BMC/src/BCS.BMC.Core/BCS.BMC.Core.csproj
  89. +21
    -0
      BCS.BMC/src/BCS.BMC.Core/BMC/CompanyMasters/CompanyMaster.cs
  90. +20
    -0
      BCS.BMC/src/BCS.BMC.Core/BMCConsts.cs
  91. +55
    -0
      BCS.BMC/src/BCS.BMC.Core/BMCCoreModule.cs
  92. +47
    -0
      BCS.BMC/src/BCS.BMC.Core/Configuration/AppConfigurations.cs
  93. +7
    -0
      BCS.BMC/src/BCS.BMC.Core/Configuration/AppSettingNames.cs
  94. +16
    -0
      BCS.BMC/src/BCS.BMC.Core/Configuration/AppSettingProvider.cs
  95. +18
    -0
      BCS.BMC/src/BCS.BMC.Core/Debugging/DebugHelper.cs
  96. +20
    -0
      BCS.BMC/src/BCS.BMC.Core/Editions/EditionManager.cs
  97. +30
    -0
      BCS.BMC/src/BCS.BMC.Core/Features/FeatureValueStore.cs
  98. +32
    -0
      BCS.BMC/src/BCS.BMC.Core/Identity/IdentityRegistrar.cs
  99. +25
    -0
      BCS.BMC/src/BCS.BMC.Core/Identity/SecurityStampValidator.cs
  100. +32
    -0
      BCS.BMC/src/BCS.BMC.Core/Identity/SignInManager.cs

+ 2
- 0
.gitattributes View File

@ -0,0 +1,2 @@
**/wwwroot/lib/** linguist-vendored
**/wwwroot/css/** linguist-vendored

+ 63
- 0
BCS.BMC/.gitattributes View File

@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

+ 256
- 0
BCS.BMC/.gitignore View File

@ -0,0 +1,256 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
src/BCS.BMC.Web.Mvc/secrets.json
src/BCS.BMC.Web.Host/secrets.json
src/BCS.BMC.Migrator/secrets.json

+ 88
- 0
BCS.BMC/BCS.BMC.sln View File

@ -0,0 +1,88 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30709.64
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F10AA149-2626-486E-85BB-9CD5365F3016}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BCS.BMC.Core", "src\BCS.BMC.Core\BCS.BMC.Core.csproj", "{0FA75A5B-AB83-4FD0-B545-279774C01E87}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BCS.BMC.Application", "src\BCS.BMC.Application\BCS.BMC.Application.csproj", "{3870C648-4AEA-4B85-BA3F-F2F63B96136A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BCS.BMC.Tests", "test\BCS.BMC.Tests\BCS.BMC.Tests.csproj", "{0D4C5D00-C144-4213-A007-4B8944113AB1}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BCS.BMC.Migrator", "src\BCS.BMC.Migrator\BCS.BMC.Migrator.csproj", "{880B3591-E057-46FE-B525-10BD83828B93}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BCS.BMC.Web.Host", "src\BCS.BMC.Web.Host\BCS.BMC.Web.Host.csproj", "{38E184BD-E874-4633-A947-AED4FDB73F40}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BCS.BMC.Web.Core", "src\BCS.BMC.Web.Core\BCS.BMC.Web.Core.csproj", "{22CFE0D2-8DCA-42D7-AD7D-784C3862493F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BCS.BMC.Web.Mvc", "src\BCS.BMC.Web.Mvc\BCS.BMC.Web.Mvc.csproj", "{A2213374-BB48-48FD-BBD4-81E6A961D866}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BCS.BMC.EntityFrameworkCore", "src\BCS.BMC.EntityFrameworkCore\BCS.BMC.EntityFrameworkCore.csproj", "{E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BCS.BMC.Web.Tests", "test\BCS.BMC.Web.Tests\BCS.BMC.Web.Tests.csproj", "{CA86CF6F-5D9E-4DAC-9CCB-0F87B519E087}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0FA75A5B-AB83-4FD0-B545-279774C01E87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0FA75A5B-AB83-4FD0-B545-279774C01E87}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0FA75A5B-AB83-4FD0-B545-279774C01E87}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0FA75A5B-AB83-4FD0-B545-279774C01E87}.Release|Any CPU.Build.0 = Release|Any CPU
{3870C648-4AEA-4B85-BA3F-F2F63B96136A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3870C648-4AEA-4B85-BA3F-F2F63B96136A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3870C648-4AEA-4B85-BA3F-F2F63B96136A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3870C648-4AEA-4B85-BA3F-F2F63B96136A}.Release|Any CPU.Build.0 = Release|Any CPU
{0D4C5D00-C144-4213-A007-4B8944113AB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0D4C5D00-C144-4213-A007-4B8944113AB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0D4C5D00-C144-4213-A007-4B8944113AB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0D4C5D00-C144-4213-A007-4B8944113AB1}.Release|Any CPU.Build.0 = Release|Any CPU
{880B3591-E057-46FE-B525-10BD83828B93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{880B3591-E057-46FE-B525-10BD83828B93}.Debug|Any CPU.Build.0 = Debug|Any CPU
{880B3591-E057-46FE-B525-10BD83828B93}.Release|Any CPU.ActiveCfg = Release|Any CPU
{880B3591-E057-46FE-B525-10BD83828B93}.Release|Any CPU.Build.0 = Release|Any CPU
{38E184BD-E874-4633-A947-AED4FDB73F40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{38E184BD-E874-4633-A947-AED4FDB73F40}.Debug|Any CPU.Build.0 = Debug|Any CPU
{38E184BD-E874-4633-A947-AED4FDB73F40}.Release|Any CPU.ActiveCfg = Release|Any CPU
{38E184BD-E874-4633-A947-AED4FDB73F40}.Release|Any CPU.Build.0 = Release|Any CPU
{22CFE0D2-8DCA-42D7-AD7D-784C3862493F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{22CFE0D2-8DCA-42D7-AD7D-784C3862493F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{22CFE0D2-8DCA-42D7-AD7D-784C3862493F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{22CFE0D2-8DCA-42D7-AD7D-784C3862493F}.Release|Any CPU.Build.0 = Release|Any CPU
{A2213374-BB48-48FD-BBD4-81E6A961D866}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A2213374-BB48-48FD-BBD4-81E6A961D866}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A2213374-BB48-48FD-BBD4-81E6A961D866}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A2213374-BB48-48FD-BBD4-81E6A961D866}.Release|Any CPU.Build.0 = Release|Any CPU
{E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E0580562-F8F2-4EBB-B07A-ABFC6F2C314F}.Release|Any CPU.Build.0 = Release|Any CPU
{CA86CF6F-5D9E-4DAC-9CCB-0F87B519E087}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CA86CF6F-5D9E-4DAC-9CCB-0F87B519E087}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CA86CF6F-5D9E-4DAC-9CCB-0F87B519E087}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CA86CF6F-5D9E-4DAC-9CCB-0F87B519E087}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{0FA75A5B-AB83-4FD0-B545-279774C01E87} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC}
{3870C648-4AEA-4B85-BA3F-F2F63B96136A} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC}
{0D4C5D00-C144-4213-A007-4B8944113AB1} = {F10AA149-2626-486E-85BB-9CD5365F3016}
{880B3591-E057-46FE-B525-10BD83828B93} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC}
{38E184BD-E874-4633-A947-AED4FDB73F40} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC}
{22CFE0D2-8DCA-42D7-AD7D-784C3862493F} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC}
{A2213374-BB48-48FD-BBD4-81E6A961D866} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC}
{E0580562-F8F2-4EBB-B07A-ABFC6F2C314F} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC}
{CA86CF6F-5D9E-4DAC-9CCB-0F87B519E087} = {F10AA149-2626-486E-85BB-9CD5365F3016}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9A55C749-0BFF-4EFD-8499-12A2CB3B5B07}
EndGlobalSection
EndGlobal

+ 37
- 0
BCS.BMC/build/build-mvc.ps1 View File

@ -0,0 +1,37 @@
# COMMON PATHS
$buildFolder = (Get-Item -Path "./" -Verbose).FullName
$slnFolder = Join-Path $buildFolder "../"
$outputFolder = Join-Path $buildFolder "outputs"
$webMvcFolder = Join-Path $slnFolder "src/BCS.BMC.Web.Mvc"
## CLEAR ######################################################################
Remove-Item $outputFolder -Force -Recurse -ErrorAction Ignore
New-Item -Path $outputFolder -ItemType Directory
## RESTORE NUGET PACKAGES #####################################################
Set-Location $slnFolder
dotnet restore
## PUBLISH WEB MVC PROJECT ###################################################
Set-Location $webMvcFolder
dotnet publish --output (Join-Path $outputFolder "Mvc")
## CREATE DOCKER IMAGES #######################################################
# Mvc
Set-Location (Join-Path $outputFolder "Mvc")
docker rmi abp/mvc -f
docker build -t abp/mvc .
## DOCKER COMPOSE FILES #######################################################
Copy-Item (Join-Path $slnFolder "docker/mvc/*.*") $outputFolder
## FINALIZE ###################################################################
Set-Location $outputFolder

+ 12
- 0
BCS.BMC/docker/mvc/docker-compose.yml View File

@ -0,0 +1,12 @@
version: '2'
services:
abp_mvc:
image: abp/mvc
environment:
- ASPNETCORE_ENVIRONMENT=Staging
ports:
- "9903:80"
volumes:
- "./Mvc-Logs:/app/App_Data/Logs"

+ 1
- 0
BCS.BMC/docker/mvc/down.ps1 View File

@ -0,0 +1 @@
docker-compose down -v --rmi local

+ 1
- 0
BCS.BMC/docker/mvc/up.ps1 View File

@ -0,0 +1 @@
docker-compose up -d

+ 64
- 0
BCS.BMC/src/BCS.BMC.Application/Authorization/AbpLoginResultTypeHelper.cs View File

@ -0,0 +1,64 @@
using System;
using Abp;
using Abp.Authorization;
using Abp.Dependency;
using Abp.UI;
namespace BCS.BMC.Authorization
{
public class AbpLoginResultTypeHelper : AbpServiceBase, ITransientDependency
{
public AbpLoginResultTypeHelper()
{
LocalizationSourceName = BMCConsts.LocalizationSourceName;
}
public Exception CreateExceptionForFailedLoginAttempt(AbpLoginResultType result, string usernameOrEmailAddress, string tenancyName)
{
switch (result)
{
case AbpLoginResultType.Success:
return new Exception("Don't call this method with a success result!");
case AbpLoginResultType.InvalidUserNameOrEmailAddress:
case AbpLoginResultType.InvalidPassword:
return new UserFriendlyException(L("LoginFailed"), L("InvalidUserNameOrPassword"));
case AbpLoginResultType.InvalidTenancyName:
return new UserFriendlyException(L("LoginFailed"), L("ThereIsNoTenantDefinedWithName{0}", tenancyName));
case AbpLoginResultType.TenantIsNotActive:
return new UserFriendlyException(L("LoginFailed"), L("TenantIsNotActive", tenancyName));
case AbpLoginResultType.UserIsNotActive:
return new UserFriendlyException(L("LoginFailed"), L("UserIsNotActiveAndCanNotLogin", usernameOrEmailAddress));
case AbpLoginResultType.UserEmailIsNotConfirmed:
return new UserFriendlyException(L("LoginFailed"), L("UserEmailIsNotConfirmedAndCanNotLogin"));
case AbpLoginResultType.LockedOut:
return new UserFriendlyException(L("LoginFailed"), L("UserLockedOutMessage"));
default: // Can not fall to default actually. But other result types can be added in the future and we may forget to handle it
Logger.Warn("Unhandled login fail reason: " + result);
return new UserFriendlyException(L("LoginFailed"));
}
}
public string CreateLocalizedMessageForFailedLoginAttempt(AbpLoginResultType result, string usernameOrEmailAddress, string tenancyName)
{
switch (result)
{
case AbpLoginResultType.Success:
throw new Exception("Don't call this method with a success result!");
case AbpLoginResultType.InvalidUserNameOrEmailAddress:
case AbpLoginResultType.InvalidPassword:
return L("InvalidUserNameOrPassword");
case AbpLoginResultType.InvalidTenancyName:
return L("ThereIsNoTenantDefinedWithName{0}", tenancyName);
case AbpLoginResultType.TenantIsNotActive:
return L("TenantIsNotActive", tenancyName);
case AbpLoginResultType.UserIsNotActive:
return L("UserIsNotActiveAndCanNotLogin", usernameOrEmailAddress);
case AbpLoginResultType.UserEmailIsNotConfirmed:
return L("UserEmailIsNotConfirmedAndCanNotLogin");
default: // Can not fall to default actually. But other result types can be added in the future and we may forget to handle it
Logger.Warn("Unhandled login fail reason: " + result);
return L("LoginFailed");
}
}
}
}

+ 57
- 0
BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/AccountAppService.cs View File

@ -0,0 +1,57 @@
using System.Threading.Tasks;
using Abp.Configuration;
using Abp.Zero.Configuration;
using BCS.BMC.Authorization.Accounts.Dto;
using BCS.BMC.Authorization.Users;
namespace BCS.BMC.Authorization.Accounts
{
public class AccountAppService : BMCAppServiceBase, IAccountAppService
{
// from: http://regexlib.com/REDetails.aspx?regexp_id=1923
public const string PasswordRegex = "(?=^.{8,}$)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\\s)[0-9a-zA-Z!@#$%^&*()]*$";
private readonly UserRegistrationManager _userRegistrationManager;
public AccountAppService(
UserRegistrationManager userRegistrationManager)
{
_userRegistrationManager = userRegistrationManager;
}
public async Task<IsTenantAvailableOutput> IsTenantAvailable(IsTenantAvailableInput input)
{
var tenant = await TenantManager.FindByTenancyNameAsync(input.TenancyName);
if (tenant == null)
{
return new IsTenantAvailableOutput(TenantAvailabilityState.NotFound);
}
if (!tenant.IsActive)
{
return new IsTenantAvailableOutput(TenantAvailabilityState.InActive);
}
return new IsTenantAvailableOutput(TenantAvailabilityState.Available, tenant.Id);
}
public async Task<RegisterOutput> Register(RegisterInput input)
{
var user = await _userRegistrationManager.RegisterAsync(
input.Name,
input.Surname,
input.EmailAddress,
input.UserName,
input.Password,
true // Assumed email address is always confirmed. Change this if you want to implement email confirmation.
);
var isEmailConfirmationRequiredForLogin = await SettingManager.GetSettingValueAsync<bool>(AbpZeroSettingNames.UserManagement.IsEmailConfirmationRequiredForLogin);
return new RegisterOutput
{
CanLogin = user.IsActive && (user.IsEmailConfirmed || !isEmailConfirmationRequiredForLogin)
};
}
}
}

+ 12
- 0
BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/Dto/IsTenantAvailableInput.cs View File

@ -0,0 +1,12 @@
using System.ComponentModel.DataAnnotations;
using Abp.MultiTenancy;
namespace BCS.BMC.Authorization.Accounts.Dto
{
public class IsTenantAvailableInput
{
[Required]
[StringLength(AbpTenantBase.MaxTenancyNameLength)]
public string TenancyName { get; set; }
}
}

+ 19
- 0
BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/Dto/IsTenantAvailableOutput.cs View File

@ -0,0 +1,19 @@
namespace BCS.BMC.Authorization.Accounts.Dto
{
public class IsTenantAvailableOutput
{
public TenantAvailabilityState State { get; set; }
public int? TenantId { get; set; }
public IsTenantAvailableOutput()
{
}
public IsTenantAvailableOutput(TenantAvailabilityState state, int? tenantId = null)
{
State = state;
TenantId = tenantId;
}
}
}

+ 48
- 0
BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/Dto/RegisterInput.cs View File

@ -0,0 +1,48 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Abp.Auditing;
using Abp.Authorization.Users;
using Abp.Extensions;
using BCS.BMC.Validation;
namespace BCS.BMC.Authorization.Accounts.Dto
{
public class RegisterInput : IValidatableObject
{
[Required]
[StringLength(AbpUserBase.MaxNameLength)]
public string Name { get; set; }
[Required]
[StringLength(AbpUserBase.MaxSurnameLength)]
public string Surname { get; set; }
[Required]
[StringLength(AbpUserBase.MaxUserNameLength)]
public string UserName { get; set; }
[Required]
[EmailAddress]
[StringLength(AbpUserBase.MaxEmailAddressLength)]
public string EmailAddress { get; set; }
[Required]
[StringLength(AbpUserBase.MaxPlainPasswordLength)]
[DisableAuditing]
public string Password { get; set; }
[DisableAuditing]
public string CaptchaResponse { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!UserName.IsNullOrEmpty())
{
if (!UserName.Equals(EmailAddress) && ValidationHelper.IsEmail(UserName))
{
yield return new ValidationResult("Username cannot be an email address unless it's the same as your email address!");
}
}
}
}
}

+ 7
- 0
BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/Dto/RegisterOutput.cs View File

@ -0,0 +1,7 @@
namespace BCS.BMC.Authorization.Accounts.Dto
{
public class RegisterOutput
{
public bool CanLogin { get; set; }
}
}

+ 9
- 0
BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/Dto/TenantAvailabilityState.cs View File

@ -0,0 +1,9 @@
namespace BCS.BMC.Authorization.Accounts.Dto
{
public enum TenantAvailabilityState
{
Available = 1,
InActive,
NotFound
}
}

+ 13
- 0
BCS.BMC/src/BCS.BMC.Application/Authorization/Accounts/IAccountAppService.cs View File

@ -0,0 +1,13 @@
using System.Threading.Tasks;
using Abp.Application.Services;
using BCS.BMC.Authorization.Accounts.Dto;
namespace BCS.BMC.Authorization.Accounts
{
public interface IAccountAppService : IApplicationService
{
Task<IsTenantAvailableOutput> IsTenantAvailable(IsTenantAvailableInput input);
Task<RegisterOutput> Register(RegisterInput input);
}
}

+ 24
- 0
BCS.BMC/src/BCS.BMC.Application/BCS.BMC.Application.csproj View File

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<VersionPrefix>1.0.0.0</VersionPrefix>
<TargetFramework>net6.0</TargetFramework>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<AssemblyName>BCS.BMC.Application</AssemblyName>
<PackageId>BCS.BMC.Application</PackageId>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace>BCS.BMC</RootNamespace>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\BCS.BMC.Core\BCS.BMC.Core.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="bin\Debug\net6.0\ref\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNet.Mvc" Version="5.2.9" />
<PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.9" />
</ItemGroup>
</Project>

+ 47
- 0
BCS.BMC/src/BCS.BMC.Application/BMCAppServiceBase.cs View File

@ -0,0 +1,47 @@
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Abp.Application.Services;
using Abp.IdentityFramework;
using Abp.Runtime.Session;
using BCS.BMC.Authorization.Users;
using BCS.BMC.MultiTenancy;
namespace BCS.BMC
{
/// <summary>
/// Derive your application services from this class.
/// </summary>
public abstract class BMCAppServiceBase : ApplicationService
{
public TenantManager TenantManager { get; set; }
public UserManager UserManager { get; set; }
protected BMCAppServiceBase()
{
LocalizationSourceName = BMCConsts.LocalizationSourceName;
}
protected virtual async Task<User> GetCurrentUserAsync()
{
var user = await UserManager.FindByIdAsync(AbpSession.GetUserId().ToString());
if (user == null)
{
throw new Exception("There is no current user!");
}
return user;
}
protected virtual Task<Tenant> GetCurrentTenantAsync()
{
return TenantManager.GetByIdAsync(AbpSession.GetTenantId());
}
protected virtual void CheckErrors(IdentityResult identityResult)
{
identityResult.CheckErrors(LocalizationManager);
}
}
}

+ 30
- 0
BCS.BMC/src/BCS.BMC.Application/BMCApplicationModule.cs View File

@ -0,0 +1,30 @@
using Abp.AutoMapper;
using Abp.Modules;
using Abp.Reflection.Extensions;
using BCS.BMC.Authorization;
namespace BCS.BMC
{
[DependsOn(
typeof(BMCCoreModule),
typeof(AbpAutoMapperModule))]
public class BMCApplicationModule : AbpModule
{
public override void PreInitialize()
{
Configuration.Authorization.Providers.Add<BMCAuthorizationProvider>();
}
public override void Initialize()
{
var thisAssembly = typeof(BMCApplicationModule).GetAssembly();
IocManager.RegisterAssemblyByConvention(thisAssembly);
Configuration.Modules.AbpAutoMapper().Configurators.Add(
// Scan the assembly for classes which inherit from AutoMapper.Profile
cfg => cfg.AddMaps(thisAssembly)
);
}
}
}

+ 46
- 0
BCS.BMC/src/BCS.BMC.Application/CheckCompanies/CheckCompanyAppService.cs View File

@ -0,0 +1,46 @@
using Abp.Application.Services.Dto;
using Abp.AutoMapper;
using Abp.Domain.Repositories;
using Abp.Extensions;
using Abp.Linq.Extensions;
using BCS.BMC.BMC.CompanyMasters;
using BCS.BMC.CheckCompanies.Dto;
using BCS.BMC.ClientMasters.Dto;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace BCS.BMC.CheckCompanies
{
public class CheckCompanyAppService : ICheckCompanyAppService
{
private readonly IRepository<CompanyMaster, int> _companyMaster;
public CheckCompanyAppService(IRepository<CompanyMaster, int> companyMaster)
{
_companyMaster = companyMaster;
}
public async Task<GetCompanyMasterForEditOutput> GetCompanyByUrl(string input)
{
var entity = await _companyMaster.GetAllListAsync();
foreach (var item in entity)
{
if (item.DomainName.ToString() == input)
{
}
}
var items = entity.MapTo<GetCompanyMasterForEditOutput>();
return items;
}
}
}

+ 17
- 0
BCS.BMC/src/BCS.BMC.Application/CheckCompanies/Dto/GetCompanyListDto.cs View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BCS.BMC.CheckCompanies.Dto
{
public class GetCompanyListDto
{
public int Id { get; set; }
public string CompanyName { get; set; }
public string DomainName { get; set; }
public string TopLevelDomainName { get; set; }
public string SubDomainName { get; set; }
}
}

+ 14
- 0
BCS.BMC/src/BCS.BMC.Application/CheckCompanies/Dto/GetCompanyListInput.cs View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BCS.BMC.CheckCompanies.Dto
{
public class GetCompanyListInput
{
public int Id { get; set; }
public string DomainName { get; set; }
}
}

+ 19
- 0
BCS.BMC/src/BCS.BMC.Application/CheckCompanies/ICheckCompanyAppService.cs View File

@ -0,0 +1,19 @@
using Abp.Application.Services;
using Abp.Application.Services.Dto;
using BCS.BMC.CheckCompanies.Dto;
using BCS.BMC.ClientMasters.Dto;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BCS.BMC.CheckCompanies
{
public interface ICheckCompanyAppService : IApplicationService
{
Task<GetCompanyMasterForEditOutput> GetCompanyByUrl(string input);
}
}

+ 237
- 0
BCS.BMC/src/BCS.BMC.Application/CompanyMasters/CompanyMasterAppService.cs View File

@ -0,0 +1,237 @@
using Abp.Application.Services;
using Abp.Domain.Repositories;
using BCS.BMC.Authorization.Users;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BCS.BMC.BMC.CompanyMasters;
using Microsoft.AspNetCore.Identity;
using Abp.Application.Services.Dto;
using BCS.BMC.ClientMasters.Dto;
using Abp.Extensions;
using System.Text.RegularExpressions;
using System.Security.Policy;
using Abp.Collections.Extensions;
using Abp.Linq.Extensions;
using Microsoft.EntityFrameworkCore;
using BCS.BMC.Roles.Dto;
using Abp.AutoMapper;
using Abp.Domain.Entities;
using Abp.Runtime.Session;
using Abp.UI;
using System.Runtime.Serialization;
using BCS.BMC.CompanyMasters;
using System.Net;
//using System.Web.Mvc;
using System.Text.Json;
//using System.Web.Http;
using Microsoft.AspNetCore.Mvc;
using System.Web.Http;
using System.Web.Mvc;
using FromBodyAttribute = System.Web.Http.FromBodyAttribute;
using BCS.BMC.CompanyMasters.Dto;
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;
using Abp.Json;
namespace BCS.BMC.CompanyMasters
{
public class CompanyMasterAppService : ICompanyMasterAppService
{
//private readonly IRepository<ClientMaster> _locationRepository;
private readonly IRepository<CompanyMaster, int> _companyMaster;
public CompanyMasterAppService(IRepository<CompanyMaster, int> companyMaster)
{
_companyMaster = companyMaster;
}
public async Task<PagedResultDto<CompanyListDto>> GetCompanies(GetCompanyInput input)
{
string filter = "";
if (!input.Filter.IsNullOrWhiteSpace())
{
filter = Regex.Replace(input.Filter.Trim(), @"[^0-9a-zA-Z\s]+", "");
}
try
{
var linqQuery = from company in _companyMaster.GetAll()
select new
{
company,
company.CompanyName,
company.Url,
company.DomainName,
company.SubDomainName
};
//var query = linqQuery
// .WhereIf(input.Id.HasValue && input.Id.Value > 0, x => x.zone.Location.ClientId == input.ClientId.Value);
var totalCount = await linqQuery.CountAsync();
var items = await linqQuery.PageBy(input).ToListAsync();
var dtos = items.Select(c =>
{
var x = c.company;
var dto = x.MapTo<CompanyListDto>();
dto.Id = x.Id;
dto.CompanyName = x.CompanyName != null ? x.CompanyName : string.Empty;
dto.Url = x.Url != null ? x.Url : string.Empty;
dto.DomainName = c.DomainName != null ? x.DomainName : String.Empty;
dto.SubDomainName = c.SubDomainName != null ? x.SubDomainName : String.Empty;
return dto;
}).ToList();
return new PagedResultDto<CompanyListDto>(totalCount, dtos);
}
catch (Exception ex)
{
throw ex;
}
}
public async Task<GetCompanyMasterForEditOutput> GetCompanyById(EntityDto input)
{
var entity = await _companyMaster.FirstOrDefaultAsync(x => x.Id == input.Id);
var dto = entity.MapTo<GetCompanyMasterForEditOutput>();
//if (entity != null)
dto.CompanyName = entity.CompanyName != null ? entity.CompanyName : string.Empty;
dto.Url = entity.Url != null ? entity.Url : string.Empty;
dto.DomainName = entity.DomainName != null ? entity.DomainName : string.Empty;
dto.SubDomainName = entity.SubDomainName != null ? entity.SubDomainName : string.Empty;
return dto;
}
public async Task<int> CreateOrUpdateCompanyMaster(CreateOrUpdateCompanyMasterInput input)
{
int getClientId = 0;
if (input.Id > 0)
{
getClientId = (int)input.Id;
await Update(input);
}
else
{
getClientId = await Create(input);
}
return getClientId;
}
protected async Task<int> Create(CreateOrUpdateCompanyMasterInput input)
{
int companyId = 0;
var company = from m in _companyMaster.GetAllList().Where(m => m.Id == input.Id && m.CompanyName.ToLower().Trim() == input.CompanyName.ToLower().Trim()
&& m.Url == input.Url.Trim())
select m;
var entity = input.MapTo<CompanyMaster>();
// entity.TenantId = AbpSession.TenantId;
Uri uri = new Uri(input.Url, UriKind.Absolute);
var host = uri.Host;
if (host.Split('.').Length > 2)
{
int lastIndex = host.LastIndexOf(".");
int index = host.LastIndexOf(".", lastIndex - 1);
var subdomain = host.Substring(0, index);
if (subdomain != "www")
{
entity.SubDomainName = subdomain;
}
}
entity.DomainName = host;
if (company == null || company.Count() == 0)
{
companyId = await _companyMaster.InsertAndGetIdAsync(entity);
}
else
{
//throw new UserFriendlyException(string.Format(L("ClientDuplicateMessage"), L(input.ClientName)));
throw new UserFriendlyException("Url Already Exist");
}
return companyId;
}
protected async Task Update(CreateOrUpdateCompanyMasterInput input)
{
var entity = await _companyMaster.FirstOrDefaultAsync(x => x.Id == input.Id);
if (entity == null)
{
//throw new UserFriendlyException(NotFoundRecord ("Name", input.ClientName));
throw new UserFriendlyException("No Record Found");
}
var getclient = from m in _companyMaster.GetAllList()
.Where(m => m.Id == input.Id && m.CompanyName.ToLower().Trim() == input.CompanyName.ToLower().Trim() && m.Id != input.Id)
select m;
input.MapTo(entity);
if (getclient == null || getclient.Count() == 0)
{
await _companyMaster.UpdateAsync(entity);
}
else
{
throw new UserFriendlyException(string.Format(("ClientDuplicateMessage"), (input.CompanyName)));
}
}
public async Task DeleteCompanyList(InputCompanyId Ids)
{
foreach (var item in Ids.Id)
{
await _companyMaster.DeleteAsync(item);
}
}
public async Task DeleteCompany(EntityDto<int> input)
{
await _companyMaster.DeleteAsync(x => x.Id == input.Id);
}
public async Task<HttpStatusCodeResult> TokenByCompanyUrl(GetInputUrl input)
{
if (input.CompanyUrl == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var company = await _companyMaster.FirstOrDefaultAsync(x => x.Url == input.CompanyUrl.ToString());
if(company == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
using (HttpClient client = new HttpClient())
{
Uri uri = new Uri(input.CompanyUrl);
var baseUrl = uri + "api/login";
//client.BaseAddress = new Uri($"https://{uri.Host}/");
//client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var data = new
{
usernameOrEmailAddress = input.UsernameOrEmailAddress,
password = input.Password
};
var requestJson = JsonConvert.SerializeObject(data);
var requestContent = new StringContent(requestJson.ToString());
requestContent.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
HttpResponseMessage response = await client.PostAsync(baseUrl, requestContent);
response.EnsureSuccessStatusCode();
if (response.IsSuccessStatusCode)
{
var responseStream = await response.Content.ReadAsStringAsync();
return new HttpStatusCodeResult(HttpStatusCode.OK, responseStream);
}
}
return new HttpStatusCodeResult(HttpStatusCode.OK);
}
}
}

+ 22
- 0
BCS.BMC/src/BCS.BMC.Application/CompanyMasters/Dto/CompanyListDto.cs View File

@ -0,0 +1,22 @@
using Abp.Application.Services.Dto;
using Abp.AutoMapper;
using BCS.BMC.BMC.CompanyMasters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
namespace BCS.BMC.ClientMasters.Dto
{
[AutoMap(typeof(CompanyMaster))]
public class CompanyListDto : AuditedEntityDto<int?>
{
public int Id { get; set; }
public string CompanyName { get; set; }
public string Url { get; set; }
public string DomainName { get; set; }
public string SubDomainName { get; set; }
}
}

+ 21
- 0
BCS.BMC/src/BCS.BMC.Application/CompanyMasters/Dto/CreateOrUpdateCompanyMasterInput.cs View File

@ -0,0 +1,21 @@
using Abp.Application.Services.Dto;
using Abp.AutoMapper;
using BCS.BMC.BMC.CompanyMasters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BCS.BMC.ClientMasters.Dto
{
[AutoMap(typeof(CompanyMaster))]
public class CreateOrUpdateCompanyMasterInput : EntityDto<int?>
{
public int Id { get; set; }
public string CompanyName { get; set; }
public string Url { get; set; }
public string DomainName { get; set; }
public string SubDomainName { get; set; }
}
}

+ 28
- 0
BCS.BMC/src/BCS.BMC.Application/CompanyMasters/Dto/GetCompanyInput.cs View File

@ -0,0 +1,28 @@
using Abp.Configuration;
using Abp.Runtime.Validation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BCS.BMC.ClientMasters.Dto
{
public class GetCompanyInput : PagedSortedFilteredInputDto, IShouldNormalize
{
public void Normalize()
{
if (string.IsNullOrEmpty(Sorting))
{
Sorting = "client.Name";
}
else
{
Sorting = "client." + Sorting;
}
}
public int? Searchby { get; set; }
public int? Id { get; set; }
}
}

+ 28
- 0
BCS.BMC/src/BCS.BMC.Application/CompanyMasters/Dto/GetCompanyMasterForEditOutput.cs View File

@ -0,0 +1,28 @@
using Abp.Application.Services.Dto;
using Abp.AutoMapper;
using BCS.BMC.BMC.CompanyMasters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BCS.BMC.ClientMasters.Dto
{
[AutoMap(typeof(CompanyMaster))]
public class GetCompanyMasterForEditOutput : AuditedEntityDto<int?>
{
public int Id { get; set; }
public string CompanyName { get; set; }
public string Url { get; set; }
public string DomainName { get; set; }
public string SubDomainName { get; set; }
public DateTime CreationTime { get; set; }
public int CreatorUserId { get; set; }
public int DeleterUserId { get; set; }
public DateTime DeletionTime { get; set; }
public bool IsDeleted { get; set; }
public DateTime LastModificationTime { get; set; }
public int LastModifierUserId { get; set; }
}
}

+ 17
- 0
BCS.BMC/src/BCS.BMC.Application/CompanyMasters/Dto/GetInputUrl.cs View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
namespace BCS.BMC.CompanyMasters.Dto
{
public class GetInputUrl
{
public string CompanyUrl { get; set; }
public string UsernameOrEmailAddress { get; set; }
public string Password { get; set; }
}
}

+ 13
- 0
BCS.BMC/src/BCS.BMC.Application/CompanyMasters/Dto/InputCompanyId.cs View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BCS.BMC.CompanyMasters.Dto
{
public class InputCompanyId
{
public List<int> Id { get; set; }
}
}

+ 32
- 0
BCS.BMC/src/BCS.BMC.Application/CompanyMasters/ICompanyMasterAppService.cs View File

@ -0,0 +1,32 @@
using Abp.Application.Services;
using BCS.BMC.Users.Dto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Identity;
using BCS.BMC.BMC.CompanyMasters;
using Abp.Application.Services.Dto;
using BCS.BMC.ClientMasters.Dto;
using System.Web.Mvc;
using BCS.BMC.CompanyMasters.Dto;
using System.Web.Http;
using HttpPostAttribute = System.Web.Http.HttpPostAttribute;
using System.Net.Http;
namespace BCS.BMC.CompanyMasters
{
public interface ICompanyMasterAppService : IApplicationService
{
Task<PagedResultDto<CompanyListDto>> GetCompanies(GetCompanyInput input);
Task<GetCompanyMasterForEditOutput> GetCompanyById(EntityDto input);
Task<int> CreateOrUpdateCompanyMaster(CreateOrUpdateCompanyMasterInput input);
Task DeleteCompanyList(InputCompanyId Ids);
Task DeleteCompany(EntityDto<int> input);
[HttpPost]
Task<HttpStatusCodeResult> TokenByCompanyUrl(GetInputUrl input);
}
}

+ 16
- 0
BCS.BMC/src/BCS.BMC.Application/Configuration/ConfigurationAppService.cs View File

@ -0,0 +1,16 @@
using System.Threading.Tasks;
using Abp.Authorization;
using Abp.Runtime.Session;
using BCS.BMC.Configuration.Dto;
namespace BCS.BMC.Configuration
{
[AbpAuthorize]
public class ConfigurationAppService : BMCAppServiceBase, IConfigurationAppService
{
public async Task ChangeUiTheme(ChangeUiThemeInput input)
{
await SettingManager.ChangeSettingForUserAsync(AbpSession.ToUserIdentifier(), AppSettingNames.UiTheme, input.Theme);
}
}
}

+ 11
- 0
BCS.BMC/src/BCS.BMC.Application/Configuration/Dto/ChangeUiThemeInput.cs View File

@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;
namespace BCS.BMC.Configuration.Dto
{
public class ChangeUiThemeInput
{
[Required]
[StringLength(32)]
public string Theme { get; set; }
}
}

+ 10
- 0
BCS.BMC/src/BCS.BMC.Application/Configuration/IConfigurationAppService.cs View File

@ -0,0 +1,10 @@
using System.Threading.Tasks;
using BCS.BMC.Configuration.Dto;
namespace BCS.BMC.Configuration
{
public interface IConfigurationAppService
{
Task ChangeUiTheme(ChangeUiThemeInput input);
}
}

+ 14
- 0
BCS.BMC/src/BCS.BMC.Application/Configuration/Ui/UiThemeInfo.cs View File

@ -0,0 +1,14 @@
namespace BCS.BMC.Configuration.Ui
{
public class UiThemeInfo
{
public string Name { get; }
public string CssClass { get; }
public UiThemeInfo(string name, string cssClass)
{
Name = name;
CssClass = cssClass;
}
}
}

+ 36
- 0
BCS.BMC/src/BCS.BMC.Application/Configuration/Ui/UiThemes.cs View File

@ -0,0 +1,36 @@
using System.Collections.Generic;
namespace BCS.BMC.Configuration.Ui
{
public static class UiThemes
{
public static List<UiThemeInfo> All { get; }
static UiThemes()
{
All = new List<UiThemeInfo>
{
new UiThemeInfo("Red", "red"),
new UiThemeInfo("Pink", "pink"),
new UiThemeInfo("Purple", "purple"),
new UiThemeInfo("Deep Purple", "deep-purple"),
new UiThemeInfo("Indigo", "indigo"),
new UiThemeInfo("Blue", "blue"),
new UiThemeInfo("Light Blue", "light-blue"),
new UiThemeInfo("Cyan", "cyan"),
new UiThemeInfo("Teal", "teal"),
new UiThemeInfo("Green", "green"),
new UiThemeInfo("Light Green", "light-green"),
new UiThemeInfo("Lime", "lime"),
new UiThemeInfo("Yellow", "yellow"),
new UiThemeInfo("Amber", "amber"),
new UiThemeInfo("Orange", "orange"),
new UiThemeInfo("Deep Orange", "deep-orange"),
new UiThemeInfo("Brown", "brown"),
new UiThemeInfo("Grey", "grey"),
new UiThemeInfo("Blue Grey", "blue-grey"),
new UiThemeInfo("Black", "black")
};
}
}
}

+ 29
- 0
BCS.BMC/src/BCS.BMC.Application/MultiTenancy/Dto/CreateTenantDto.cs View File

@ -0,0 +1,29 @@
using System.ComponentModel.DataAnnotations;
using Abp.Authorization.Users;
using Abp.AutoMapper;
using Abp.MultiTenancy;
namespace BCS.BMC.MultiTenancy.Dto
{
[AutoMapTo(typeof(Tenant))]
public class CreateTenantDto
{
[Required]
[StringLength(AbpTenantBase.MaxTenancyNameLength)]
[RegularExpression(AbpTenantBase.TenancyNameRegex)]
public string TenancyName { get; set; }
[Required]
[StringLength(AbpTenantBase.MaxNameLength)]
public string Name { get; set; }
[Required]
[StringLength(AbpUserBase.MaxEmailAddressLength)]
public string AdminEmailAddress { get; set; }
[StringLength(AbpTenantBase.MaxConnectionStringLength)]
public string ConnectionString { get; set; }
public bool IsActive {get; set;}
}
}

+ 11
- 0
BCS.BMC/src/BCS.BMC.Application/MultiTenancy/Dto/PagedTenantResultRequestDto.cs View File

@ -0,0 +1,11 @@
using Abp.Application.Services.Dto;
namespace BCS.BMC.MultiTenancy.Dto
{
public class PagedTenantResultRequestDto : PagedResultRequestDto
{
public string Keyword { get; set; }
public bool? IsActive { get; set; }
}
}

+ 22
- 0
BCS.BMC/src/BCS.BMC.Application/MultiTenancy/Dto/TenantDto.cs View File

@ -0,0 +1,22 @@
using System.ComponentModel.DataAnnotations;
using Abp.Application.Services.Dto;
using Abp.AutoMapper;
using Abp.MultiTenancy;
namespace BCS.BMC.MultiTenancy.Dto
{
[AutoMapFrom(typeof(Tenant))]
public class TenantDto : EntityDto
{
[Required]
[StringLength(AbpTenantBase.MaxTenancyNameLength)]
[RegularExpression(AbpTenantBase.TenancyNameRegex)]
public string TenancyName { get; set; }
[Required]
[StringLength(AbpTenantBase.MaxNameLength)]
public string Name { get; set; }
public bool IsActive {get; set;}
}
}

+ 10
- 0
BCS.BMC/src/BCS.BMC.Application/MultiTenancy/ITenantAppService.cs View File

@ -0,0 +1,10 @@
using Abp.Application.Services;
using BCS.BMC.MultiTenancy.Dto;
namespace BCS.BMC.MultiTenancy
{
public interface ITenantAppService : IAsyncCrudAppService<TenantDto, int, PagedTenantResultRequestDto, CreateTenantDto, TenantDto>
{
}
}

+ 123
- 0
BCS.BMC/src/BCS.BMC.Application/MultiTenancy/TenantAppService.cs View File

@ -0,0 +1,123 @@
using System.Linq;
using System.Threading.Tasks;
using Abp.Application.Services;
using Abp.Application.Services.Dto;
using Abp.Authorization;
using Abp.Domain.Repositories;
using Abp.Extensions;
using Abp.IdentityFramework;
using Abp.Linq.Extensions;
using Abp.MultiTenancy;
using Abp.Runtime.Security;
using BCS.BMC.Authorization;
using BCS.BMC.Authorization.Roles;
using BCS.BMC.Authorization.Users;
using BCS.BMC.Editions;
using BCS.BMC.MultiTenancy.Dto;
using Microsoft.AspNetCore.Identity;
namespace BCS.BMC.MultiTenancy
{
[AbpAuthorize(PermissionNames.Pages_Tenants)]
public class TenantAppService : AsyncCrudAppService<Tenant, TenantDto, int, PagedTenantResultRequestDto, CreateTenantDto, TenantDto>, ITenantAppService
{
private readonly TenantManager _tenantManager;
private readonly EditionManager _editionManager;
private readonly UserManager _userManager;
private readonly RoleManager _roleManager;
private readonly IAbpZeroDbMigrator _abpZeroDbMigrator;
public TenantAppService(
IRepository<Tenant, int> repository,
TenantManager tenantManager,
EditionManager editionManager,
UserManager userManager,
RoleManager roleManager,
IAbpZeroDbMigrator abpZeroDbMigrator)
: base(repository)
{
_tenantManager = tenantManager;
_editionManager = editionManager;
_userManager = userManager;
_roleManager = roleManager;
_abpZeroDbMigrator = abpZeroDbMigrator;
}
public override async Task<TenantDto> CreateAsync(CreateTenantDto input)
{
CheckCreatePermission();
// Create tenant
var tenant = ObjectMapper.Map<Tenant>(input);
tenant.ConnectionString = input.ConnectionString.IsNullOrEmpty()
? null
: SimpleStringCipher.Instance.Encrypt(input.ConnectionString);
var defaultEdition = await _editionManager.FindByNameAsync(EditionManager.DefaultEditionName);
if (defaultEdition != null)
{
tenant.EditionId = defaultEdition.Id;
}
await _tenantManager.CreateAsync(tenant);
await CurrentUnitOfWork.SaveChangesAsync(); // To get new tenant's id.
// Create tenant database
_abpZeroDbMigrator.CreateOrMigrateForTenant(tenant);
// We are working entities of new tenant, so changing tenant filter
using (CurrentUnitOfWork.SetTenantId(tenant.Id))
{
// Create static roles for new tenant
CheckErrors(await _roleManager.CreateStaticRoles(tenant.Id));
await CurrentUnitOfWork.SaveChangesAsync(); // To get static role ids
// Grant all permissions to admin role
var adminRole = _roleManager.Roles.Single(r => r.Name == StaticRoleNames.Tenants.Admin);
await _roleManager.GrantAllPermissionsAsync(adminRole);
// Create admin user for the tenant
var adminUser = User.CreateTenantAdminUser(tenant.Id, input.AdminEmailAddress);
await _userManager.InitializeOptionsAsync(tenant.Id);
CheckErrors(await _userManager.CreateAsync(adminUser, User.DefaultPassword));
await CurrentUnitOfWork.SaveChangesAsync(); // To get admin user's id
// Assign admin user to role!
CheckErrors(await _userManager.AddToRoleAsync(adminUser, adminRole.Name));
await CurrentUnitOfWork.SaveChangesAsync();
}
return MapToEntityDto(tenant);
}
protected override IQueryable<Tenant> CreateFilteredQuery(PagedTenantResultRequestDto input)
{
return Repository.GetAll()
.WhereIf(!input.Keyword.IsNullOrWhiteSpace(), x => x.TenancyName.Contains(input.Keyword) || x.Name.Contains(input.Keyword))
.WhereIf(input.IsActive.HasValue, x => x.IsActive == input.IsActive);
}
protected override void MapToEntity(TenantDto updateInput, Tenant entity)
{
// Manually mapped since TenantDto contains non-editable properties too.
entity.Name = updateInput.Name;
entity.TenancyName = updateInput.TenancyName;
entity.IsActive = updateInput.IsActive;
}
public override async Task DeleteAsync(EntityDto<int> input)
{
CheckDeletePermission();
var tenant = await _tenantManager.GetByIdAsync(input.Id);
await _tenantManager.DeleteAsync(tenant);
}
private void CheckErrors(IdentityResult identityResult)
{
identityResult.CheckErrors(LocalizationManager);
}
}
}

+ 311
- 0
BCS.BMC/src/BCS.BMC.Application/Net/MimeTypes/MimeTypeNames.cs View File

@ -0,0 +1,311 @@
using System;
namespace BCS.BMC.Net.MimeTypes
{
/* Copied from:
* http://stackoverflow.com/questions/10362140/asp-mvc-are-there-any-constants-for-the-default-content-types */
/// <summary>
/// Common mime types.
/// </summary>
public static class MimeTypeNames
{
///<summary>Used to denote the encoding necessary for files containing JavaScript source code. The alternative MIME type for this file type is text/javascript.</summary>
public const string ApplicationXJavascript = "application/x-javascript";
///<summary>24bit Linear PCM audio at 8-48kHz, 1-N channels; Defined in RFC 3190</summary>
public const string AudioL24 = "audio/L24";
///<summary>Adobe Flash files for example with the extension .swf</summary>
public const string ApplicationXShockwaveFlash = "application/x-shockwave-flash";
///<summary>Arbitrary binary data.[5] Generally speaking this type identifies files that are not associated with a specific application. Contrary to past assumptions by software packages such as Apache this is not a type that should be applied to unknown files. In such a case, a server or application should not indicate a content type, as it may be incorrect, but rather, should omit the type in order to allow the recipient to guess the type.[6]</summary>
public const string ApplicationOctetStream = "application/octet-stream";
///<summary>Atom feeds</summary>
public const string ApplicationAtomXml = "application/atom+xml";
///<summary>Cascading Style Sheets; Defined in RFC 2318</summary>
public const string TextCss = "text/css";
///<summary>commands; subtype resident in Gecko browsers like Firefox 3.5</summary>
public const string TextCmd = "text/cmd";
///<summary>Comma-separated values; Defined in RFC 4180</summary>
public const string TextCsv = "text/csv";
///<summary>deb (file format), a software package format used by the Debian project</summary>
public const string ApplicationXDeb = "application/x-deb";
///<summary>Defined in RFC 1847</summary>
public const string MultipartEncrypted = "multipart/encrypted";
///<summary>Defined in RFC 1847</summary>
public const string MultipartSigned = "multipart/signed";
///<summary>Defined in RFC 2616</summary>
public const string MessageHttp = "message/http";
///<summary>Defined in RFC 4735</summary>
public const string ModelExample = "model/example";
///<summary>device-independent document in DVI format</summary>
public const string ApplicationXDvi = "application/x-dvi";
///<summary>DTD files; Defined by RFC 3023</summary>
public const string ApplicationXmlDtd = "application/xml-dtd";
///<summary>ECMAScript/JavaScript; Defined in RFC 4329 (equivalent to application/ecmascript but with looser processing rules) It is not accepted in IE 8 or earlier - text/javascript is accepted but it is defined as obsolete in RFC 4329. The "type" attribute of the <script> tag in HTML5 is optional and in practice omitting the media type of JavaScript programs is the most interoperable solution since all browsers have always assumed the correct default even before HTML5.</summary>
public const string ApplicationJavascript = "application/javascript";
///<summary>ECMAScript/JavaScript; Defined in RFC 4329 (equivalent to application/javascript but with stricter processing rules)</summary>
public const string ApplicationEcmascript = "application/ecmascript";
///<summary>EDI EDIFACT data; Defined in RFC 1767</summary>
public const string ApplicationEdifact = "application/EDIFACT";
///<summary>EDI X12 data; Defined in RFC 1767</summary>
public const string ApplicationEdiX12 = "application/EDI-X12";
///<summary>Email; Defined in RFC 2045 and RFC 2046</summary>
public const string MessagePartial = "message/partial";
///<summary>Email; EML files, MIME files, MHT files, MHTML files; Defined in RFC 2045 and RFC 2046</summary>
public const string MessageRfc822 = "message/rfc822";
///<summary>Extensible Markup Language; Defined in RFC 3023</summary>
public const string TextXml = "text/xml";
///<summary>Flash video (FLV files)</summary>
public const string VideoXFlv = "video/x-flv";
///<summary>GIF image; Defined in RFC 2045 and RFC 2046</summary>
public const string ImageGif = "image/gif";
///<summary>GoogleWebToolkit data</summary>
public const string TextXGwtRpc = "text/x-gwt-rpc";
///<summary>Gzip</summary>
public const string ApplicationXGzip = "application/x-gzip";
///<summary>HTML; Defined in RFC 2854</summary>
public const string TextHtml = "text/html";
///<summary>ICO image; Registered[9]</summary>
public const string ImageVndMicrosoftIcon = "image/vnd.microsoft.icon";
///<summary>IGS files, IGES files; Defined in RFC 2077</summary>
public const string ModelIges = "model/iges";
///<summary>IMDN Instant Message Disposition Notification; Defined in RFC 5438</summary>
public const string MessageImdnXml = "message/imdn+xml";
///<summary>JavaScript Object Notation JSON; Defined in RFC 4627</summary>
public const string ApplicationJson = "application/json";
///<summary>JavaScript Object Notation (JSON) Patch; Defined in RFC 6902</summary>
public const string ApplicationJsonPatch = "application/json-patch+json";
///<summary>JavaScript - Defined in and obsoleted by RFC 4329 in order to discourage its usage in favor of application/javascript. However,text/javascript is allowed in HTML 4 and 5 and, unlike application/javascript, has cross-browser support. The "type" attribute of the <script> tag in HTML5 is optional and there is no need to use it at all since all browsers have always assumed the correct default (even in HTML 4 where it was required by the specification).</summary>
[Obsolete]
public const string TextJavascript = "text/javascript";
///<summary>JPEG JFIF image; Associated with Internet Explorer; Listed in ms775147(v=vs.85) - Progressive JPEG, initiated before global browser support for progressive JPEGs (Microsoft and Firefox).</summary>
public const string ImagePjpeg = "image/pjpeg";
///<summary>JPEG JFIF image; Defined in RFC 2045 and RFC 2046</summary>
public const string ImageJpeg = "image/jpeg";
///<summary>jQuery template data</summary>
public const string TextXJqueryTmpl = "text/x-jquery-tmpl";
///<summary>KML files (e.g. for Google Earth)</summary>
public const string ApplicationVndGoogleEarthKmlXml = "application/vnd.google-earth.kml+xml";
///<summary>LaTeX files</summary>
public const string ApplicationXLatex = "application/x-latex";
///<summary>Matroska open media format</summary>
public const string VideoXMatroska = "video/x-matroska";
///<summary>Microsoft Excel 2007 files</summary>
public const string ApplicationVndOpenxmlformatsOfficedocumentSpreadsheetmlSheet = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
///<summary>Microsoft Excel files</summary>
public const string ApplicationVndMsExcel = "application/vnd.ms-excel";
///<summary>Microsoft Powerpoint 2007 files</summary>
public const string ApplicationVndOpenxmlformatsOfficedocumentPresentationmlPresentation = "application/vnd.openxmlformats-officedocument.presentationml.presentation";
///<summary>Microsoft Powerpoint files</summary>
public const string ApplicationVndMsPowerpoint = "application/vnd.ms-powerpoint";
///<summary>Microsoft Word 2007 files</summary>
public const string ApplicationVndOpenxmlformatsOfficedocumentWordprocessingmlDocument = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
///<summary>Microsoft Word files[15]</summary>
public const string ApplicationMsword = "application/msword";
///<summary>MIME Email; Defined in RFC 2045 and RFC 2046</summary>
public const string MultipartAlternative = "multipart/alternative";
///<summary>MIME Email; Defined in RFC 2045 and RFC 2046</summary>
public const string MultipartMixed = "multipart/mixed";
///<summary>MIME Email; Defined in RFC 2387 and used by MHTML (HTML mail)</summary>
public const string MultipartRelated = "multipart/related";
///<summary>MIME Webform; Defined in RFC 2388</summary>
public const string MultipartFormData = "multipart/form-data";
///<summary>Mozilla XUL files</summary>
public const string ApplicationVndMozillaXulXml = "application/vnd.mozilla.xul+xml";
///<summary>MP3 or other MPEG audio; Defined in RFC 3003</summary>
public const string AudioMpeg = "audio/mpeg";
///<summary>MP4 audio</summary>
public const string AudioMp4 = "audio/mp4";
///<summary>MP4 video; Defined in RFC 4337</summary>
public const string VideoMp4 = "video/mp4";
///<summary>MPEG-1 video with multiplexed audio; Defined in RFC 2045 and RFC 2046</summary>
public const string VideoMpeg = "video/mpeg";
///<summary>MSH files, MESH files; Defined in RFC 2077, SILO files</summary>
public const string ModelMesh = "model/mesh";
///<summary>mulaw audio at 8 kHz, 1 channel; Defined in RFC 2046</summary>
public const string AudioBasic = "audio/basic";
///<summary>Ogg Theora or other video (with audio); Defined in RFC 5334</summary>
public const string VideoOgg = "video/ogg";
///<summary>Ogg Vorbis, Speex, Flac and other audio; Defined in RFC 5334</summary>
public const string AudioOgg = "audio/ogg";
///<summary>Ogg, a multimedia bitstream container format; Defined in RFC 5334</summary>
public const string ApplicationOgg = "application/ogg";
///<summary>OP</summary>
public const string ApplicationXopXml = "application/xop+xml";
///<summary>OpenDocument Graphics; Registered[14]</summary>
public const string ApplicationVndOasisOpendocumentGraphics = "application/vnd.oasis.opendocument.graphics";
///<summary>OpenDocument Presentation; Registered[13]</summary>
public const string ApplicationVndOasisOpendocumentPresentation = "application/vnd.oasis.opendocument.presentation";
///<summary>OpenDocument Spreadsheet; Registered[12]</summary>
public const string ApplicationVndOasisOpendocumentSpreadsheet = "application/vnd.oasis.opendocument.spreadsheet";
///<summary>OpenDocument Text; Registered[11]</summary>
public const string ApplicationVndOasisOpendocumentText = "application/vnd.oasis.opendocument.text";
///<summary>p12 files</summary>
public const string ApplicationXPkcs12 = "application/x-pkcs12";
///<summary>p7b and spc files</summary>
public const string ApplicationXPkcs7Certificates = "application/x-pkcs7-certificates";
///<summary>p7c files</summary>
public const string ApplicationXPkcs7Mime = "application/x-pkcs7-mime";
///<summary>p7r files</summary>
public const string ApplicationXPkcs7Certreqresp = "application/x-pkcs7-certreqresp";
///<summary>p7s files</summary>
public const string ApplicationXPkcs7Signature = "application/x-pkcs7-signature";
///<summary>Portable Document Format, PDF has been in use for document exchange on the Internet since 1993; Defined in RFC 3778</summary>
public const string ApplicationPdf = "application/pdf";
///<summary>Portable Network Graphics; Registered,[8] Defined in RFC 2083</summary>
public const string ImagePng = "image/png";
///<summary>PostScript; Defined in RFC 2046</summary>
public const string ApplicationPostscript = "application/postscript";
///<summary>QuickTime video; Registered[10]</summary>
public const string VideoQuicktime = "video/quicktime";
///<summary>RAR archive files</summary>
public const string ApplicationXRarCompressed = "application/x-rar-compressed";
///<summary>RealAudio; Documented in RealPlayer Customer Support Answer 2559</summary>
public const string AudioVndRnRealaudio = "audio/vnd.rn-realaudio";
///<summary>Resource Description Framework; Defined by RFC 3870</summary>
public const string ApplicationRdfXml = "application/rdf+xml";
///<summary>RSS feeds</summary>
public const string ApplicationRssXml = "application/rss+xml";
///<summary>SOAP; Defined by RFC 3902</summary>
public const string ApplicationSoapXml = "application/soap+xml";
///<summary>StuffIt archive files</summary>
public const string ApplicationXStuffit = "application/x-stuffit";
///<summary>SVG vector image; Defined in SVG Tiny 1.2 Specification Appendix M</summary>
public const string ImageSvgXml = "image/svg+xml";
///<summary>Tag Image File Format (only for Baseline TIFF); Defined in RFC 3302</summary>
public const string ImageTiff = "image/tiff";
///<summary>Tarball files</summary>
public const string ApplicationXTar = "application/x-tar";
///<summary>Textual data; Defined in RFC 2046 and RFC 3676</summary>
public const string TextPlain = "text/plain";
///<summary>TrueType Font No registered MIME type, but this is the most commonly used</summary>
public const string ApplicationXFontTtf = "application/x-font-ttf";
///<summary>vCard (contact information); Defined in RFC 6350</summary>
public const string TextVcard = "text/vcard";
///<summary>Vorbis encoded audio; Defined in RFC 5215</summary>
public const string AudioVorbis = "audio/vorbis";
///<summary>WAV audio; Defined in RFC 2361</summary>
public const string AudioVndWave = "audio/vnd.wave";
///<summary>Web Open Font Format; (candidate recommendation; use application/x-font-woff until standard is official)</summary>
public const string ApplicationFontWoff = "application/font-woff";
///<summary>WebM Matroska-based open media format</summary>
public const string VideoWebm = "video/webm";
///<summary>WebM open media format</summary>
public const string AudioWebm = "audio/webm";
///<summary>Windows Media Audio Redirector; Documented in Microsoft help page</summary>
public const string AudioXMsWax = "audio/x-ms-wax";
///<summary>Windows Media Audio; Documented in Microsoft KB 288102</summary>
public const string AudioXMsWma = "audio/x-ms-wma";
///<summary>Windows Media Video; Documented in Microsoft KB 288102</summary>
public const string VideoXMsWmv = "video/x-ms-wmv";
///<summary>WRL files, VRML files; Defined in RFC 2077</summary>
public const string ModelVrml = "model/vrml";
///<summary>X3D ISO standard for representing 3D computer graphics, X3D XML files</summary>
public const string ModelX3DXml = "model/x3d+xml";
///<summary>X3D ISO standard for representing 3D computer graphics, X3DB binary files</summary>
public const string ModelX3DBinary = "model/x3d+binary";
///<summary>X3D ISO standard for representing 3D computer graphics, X3DV VRML files</summary>
public const string ModelX3DVrml = "model/x3d+vrml";
///<summary>XHTML; Defined by RFC 3236</summary>
public const string ApplicationXhtmlXml = "application/xhtml+xml";
///<summary>ZIP archive files; Registered[7]</summary>
public const string ApplicationZip = "application/zip";
}
}

+ 24
- 0
BCS.BMC/src/BCS.BMC.Application/PagedInputDto.cs View File

@ -0,0 +1,24 @@
using Abp.Application.Services.Dto;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BCS.BMC
{
public class PagedInputDto : IPagedResultRequest
{
// [Range(1, AbpExtendedConsts.MaxPageSize)]
public int MaxResultCount { get; set; }
[Range(0, int.MaxValue)]
public int SkipCount { get; set; }
//public PagedInputDto()
//{
// MaxResultCount = AbpExtendedConsts.DefaultPageSize;
//}
}
}

+ 15
- 0
BCS.BMC/src/BCS.BMC.Application/PagedSortedFilteredInputDto.cs View File

@ -0,0 +1,15 @@
using Abp.Application.Services.Dto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BCS.BMC
{
public class PagedSortedFilteredInputDto : PagedInputDto, ISortedResultRequest
{
public string Sorting { get; set; }
public string Filter { get; set; }
}
}

+ 18
- 0
BCS.BMC/src/BCS.BMC.Application/Properties/AssemblyInfo.cs View File

@ -0,0 +1,18 @@
using System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("BCS.BMC.Application")]
[assembly: AssemblyTrademark("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("3870c648-4aea-4b85-ba3f-f2f63b96136a")]

+ 30
- 0
BCS.BMC/src/BCS.BMC.Application/Roles/Dto/CreateRoleDto.cs View File

@ -0,0 +1,30 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Abp.Authorization.Roles;
using BCS.BMC.Authorization.Roles;
namespace BCS.BMC.Roles.Dto
{
public class CreateRoleDto
{
[Required]
[StringLength(AbpRoleBase.MaxNameLength)]
public string Name { get; set; }
[Required]
[StringLength(AbpRoleBase.MaxDisplayNameLength)]
public string DisplayName { get; set; }
public string NormalizedName { get; set; }
[StringLength(Role.MaxDescriptionLength)]
public string Description { get; set; }
public List<string> GrantedPermissions { get; set; }
public CreateRoleDto()
{
GrantedPermissions = new List<string>();
}
}
}

+ 11
- 0
BCS.BMC/src/BCS.BMC.Application/Roles/Dto/FlatPermissionDto.cs View File

@ -0,0 +1,11 @@
namespace BCS.BMC.Roles.Dto
{
public class FlatPermissionDto
{
public string Name { get; set; }
public string DisplayName { get; set; }
public string Description { get; set; }
}
}

+ 13
- 0
BCS.BMC/src/BCS.BMC.Application/Roles/Dto/GetRoleForEditOutput.cs View File

@ -0,0 +1,13 @@
using System.Collections.Generic;
namespace BCS.BMC.Roles.Dto
{
public class GetRoleForEditOutput
{
public RoleEditDto Role { get; set; }
public List<FlatPermissionDto> Permissions { get; set; }
public List<string> GrantedPermissionNames { get; set; }
}
}

+ 7
- 0
BCS.BMC/src/BCS.BMC.Application/Roles/Dto/GetRolesInput.cs View File

@ -0,0 +1,7 @@
namespace BCS.BMC.Roles.Dto
{
public class GetRolesInput
{
public string Permission { get; set; }
}
}

+ 10
- 0
BCS.BMC/src/BCS.BMC.Application/Roles/Dto/PagedRoleResultRequestDto.cs View File

@ -0,0 +1,10 @@
using Abp.Application.Services.Dto;
namespace BCS.BMC.Roles.Dto
{
public class PagedRoleResultRequestDto : PagedResultRequestDto
{
public string Keyword { get; set; }
}
}

+ 16
- 0
BCS.BMC/src/BCS.BMC.Application/Roles/Dto/PermissionDto.cs View File

@ -0,0 +1,16 @@
using Abp.Application.Services.Dto;
using Abp.AutoMapper;
using Abp.Authorization;
namespace BCS.BMC.Roles.Dto
{
[AutoMapFrom(typeof(Permission))]
public class PermissionDto : EntityDto<long>
{
public string Name { get; set; }
public string DisplayName { get; set; }
public string Description { get; set; }
}
}

+ 27
- 0
BCS.BMC/src/BCS.BMC.Application/Roles/Dto/RoleDto.cs View File

@ -0,0 +1,27 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Abp.Application.Services.Dto;
using Abp.Authorization.Roles;
using Abp.AutoMapper;
using BCS.BMC.Authorization.Roles;
namespace BCS.BMC.Roles.Dto
{
public class RoleDto : EntityDto<int>
{
[Required]
[StringLength(AbpRoleBase.MaxNameLength)]
public string Name { get; set; }
[Required]
[StringLength(AbpRoleBase.MaxDisplayNameLength)]
public string DisplayName { get; set; }
public string NormalizedName { get; set; }
[StringLength(Role.MaxDescriptionLength)]
public string Description { get; set; }
public List<string> GrantedPermissions { get; set; }
}
}

+ 23
- 0
BCS.BMC/src/BCS.BMC.Application/Roles/Dto/RoleEditDto.cs View File

@ -0,0 +1,23 @@
using System.ComponentModel.DataAnnotations;
using Abp.Application.Services.Dto;
using Abp.Authorization.Roles;
using BCS.BMC.Authorization.Roles;
namespace BCS.BMC.Roles.Dto
{
public class RoleEditDto: EntityDto<int>
{
[Required]
[StringLength(AbpRoleBase.MaxNameLength)]
public string Name { get; set; }
[Required]
[StringLength(AbpRoleBase.MaxDisplayNameLength)]
public string DisplayName { get; set; }
[StringLength(Role.MaxDescriptionLength)]
public string Description { get; set; }
public bool IsStatic { get; set; }
}
}

+ 19
- 0
BCS.BMC/src/BCS.BMC.Application/Roles/Dto/RoleListDto.cs View File

@ -0,0 +1,19 @@
using System;
using Abp.Application.Services.Dto;
using Abp.Domain.Entities.Auditing;
namespace BCS.BMC.Roles.Dto
{
public class RoleListDto : EntityDto, IHasCreationTime
{
public string Name { get; set; }
public string DisplayName { get; set; }
public bool IsStatic { get; set; }
public bool IsDefault { get; set; }
public DateTime CreationTime { get; set; }
}
}

+ 29
- 0
BCS.BMC/src/BCS.BMC.Application/Roles/Dto/RoleMapProfile.cs View File

@ -0,0 +1,29 @@
using System.Linq;
using AutoMapper;
using Abp.Authorization;
using Abp.Authorization.Roles;
using BCS.BMC.Authorization.Roles;
namespace BCS.BMC.Roles.Dto
{
public class RoleMapProfile : Profile
{
public RoleMapProfile()
{
// Role and permission
CreateMap<Permission, string>().ConvertUsing(r => r.Name);
CreateMap<RolePermissionSetting, string>().ConvertUsing(r => r.Name);
CreateMap<CreateRoleDto, Role>();
CreateMap<RoleDto, Role>();
CreateMap<Role, RoleDto>().ForMember(x => x.GrantedPermissions,
opt => opt.MapFrom(x => x.Permissions.Where(p => p.IsGranted)));
CreateMap<Role, RoleListDto>();
CreateMap<Role, RoleEditDto>();
CreateMap<Permission, FlatPermissionDto>();
}
}
}

+ 16
- 0
BCS.BMC/src/BCS.BMC.Application/Roles/IRoleAppService.cs View File

@ -0,0 +1,16 @@
using System.Threading.Tasks;
using Abp.Application.Services;
using Abp.Application.Services.Dto;
using BCS.BMC.Roles.Dto;
namespace BCS.BMC.Roles
{
public interface IRoleAppService : IAsyncCrudAppService<RoleDto, int, PagedRoleResultRequestDto, CreateRoleDto, RoleDto>
{
Task<ListResultDto<PermissionDto>> GetAllPermissions();
Task<GetRoleForEditOutput> GetRoleForEdit(EntityDto input);
Task<ListResultDto<RoleListDto>> GetRolesAsync(GetRolesInput input);
}
}

+ 148
- 0
BCS.BMC/src/BCS.BMC.Application/Roles/RoleAppService.cs View File

@ -0,0 +1,148 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Abp.Application.Services;
using Abp.Application.Services.Dto;
using Abp.Authorization;
using Abp.Domain.Repositories;
using Abp.Extensions;
using Abp.IdentityFramework;
using Abp.Linq.Extensions;
using BCS.BMC.Authorization;
using BCS.BMC.Authorization.Roles;
using BCS.BMC.Authorization.Users;
using BCS.BMC.Roles.Dto;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
namespace BCS.BMC.Roles
{
[AbpAuthorize(PermissionNames.Pages_Roles)]
public class RoleAppService : AsyncCrudAppService<Role, RoleDto, int, PagedRoleResultRequestDto, CreateRoleDto, RoleDto>, IRoleAppService
{
private readonly RoleManager _roleManager;
private readonly UserManager _userManager;
public RoleAppService(IRepository<Role> repository, RoleManager roleManager, UserManager userManager)
: base(repository)
{
_roleManager = roleManager;
_userManager = userManager;
}
public override async Task<RoleDto> CreateAsync(CreateRoleDto input)
{
CheckCreatePermission();
var role = ObjectMapper.Map<Role>(input);
role.SetNormalizedName();
CheckErrors(await _roleManager.CreateAsync(role));
var grantedPermissions = PermissionManager
.GetAllPermissions()
.Where(p => input.GrantedPermissions.Contains(p.Name))
.ToList();
await _roleManager.SetGrantedPermissionsAsync(role, grantedPermissions);
return MapToEntityDto(role);
}
public async Task<ListResultDto<RoleListDto>> GetRolesAsync(GetRolesInput input)
{
var roles = await _roleManager
.Roles
.WhereIf(
!input.Permission.IsNullOrWhiteSpace(),
r => r.Permissions.Any(rp => rp.Name == input.Permission && rp.IsGranted)
)
.ToListAsync();
return new ListResultDto<RoleListDto>(ObjectMapper.Map<List<RoleListDto>>(roles));
}
public override async Task<RoleDto> UpdateAsync(RoleDto input)
{
CheckUpdatePermission();
var role = await _roleManager.GetRoleByIdAsync(input.Id);
ObjectMapper.Map(input, role);
CheckErrors(await _roleManager.UpdateAsync(role));
var grantedPermissions = PermissionManager
.GetAllPermissions()
.Where(p => input.GrantedPermissions.Contains(p.Name))
.ToList();
await _roleManager.SetGrantedPermissionsAsync(role, grantedPermissions);
return MapToEntityDto(role);
}
public override async Task DeleteAsync(EntityDto<int> input)
{
CheckDeletePermission();
var role = await _roleManager.FindByIdAsync(input.Id.ToString());
var users = await _userManager.GetUsersInRoleAsync(role.NormalizedName);
foreach (var user in users)
{
CheckErrors(await _userManager.RemoveFromRoleAsync(user, role.NormalizedName));
}
CheckErrors(await _roleManager.DeleteAsync(role));
}
public Task<ListResultDto<PermissionDto>> GetAllPermissions()
{
var permissions = PermissionManager.GetAllPermissions();
return Task.FromResult(new ListResultDto<PermissionDto>(
ObjectMapper.Map<List<PermissionDto>>(permissions).OrderBy(p => p.DisplayName).ToList()
));
}
protected override IQueryable<Role> CreateFilteredQuery(PagedRoleResultRequestDto input)
{
return Repository.GetAllIncluding(x => x.Permissions)
.WhereIf(!input.Keyword.IsNullOrWhiteSpace(), x => x.Name.Contains(input.Keyword)
|| x.DisplayName.Contains(input.Keyword)
|| x.Description.Contains(input.Keyword));
}
protected override async Task<Role> GetEntityByIdAsync(int id)
{
return await Repository.GetAllIncluding(x => x.Permissions).FirstOrDefaultAsync(x => x.Id == id);
}
protected override IQueryable<Role> ApplySorting(IQueryable<Role> query, PagedRoleResultRequestDto input)
{
return query.OrderBy(r => r.DisplayName);
}
protected virtual void CheckErrors(IdentityResult identityResult)
{
identityResult.CheckErrors(LocalizationManager);
}
public async Task<GetRoleForEditOutput> GetRoleForEdit(EntityDto input)
{
var permissions = PermissionManager.GetAllPermissions();
var role = await _roleManager.GetRoleByIdAsync(input.Id);
var grantedPermissions = (await _roleManager.GetGrantedPermissionsAsync(role)).ToArray();
var roleEditDto = ObjectMapper.Map<RoleEditDto>(role);
return new GetRoleForEditOutput
{
Role = roleEditDto,
Permissions = ObjectMapper.Map<List<FlatPermissionDto>>(permissions).OrderBy(p => p.DisplayName).ToList(),
GrantedPermissionNames = grantedPermissions.Select(p => p.Name).ToList()
};
}
}
}

+ 14
- 0
BCS.BMC/src/BCS.BMC.Application/Sessions/Dto/ApplicationInfoDto.cs View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
namespace BCS.BMC.Sessions.Dto
{
public class ApplicationInfoDto
{
public string Version { get; set; }
public DateTime ReleaseDate { get; set; }
public Dictionary<string, bool> Features { get; set; }
}
}

+ 11
- 0
BCS.BMC/src/BCS.BMC.Application/Sessions/Dto/GetCurrentLoginInformationsOutput.cs View File

@ -0,0 +1,11 @@
namespace BCS.BMC.Sessions.Dto
{
public class GetCurrentLoginInformationsOutput
{
public ApplicationInfoDto Application { get; set; }
public UserLoginInfoDto User { get; set; }
public TenantLoginInfoDto Tenant { get; set; }
}
}

+ 14
- 0
BCS.BMC/src/BCS.BMC.Application/Sessions/Dto/TenantLoginInfoDto.cs View File

@ -0,0 +1,14 @@
using Abp.Application.Services.Dto;
using Abp.AutoMapper;
using BCS.BMC.MultiTenancy;
namespace BCS.BMC.Sessions.Dto
{
[AutoMapFrom(typeof(Tenant))]
public class TenantLoginInfoDto : EntityDto
{
public string TenancyName { get; set; }
public string Name { get; set; }
}
}

+ 18
- 0
BCS.BMC/src/BCS.BMC.Application/Sessions/Dto/UserLoginInfoDto.cs View File

@ -0,0 +1,18 @@
using Abp.Application.Services.Dto;
using Abp.AutoMapper;
using BCS.BMC.Authorization.Users;
namespace BCS.BMC.Sessions.Dto
{
[AutoMapFrom(typeof(User))]
public class UserLoginInfoDto : EntityDto<long>
{
public string Name { get; set; }
public string Surname { get; set; }
public string UserName { get; set; }
public string EmailAddress { get; set; }
}
}

+ 11
- 0
BCS.BMC/src/BCS.BMC.Application/Sessions/ISessionAppService.cs View File

@ -0,0 +1,11 @@
using System.Threading.Tasks;
using Abp.Application.Services;
using BCS.BMC.Sessions.Dto;
namespace BCS.BMC.Sessions
{
public interface ISessionAppService : IApplicationService
{
Task<GetCurrentLoginInformationsOutput> GetCurrentLoginInformations();
}
}

+ 36
- 0
BCS.BMC/src/BCS.BMC.Application/Sessions/SessionAppService.cs View File

@ -0,0 +1,36 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Abp.Auditing;
using BCS.BMC.Sessions.Dto;
namespace BCS.BMC.Sessions
{
public class SessionAppService : BMCAppServiceBase, ISessionAppService
{
[DisableAuditing]
public async Task<GetCurrentLoginInformationsOutput> GetCurrentLoginInformations()
{
var output = new GetCurrentLoginInformationsOutput
{
Application = new ApplicationInfoDto
{
Version = AppVersionHelper.Version,
ReleaseDate = AppVersionHelper.ReleaseDate,
Features = new Dictionary<string, bool>()
}
};
if (AbpSession.TenantId.HasValue)
{
output.Tenant = ObjectMapper.Map<TenantLoginInfoDto>(await GetCurrentTenantAsync());
}
if (AbpSession.UserId.HasValue)
{
output.User = ObjectMapper.Map<UserLoginInfoDto>(await GetCurrentUserAsync());
}
return output;
}
}
}

+ 13
- 0
BCS.BMC/src/BCS.BMC.Application/Users/Dto/ChangePasswordDto.cs View File

@ -0,0 +1,13 @@
using System.ComponentModel.DataAnnotations;
namespace BCS.BMC.Users.Dto
{
public class ChangePasswordDto
{
[Required]
public string CurrentPassword { get; set; }
[Required]
public string NewPassword { get; set; }
}
}

+ 10
- 0
BCS.BMC/src/BCS.BMC.Application/Users/Dto/ChangeUserLanguageDto.cs View File

@ -0,0 +1,10 @@
using System.ComponentModel.DataAnnotations;
namespace BCS.BMC.Users.Dto
{
public class ChangeUserLanguageDto
{
[Required]
public string LanguageName { get; set; }
}
}

+ 47
- 0
BCS.BMC/src/BCS.BMC.Application/Users/Dto/CreateUserDto.cs View File

@ -0,0 +1,47 @@
using System.ComponentModel.DataAnnotations;
using Abp.Auditing;
using Abp.Authorization.Users;
using Abp.AutoMapper;
using Abp.Runtime.Validation;
using BCS.BMC.Authorization.Users;
namespace BCS.BMC.Users.Dto
{
[AutoMapTo(typeof(User))]
public class CreateUserDto : IShouldNormalize
{
[Required]
[StringLength(AbpUserBase.MaxUserNameLength)]
public string UserName { get; set; }
[Required]
[StringLength(AbpUserBase.MaxNameLength)]
public string Name { get; set; }
[Required]
[StringLength(AbpUserBase.MaxSurnameLength)]
public string Surname { get; set; }
[Required]
[EmailAddress]
[StringLength(AbpUserBase.MaxEmailAddressLength)]
public string EmailAddress { get; set; }
public bool IsActive { get; set; }
public string[] RoleNames { get; set; }
[Required]
[StringLength(AbpUserBase.MaxPlainPasswordLength)]
[DisableAuditing]
public string Password { get; set; }
public void Normalize()
{
if (RoleNames == null)
{
RoleNames = new string[0];
}
}
}
}

+ 12
- 0
BCS.BMC/src/BCS.BMC.Application/Users/Dto/PagedUserResultRequestDto.cs View File

@ -0,0 +1,12 @@
using Abp.Application.Services.Dto;
using System;
namespace BCS.BMC.Users.Dto
{
//custom PagedResultRequestDto
public class PagedUserResultRequestDto : PagedResultRequestDto
{
public string Keyword { get; set; }
public bool? IsActive { get; set; }
}
}

+ 16
- 0
BCS.BMC/src/BCS.BMC.Application/Users/Dto/ResetPasswordDto.cs View File

@ -0,0 +1,16 @@
using System.ComponentModel.DataAnnotations;
namespace BCS.BMC.Users.Dto
{
public class ResetPasswordDto
{
[Required]
public string AdminPassword { get; set; }
[Required]
public long UserId { get; set; }
[Required]
public string NewPassword { get; set; }
}
}

+ 40
- 0
BCS.BMC/src/BCS.BMC.Application/Users/Dto/UserDto.cs View File

@ -0,0 +1,40 @@
using System;
using System.ComponentModel.DataAnnotations;
using Abp.Application.Services.Dto;
using Abp.Authorization.Users;
using Abp.AutoMapper;
using BCS.BMC.Authorization.Users;
namespace BCS.BMC.Users.Dto
{
[AutoMapFrom(typeof(User))]
public class UserDto : EntityDto<long>
{
[Required]
[StringLength(AbpUserBase.MaxUserNameLength)]
public string UserName { get; set; }
[Required]
[StringLength(AbpUserBase.MaxNameLength)]
public string Name { get; set; }
[Required]
[StringLength(AbpUserBase.MaxSurnameLength)]
public string Surname { get; set; }
[Required]
[EmailAddress]
[StringLength(AbpUserBase.MaxEmailAddressLength)]
public string EmailAddress { get; set; }
public bool IsActive { get; set; }
public string FullName { get; set; }
public DateTime? LastLoginTime { get; set; }
public DateTime CreationTime { get; set; }
public string[] RoleNames { get; set; }
}
}

+ 19
- 0
BCS.BMC/src/BCS.BMC.Application/Users/Dto/UserMapProfile.cs View File

@ -0,0 +1,19 @@
using AutoMapper;
using BCS.BMC.Authorization.Users;
namespace BCS.BMC.Users.Dto
{
public class UserMapProfile : Profile
{
public UserMapProfile()
{
CreateMap<UserDto, User>();
CreateMap<UserDto, User>()
.ForMember(x => x.Roles, opt => opt.Ignore())
.ForMember(x => x.CreationTime, opt => opt.Ignore());
CreateMap<CreateUserDto, User>();
CreateMap<CreateUserDto, User>().ForMember(x => x.Roles, opt => opt.Ignore());
}
}
}

+ 18
- 0
BCS.BMC/src/BCS.BMC.Application/Users/IUserAppService.cs View File

@ -0,0 +1,18 @@
using System.Threading.Tasks;
using Abp.Application.Services;
using Abp.Application.Services.Dto;
using BCS.BMC.Roles.Dto;
using BCS.BMC.Users.Dto;
namespace BCS.BMC.Users
{
public interface IUserAppService : IAsyncCrudAppService<UserDto, long, PagedUserResultRequestDto, CreateUserDto, UserDto>
{
Task DeActivate(EntityDto<long> user);
Task Activate(EntityDto<long> user);
Task<ListResultDto<RoleDto>> GetRoles();
Task ChangeLanguage(ChangeUserLanguageDto input);
Task<bool> ChangePassword(ChangePasswordDto input);
}
}

+ 251
- 0
BCS.BMC/src/BCS.BMC.Application/Users/UserAppService.cs View File

@ -0,0 +1,251 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Abp.Application.Services;
using Abp.Application.Services.Dto;
using Abp.Authorization;
using Abp.Domain.Entities;
using Abp.Domain.Repositories;
using Abp.Extensions;
using Abp.IdentityFramework;
using Abp.Linq.Extensions;
using Abp.Localization;
using Abp.Runtime.Session;
using Abp.UI;
using BCS.BMC.Authorization;
using BCS.BMC.Authorization.Accounts;
using BCS.BMC.Authorization.Roles;
using BCS.BMC.Authorization.Users;
using BCS.BMC.Roles.Dto;
using BCS.BMC.Users.Dto;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
namespace BCS.BMC.Users
{
[AbpAuthorize(PermissionNames.Pages_Users)]
public class UserAppService : AsyncCrudAppService<User, UserDto, long, PagedUserResultRequestDto, CreateUserDto, UserDto>, IUserAppService
{
private readonly UserManager _userManager;
private readonly RoleManager _roleManager;
private readonly IRepository<Role> _roleRepository;
private readonly IPasswordHasher<User> _passwordHasher;
private readonly IAbpSession _abpSession;
private readonly LogInManager _logInManager;
public UserAppService(
IRepository<User, long> repository,
UserManager userManager,
RoleManager roleManager,
IRepository<Role> roleRepository,
IPasswordHasher<User> passwordHasher,
IAbpSession abpSession,
LogInManager logInManager)
: base(repository)
{
_userManager = userManager;
_roleManager = roleManager;
_roleRepository = roleRepository;
_passwordHasher = passwordHasher;
_abpSession = abpSession;
_logInManager = logInManager;
}
public override async Task<UserDto> CreateAsync(CreateUserDto input)
{
CheckCreatePermission();
var user = ObjectMapper.Map<User>(input);
user.TenantId = AbpSession.TenantId;
user.IsEmailConfirmed = true;
await _userManager.InitializeOptionsAsync(AbpSession.TenantId);
CheckErrors(await _userManager.CreateAsync(user, input.Password));
if (input.RoleNames != null)
{
CheckErrors(await _userManager.SetRolesAsync(user, input.RoleNames));
}
CurrentUnitOfWork.SaveChanges();
return MapToEntityDto(user);
}
public override async Task<UserDto> UpdateAsync(UserDto input)
{
CheckUpdatePermission();
var user = await _userManager.GetUserByIdAsync(input.Id);
MapToEntity(input, user);
CheckErrors(await _userManager.UpdateAsync(user));
if (input.RoleNames != null)
{
CheckErrors(await _userManager.SetRolesAsync(user, input.RoleNames));
}
return await GetAsync(input);
}
public override async Task DeleteAsync(EntityDto<long> input)
{
var user = await _userManager.GetUserByIdAsync(input.Id);
await _userManager.DeleteAsync(user);
}
[AbpAuthorize(PermissionNames.Pages_Users_Activation)]
public async Task Activate(EntityDto<long> user)
{
await Repository.UpdateAsync(user.Id, async (entity) =>
{
entity.IsActive = true;
});
}
[AbpAuthorize(PermissionNames.Pages_Users_Activation)]
public async Task DeActivate(EntityDto<long> user)
{
await Repository.UpdateAsync(user.Id, async (entity) =>
{
entity.IsActive = false;
});
}
public async Task<ListResultDto<RoleDto>> GetRoles()
{
var roles = await _roleRepository.GetAllListAsync();
return new ListResultDto<RoleDto>(ObjectMapper.Map<List<RoleDto>>(roles));
}
public async Task ChangeLanguage(ChangeUserLanguageDto input)
{
await SettingManager.ChangeSettingForUserAsync(
AbpSession.ToUserIdentifier(),
LocalizationSettingNames.DefaultLanguage,
input.LanguageName
);
}
protected override User MapToEntity(CreateUserDto createInput)
{
var user = ObjectMapper.Map<User>(createInput);
user.SetNormalizedNames();
return user;
}
protected override void MapToEntity(UserDto input, User user)
{
ObjectMapper.Map(input, user);
user.SetNormalizedNames();
}
protected override UserDto MapToEntityDto(User user)
{
var roleIds = user.Roles.Select(x => x.RoleId).ToArray();
var roles = _roleManager.Roles.Where(r => roleIds.Contains(r.Id)).Select(r => r.NormalizedName);
var userDto = base.MapToEntityDto(user);
userDto.RoleNames = roles.ToArray();
return userDto;
}
protected override IQueryable<User> CreateFilteredQuery(PagedUserResultRequestDto input)
{
return Repository.GetAllIncluding(x => x.Roles)
.WhereIf(!input.Keyword.IsNullOrWhiteSpace(), x => x.UserName.Contains(input.Keyword) || x.Name.Contains(input.Keyword) || x.EmailAddress.Contains(input.Keyword))
.WhereIf(input.IsActive.HasValue, x => x.IsActive == input.IsActive);
}
protected override async Task<User> GetEntityByIdAsync(long id)
{
var user = await Repository.GetAllIncluding(x => x.Roles).FirstOrDefaultAsync(x => x.Id == id);
if (user == null)
{
throw new EntityNotFoundException(typeof(User), id);
}
return user;
}
protected override IQueryable<User> ApplySorting(IQueryable<User> query, PagedUserResultRequestDto input)
{
return query.OrderBy(r => r.UserName);
}
protected virtual void CheckErrors(IdentityResult identityResult)
{
identityResult.CheckErrors(LocalizationManager);
}
public async Task<bool> ChangePassword(ChangePasswordDto input)
{
await _userManager.InitializeOptionsAsync(AbpSession.TenantId);
var user = await _userManager.FindByIdAsync(AbpSession.GetUserId().ToString());
if (user == null)
{
throw new Exception("There is no current user!");
}
if (await _userManager.CheckPasswordAsync(user, input.CurrentPassword))
{
CheckErrors(await _userManager.ChangePasswordAsync(user, input.NewPassword));
}
else
{
CheckErrors(IdentityResult.Failed(new IdentityError
{
Description = "Incorrect password."
}));
}
return true;
}
public async Task<bool> ResetPassword(ResetPasswordDto input)
{
if (_abpSession.UserId == null)
{
throw new UserFriendlyException("Please log in before attempting to reset password.");
}
var currentUser = await _userManager.GetUserByIdAsync(_abpSession.GetUserId());
var loginAsync = await _logInManager.LoginAsync(currentUser.UserName, input.AdminPassword, shouldLockout: false);
if (loginAsync.Result != AbpLoginResultType.Success)
{
throw new UserFriendlyException("Your 'Admin Password' did not match the one on record. Please try again.");
}
if (currentUser.IsDeleted || !currentUser.IsActive)
{
return false;
}
var roles = await _userManager.GetRolesAsync(currentUser);
if (!roles.Contains(StaticRoleNames.Tenants.Admin))
{
throw new UserFriendlyException("Only administrators may reset passwords.");
}
var user = await _userManager.GetUserByIdAsync(input.UserId);
if (user != null)
{
user.Password = _passwordHasher.HashPassword(user, input.NewPassword);
await CurrentUnitOfWork.SaveChangesAsync();
}
return true;
}
}
}

+ 26
- 0
BCS.BMC/src/BCS.BMC.Core/AppVersionHelper.cs View File

@ -0,0 +1,26 @@
using System;
using System.IO;
using Abp.Reflection.Extensions;
namespace BCS.BMC
{
/// <summary>
/// Central point for application version.
/// </summary>
public class AppVersionHelper
{
/// <summary>
/// Gets current version of the application.
/// It's also shown in the web page.
/// </summary>
public const string Version = "7.3.0.0";
/// <summary>
/// Gets release (last build) date of the application.
/// It's shown in the web page.
/// </summary>
public static DateTime ReleaseDate => LzyReleaseDate.Value;
private static readonly Lazy<DateTime> LzyReleaseDate = new Lazy<DateTime>(() => new FileInfo(typeof(AppVersionHelper).GetAssembly().Location).LastWriteTime);
}
}

+ 23
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/BMCAuthorizationProvider.cs View File

@ -0,0 +1,23 @@
using Abp.Authorization;
using Abp.Localization;
using Abp.MultiTenancy;
namespace BCS.BMC.Authorization
{
public class BMCAuthorizationProvider : AuthorizationProvider
{
public override void SetPermissions(IPermissionDefinitionContext context)
{
context.CreatePermission(PermissionNames.Pages_Users, L("Users"));
context.CreatePermission(PermissionNames.Pages_Users_Activation, L("UsersActivation"));
context.CreatePermission(PermissionNames.Pages_Roles, L("Roles"));
context.CreatePermission(PermissionNames.Pages_CompanyMaster, L("CompanyMaster"));
context.CreatePermission(PermissionNames.Pages_Tenants, L("Tenants"), multiTenancySides: MultiTenancySides.Host);
}
private static ILocalizableString L(string name)
{
return new LocalizableString(name, BMCConsts.LocalizationSourceName);
}
}
}

+ 45
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/LoginManager.cs View File

@ -0,0 +1,45 @@
using Microsoft.AspNetCore.Identity;
using Abp.Authorization;
using Abp.Authorization.Users;
using Abp.Configuration;
using Abp.Configuration.Startup;
using Abp.Dependency;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
using Abp.Zero.Configuration;
using BCS.BMC.Authorization.Roles;
using BCS.BMC.Authorization.Users;
using BCS.BMC.MultiTenancy;
namespace BCS.BMC.Authorization
{
public class LogInManager : AbpLogInManager<Tenant, Role, User>
{
public LogInManager(
UserManager userManager,
IMultiTenancyConfig multiTenancyConfig,
IRepository<Tenant> tenantRepository,
IUnitOfWorkManager unitOfWorkManager,
ISettingManager settingManager,
IRepository<UserLoginAttempt, long> userLoginAttemptRepository,
IUserManagementConfig userManagementConfig,
IIocResolver iocResolver,
IPasswordHasher<User> passwordHasher,
RoleManager roleManager,
UserClaimsPrincipalFactory claimsPrincipalFactory)
: base(
userManager,
multiTenancyConfig,
tenantRepository,
unitOfWorkManager,
settingManager,
userLoginAttemptRepository,
userManagementConfig,
iocResolver,
passwordHasher,
roleManager,
claimsPrincipalFactory)
{
}
}
}

+ 14
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/PermissionChecker.cs View File

@ -0,0 +1,14 @@
using Abp.Authorization;
using BCS.BMC.Authorization.Roles;
using BCS.BMC.Authorization.Users;
namespace BCS.BMC.Authorization
{
public class PermissionChecker : PermissionChecker<Role, User>
{
public PermissionChecker(UserManager userManager)
: base(userManager)
{
}
}
}

+ 13
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/PermissionNames.cs View File

@ -0,0 +1,13 @@
namespace BCS.BMC.Authorization
{
public static class PermissionNames
{
public const string Pages_Tenants = "Pages.Tenants";
public const string Pages_Users = "Pages.Users";
public const string Pages_Users_Activation = "Pages.Users.Activation";
public const string Pages_Roles = "Pages.Roles";
public const string Pages_CompanyMaster = "Pages.CompanyMaster";
}
}

+ 29
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/Roles/AppRoleConfig.cs View File

@ -0,0 +1,29 @@
using Abp.MultiTenancy;
using Abp.Zero.Configuration;
namespace BCS.BMC.Authorization.Roles
{
public static class AppRoleConfig
{
public static void Configure(IRoleManagementConfig roleManagementConfig)
{
// Static host roles
roleManagementConfig.StaticRoles.Add(
new StaticRoleDefinition(
StaticRoleNames.Host.Admin,
MultiTenancySides.Host
)
);
// Static tenant roles
roleManagementConfig.StaticRoles.Add(
new StaticRoleDefinition(
StaticRoleNames.Tenants.Admin,
MultiTenancySides.Tenant
)
);
}
}
}

+ 28
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/Roles/Role.cs View File

@ -0,0 +1,28 @@
using System.ComponentModel.DataAnnotations;
using Abp.Authorization.Roles;
using BCS.BMC.Authorization.Users;
namespace BCS.BMC.Authorization.Roles
{
public class Role : AbpRole<User>
{
public const int MaxDescriptionLength = 5000;
public Role()
{
}
public Role(int? tenantId, string displayName)
: base(tenantId, displayName)
{
}
public Role(int? tenantId, string name, string displayName)
: base(tenantId, name, displayName)
{
}
[StringLength(MaxDescriptionLength)]
public string Description {get; set;}
}
}

+ 43
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/Roles/RoleManager.cs View File

@ -0,0 +1,43 @@
using System.Collections.Generic;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using Abp.Authorization;
using Abp.Authorization.Roles;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
using Abp.Organizations;
using Abp.Runtime.Caching;
using Abp.Zero.Configuration;
using BCS.BMC.Authorization.Users;
namespace BCS.BMC.Authorization.Roles
{
public class RoleManager : AbpRoleManager<Role, User>
{
public RoleManager(
RoleStore store,
IEnumerable<IRoleValidator<Role>> roleValidators,
ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors,
ILogger<AbpRoleManager<Role, User>> logger,
IPermissionManager permissionManager,
ICacheManager cacheManager,
IUnitOfWorkManager unitOfWorkManager,
IRoleManagementConfig roleManagementConfig,
IRepository<OrganizationUnit, long> organizationUnitRepository,
IRepository<OrganizationUnitRole, long> organizationUnitRoleRepository)
: base(
store,
roleValidators,
keyNormalizer,
errors, logger,
permissionManager,
cacheManager,
unitOfWorkManager,
roleManagementConfig,
organizationUnitRepository,
organizationUnitRoleRepository)
{
}
}
}

+ 21
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/Roles/RoleStore.cs View File

@ -0,0 +1,21 @@
using Abp.Authorization.Roles;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
using BCS.BMC.Authorization.Users;
namespace BCS.BMC.Authorization.Roles
{
public class RoleStore : AbpRoleStore<Role, User>
{
public RoleStore(
IUnitOfWorkManager unitOfWorkManager,
IRepository<Role> roleRepository,
IRepository<RolePermissionSetting, long> rolePermissionSettingRepository)
: base(
unitOfWorkManager,
roleRepository,
rolePermissionSettingRepository)
{
}
}
}

+ 15
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/Roles/StaticRoleNames.cs View File

@ -0,0 +1,15 @@
namespace BCS.BMC.Authorization.Roles
{
public static class StaticRoleNames
{
public static class Host
{
public const string Admin = "Admin";
}
public static class Tenants
{
public const string Admin = "Admin";
}
}
}

+ 34
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/Users/User.cs View File

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using Abp.Authorization.Users;
using Abp.Extensions;
namespace BCS.BMC.Authorization.Users
{
public class User : AbpUser<User>
{
public const string DefaultPassword = "123qwe";
public static string CreateRandomPassword()
{
return Guid.NewGuid().ToString("N").Truncate(16);
}
public static User CreateTenantAdminUser(int tenantId, string emailAddress)
{
var user = new User
{
TenantId = tenantId,
UserName = AdminUserName,
Name = AdminUserName,
Surname = AdminUserName,
EmailAddress = emailAddress,
Roles = new List<UserRole>()
};
user.SetNormalizedNames();
return user;
}
}
}

+ 24
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/Users/UserClaimsPrincipalFactory.cs View File

@ -0,0 +1,24 @@
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using Abp.Authorization;
using BCS.BMC.Authorization.Roles;
using Abp.Domain.Uow;
namespace BCS.BMC.Authorization.Users
{
public class UserClaimsPrincipalFactory : AbpUserClaimsPrincipalFactory<User, Role>
{
public UserClaimsPrincipalFactory(
UserManager userManager,
RoleManager roleManager,
IOptions<IdentityOptions> optionsAccessor,
IUnitOfWorkManager unitOfWorkManager)
: base(
userManager,
roleManager,
optionsAccessor,
unitOfWorkManager)
{
}
}
}

+ 61
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/Users/UserManager.cs View File

@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Abp.Authorization;
using Abp.Authorization.Users;
using Abp.Configuration;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
using Abp.Organizations;
using Abp.Runtime.Caching;
using BCS.BMC.Authorization.Roles;
using Abp.Authorization.Roles;
namespace BCS.BMC.Authorization.Users
{
public class UserManager : AbpUserManager<Role, User>
{
public UserManager(
RoleManager roleManager,
UserStore store,
IOptions<IdentityOptions> optionsAccessor,
IPasswordHasher<User> passwordHasher,
IEnumerable<IUserValidator<User>> userValidators,
IEnumerable<IPasswordValidator<User>> passwordValidators,
ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors,
IServiceProvider services,
ILogger<UserManager<User>> logger,
IPermissionManager permissionManager,
IUnitOfWorkManager unitOfWorkManager,
ICacheManager cacheManager,
IRepository<OrganizationUnit, long> organizationUnitRepository,
IRepository<UserOrganizationUnit, long> userOrganizationUnitRepository,
IOrganizationUnitSettings organizationUnitSettings,
ISettingManager settingManager,
IRepository<UserLogin, long> userLoginRepository)
: base(
roleManager,
store,
optionsAccessor,
passwordHasher,
userValidators,
passwordValidators,
keyNormalizer,
errors,
services,
logger,
permissionManager,
unitOfWorkManager,
cacheManager,
organizationUnitRepository,
userOrganizationUnitRepository,
organizationUnitSettings,
settingManager,
userLoginRepository)
{
}
}
}

+ 112
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/Users/UserRegistrationManager.cs View File

@ -0,0 +1,112 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Abp.Authorization.Users;
using Abp.Domain.Services;
using Abp.IdentityFramework;
using Abp.Runtime.Session;
using Abp.UI;
using BCS.BMC.Authorization.Roles;
using BCS.BMC.MultiTenancy;
namespace BCS.BMC.Authorization.Users
{
public class UserRegistrationManager : DomainService
{
public IAbpSession AbpSession { get; set; }
private readonly TenantManager _tenantManager;
private readonly UserManager _userManager;
private readonly RoleManager _roleManager;
private readonly IPasswordHasher<User> _passwordHasher;
public UserRegistrationManager(
TenantManager tenantManager,
UserManager userManager,
RoleManager roleManager,
IPasswordHasher<User> passwordHasher)
{
_tenantManager = tenantManager;
_userManager = userManager;
_roleManager = roleManager;
_passwordHasher = passwordHasher;
AbpSession = NullAbpSession.Instance;
}
public async Task<User> RegisterAsync(string name, string surname, string emailAddress, string userName, string plainPassword, bool isEmailConfirmed)
{
CheckForTenant();
var tenant = await GetActiveTenantAsync();
var user = new User
{
TenantId = tenant.Id,
Name = name,
Surname = surname,
EmailAddress = emailAddress,
IsActive = true,
UserName = userName,
IsEmailConfirmed = isEmailConfirmed,
Roles = new List<UserRole>()
};
user.SetNormalizedNames();
foreach (var defaultRole in await _roleManager.Roles.Where(r => r.IsDefault).ToListAsync())
{
user.Roles.Add(new UserRole(tenant.Id, user.Id, defaultRole.Id));
}
await _userManager.InitializeOptionsAsync(tenant.Id);
CheckErrors(await _userManager.CreateAsync(user, plainPassword));
await CurrentUnitOfWork.SaveChangesAsync();
return user;
}
private void CheckForTenant()
{
if (!AbpSession.TenantId.HasValue)
{
throw new InvalidOperationException("Can not register host users!");
}
}
private async Task<Tenant> GetActiveTenantAsync()
{
if (!AbpSession.TenantId.HasValue)
{
return null;
}
return await GetActiveTenantAsync(AbpSession.TenantId.Value);
}
private async Task<Tenant> GetActiveTenantAsync(int tenantId)
{
var tenant = await _tenantManager.FindByIdAsync(tenantId);
if (tenant == null)
{
throw new UserFriendlyException(L("UnknownTenantId{0}", tenantId));
}
if (!tenant.IsActive)
{
throw new UserFriendlyException(L("TenantIdIsNotActive{0}", tenantId));
}
return tenant;
}
protected virtual void CheckErrors(IdentityResult identityResult)
{
identityResult.CheckErrors(LocalizationManager);
}
}
}

+ 35
- 0
BCS.BMC/src/BCS.BMC.Core/Authorization/Users/UserStore.cs View File

@ -0,0 +1,35 @@
using Abp.Authorization.Users;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
using Abp.Linq;
using Abp.Organizations;
using BCS.BMC.Authorization.Roles;
namespace BCS.BMC.Authorization.Users
{
public class UserStore : AbpUserStore<Role, User>
{
public UserStore(
IUnitOfWorkManager unitOfWorkManager,
IRepository<User, long> userRepository,
IRepository<Role> roleRepository,
IRepository<UserRole, long> userRoleRepository,
IRepository<UserLogin, long> userLoginRepository,
IRepository<UserClaim, long> userClaimRepository,
IRepository<UserPermissionSetting, long> userPermissionSettingRepository,
IRepository<UserOrganizationUnit, long> userOrganizationUnitRepository,
IRepository<OrganizationUnitRole, long> organizationUnitRoleRepository)
: base(unitOfWorkManager,
userRepository,
roleRepository,
userRoleRepository,
userLoginRepository,
userClaimRepository,
userPermissionSettingRepository,
userOrganizationUnitRepository,
organizationUnitRoleRepository
)
{
}
}
}

+ 22
- 0
BCS.BMC/src/BCS.BMC.Core/BCS.BMC.Core.csproj View File

@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<VersionPrefix>1.0.0.0</VersionPrefix>
<TargetFramework>net6.0</TargetFramework>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<AssemblyName>BCS.BMC.Core</AssemblyName>
<PackageId>BCS.BMC.Core</PackageId>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<UserSecretsId>BCS-BMC-56C2EF2F-ABD6-4EFC-AAF2-2E81C34E8FB1</UserSecretsId>
<RootNamespace>BCS.BMC</RootNamespace>
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Localization\SourceFiles\*.xml" Exclude="bin\**;obj\**;**\*.xproj;packages\**;@(EmbeddedResource)" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Abp.AutoMapper" Version="7.3.0" />
<PackageReference Include="Abp.ZeroCore.EntityFrameworkCore" Version="7.3.0" />
<PackageReference Include="Castle.Windsor.MsDependencyInjection" Version="3.4.0" />
</ItemGroup>
</Project>

+ 21
- 0
BCS.BMC/src/BCS.BMC.Core/BMC/CompanyMasters/CompanyMaster.cs View File

@ -0,0 +1,21 @@
using Abp.Domain.Entities;
using Abp.Domain.Entities.Auditing;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BCS.BMC.BMC.CompanyMasters
{
[Table("CompanyMaster")]
public class CompanyMaster : FullAuditedEntity
{
public int Id { get; set; }
public string CompanyName { get; set; }
public string Url { get; set; }
public string DomainName { get; set; }
public string SubDomainName { get; set; }
}
}

+ 20
- 0
BCS.BMC/src/BCS.BMC.Core/BMCConsts.cs View File

@ -0,0 +1,20 @@
using BCS.BMC.Debugging;
namespace BCS.BMC
{
public class BMCConsts
{
public const string LocalizationSourceName = "BMC";
public const string ConnectionStringName = "Default";
public const bool MultiTenancyEnabled = true;
/// <summary>
/// Default pass phrase for SimpleStringCipher decrypt/encrypt operations
/// </summary>
public static readonly string DefaultPassPhrase =
DebugHelper.IsDebug ? "gsKxGZ012HLL3MI5" : "81e191d3010b4e68a2ac7c637b394428";
}
}

+ 55
- 0
BCS.BMC/src/BCS.BMC.Core/BMCCoreModule.cs View File

@ -0,0 +1,55 @@
using Abp.Localization;
using Abp.Modules;
using Abp.Reflection.Extensions;
using Abp.Runtime.Security;
using Abp.Timing;
using Abp.Zero;
using Abp.Zero.Configuration;
using BCS.BMC.Authorization.Roles;
using BCS.BMC.Authorization.Users;
using BCS.BMC.Configuration;
using BCS.BMC.Localization;
using BCS.BMC.MultiTenancy;
using BCS.BMC.Timing;
namespace BCS.BMC
{
[DependsOn(typeof(AbpZeroCoreModule))]
public class BMCCoreModule : AbpModule
{
public override void PreInitialize()
{
Configuration.Auditing.IsEnabledForAnonymousUsers = true;
// Declare entity types
Configuration.Modules.Zero().EntityTypes.Tenant = typeof(Tenant);
Configuration.Modules.Zero().EntityTypes.Role = typeof(Role);
Configuration.Modules.Zero().EntityTypes.User = typeof(User);
BMCLocalizationConfigurer.Configure(Configuration.Localization);
// Enable this line to create a multi-tenant application.
Configuration.MultiTenancy.IsEnabled = BMCConsts.MultiTenancyEnabled;
// Configure roles
AppRoleConfig.Configure(Configuration.Modules.Zero().RoleManagement);
Configuration.Settings.Providers.Add<AppSettingProvider>();
Configuration.Localization.Languages.Add(new LanguageInfo("fa", "فارسی", "famfamfam-flags ir"));
Configuration.Settings.SettingEncryptionConfiguration.DefaultPassPhrase = BMCConsts.DefaultPassPhrase;
SimpleStringCipher.DefaultPassPhrase = BMCConsts.DefaultPassPhrase;
}
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(typeof(BMCCoreModule).GetAssembly());
}
public override void PostInitialize()
{
IocManager.Resolve<AppTimes>().StartupTime = Clock.Now;
}
}
}

+ 47
- 0
BCS.BMC/src/BCS.BMC.Core/Configuration/AppConfigurations.cs View File

@ -0,0 +1,47 @@
using System.Collections.Concurrent;
using Microsoft.Extensions.Configuration;
using Abp.Extensions;
using Abp.Reflection.Extensions;
namespace BCS.BMC.Configuration
{
public static class AppConfigurations
{
private static readonly ConcurrentDictionary<string, IConfigurationRoot> _configurationCache;
static AppConfigurations()
{
_configurationCache = new ConcurrentDictionary<string, IConfigurationRoot>();
}
public static IConfigurationRoot Get(string path, string environmentName = null, bool addUserSecrets = false)
{
var cacheKey = path + "#" + environmentName + "#" + addUserSecrets;
return _configurationCache.GetOrAdd(
cacheKey,
_ => BuildConfiguration(path, environmentName, addUserSecrets)
);
}
private static IConfigurationRoot BuildConfiguration(string path, string environmentName = null, bool addUserSecrets = false)
{
var builder = new ConfigurationBuilder()
.SetBasePath(path)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
if (!environmentName.IsNullOrWhiteSpace())
{
builder = builder.AddJsonFile($"appsettings.{environmentName}.json", optional: true);
}
builder = builder.AddEnvironmentVariables();
if (addUserSecrets)
{
builder.AddUserSecrets(typeof(AppConfigurations).GetAssembly(), optional: true);
}
return builder.Build();
}
}
}

+ 7
- 0
BCS.BMC/src/BCS.BMC.Core/Configuration/AppSettingNames.cs View File

@ -0,0 +1,7 @@
namespace BCS.BMC.Configuration
{
public static class AppSettingNames
{
public const string UiTheme = "App.UiTheme";
}
}

+ 16
- 0
BCS.BMC/src/BCS.BMC.Core/Configuration/AppSettingProvider.cs View File

@ -0,0 +1,16 @@
using System.Collections.Generic;
using Abp.Configuration;
namespace BCS.BMC.Configuration
{
public class AppSettingProvider : SettingProvider
{
public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
{
return new[]
{
new SettingDefinition(AppSettingNames.UiTheme, "red", scopes: SettingScopes.Application | SettingScopes.Tenant | SettingScopes.User, clientVisibilityProvider: new VisibleSettingClientVisibilityProvider())
};
}
}
}

+ 18
- 0
BCS.BMC/src/BCS.BMC.Core/Debugging/DebugHelper.cs View File

@ -0,0 +1,18 @@
namespace BCS.BMC.Debugging
{
public static class DebugHelper
{
public static bool IsDebug
{
get
{
#pragma warning disable
#if DEBUG
return true;
#endif
return false;
#pragma warning restore
}
}
}
}

+ 20
- 0
BCS.BMC/src/BCS.BMC.Core/Editions/EditionManager.cs View File

@ -0,0 +1,20 @@
using Abp.Application.Editions;
using Abp.Application.Features;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
namespace BCS.BMC.Editions
{
public class EditionManager : AbpEditionManager
{
public const string DefaultEditionName = "Standard";
public EditionManager(
IRepository<Edition> editionRepository,
IAbpZeroFeatureValueStore featureValueStore,
IUnitOfWorkManager unitOfWorkManager)
: base(editionRepository, featureValueStore, unitOfWorkManager)
{
}
}
}

+ 30
- 0
BCS.BMC/src/BCS.BMC.Core/Features/FeatureValueStore.cs View File

@ -0,0 +1,30 @@
using Abp.Application.Features;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
using Abp.MultiTenancy;
using Abp.Runtime.Caching;
using BCS.BMC.Authorization.Users;
using BCS.BMC.MultiTenancy;
namespace BCS.BMC.Features
{
public class FeatureValueStore : AbpFeatureValueStore<Tenant, User>
{
public FeatureValueStore(
ICacheManager cacheManager,
IRepository<TenantFeatureSetting, long> tenantFeatureRepository,
IRepository<Tenant> tenantRepository,
IRepository<EditionFeatureSetting, long> editionFeatureRepository,
IFeatureManager featureManager,
IUnitOfWorkManager unitOfWorkManager)
: base(
cacheManager,
tenantFeatureRepository,
tenantRepository,
editionFeatureRepository,
featureManager,
unitOfWorkManager)
{
}
}
}

+ 32
- 0
BCS.BMC/src/BCS.BMC.Core/Identity/IdentityRegistrar.cs View File

@ -0,0 +1,32 @@
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;
using BCS.BMC.Authorization;
using BCS.BMC.Authorization.Roles;
using BCS.BMC.Authorization.Users;
using BCS.BMC.Editions;
using BCS.BMC.MultiTenancy;
namespace BCS.BMC.Identity
{
public static class IdentityRegistrar
{
public static IdentityBuilder Register(IServiceCollection services)
{
services.AddLogging();
return services.AddAbpIdentity<Tenant, User, Role>()
.AddAbpTenantManager<TenantManager>()
.AddAbpUserManager<UserManager>()
.AddAbpRoleManager<RoleManager>()
.AddAbpEditionManager<EditionManager>()
.AddAbpUserStore<UserStore>()
.AddAbpRoleStore<RoleStore>()
.AddAbpLogInManager<LogInManager>()
.AddAbpSignInManager<SignInManager>()
.AddAbpSecurityStampValidator<SecurityStampValidator>()
.AddAbpUserClaimsPrincipalFactory<UserClaimsPrincipalFactory>()
.AddPermissionChecker<PermissionChecker>()
.AddDefaultTokenProviders();
}
}
}

+ 25
- 0
BCS.BMC/src/BCS.BMC.Core/Identity/SecurityStampValidator.cs View File

@ -0,0 +1,25 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using Abp.Authorization;
using BCS.BMC.Authorization.Roles;
using BCS.BMC.Authorization.Users;
using BCS.BMC.MultiTenancy;
using Microsoft.Extensions.Logging;
using Abp.Domain.Uow;
namespace BCS.BMC.Identity
{
public class SecurityStampValidator : AbpSecurityStampValidator<Tenant, Role, User>
{
public SecurityStampValidator(
IOptions<SecurityStampValidatorOptions> options,
SignInManager signInManager,
ISystemClock systemClock,
ILoggerFactory loggerFactory,
IUnitOfWorkManager unitOfWorkManager)
: base(options, signInManager, systemClock, loggerFactory, unitOfWorkManager)
{
}
}
}

+ 32
- 0
BCS.BMC/src/BCS.BMC.Core/Identity/SignInManager.cs View File

@ -0,0 +1,32 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Abp.Authorization;
using Abp.Authorization.Users;
using Abp.Configuration;
using Abp.Domain.Uow;
using BCS.BMC.Authorization.Roles;
using BCS.BMC.Authorization.Users;
using BCS.BMC.MultiTenancy;
namespace BCS.BMC.Identity
{
public class SignInManager : AbpSignInManager<Tenant, Role, User>
{
public SignInManager(
UserManager userManager,
IHttpContextAccessor contextAccessor,
UserClaimsPrincipalFactory claimsFactory,
IOptions<IdentityOptions> optionsAccessor,
ILogger<SignInManager<User>> logger,
IUnitOfWorkManager unitOfWorkManager,
ISettingManager settingManager,
IAuthenticationSchemeProvider schemes,
IUserConfirmation<User> userConfirmation)
: base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, unitOfWorkManager, settingManager, schemes, userConfirmation)
{
}
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save