diff --git a/.gitignore b/.gitignore
index 786eba6270..1faf2fac91 100644
--- a/.gitignore
+++ b/.gitignore
@@ -317,4 +317,7 @@ tempkey.jwk
# [Disabled for now] *.abppkg.analyze.json
# appsettings.secrets.json
-appsettings.secrets.json
\ No newline at end of file
+appsettings.secrets.json
+deploy/nuget-api-key.txt
+deploy/npm-auth-token.txt
+deploy/ssh-password.txt
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en-GB.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en-GB.json
index 4ea99af7e1..f64b385908 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en-GB.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en-GB.json
@@ -210,6 +210,10 @@
"Completed": "Completed",
"Failed": "Failed",
"PaymentRequestDeletionWarningMessage": "This payment request will be deleted. Do you confirm that?",
- "Payment": "Payment"
+ "Payment": "Payment",
+ "Permission:SendWelcomeEmail": "Send Welcome Email",
+ "SendWelcomeEmail": "Send Welcome Email",
+ "SendWelcomeEmailWarningMessage": "Are you sure you want to send welcome email to the organization members?",
+ "SendWelcomeEmailSuccessMessage": "Welcome email sent successfully!"
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
index 923535cfdd..f926259297 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
@@ -352,6 +352,11 @@
"Volo.AbpIo.Commercial:030008": "Purchase date can be set only when status is Purchased!",
"Volo.AbpIo.Commercial:030009": "User not found!",
"Volo.AbpIo.Commercial:030010": "To purchase the trial license, first you need to activate your trial license!",
- "Volo.AbpIo.Commercial:030011": "You cannot delete a trial license when it is purchased!"
+ "Volo.AbpIo.Commercial:030011": "You cannot delete a trial license when it is purchased!",
+ "Permission:SendWelcomeEmail": "Send Welcome Email",
+ "SendWelcomeEmail": "Send Welcome Email",
+ "SendWelcomeEmailWarningMessage": "Are you sure you want to send welcome email to the organization members?",
+ "SendWelcomeEmailSuccessMessage": "Welcome email sent successfully!",
+ "PaymentRequestId": "Payment Request Id"
}
}
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json
index 1bba0bb964..5942fca747 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json
@@ -348,6 +348,10 @@
"Volo.AbpIo.Commercial:030008": "Satın alma tarihi yalnızca durum Satın Alındı olduğunda ayarlanabilir!",
"Volo.AbpIo.Commercial:030009": "Kullanıcı bulunamadı!",
"Volo.AbpIo.Commercial:030010": "Deneme lisansını satın almak için önce deneme lisansınızı etkinleştirmeniz gerekir!",
- "Volo.AbpIo.Commercial:030011": "Satın alındığında bir deneme lisansını silemezsiniz!"
+ "Volo.AbpIo.Commercial:030011": "Satın alındığında bir deneme lisansını silemezsiniz!",
+ "Permission:SendWelcomeEmail": "Hoşgeldin Emaili Gönder",
+ "SendWelcomeEmail": "Hoşgeldin Emaili Gönder",
+ "SendWelcomeEmailWarningMessage": "Organizasyon üyelerine hoşgeldin emaili göndermek istediğinden emin misin?",
+ "SendWelcomeEmailSuccessMessage": "Hoşgeldin emaili başarıyla gönderilmiştir!"
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json
index 87b934f8c5..caa14e8d94 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en-GB.json
@@ -102,6 +102,10 @@
"InvalidFormInputs": "Please, type the valid information specified on the form.",
"DDDBookEmailBody": "Thank you. To download your book, click here.",
"FreeDDDEBook": "Free DDD E-Book",
- "CommercialNewsletterConfirmationMessage": "I agree to the Terms & Conditions and Privacy Policy."
+ "CommercialNewsletterConfirmationMessage": "I agree to the Terms & Conditions and Privacy Policy.",
+ "RemoveCurrentUserFromOrganizationWarningMessage": "You are removing yourself from your own organization. You will no longer be able to manage this organization, do you confirm?",
+ "RenewExistingOrganizationOrCreateNewOneMessage": "You can renew the license of your organization(s) by clicking the below \"Extend Now\" button(s) and thus you can extend the license expiry date by 1 year. If you continue to checkout, you will have a new organization. Do you want to continue with a new organization?",
+ "ExtendNow": "Extend Now",
+ "ContinueWithNewOrganization": "Continue with a new organization"
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
index 4996c8f361..9720354d99 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
@@ -178,7 +178,7 @@
"ChangingLicenseType": "Can I upgrade my license type later?",
"ChangingLicenseTypeExplanation": "You can upgrade to a higher license by paying the difference within your active license period. When you upgrade to a higher license plan, you get the benefits of the new plan, but the license upgrade does not change the license expiry date. Besides, you can also add new developer seats to your existing license, see \"How many developers can work on the ABP Commercial?\"",
"LicenseExtendUpgradeDiff": "What is the difference between license extend and upgrade?",
- "LicenseExtendUpgradeDiffExplanation": "Extending: By extending/renewing your license, you will continue to get premium support and get major updates for the modules and themes. Besides, you will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development.
Upgrading: By upgrading your license, you will promote to a higher license plan which will allow you to get additional benefits. See the license comparison table to check the differences between the license plans.On the other hand, when you upgrade, your license expiry date will not change!To extend your license end date, you need to extend your license.",
+ "LicenseExtendUpgradeDiffExplanation": "Extending: By extending/renewing your license, you will continue to get premium support and get major updates for the modules and themes. Besides, you will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development. When you extend your license, 1 year is added to your license expiry date. Upgrading: By upgrading your license, you will promote to a higher license plan which will allow you to get additional benefits. See the license comparison table to check the differences between the license plans.On the other hand, when you upgrade, your license expiry date will not change!To extend your license end date, you need to extend your license.",
"LicenseRenewalCost": "What is the license renewal cost after 1 year?",
"LicenseRenewalCostExplanation": "The renewal (extend) rate of all ABP Commercial perpetual licenses is {0} of the license list price. The renewal price of the standard Team License is ${1}, standard Business License is ${2} and standard Enterprise License is ${3}. If you are already a customer, log into your account to review the available renewal pricing.",
"HowDoIRenewMyLicense": "How do I renew my license?",
@@ -193,7 +193,7 @@
"WhatHappensWhenLicenseEnds": "What happens when my license period ends?",
"WhatHappensWhenLicenseEndsExplanation1": "ABP Commercial license type is perpetual license. After your license expires, you can continue developing your project. And you are not obliged to renew your license. Your license comes with a one-year Updates and Support plan out of the box. To continue to receive new features, performance enhancements, bug fixes, support and continue to use ABP Suite, make sure to renew your plan each year. When your license expires, you will not be able to get more of the following benefits;",
"WhatHappensWhenLicenseEndsExplanation2": "You can not create new solutions using the ABP Commercial, but you can continue to develop your existing applications forever.",
- "WhatHappensWhenLicenseEndsExplanation3": "You will be able to get updates for the modules and themes within your MAJOR version. For example; if you are using v3.2.0 of a module, you can still get updates for v3.x.x (v3.3.0, v3.5.2... etc.) of that module. But you cannot get updates for the next major version (like v4.x, v5.x)",
+ "WhatHappensWhenLicenseEndsExplanation3": "You will be able to get updates for the modules and themes within your MAJOR version (except RC or Preview versions). For example; if you are using v3.2.0 of a module, you can still get updates for v3.x.x (v3.3.0, v3.5.2... etc.) of that module. But you cannot get updates for the next major version (like v4.x, v5.x). Let's say, when your license expired, the latest release was v4.4.3 and the latest preview version was v5.0.0-rc.2, you can only access the v4.X.X but you cannot access the v5.X.X.",
"WhatHappensWhenLicenseEndsExplanation4": "You can not install new modules and themes added to the ABP Commercial platform after your license ends.",
"WhatHappensWhenLicenseEndsExplanation5": "You can not use the ABP Suite.",
"WhatHappensWhenLicenseEndsExplanation6": "You can not get the premium support anymore.",
@@ -394,6 +394,12 @@
"DowngradeLicensePlan": "Can I downgrade to a lower license plan in the future?",
"DowngradeLicensePlanExplanation": "You cannot downgrade your existing license plan. But you can purchase a new lower license plan and continue to your development on the new license. After you purchase a lower license, you just need to login to your new license plan via ABP CLI command: ` abp login -o `.",
"LicenseTransfer": "Can a license be transferred from one developer to another?",
- "LicenseTransferExplanation": "Yes! When you purchase a license, you become the license holder, hence you will have access to the organization management page. An organization has owner and developer roles. Owners can manage the developer seats and assign developers. Each assigned developer will login via ABP CLI command into the system and will have development and support permissions."
- }
+ "LicenseTransferExplanation": "Yes! When you purchase a license, you become the license holder, hence you will have access to the organization management page. An organization has owner and developer roles. Owners can manage the developer seats and assign developers. Each assigned developer will login via ABP CLI command into the system and will have development and support permissions.",
+ "UserOwnerDescription": "The 'Owner' of the organization is the admin of this account. He/she manages the organization by purchasing licenses, allocating developers. An 'Owner' cannot write code in the ABP Commercial projects, cannot download the ABP sample projects, or cannot ask questions on the support website. If you want to do all these, you have to add yourself as a developer too.",
+ "UserDeveloperDescription": "The 'Developers' can write code in the ABP Commercial projects, download the ABP sample projects, or ask questions on the support website. On the other hand, the 'Developers' cannot manage this organization.",
+ "RemoveCurrentUserFromOrganizationWarningMessage": "You are removing yourself from your own organization. You will no longer be able to manage this organization, do you confirm?",
+ "RenewExistingOrganizationOrCreateNewOneMessage": "You can renew the license of your organization(s) by clicking the below \"Extend Now\" button(s) and thus you can extend the license expiry date by 1 year. If you continue to checkout, you will have a new organization. Do you want to continue with a new organization?",
+ "ExtendNow": "Extend Now",
+ "ContinueWithNewOrganization": "Continue with a new organization"
+ }
}
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json
index ae472a27f0..5e93833b0d 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json
@@ -390,6 +390,10 @@
"TrialLicenseExpireMessage": "Deneme lisansını kullanıyorsunuz ve deneme lisansınızın süresi {0} tarihinde sona erecek.",
"TryForFree": "Ücretsiz deneyin",
"TrialLicenseExpiredInfo": "Deneme lisansınızın süresi doldu!",
- "CommercialNewsletterConfirmationMessage": "Şartlar, Koşullar ve Gizlilik politikasını kabul ediyorum."
+ "CommercialNewsletterConfirmationMessage": "Şartlar, Koşullar ve Gizlilik politikasını kabul ediyorum.",
+ "RemoveCurrentUserFromOrganizationWarningMessage": "Organizasyondan kendinizi kaldırıyorsunuz. Artık bu organizasyonu yönetemeyeceksiniz, onaylıyor musunuz? ",
+ "RenewExistingOrganizationOrCreateNewOneMessage": "Aşağıdaki \"Şimdi Uzat\" buton(lar)una tıklayarak organizasyon(lar)ınızın lisansını yenileyebilir ve böylece lisans geçerlilik süresini 1 yıl uzatabilirsiniz. Ödemeye devam ederseniz, yeni bir organizasyonunuz olacak. Yeni bir organizasyonla devam etmek istiyor musunuz? ",
+ "ExtendNow": "Şimdi Uzat",
+ "ContinueWithNewOrganization": "Yeni bir organizasyon ile devam et"
}
}
\ No newline at end of file
diff --git a/common.props b/common.props
index fce50ee6a9..eb7060b4ec 100644
--- a/common.props
+++ b/common.props
@@ -1,7 +1,7 @@
latest
- 5.0.0-rc.1
+ 5.0.0$(NoWarn);CS1591;CS0436https://abp.io/assets/abp_nupkg.pnghttps://abp.io/
@@ -9,28 +9,23 @@
githttps://github.com/abpframework/abp/true
-
$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb
- all
- runtime; build; native; contentfiles; analyzers
+ all
+ runtime; build; native; contentfiles; analyzers
-
-
-
- true
- Never
-
+
+
+
+
-
-
-
+
\ No newline at end of file
diff --git a/deploy/1-fetch-and-build.ps1 b/deploy/1-fetch-and-build.ps1
new file mode 100644
index 0000000000..f616c0153a
--- /dev/null
+++ b/deploy/1-fetch-and-build.ps1
@@ -0,0 +1,50 @@
+param(
+ [string]$branch,
+ [string]$newVersion
+)
+
+. ..\nupkg\common.ps1
+
+if (!$branch)
+{
+ $branch = Read-Host "Enter the branch name"
+}
+
+#----------- Read the current version from common.props -----------
+$commonPropsFilePath = resolve-path "../common.props"
+$commonPropsXmlCurrent = [xml](Get-Content $commonPropsFilePath )
+$currentVersion = $commonPropsXmlCurrent.Project.PropertyGroup.Version.Trim()
+
+if (!$newVersion)
+{
+ $newVersion = Read-Host "Current version is '$currentVersion'. Enter the new version (empty for no change) "
+ if($newVersion -eq "")
+ {
+ $newVersion = $currentVersion
+ }
+}
+
+if ($newVersion -ne $currentVersion){
+ # Update common.props for version attribute
+ $commonPropsXmlCurrent.Project.PropertyGroup.Version = $newVersion
+ $commonPropsXmlCurrent.Save( $commonPropsFilePath )
+ #check if it's updated...
+ $commonPropsXmlNew = [xml](Get-Content $commonPropsFilePath )
+ $newVersionAfterUpdate = $commonPropsXmlNew.Project.PropertyGroup.Version
+ echo "`n`nNew version updated as '$newVersionAfterUpdate' in $commonPropsFilePath`n"
+}
+
+
+################################################################
+Write-Info "Pulling ABP $branch branch from GitHub"
+cd ..
+git switch $branch
+git pull origin
+
+################################################################
+Write-Info "Building ABP repository"
+cd build
+.\build-all-release.ps1
+
+Write-Info "Completed: Building ABP repository"
+cd ..\deploy #always return to the deploy directory
\ No newline at end of file
diff --git a/deploy/2-nuget-pack.ps1 b/deploy/2-nuget-pack.ps1
new file mode 100644
index 0000000000..896377c2c3
--- /dev/null
+++ b/deploy/2-nuget-pack.ps1
@@ -0,0 +1,10 @@
+. ..\nupkg\common.ps1
+Write-Info "Creating NuGet packages"
+
+echo "`n-----=====[ CREATING NUGET PACKAGES ]=====-----`n"
+cd ..\nupkg
+powershell -File pack.ps1
+echo "`n-----=====[ CREATING NUGET PACKAGES COMPLETED ]=====-----`n"
+
+Write-Info "Completed: Creating NuGet packages"
+cd ..\deploy #always return to the deploy directory
\ No newline at end of file
diff --git a/deploy/3-nuget-push.ps1 b/deploy/3-nuget-push.ps1
new file mode 100644
index 0000000000..b2911ed11a
--- /dev/null
+++ b/deploy/3-nuget-push.ps1
@@ -0,0 +1,31 @@
+param(
+ [string]$nugetApiKey
+)
+
+. ..\nupkg\common.ps1
+
+if (!$nugetApiKey)
+{
+ #reading password from file content
+ $passwordFileName = "nuget-api-key.txt"
+ $pathExists = Test-Path -Path $passwordFileName -PathType Leaf
+ if ($pathExists)
+ {
+ $nugetApiKey = Get-Content $passwordFileName
+ echo "Using NuGet API Key from $passwordFileName ..."
+ }
+}
+
+if (!$nugetApiKey)
+{
+ $nugetApiKey = Read-Host "Enter the NuGet API KEY"
+}
+
+Write-Info "Pushing packages to NuGet"
+echo "`n-----=====[ PUSHING PACKAGES TO NUGET ]=====-----`n"
+cd ..\nupkg
+powershell -File push_packages.ps1 $nugetApiKey
+echo "`n-----=====[ PUSHING PACKAGES TO NUGET COMPLETED ]=====-----`n"
+Write-Info "Completed: Pushing packages to NuGet"
+
+cd ..\deploy #always return to the deploy directory
\ No newline at end of file
diff --git a/deploy/4-npm-publish-mvc.ps1 b/deploy/4-npm-publish-mvc.ps1
new file mode 100644
index 0000000000..7e1c0be1be
--- /dev/null
+++ b/deploy/4-npm-publish-mvc.ps1
@@ -0,0 +1,39 @@
+param(
+ [string]$npmAuthToken
+)
+
+. ..\nupkg\common.ps1
+
+if (!$npmAuthToken)
+{
+ #reading password from file content
+ $passwordFileName = "npm-auth-token.txt"
+ $pathExists = Test-Path -Path $passwordFileName -PathType Leaf
+ if ($pathExists)
+ {
+ $npmAuthToken = Get-Content $passwordFileName
+ echo "Using NPM Auth Token from $passwordFileName ..."
+ }
+}
+
+if (!$npmAuthToken)
+{
+ $npmAuthToken = Read-Host "Enter the NPM Auth Token"
+}
+
+cd ..\npm
+
+#----------------------------------------------------------------------------
+
+echo "`nSetting npmjs.org auth-token token`n"
+npm set //registry.npmjs.org/:_authToken $npmAuthToken
+
+#----------------------------------------------------------------------------
+
+Write-Info "Pushing MVC packages to NPM"
+echo "`n-----=====[ PUSHING MVC PACKS TO NPM ]=====-----`n"
+powershell -File publish-mvc.ps1
+echo "`n-----=====[ PUSHING MVC PACKS TO NPM COMPLETED ]=====-----`n"
+Write-Info "Completed: Pushing MVC packages to NPM"
+
+cd ..\deploy #always return to the deploy directory
\ No newline at end of file
diff --git a/deploy/5-npm-publish-angular.ps1 b/deploy/5-npm-publish-angular.ps1
new file mode 100644
index 0000000000..cb2e0283f5
--- /dev/null
+++ b/deploy/5-npm-publish-angular.ps1
@@ -0,0 +1,39 @@
+param(
+ [string]$npmAuthToken
+)
+
+. ..\nupkg\common.ps1
+
+if (!$npmAuthToken)
+{
+ #reading password from file content
+ $passwordFileName = "npm-auth-token.txt"
+ $pathExists = Test-Path -Path $passwordFileName -PathType Leaf
+ if ($pathExists)
+ {
+ $npmAuthToken = Get-Content $passwordFileName
+ echo "Using NPM Auth Token from $passwordFileName ..."
+ }
+}
+
+if (!$npmAuthToken)
+{
+ $npmAuthToken = Read-Host "Enter the NPM Auth Token"
+}
+
+cd ..\npm
+
+#----------------------------------------------------------------------------
+
+echo "`nSetting npmjs.org auth-token token`n"
+npm set //registry.npmjs.org/:_authToken $npmAuthToken
+
+#----------------------------------------------------------------------------
+
+Write-Info "Pushing MVC packages to NPM"
+echo "`n-----=====[ PUSHING MVC PACKS TO NPM ]=====-----`n"
+powershell -File publish-ng.ps1
+echo "`n-----=====[ PUSHING MVC PACKS TO NPM COMPLETED ]=====-----`n"
+Write-Info "Completed: Pushing MVC packages to NPM"
+
+cd ..\deploy #always return to the deploy directory
diff --git a/deploy/6-git-commit.ps1 b/deploy/6-git-commit.ps1
new file mode 100644
index 0000000000..430f476b0c
--- /dev/null
+++ b/deploy/6-git-commit.ps1
@@ -0,0 +1,14 @@
+. ..\nupkg\common.ps1
+
+cd ..
+
+Write-Info "Committing changes to GitHub"
+echo "`n-----=====[ COMMITTING CHANGES ]=====-----`n"
+git add .
+git commit -m Update_NPM_Package_Versions
+git push
+
+echo "`n-----=====[ COMMITTING CHANGES COMPLETED ]=====-----`n"
+Write-Info "Completed: Committing changes to GitHub"
+
+cd deploy #always return to the deploy directory
\ No newline at end of file
diff --git a/deploy/7-new-github-release__NOT_ACTIVE_USE_MANUAL_WAY.ps1 b/deploy/7-new-github-release__NOT_ACTIVE_USE_MANUAL_WAY.ps1
new file mode 100644
index 0000000000..87ab47cbcc
--- /dev/null
+++ b/deploy/7-new-github-release__NOT_ACTIVE_USE_MANUAL_WAY.ps1
@@ -0,0 +1,35 @@
+#THIS IS NOT BEING USED CURRENTLY. RELEASE GITHUB MANUALLY
+
+# Import the module dynamically from the PowerShell Gallery. Use CurrentUser scope to avoid having to run as admin.
+Import-Module -Name new-github-release-function.psm1
+
+# Specify the parameters required to create the release. Do it as a hash table for easier readability.
+$newGitHubReleaseParameters =
+@{
+ GitHubUsername = 'abpframework'
+ GitHubRepositoryName = 'abp'
+ GitHubAccessToken = '*******************'
+ ReleaseName = "5.0.0-rc.2"
+ TagName = "5.0.0-rc.2"
+ ReleaseNotes = "N/A"
+ #AssetFilePaths = @('C:\MyProject\Installer.exe','C:\MyProject\Documentation.md')
+ IsPreRelease = $true
+ IsDraft = $true # Set to true when testing so we don't publish a real release (visible to everyone) by accident.
+}
+
+# Try to create the Release on GitHub and save the results.
+$result = New-GitHubRelease @newGitHubReleaseParameters
+
+# Provide some feedback to the user based on the results.
+if ($result.Succeeded -eq $true)
+{
+ Write-Output "Release published successfully! View it at $($result.ReleaseUrl)"
+}
+elseif ($result.ReleaseCreationSucceeded -eq $false)
+{
+ Write-Error "The release was not created. Error message is: $($result.ErrorMessage)"
+}
+elseif ($result.AllAssetUploadsSucceeded -eq $false)
+{
+ Write-Error "The release was created, but not all of the assets were uploaded to it. View it at $($result.ReleaseUrl). Error message is: $($result.ErrorMessage)"
+}
diff --git a/deploy/8-download-release-zip.ps1 b/deploy/8-download-release-zip.ps1
new file mode 100644
index 0000000000..41de0ff6d7
--- /dev/null
+++ b/deploy/8-download-release-zip.ps1
@@ -0,0 +1,33 @@
+param(
+ [string]$password
+)
+
+. ..\nupkg\common.ps1
+
+if (!$password)
+{
+ #reading password from file content
+ $sshPasswordFileName = "ssh-password.txt"
+ $password = Get-Content $sshPasswordFileName
+ echo "Using SSH password from $sshPasswordFileName ..."
+}
+
+if (!$password)
+{
+ $password = Read-Host "Enter the Natro jenkins user password"
+}
+
+# Get the current version
+[xml]$commonPropsXml = Get-Content "../common.props"
+$version = $commonPropsXml.Project.PropertyGroup.Version
+echo "`n---===[ Current version: $version ]===---"
+
+#---------------------------------------------------------------------
+Write-Info "Downloading release zip into Natro"
+echo "`n---===[ Running SSH commands on NATRO ]===---"
+echo "`nDownloading release file into Natro..."
+
+plink.exe -ssh jenkins@94.73.164.234 -pw $password -P 22 -batch "powershell -File c:\ci\scripts\download-latest-abp-release.ps1 ${version}"
+
+Write-Info "Completed: Downloading release zip into Natro completed"
+#---------------------------------------------------------------------
diff --git a/deploy/new-github-release-function.psm1 b/deploy/new-github-release-function.psm1
new file mode 100644
index 0000000000..e81bf19e2c
--- /dev/null
+++ b/deploy/new-github-release-function.psm1
@@ -0,0 +1,347 @@
+#Requires -Version 3.0
+
+function New-GitHubRelease
+{
+<#
+ .SYNOPSIS
+ Creates a new Release for the given GitHub repository.
+
+ .DESCRIPTION
+ Uses the GitHub API to create a new Release for a given repository.
+ Allows you to specify all of the Release properties, such as the Tag, Name, Assets, and if it's a Draft or Prerelease or not.
+
+ .PARAMETER GitHubUsername
+ The username that the GitHub repository exists under.
+ e.g. For the repository https://github.com/deadlydog/New-GitHubRelease, the username is 'deadlydog'.
+
+ .PARAMETER GitHubRepositoryName
+ The name of the repository to create the Release for.
+ e.g. For the repository https://github.com/deadlydog/New-GitHubRelease, the repository name is 'New-GitHubRelease'.
+
+ .PARAMETER GitHubAccessToken
+ The Access Token to use as credentials for GitHub.
+ Access tokens can be generated at https://github.com/settings/tokens.
+ The access token will need to have the repo/public_repo permission on it for it to be allowed to create a new Release.
+
+ .PARAMETER TagName
+ The name of the tag to create at the Commitish.
+
+ .PARAMETER ReleaseName
+ The name to use for the new release.
+ If blank, the TagName will be used.
+
+ .PARAMETER ReleaseNotes
+ The text describing the contents of the release.
+
+ .PARAMETER AssetFilePaths
+ The full paths of the files to include in the release.
+
+ .PARAMETER Commitish
+ Specifies the commitish value that determines where the Git tag is created from.
+ Can be any branch or commit SHA. Unused if the Git tag already exists.
+ Default: the repository's default branch (usually master).
+
+ .PARAMETER IsDraft
+ True to create a draft (unpublished) release, false to create a published one.
+ Default: false
+
+ .PARAMETER IsPreRelease
+ True to identify the release as a prerelease. false to identify the release as a full release.
+ Default: false
+
+ .OUTPUTS
+ A hash table with the following properties is returned:
+
+ Succeeded = $true if the Release was created successfully and all assets were uploaded to it, $false if some part of the process failed.
+ ReleaseCreationSucceeded = $true if the Release was created successfully (does not include asset uploads), $false if the Release was not created.
+ AllAssetUploadsSucceeded = $true if all assets were uploaded to the Release successfully, $false if one of them failed, $null if there were no assets to upload.
+ ReleaseUrl = The URL of the new Release that was created.
+ ErrorMessage = A message describing what went wrong in the case that Succeeded is $false.
+
+ .EXAMPLE
+ # Import the module dynamically from the PowerShell Gallery. Use CurrentUser scope to avoid having to run as admin.
+ Import-Module -Name New-GitHubRelease -Scope CurrentUser
+
+ # Specify the parameters required to create the release. Do it as a hash table for easier readability.
+ $newGitHubReleaseParameters =
+ @{
+ GitHubUsername = 'deadlydog'
+ GitHubRepositoryName = 'New-GitHubRelease'
+ GitHubAccessToken = 'SomeLongHexidecimalString'
+ ReleaseName = "New-GitHubRelease v1.0.0"
+ TagName = "v1.0.0"
+ ReleaseNotes = "This release contains the following changes: ..."
+ AssetFilePaths = @('C:\MyProject\Installer.exe','C:\MyProject\Documentation.md')
+ IsPreRelease = $false
+ IsDraft = $true # Set to true when testing so we don't publish a real release (visible to everyone) by accident.
+ }
+
+ # Try to create the Release on GitHub and save the results.
+ $result = New-GitHubRelease @newGitHubReleaseParameters
+
+ # Provide some feedback to the user based on the results.
+ if ($result.Succeeded -eq $true)
+ {
+ Write-Output "Release published successfully! View it at $($result.ReleaseUrl)"
+ }
+ elseif ($result.ReleaseCreationSucceeded -eq $false)
+ {
+ Write-Error "The release was not created. Error message is: $($result.ErrorMessage)"
+ }
+ elseif ($result.AllAssetUploadsSucceeded -eq $false)
+ {
+ Write-Error "The release was created, but not all of the assets were uploaded to it. View it at $($result.ReleaseUrl). Error message is: $($result.ErrorMessage)"
+ }
+
+ Attempt to create a new Release on GitHub, and provide feedback to the user indicating if it succeeded or not.
+
+ .LINK
+ Project home: https://github.com/deadlydog/New-GitHubRelease
+
+ .NOTES
+ Name: New-GitHubRelease
+ Author: Daniel Schroeder (originally based on the script at https://github.com/majkinetor/au/blob/master/scripts/Github-CreateRelease.ps1)
+ GitHub Release API Documentation: https://developer.github.com/v3/repos/releases/#create-a-release
+ Version: 1.0.2
+#>
+ [CmdletBinding()]
+ param
+ (
+ [Parameter(Mandatory=$true,HelpMessage="The username the repository is under (e.g. deadlydog).")]
+ [string] $GitHubUsername,
+
+ [Parameter(Mandatory=$true,HelpMessage="The repository name to create the release in (e.g. Invoke-MsBuild).")]
+ [string] $GitHubRepositoryName,
+
+ [Parameter(Mandatory=$true,HelpMessage="The Acess Token to use as credentials for GitHub.")]
+ [string] $GitHubAccessToken,
+
+ [Parameter(Mandatory=$true,HelpMessage="The name of the tag to create at the the Commitish.")]
+ [string] $TagName,
+
+ [Parameter(Mandatory=$false,HelpMessage="The name of the release. If blank, the TagName will be used.")]
+ [string] $ReleaseName,
+
+ [Parameter(Mandatory=$false,HelpMessage="Text describing the contents of the tag.")]
+ [string] $ReleaseNotes,
+
+ [Parameter(Mandatory=$false,HelpMessage="The full paths of the files to include in the release.")]
+ [string[]] $AssetFilePaths,
+
+ [Parameter(Mandatory=$false, HelpMessage="Specifies the commitish value that determines where the Git tag is created from. Can be any branch or commit SHA. Unused if the Git tag already exists. Default: the repository's default branch (usually master).")]
+ [string] $Commitish,
+
+ [Parameter(Mandatory=$false,HelpMessage="True to create a draft (unpublished) release, false to create a published one. Default: false")]
+ [bool] $IsDraft = $false,
+
+ [Parameter(Mandatory=$false,HelpMessage="True to identify the release as a prerelease. false to identify the release as a full release. Default: false")]
+ [bool] $IsPreRelease = $false
+ )
+
+ BEGIN
+ {
+ # Turn on Strict Mode to help catch syntax-related errors.
+ # This must come after a script's/function's param section.
+ # Forces a function to be the first non-comment code to appear in a PowerShell Script/Module.
+ Set-StrictMode -Version Latest
+
+ Set-SecurityProtocolForThread
+
+ [string] $NewLine = [Environment]::NewLine
+
+ if ([string]::IsNullOrEmpty($ReleaseName))
+ {
+ $ReleaseName = $TagName
+ }
+
+ # Ensure that all of the given asset file paths to upload are valid.
+ Test-AllFilePathsAndThrowErrorIfOneIsNotValid $AssetFilePaths
+ }
+
+ END { }
+
+ PROCESS
+ {
+ # Create the hash table to return, with default values.
+ $result = @{}
+ $result.Succeeded = $false
+ $result.ReleaseCreationSucceeded = $false
+ $result.AllAssetUploadsSucceeded = $false
+ $result.ReleaseUrl = $null
+ $result.ErrorMessage = $null
+
+ [bool] $thereAreNoAssetsToIncludeInTheRelease = ($AssetFilePaths -eq $null) -or ($AssetFilePaths.Count -le 0)
+ if ($thereAreNoAssetsToIncludeInTheRelease)
+ {
+ $result.AllAssetUploadsSucceeded = $null
+ }
+
+ $authHeader =
+ @{
+ Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($GitHubAccessToken + ":x-oauth-basic"))
+ }
+
+ $releaseData =
+ @{
+ tag_name = $TagName
+ target_commitish = $Commitish
+ name = $ReleaseName
+ body = $ReleaseNotes
+ draft = $IsDraft
+ prerelease = $IsPreRelease
+ }
+
+ $createReleaseWebRequestParameters =
+ @{
+ Uri = "https://api.github.com/repos/$GitHubUsername/$GitHubRepositoryName/releases"
+ Method = 'POST'
+ Headers = $authHeader
+ ContentType = 'application/json'
+ Body = (ConvertTo-Json $releaseData -Compress)
+ }
+
+ try
+ {
+ Write-Verbose "Sending web request to create the new Release..."
+ $createReleaseWebRequestResults = Invoke-RestMethodAndThrowDescriptiveErrorOnFailure $createReleaseWebRequestParameters
+ }
+ catch
+ {
+ $result.ReleaseCreationSucceeded = $false
+ $result.ErrorMessage = $_.Exception.Message
+ return $result
+ }
+
+ $result.ReleaseCreationSucceeded = $true
+ $result.ReleaseUrl = $createReleaseWebRequestResults.html_url
+
+ if ($thereAreNoAssetsToIncludeInTheRelease)
+ {
+ $result.Succeeded = $true
+ return $result
+ }
+
+ # Upload Url has template parameters on the end (e.g. ".../assets{?name,label}"), so remove them.
+ [string] $urlToUploadFilesTo = $createReleaseWebRequestResults.upload_url -replace '{.+}'
+
+ try
+ {
+ Write-Verbose "Uploading asset files to the new release..."
+ Send-FilesToGitHubRelease -filePathsToUpload $AssetFilePaths -urlToUploadFilesTo $urlToUploadFilesTo -authHeader $authHeader
+ }
+ catch
+ {
+ $result.AllAssetUploadsSucceeded = $false
+ $result.ErrorMessage = $_.Exception.Message
+ return $result
+ }
+
+ $result.AllAssetUploadsSucceeded = $true
+ $result.Succeeded = $true
+ return $result
+ }
+}
+
+function Send-FilesToGitHubRelease([string[]] $filePathsToUpload, [string] $urlToUploadFilesTo, $authHeader)
+{
+ [int] $numberOfFilesToUpload = $filePathsToUpload.Count
+ [int] $numberOfFilesUploaded = 0
+ $filePathsToUpload | ForEach-Object `
+ {
+ $filePath = $_
+ $fileName = Get-Item $filePath | Select-Object -ExpandProperty Name
+
+ $uploadAssetWebRequestParameters =
+ @{
+ # Append the name of the file to the upload url.
+ Uri = $urlToUploadFilesTo + "?name=$fileName"
+ Method = 'POST'
+ Headers = $authHeader
+ ContentType = 'application/zip'
+ InFile = $filePath
+ }
+
+ $numberOfFilesUploaded = $numberOfFilesUploaded + 1
+ Write-Verbose "Uploading asset $numberOfFilesUploaded of $numberOfFilesToUpload, '$filePath'."
+ Invoke-RestMethodAndThrowDescriptiveErrorOnFailure $uploadAssetWebRequestParameters > $null
+ }
+}
+
+function Test-AllFilePathsAndThrowErrorIfOneIsNotValid([string[]] $filePaths)
+{
+ foreach ($filePath in $filePaths)
+ {
+ [bool] $fileWasNotFoundAtPath = [string]::IsNullOrEmpty($filePath) -or !(Test-Path -Path $filePath -PathType Leaf)
+ if ($fileWasNotFoundAtPath)
+ {
+ throw "There is no file at the specified path, '$filePath'."
+ }
+ }
+}
+
+function Invoke-RestMethodAndThrowDescriptiveErrorOnFailure($requestParametersHashTable)
+{
+ $requestDetailsAsNicelyFormattedString = Convert-HashTableToNicelyFormattedString $requestParametersHashTable
+ Write-Verbose "Making web request with the following parameters:$NewLine$requestDetailsAsNicelyFormattedString"
+
+ try
+ {
+ $webRequestResult = Invoke-RestMethod @requestParametersHashTable
+ }
+ catch
+ {
+ [Exception] $exception = $_.Exception
+
+ [string] $errorMessage = Get-RestMethodExceptionDetailsOrNull -restMethodException $exception
+ if ([string]::IsNullOrWhiteSpace($errorMessage))
+ {
+ $errorMessage = $exception.ToString()
+ }
+
+ throw "An unexpected error occurred while making web request:$NewLine$errorMessage"
+ }
+
+ Write-Verbose "Web request returned the following result:$NewLine$webRequestResult"
+ return $webRequestResult
+}
+
+function Get-RestMethodExceptionDetailsOrNull([Exception] $restMethodException)
+{
+ try
+ {
+ $responseDetails = @{
+ ResponseUri = $exception.Response.ResponseUri
+ StatusCode = $exception.Response.StatusCode
+ StatusDescription = $exception.Response.StatusDescription
+ ErrorMessage = $exception.Message
+ }
+ [string] $responseDetailsAsNicelyFormattedString = Convert-HashTableToNicelyFormattedString $responseDetails
+
+ [string] $errorInfo = "Request Details:" + $NewLine + $requestDetailsAsNicelyFormattedString
+ $errorInfo += $NewLine
+ $errorInfo += "Response Details:" + $NewLine + $responseDetailsAsNicelyFormattedString
+ return $errorInfo
+ }
+ catch
+ {
+ return $null
+ }
+}
+
+function Convert-HashTableToNicelyFormattedString($hashTable)
+{
+ [string] $nicelyFormattedString = $hashTable.Keys | ForEach-Object `
+ {
+ $key = $_
+ $value = $hashTable.$key
+ " $key = $value$NewLine"
+ }
+ return $nicelyFormattedString
+}
+
+function Set-SecurityProtocolForThread
+{
+ [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12 -bor [System.Net.SecurityProtocolType]::Tls11 -bor [System.Net.SecurityProtocolType]::Tls
+}
+
+Export-ModuleMember -Function New-GitHubRelease
\ No newline at end of file
diff --git a/deploy/plink.exe b/deploy/plink.exe
new file mode 100644
index 0000000000..9372972ea1
Binary files /dev/null and b/deploy/plink.exe differ
diff --git a/deploy/readme.md b/deploy/readme.md
new file mode 100644
index 0000000000..f814b77016
--- /dev/null
+++ b/deploy/readme.md
@@ -0,0 +1,31 @@
+# ABP Framework Release Steps
+
+## 1-) Set your secret keys
+
+The following files are ignored from GitHub, therefore you need to create these files in your local environment.
+
+* create `npm-auth-token.txt` file in this folder and write the npmjs.org auth token. it's a GUID type.
+* create `nuget-api-key.txt` file this folder and write your nuget.org API key.
+* create `ssh-password.txt` file and write `jenkins` user SSH password.
+
+## 2-) Run the commands
+
+The commands are the followings:
+
+- **1-fetch-and-build.ps1**
+ - You need to enter the branch name. eg: `rel-5.0`
+ - You need to enter the new version for this release. eg: `5.0.0-rc.2`
+- **2-nuget-pack.ps1**
+- **3-nuget-push.ps1**
+- **4-npm-publish.ps1**
+- **5-git-commit.ps1**
+- **6-new-github-release.ps1**
+ - Note: The step 6 is not active. You need to manually make GitHub release from https://github.com/abpframework/abp/releases/new
+ * create tag. eg: `5.0.0-rc.1`
+ * create the release from the related branch eg: `rel-5.0`
+ * enter the release title. eg: `5.0.0-rc.1`
+ * auto generate release notes and delete merge lines
+ * check `This is a pre-release` if it's a RC version.
+ * click `Publish release` button.
+- **7-download-release-zip.ps1**
+
diff --git a/docs/en/API/Dynamic-CSharp-API-Clients.md b/docs/en/API/Dynamic-CSharp-API-Clients.md
index b71e6b88b9..31032e6392 100644
--- a/docs/en/API/Dynamic-CSharp-API-Clients.md
+++ b/docs/en/API/Dynamic-CSharp-API-Clients.md
@@ -74,7 +74,7 @@ public class MyClientAppModule : AbpModule
`RemoteServices` section in the `appsettings.json` file is used to get remote service address by default. Simplest configuration is shown below:
-````
+```json
{
"RemoteServices": {
"Default": {
@@ -82,7 +82,7 @@ public class MyClientAppModule : AbpModule
}
}
}
-````
+```
See the "AbpRemoteServiceOptions" section below for more detailed configuration.
@@ -203,4 +203,4 @@ public override void PreConfigureServices(ServiceConfigurationContext context)
}
````
-This example uses the [Microsoft.Extensions.Http.Polly](https://www.nuget.org/packages/Microsoft.Extensions.Http.Polly) package. You also need to import the `Polly` namespace (`using Polly;`) to be able to use the `WaitAndRetryAsync` method.
\ No newline at end of file
+This example uses the [Microsoft.Extensions.Http.Polly](https://www.nuget.org/packages/Microsoft.Extensions.Http.Polly) package. You also need to import the `Polly` namespace (`using Polly;`) to be able to use the `WaitAndRetryAsync` method.
diff --git a/docs/en/Blog-Posts/2021-12-15 v5_0_Release_Stable/POST.md b/docs/en/Blog-Posts/2021-12-15 v5_0_Release_Stable/POST.md
new file mode 100644
index 0000000000..329db94af3
--- /dev/null
+++ b/docs/en/Blog-Posts/2021-12-15 v5_0_Release_Stable/POST.md
@@ -0,0 +1,47 @@
+# ABP.IO Platform 5.0 Final Has Been Released!
+
+[ABP Framework](https://abp.io/) and [ABP Commercial](https://commercial.abp.io/) 5.0 versions have been released today.
+
+## What's new with 5.0?
+
+Since all the new features are already explained in details with the [5.0 RC.1 Announcement Post](https://blog.abp.io/abp/ABP-IO-Platform-5.0-RC-1-Has-Been-Released), I will not repeat all the details again. See the [RC Blog Post](https://blog.abp.io/abp/ABP-IO-Platform-5.0-RC-1-Has-Been-Released) for all the features and enhancements.
+
+## Getting started with 5.0
+
+### Creating new solutions
+
+You can create a new solution with the ABP Framework version 5.0 by either using the `abp new` command or using the **direct download** tab on the [get started page](https://abp.io/get-started).
+
+Type the following command in a command-line terminal to install the ABP CLI version 5.0:
+
+````bash
+dotnet tool install -g Volo.Abp.Cli --version 5.0.0
+````
+
+To upgrade your existing ABP CLI installation:
+
+````bash
+dotnet tool update -g Volo.Abp.Cli --version 5.0.0
+````
+
+Then you can create a new solution using the `abp new` command:
+
+````bash
+abp new Acme.BookStore
+````
+
+> See the [getting started document](https://docs.abp.io/en/abp/latest/Getting-Started) for details.
+
+### Upgrading existing solutions
+
+Check [the migration guide](https://docs.abp.io/en/abp/latest/Migration-Guides/Abp-5_0) for the applications with the version 4.x upgrading to the version 5.0. Also see [the upgrading guide](https://docs.abp.io/en/abp/latest/Upgrading) to understand how to update existing solutions.
+
+## ABP Community Talks 2021.12
+
+
+
+As the core ABP development team, we've decided to organize monthly live meetings with the ABP community. The first live meeting will be at **December 16, 2021, 17:00 (UTC)** on YouTube. ABP core team members will present some of the new features coming with ABP 5.0.
+
+**Join this event on the Kommunity platform: https://kommunity.com/volosoft/events/abp-community-talks-4afca9c9**
+
+See you in the event!
diff --git a/docs/en/Blog-Posts/2021-12-15 v5_0_Release_Stable/community-talks.png b/docs/en/Blog-Posts/2021-12-15 v5_0_Release_Stable/community-talks.png
new file mode 100644
index 0000000000..4056d1afb8
Binary files /dev/null and b/docs/en/Blog-Posts/2021-12-15 v5_0_Release_Stable/community-talks.png differ
diff --git a/docs/en/CLI.md b/docs/en/CLI.md
index b8f69b1ee4..7db562a66e 100644
--- a/docs/en/CLI.md
+++ b/docs/en/CLI.md
@@ -29,6 +29,7 @@ Here, the list of all available commands before explaining their details:
* **`help`**: Shows help on the usage of the ABP CLI.
* **`new`**: Generates a new solution based on the ABP [startup templates](Startup-Templates/Index.md).
* **`update`**: Automatically updates all ABP related NuGet and NPM packages in a solution.
+* **`clean`**: Deletes all `BIN` and `OBJ` folders in the current folder.
* **`add-package`**: Adds an ABP package to a project.
* **`add-module`**: Adds a [multi-package application module](https://docs.abp.io/en/abp/latest/Modules/Index) to a solution.
* **`list-modules`**: Lists names of open-source application modules.
@@ -145,6 +146,17 @@ abp update [options]
* `--check-all`: Check the new version of each package separately. Default is `false`.
* `--version` or `-v`: Specifies the version to use for update. If not specified, latest version is used.
+### clean
+
+Deletes all `BIN` and `OBJ` folders in the current folder.
+
+Usage:
+
+````bash
+abp clean
+````
+
+
### add-package
Adds an ABP package to a project by,
diff --git a/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md b/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md
index a1c63529a2..c82365efee 100644
--- a/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md
+++ b/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md
@@ -12,7 +12,7 @@ The most common question is;
The answer is, **you don't**. ABP Angular application is integrated with the backend (HttpApi.Host project) where it loads the configurations, **permissions** etc. For none-tiered angular applications, **HttpApi.Host** project also has IdentityServer4 embedded; also serving as **Authorization Server**. Angular application authentication flow is shown below.
-
+
> What if I want Azure AD as my authorization server and not IdentityServer?
@@ -80,7 +80,7 @@ Navigate to Manage Azure Active Directory in [azure portal](https://portal.azure
Enter a name for your application and **App.SelfUrl** + **AzureAd.CallbackPath** as redirect uri then register.
-
+
Now navigate to **Authentication** on the left menu and enable **ID tokens**.
diff --git a/docs/en/Community-Articles/2021-06-17-Using-Elsa-Workflow-with-ABP-Framework/POST.md b/docs/en/Community-Articles/2021-06-17-Using-Elsa-Workflow-with-ABP-Framework/POST.md
index 1a07d744e7..5880406ffb 100644
--- a/docs/en/Community-Articles/2021-06-17-Using-Elsa-Workflow-with-ABP-Framework/POST.md
+++ b/docs/en/Community-Articles/2021-06-17-Using-Elsa-Workflow-with-ABP-Framework/POST.md
@@ -241,8 +241,9 @@ private void ConfigureElsa(ServiceConfigurationContext context, IConfiguration c
.WithExposedHeaders("Content-Disposition"))
);
- //register controllers inside elsa
- context.Services.AddAssemblyOf();
+ //Uncomment the below line if your abp version is lower than v4.4 to register controllers of Elsa .
+ //See https://github.com/abpframework/abp/pull/9299 (we will no longer need to specify this line of code from v4.4)
+ // context.Services.AddAssemblyOf();
//Disable antiforgery validation for elsa
Configure(options =>
@@ -269,11 +270,7 @@ public override void OnApplicationInitialization(ApplicationInitializationContex
}
```
-* In here we've specified the Elsa Server Api's assembly by using the `AddAssemblyOf<>` extension method to register the required services (controllers). These services required for the dashboard (if we create a workflow by using **Elsa Workflow Designer** it calls some services under the hook, therefore we need to be assured about these services get registered).
-
-* With [v4.4](https://github.com/abpframework/abp/pull/9299), we will no longer need to specify this line of code.
-
-> **Note:** `AddAssemblyOf<>` extension method can help you to register all your services by convention. You can check [here](https://docs.abp.io/en/abp/latest/Dependency-Injection#conventional-registration) for more information about conventional registration.
+* These services required for the dashboard.
* We don't need to register our workflows one by one anymore. Because now we use `.AddWorkflowsFrom()`, and this registers workflows on our behalf.
@@ -371,12 +368,14 @@ namespace ElsaDemo.Permissions
-
+
-
+
+
+