Browse Source

Merge branch 'dev' into auto-merge/rel-7-1/1847

pull/16167/head
Alper Ebiçoğlu 3 years ago
committed by GitHub
parent
commit
e4c0d81139
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      README.md
  2. 1
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
  3. 16
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json
  4. 1
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json
  5. 6
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
  6. 1
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json
  7. 1
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json
  8. 63
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json
  9. 1
      abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json
  10. 2
      abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json
  11. 30
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json
  12. 3
      build/common.ps1
  13. 15
      delete-bin-obj.ps1
  14. BIN
      docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/abp-essential-features.png
  15. BIN
      docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/abp-try-now.png
  16. BIN
      docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/cover.png
  17. BIN
      docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/cross-platform.png
  18. BIN
      docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/ddd-book.png
  19. BIN
      docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/developer-focused.png
  20. BIN
      docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/features.png
  21. BIN
      docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/key-features.png
  22. BIN
      docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/module-layers-and-packages.png
  23. BIN
      docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/open-source.png
  24. 85
      docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/post.md
  25. BIN
      docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/cover.png
  26. 4
      docs/en/Migration-Guides/Abp-7_1.md
  27. 13
      docs/en/Migration-Guides/Abp-7_2.md
  28. 1
      docs/en/Migration-Guides/Index.md
  29. 13
      docs/en/Modules/Cms-Kit/Comments.md
  30. 10
      docs/en/Themes/LeptonXLite/Angular.md
  31. 8
      framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs
  32. 3
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj
  33. 8
      framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs
  34. 2
      framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor
  35. 1
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor
  36. 29
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor.cs
  37. 2
      framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj
  38. 9
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs
  39. 2
      framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj
  40. 4
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs
  41. 11
      modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs
  42. 5
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CmsKitCommentOptions.cs
  43. 3
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json
  44. 2
      modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs
  45. 60
      modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs
  46. 2
      modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebAutoMapperProfile.cs
  47. 4
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicCommentsController.cs
  48. 2
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs
  49. 21
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/CmsKitApplicationTestModule.cs
  50. 33
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs
  51. 4
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.css
  52. 2
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.min.css
  53. 6
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.scss
  54. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs
  55. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json
  56. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json
  57. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json
  58. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json
  59. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json
  60. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json
  61. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json
  62. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json
  63. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json
  64. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json
  65. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json
  66. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json
  67. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json
  68. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json
  69. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json
  70. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json
  71. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json
  72. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json
  73. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json
  74. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json
  75. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json
  76. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json
  77. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json
  78. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json
  79. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json
  80. 1
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json
  81. 23
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserDelegationRepository.cs
  82. 41
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserDelegation.cs
  83. 61
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserDelegationManager.cs
  84. 1
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs
  85. 52
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserDelegationRepository.cs
  86. 2
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs
  87. 2
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs
  88. 9
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs
  89. 2
      modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs
  90. 5
      modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs
  91. 1
      modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs
  92. 2
      modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs
  93. 52
      modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserDelegationRepository.cs
  94. 69
      modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserDelegationManager_Tests.cs
  95. 6
      modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/IdentityUserDelegationepository_Tests.cs
  96. 9
      modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/IdentityUserDelegationepository_Tests.cs
  97. 30
      modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs
  98. 55
      modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserDelegationepository_Tests.cs
  99. 2
      modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Pages/Index.cshtml
  100. 5
      modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230404033745_Initial.Designer.cs

4
README.md

@ -9,7 +9,7 @@
[![ABP Discord server](https://img.shields.io/discord/951497912645476422?label=Discord)](https://discord.gg/abp)
ABP Framework is a complete **infrastructure** based on the **ASP.NET Core** to create **modern web applications** and **APIs** by following the software development **best practices** and the **latest technologies**. Check out https://abp.io
ABP Framework is a complete **infrastructure** based on **ASP.NET Core** to create **modern web applications** and **APIs** by following the software development **best practices** and the **latest technologies**. Check out https://abp.io
## Getting Started
@ -49,7 +49,7 @@ ABP provides a **full stack developer experience**.
<img src="docs/en/images/ddd-microservice-simple.png">
ABP offers a complete, **modular** and **layered** software architecture based on **[Domain Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design)** principles and patterns. It also provides the necessary infrastructure and guiding to [implement this architecture](https://docs.abp.io/en/abp/latest/Domain-Driven-Design-Implementation-Guide).
ABP offers a complete, **modular** and **layered** software architecture based on **[Domain Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design)** principles and patterns. It also provides the necessary infrastructure and guidance to [implement this architecture](https://docs.abp.io/en/abp/latest/Domain-Driven-Design-Implementation-Guide).
ABP Framework is suitable for **[microservice solutions](https://docs.abp.io/en/abp/latest/Microservice-Architecture)** as well as monolithic applications.

1
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json

@ -28,6 +28,7 @@
"Volo.AbpIo.Domain:030011": "You cannot delete a trial license when it is purchased!",
"Volo.AbpIo.Domain:030012": "A user is entitled to have only 1 free trial period. You already used your trial license.",
"Volo.AbpIo.Domain:030013": "A user with an active license cannot start a trial license.",
"Volo.AbpIo.Domain:040000": "Telemetry already exists!.",
"Volo.AbpIo.Domain:070000": "The organization name can only contain latin letters, numbers, dots and hyphens!",
"Volo.AbpIo.Domain:070001": "The company name can only contain latin letters, numbers, dots, space and hyphens!",
"WantToLearn?": "Want to learn?",

16
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json

@ -22,17 +22,13 @@
"Features": "Özellikler",
"GetStarted": "Başlayın",
"Documents": "Dokümanlar",
"Community": "Topluluk",
"ContributionGuide": "Katkı Rehberi",
"Blog": "Blog",
"Commercial": "Ticari",
"MyAccount": "Hesabım",
"Permission:License": "Lisans",
"Permission:UserInfo": "kullanıcı bilgisi",
"SeeDocuments": "Dokümanlara Göz Atın",
"Samples": "örnekler",
"Framework": "Çerçeve",
"Support": "Destek",
"Samples": "Örnekler",
"FreeDDDBook": "Ücretsiz DDD Kitabı",
"New": "Yeni",
"Volo.AbpIo.Domain:020005": "Lisans uzatma yılı {MinExtendLicenseYear} yıldan az {MaxExtendLicenseYear} yıldan fazla olamaz.",
@ -96,7 +92,7 @@
"MySupportQuestions": "Destek Sorularım",
"MyProfile": "Profilim",
"Logout": "Çıkış Yap",
"Home": "Ev",
"Home": "Ana Sayfa",
"Posts": "Gönderiler",
"JoinTheABPCommunity": "ABP Topluluğuna Katılın",
"SubmitYourPost": "Gönderinizi Gönderin",
@ -166,6 +162,12 @@
"ABPCommunityTalks": "ABP Topluluk Konuşmaları",
"ABPCommunityPosts": "ABP Topluluk Gönderileri",
"WelcomeFallCampaign": "Hoş Geldin Sonbahar Kampanyası!",
"GiveAwayForNewPurchases": "Yeni alımlar için Uygulama Geliştirme Sınıfı Eğitimi hediye edilecektir!"
"GiveAwayForNewPurchases": "Yeni alımlar için Uygulama Geliştirme Sınıfı Eğitimi hediye edilecektir!",
"ExploreTheContentsCreatedByTheCoreABPTeamAndTheABPCommunity": "ABP ekibi ve ABP topluluğu tarafından oluşturulan içerikleri keşfedin.",
"CheckAllCommunityTalks": "Tüm Topluluk Gönderilerine Göz Atın",
"ExploreTheBook": "Kitabı Keşfedin",
"ExploreTheEBook": "E-Kitabı Keşfedin",
"LatestVideos": "Son Videolar",
"Videos": "Videolar"
}
}

1
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json

@ -515,6 +515,7 @@
"Pricing_Page_Testimonial_3": "نحن نحب ABP. ليس علينا كتابة كل شيء من الصفر. نبدأ من الميزات الجاهزة ونركز فقط على ما نحتاج حقًا إلى كتابته. أيضًا ، ABP مصمم جيدًا والشفرة عالية الجودة مع عدد أقل من الأخطاء. إذا كان علينا كتابة كل ما نحتاجه بمفردنا ، فقد نضطر إلى قضاء سنوات. مرة أخرى نحب أن الإصدار الجديد ، أو إصلاح المشكلة ، أو التحسين يأتي قريبًا جدًا كل أسبوعين. نحن لا ننتظر طويلا.",
"Pricing_Page_Testimonial_4": "ABP التجاري منتج رائع يوصى به. تسويق المنتجات التجارية لعملائنا في منصة واحدة قابلة للتكوين. البداية السريعة التي يوفرها إطار العمل والأدوات لأي فريق تستحق كل سنت. كانت ABP هي الأنسب لاحتياجاتنا.",
"Pricing_Page_Testimonial_5": "إطار عمل ABP ليس مجرد إطار عمل ، ولكنه أيضًا دليل لتطوير / إدارة المشروع ، لأنه يوفر تدريب DDD و GenericRepository و DI و Microservice و Modularity. حتى إذا كنت لن تستخدم الإطار نفسه ، يمكنك تطوير نفسك باستخدام docs.abp.io المُعد جيدًا ومهنيًا (OpenIdict و Redis و Quartz وما إلى ذلك). نظرًا لأن العديد من الأشياء مبنية مسبقًا ، فإنها تقصر وقت تطوير المشروع بشكل كبير (مثل صفحة تسجيل الدخول ، ومعالجة الاستثناءات ، وتصفية البيانات ، والبذر ، وتسجيل التدقيق ، والترجمة ، ووحدة التحكم في واجهة برمجة التطبيقات التلقائية ، وما إلى ذلك). كمثال من تطبيقنا ، لقد استخدمت Local Event Bus للتحكم في المخزون. لذلك ، أنا قادر على إدارة حركات الأوامر عن طريق كتابة معالج الأسهم. إنه لأمر رائع ألا تضيع الوقت من أجل CreationTime ، CreatorId. يتم ملؤها تلقائيًا.",
"Pricing_Page_Testimonial_6": "إطار عمل ABP هو إطار عمل جيد ولكنه يحتاج إلى وقت لفهم الطبقات والفئات والمكتبات المختلفة التي يستخدمها (خاصة ABP). قضيت الكثير من الوقت في قراءة قاعدة الكود ، لكن ABP Commercial توفر لنا الوقت لإنشاء كيانات تخصص المشروع (AR) والمستودع المرتبط بكل منها. أعجبني أيضًا أن النهج المستخدم في ABP ناضج جدًا ، ونعلم أنه يعتمد على DDD و monolith.",
"AbpBookDownloadArea_ClaimYourEBook": "احصل على كتاب <span class='gradient-framework'>إتقان إطار عمل ABP</span> الالكتروني الخاص بك",
"AddMemberModal_Warning_1": "اذا كان <strong>المستخدم</strong> الذي تحاول اضافته لا يوجد في النظام, يرجى مطالبة عضو فريقك بالتسجيل في <a href='{0}/Account/Register'>{0}</a> ومشاركة اسم المستخدم الخاص بحسابه معك.",
"MyOrganizations_Detail_WelcomeMessage": "مرحبًا بك في مؤسستك، {0}",

6
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json

@ -537,6 +537,7 @@
"Pricing_Page_Testimonial_3": "We love ABP. We don't have to write everything from scratch. We start from out-of-the-box features and just focus on what we really need to write. Also, ABP is well-architected and the code is high quality with fewer bugs. If we would have to write everything we needed on our own, we might have to spend years. Once more things we like is that the new version, or issue fixing, or improvement come out very soon every other week. We don't wait too long.",
"Pricing_Page_Testimonial_4": "ABP Commercial is a fantastic product would recommend. Commercial products to market for our customers in a single configurable platform. The jump start that the framework and tooling provide any team is worth every cent. ABP Commercial was the best fit for our needs.",
"Pricing_Page_Testimonial_5": "ABP Framework is not only a framework, but it is also a guide for project development/management, because it provides DDD, GenericRepository, DI, Microservice, and Modularity training. Even if you are not going to use the framework itself, you can develop yourself with docs.abp.io which is well and professionally prepared (OpenIddict, Redis, Quartz etc.). Because many things are pre-built, it shortens project development time significantly (Such as login page, exception handling, data filtering, seeding, audit logging, localization, auto API controller etc.). As an example from our application, I have used Local Event Bus for stock control. So, I am able to manage order movements by writing stock handler. It is wonderful not to lose time for CreationTime, CreatorId. They are being filled automatically.",
"Pricing_Page_Testimonial_6": "ABP Framework is a good framework but it needs time to understand the different layers, classes, and libraries it used (specially ABP). I spent a lot of time reading the code base, but ABP Commercial save us time to create the project specialty entities (AR) and the repository linked to each of them. I liked also the approach used in ABP is very mature, we know is based on DDD and monolith.",
"AbpBookDownloadArea_ClaimYourEBook": "Claim your <span class='gradient-framework'>Mastering ABP Framework</span> E-Book",
"AddMemberModal_Warning_1": "If the <strong>username</strong> you are trying to add doesn't exist in the system, please ask your team member to register on <a href='{0}/Account/Register'>{0}</a> and share the username of his/her account with you.",
"MyOrganizations_Detail_WelcomeMessage": "Welcome to your organization, {0}",
@ -759,6 +760,7 @@
"ViewLiveDemo": "View Live Theme Demo",
"GetLeptonX": "Get LeptonX Now",
"SeeLeptonXDocumentation": "See LeptonX Documentation",
"SeeLeptonDocumentation": "See Lepton Documentation",
"SimplifiedMenu": "Simplified menu",
"SimplifiedMenuDescription": "You can easily find the page you are looking for by filtering the menu",
"YourFavoritePages": "Your favorite pages at your reach",
@ -825,6 +827,8 @@
"PrivacyPolicyPageTitle": "Privacy Policy - Cookie Policy",
"TermsConditionsPageTitle": "Terms and Conditions",
"TrainingsPageTitle": "ABP Training Packages",
"ModulesPageTitle": "ABP Pre-Built Application Modules"
"ModulesPageTitle": "ABP Pre-Built Application Modules",
"Volo.AbpIo.Commercial:040001": "API Access Key is incorrect.",
"GetLepton": "Get Lepton Now"
}
}

1
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json

@ -537,6 +537,7 @@
"Pricing_Page_Testimonial_3": "Rakastamme ABP:tä. Meidän ei tarvitse kirjoittaa kaikkea tyhjästä. Aloitamme valmiista ominaisuuksista ja keskitymme vain siihen, mitä todella tarvitsemme kirjoittaa. Lisäksi ABP on hyvin suunniteltu ja koodi on korkealaatuista ja siinä on vähemmän bugeja. Jos joutuisimme kirjoittamaan kaiken tarvitsemamme itse, joudumme ehkä viettämään vuosia. Jälleen kerran pidämme siitä, että uusi versio, ongelmankorjaus tai parannus ilmestyy hyvin pian joka toinen viikko. Emme odota liian kauan.",
"Pricing_Page_Testimonial_4": "ABP Commercial on loistava tuote, jota suosittelen. Kaupalliset tuotteet markkinoille asiakkaillemme yhdellä konfiguroitavalla alustalla. Kehyksen ja työkalujen tarjoama aloitus jokaiselle joukkueelle on jokaisen sentin arvoinen. ABP Commercial sopi parhaiten tarpeisiimme.",
"Pricing_Page_Testimonial_5": "ABP Framework ei ole vain viitekehys, vaan se on myös opas projektin kehittämiseen/hallintaan, koska se tarjoaa DDD-, GenericRepository-, DI-, Microservice- ja Modularity-koulutusta. Vaikka et itse käyttäisikään kehystä, voit kehittää itseäsi docs.abp.io:lla, joka on hyvin ja ammattimaisesti valmisteltu (OpenIddict, Redis, Quartz jne.). Koska monet asiat on rakennettu valmiiksi, se lyhentää projektin kehitysaikaa merkittävästi (kuten kirjautumissivu, poikkeusten käsittely, tietojen suodatus, kylvö, tarkastusloki, lokalisointi, automaattinen API-ohjain jne.). Esimerkkinä sovelluksestamme olen käyttänyt paikallista tapahtumaväylää varastonhallintaan. Pystyn siis hallitsemaan tilausliikkeitä kirjoittamalla varastokäsittelijäksi. On hienoa olla hukkaamatta aikaa CreationTimelle, CreatorId:lle. Ne täytetään automaattisesti.",
"Pricing_Page_Testimonial_6": "ABP Framework on hyvä kehys, mutta sen käyttämien eri kerrosten, luokkien ja kirjastojen (erityisesti ABP:n) ymmärtäminen vaatii aikaa. Käytin paljon aikaa koodikannan lukemiseen, mutta ABP Commercial säästää aikaa projektin erityiskokonaisuuksien (AR) ja kuhunkin niistä linkitetyn arkiston luomiseen. Pidin myös ABP:ssä käytetystä lähestymistavasta, joka on hyvin kypsä, sillä se perustuu DDD:hen ja monoliittisuuteen.",
"AbpBookDownloadArea_ClaimYourEBook": "Lunasta <span class='gradient-framework'>Mastering ABP Framework</span> -e-kirja",
"AddMemberModal_Warning_1": "Jos <strong>käyttäjätunnusta</strong>, jota yrität lisätä, ei ole järjestelmässä, pyydä tiimisi jäsentä rekisteröitymään osoitteessa <a href='{0}/Account/Register'>{0}</ a> ja jakaa hänen tilinsä käyttäjätunnus kanssasi.",
"MyOrganizations_Detail_WelcomeMessage": "Tervetuloa organisaatioosi, {0}",

1
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json

@ -538,6 +538,7 @@
"Pricing_Page_Testimonial_3": "Szeretjük az ABP-t. Nem kell mindent a nulláról írnunk. A beépített funkciókból indulunk ki, és csak arra koncentrálunk, amit valóban meg kell írnunk. Ezenkívül az ABP jól felépített, és a kód kiváló minőségű, kevesebb hibával. Ha magunknak kellene megírnunk mindent, amire szükségünk van, akkor lehet, hogy éveket kellene töltenünk. Még egyszer, amit szeretünk, az az, hogy az új verzió, a hibajavítás vagy a fejlesztés nagyon hamar, minden második héten megjelenik. Nem várunk túl sokáig.",
"Pricing_Page_Testimonial_4": "Az ABP Commercial egy fantasztikus termék, amelyet ajánlunk. Kereskedelmi termékek, amelyeket ügyfeleink számára egyetlen konfigurálható platformon értékesíthetnek. Az ugrásszerű indítás, amelyet a keret és az eszközök biztosítanak bármely csapat számára, minden centet megér. Az ABP Commercial volt a legjobban megfelelő az igényeinknek.",
"Pricing_Page_Testimonial_5": "Az ABP Framework nem csak keretrendszer, hanem útmutató is a projektfejlesztéshez/menedzsmenthez, mert DDD, GenericRepository, DI, Microservice és Modularity képzést biztosít. Ha magát a keretrendszert nem is használja, fejlesztheti magát a docs.abp.io-val, amely jól és professzionálisan elkészített (OpenIddict, Redis, Quartz stb.) leírás. Mivel sok minden előre be van építve, jelentősen lerövidíti a projektfejlesztési időt (például bejelentkezési oldal, kivételkezelés, adatszűrés, aéapadatok, audit naplózás, lokalizáció, automatikus API vezérlő stb.). Alkalmazásunkból példaként a Helyi Event Bus-t használtam az állomány karbantartására. Így a rendelési mozgásokat eseményekkel tudom a készlethez igazítani. Csodálatos, hogy nem veszítünk időt a CreationTime-ra, a CreatorId-re. Automatikusan feltöltődnek.",
"Pricing_Page_Testimonial_6": "Az ABP Framework egy jó keretrendszer, de időre van szükség a különböző rétegek, osztályok és könyvtárak (különösen az ABP) megértéséhez. Sok időt töltöttem a kódbázis elolvasásával, de az ABP Commercial időt takarít meg nekünk a projekt speciális entitások (AR) és a mindegyikhez kapcsolódó tároló létrehozására. Tetszett az ABP-ben használt megközelítés is nagyon érett, tudjuk, hogy a DDD-n és a monoliton alapul.",
"AbpBookDownloadArea_ClaimYourEBook": "Igényelje <span class='gradient-framework'>Mastering ABP Framework</span> e-könyvét",
"AddMemberModal_Warning_1": "Ha a hozzáadni kívánt <strong>felhasználónév</strong> nem létezik a rendszerben, kérje meg csapattagját, hogy regisztráljon a <a href='{0}/Account/Register'>(z) {0}</a> webhelyen, és ossza meg fiókja felhasználónevét Önnel.",
"MyOrganizations_Detail_WelcomeMessage": "Üdvözöljük szervezetében, {0}",

63
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json

@ -95,7 +95,7 @@
"LanguageManagement": "Dil Yönetimi",
"TextTemplateManagement": "Metin Şablonu Yönetimi",
"See All Modules": "SeeAllModüller",
"ABPSuite": "ABP Süiti",
"ABPSuite": "ABP Suite",
"AbpSuiteShortDescription": "ABP Suite, ABP Commercial için tamamlayıcı bir araçtır.",
"AbpSuiteExplanation": "Birkaç dakika içinde web sayfaları oluşturmanıza olanak tanır. Komut satırından yüklenebilen bir .NET Core Global aracıdır. Yeni bir ABP çözümü oluşturabilir, veritabanından ön uca kadar CRUD sayfaları oluşturabilir.",
"Details": "Detaylar",
@ -417,7 +417,6 @@
"RenewLicenseEarly": "Lisansımı erken yenilersem, tüm yılı alacak mıyım?",
"RenewLicenseEarylExplanation": "Lisansınızı lisans bitiş tarihinizden önce yenilediğinizde, lisans bitiş tarihinize 1 yıl eklenecektir. Örneğin, lisansınızın süresi {0}-06-06 tarihinde doluyorsa ve lisansınızı {0}-01-01 tarihinde yenilediyseniz, yeni lisans bitiş tarihiniz {1}-06-06 olacaktır.",
"OpenSourceWebApplication": "Açık Kaynak Web Uygulaması",
"CompleteWebDevelopment": "Tam Web Geliştirme",
"ABPFrameworkDescription": "ABP Framework, yazılım geliştirme ve sözleşmelerin en iyi uygulamalarını takip ederek modern web uygulamaları oluşturmak için eksiksiz bir altyapıdır.",
"CommunityDescription": "ABP Çerçevesi ile ilgili deneyimlerinizi paylaşın!",
"GetStarted": "Başlayın",
@ -548,6 +547,7 @@
"Pricing_Page_Testimonial_3": "ABP'yi seviyoruz. Her şeyi sıfırdan yazmak zorunda kalmıyoruz. Kullanıma hazır özelliklerden başlıyoruz ve sadece gerçekten yazmamız gerekenlere odaklanıyoruz. Ayrıca, ABP iyi tasarlanmış ve kod daha az hata ile yüksek kalitede. İhtiyaç duyduğumuz her şeyi kendi başımıza yazmak zorunda kalsaydık, yıllarımızı harcamak zorunda kalabilirdik. Hoşumuza giden bir diğer şey de yeni sürümün, sorun düzeltmenin ya da iyileştirmenin iki haftada bir çıkması. Çok uzun süre beklemiyoruz.",
"Pricing_Page_Testimonial_4": "ABP Commercial harika bir ürün, tavsiye ederim. Müşterilerimiz için ticari ürünleri tek bir yapılandırılabilir platformda pazara sunuyor. Çerçeve ve araçların herhangi bir ekibe sağladığı hızlı başlangıç her kuruşa değer. ABP Commercial ihtiyaçlarımız için en uygun üründü.",
"Pricing_Page_Testimonial_5": "ABP Framework sadece bir framework değil, aynı zamanda bir proje geliştirme/yönetme rehberi, çünkü DDD, GenericRepository, DI, Microservice ve Modularity eğitimleri veriyor. Framework'ün kendisini kullanmayacak olsanız bile, iyi ve profesyonelce hazırlanmış docs.abp.io ile kendinizi geliştirebilirsiniz (OpenIddict, Redis, Quartz vb.). Birçok şey önceden hazır olduğu için proje geliştirme süresini önemli ölçüde kısaltıyor (Giriş sayfası, istisna işleme, veri filtreleme, tohumlama, denetim günlüğü, yerelleştirme, otomatik API denetleyicisi vb.) Uygulamamızdan bir örnek olarak, stok kontrolü için Local Event Bus kullandım. Böylece stok işleyicisi yazarak sipariş hareketlerini yönetebiliyorum. CreationTime, CreatorId için zaman kaybetmemek harika. Bunlar otomatik olarak dolduruluyor.",
"Pricing_Page_Testimonial_6": "ABP Framework iyi bir çerçeve ancak kullandığı farklı katmanları, sınıfları ve kütüphaneleri (özellikle ABP) anlamak için zaman gerekiyor. Kod tabanını okumak için çok zaman harcadım, ancak ABP Commercial, proje özel varlıklarını (AR) ve her birine bağlı depoyu oluşturmak için bize zaman kazandırdı. ABP'de kullanılan yaklaşımın çok olgun olduğunu da beğendim, DDD ve monolith'e dayandığını biliyoruz.",
"AbpBookDownloadArea_ClaimYourEBook": "<span class='gradient-framework'>Mastering ABP Framework</span> E-Kitabınızı talep edin",
"AddMemberModal_Warning_1": "Eklemeye çalıştığınız <strong>kullanıcı adı</strong> sistemde yoksa, lütfen ekip üyenizden <a href='{0}/Account/Register'>{0}</a> adresine kaydolmasını ve hesabının kullanıcı adını sizinle paylaşmasını isteyin.",
"MyOrganizations_Detail_WelcomeMessage": "Organizasyonunuza hoş geldiniz, {0}",
@ -744,12 +744,67 @@
"ConfirmedEmailAddressRequiredToStartTrial": "Deneme lisansı başlatmak için onaylanmış bir e -posta adresiniz olmalı.",
"EmailVerificationMailNotSent": "E-posta doğrulama postası gönderilemedi.",
"GetConfirmationEmail": "Daha önce bir onay e-postası almadıysanız <a href=\"javascript:void(0);\" id=\"{0}\" class=\"text-decoration-underline\"> almak için buraya tıklayın.</a>",
"WhichLicenseTypeYouAreInterestedIn": "Hangi lisans türüyle ilgileniyorsunuz?",
"WhichLicenseTypeYouAreInterestedIn": "Hangi lisans türüyle ilgileniyorsunuz?",
"BlackFridayDiscount": "Kara Cuma İndirimi",
"EulaPageTitle": "Son Kullanıcı Lisans Sözleşmesi (EULA)",
"PrivacyPolicyPageTitle": "Gizlilik Politikası - Çerez Politikası",
"TermsConditionsPageTitle": "Şartlar ve Koşullar",
"TrainingsPageTitle": "ABP Eğitim Paketleri",
"ModulesPageTitle": "ABP Önceden Oluşturulmuş Uygulama Modülleri"
"ModulesPageTitle": "ABP Hazır Uygulama Modülleri",
"Testimonial_ShortDescription_1": "ABP'nin modülerliği, ekibin zamanında teslimat yapmasını mümkün kıldı.",
"Testimonial_ShortDescription_2": "Yeni özellikleri eskisinden daha hızlı oluşturun.",
"Testimonial_ShortDescription_3": "Kullanıma hazır özelliklerden başlıyoruz ve sadece yazmamız gerekenlere odaklanıyoruz.",
"Testimonial_ShortDescription_4": "ABP Commercial ihtiyaçlarımız için en uygun olanıydı.",
"DontTakeOurWordForIt": "Bizim sözümüze güvenmeyin...",
"ReadAbpCommercialUsersWantYouToKnow": "ABP Commercial kullanıcılarının bilmenizi istediklerini okuyun.",
"OnlineReviewersOnAbpCommercial": "ABP Commercial Hakkında Çevrimiçi Yorumlar",
"SeeWhatToldAboutAbpCommercial": "ABP Commercial hakkında neler söylendiğini görün ve isterseniz düşüncelerinizi yazın.",
"YouDeserveGoodUXUI": "İyi bir kullanıcı arayüzünü ve daha iyi bir kullanıcı deneyimini hak ediyorsunuz. ABP'nin LeptonX Teması size hizmet etmek için burada.",
"ViewLiveDemo": "Canlı Tema Demosunu Görüntüle",
"LeptonXThemeForDashboard": "Yönetici Kontrol Paneliniz için LeptonX Teması",
"GetLeptonX": "LeptonX'i Şimdi Alın",
"SimplifiedMenu": "Basitleştirilmiş menü",
"SimplifiedMenuDescription": "Menüyü filtreleyerek aradığınız sayfayı kolayca bulabilirsiniz",
"YourFavoritePages": "Favori sayfalarınız elinizin altında",
"YourFavoritePagesDescription": "Sayfanın sağ üst köşesindeki yıldız simgesine tıklayarak sayfayı kolayca favorilere ekleyin veya favorilerden kaldırın.",
"BreadCrumbs": "Kesintisiz geçiş için Breadcrumb",
"BreadCrumbsDescription": "Breadcrumb'ı kullanarak, sol menü kapalıyken bile tek tıklamayla aynı seviyedeki sayfalara geçebilirsiniz, üstelik tablet ve mobil uyumlu çalışır!",
"YourMenu": "Menünüz dilediğiniz gibi",
"YourMenuDescription": "Kullanıcı menüsündeki doğrudan tıklanabilir simgeleri ve açılır kutuları istediğiniz gibi özelleştirin. Kullanıcı menüsü ihtiyaçlarınıza göre tamamen özelleştirilebilir",
"RtlSupport": "Diliniz için RTL desteği",
"RtlSupportDescription": "LeptonX Teması, diliniz için RTL'yi destekler. Dili değiştirmeniz için dil seçenekleri ayarlar menüsündedir.",
"YourColors": "Yönetici kontrol paneli kullanıcı arayüzünüzdeki renkleriniz",
"YourColorsDescription": "LeptonX Tema, sistem tercihlerinize göre çalışır ve gösterge paneli açık tema, gösterge paneli koyu tema ve gösterge paneli yarı koyu tema seçeneklerine sahiptir.",
"ArrangeContentWidth": "İçerik genişliğinizi kolayca düzenleyin",
"ArrangeContentWidthDescription": "İçerik alanınızın genişliğini kolayca değiştirin.",
"LeptonXCompatibleWith": "LeptonX Teması aşağıdakilerle uyumludur",
"MobileResponsiveTemplate": "Mobil Uyumlu Şablon",
"MobileResponsiveTemplateDescription1": "LeptonX yönetici kontrol panelinize istediğiniz cihazdan erişin.",
"MobileResponsiveTemplateDescription2": "Her cihazınızda rahatlıkla kullanabilmeniz için tasarlanmıştır. Mobil cihazlara ve tablet boyutlarına duyarlıdır.",
"TopMenuLayoutOption": "Üst Menü Düzeni Seçeneği",
"TopMenuLayoutOptionDescription1": "Web sitenizi aynı yönetici kontrol paneliyle kurmak istiyorsanız, LeptonX Teması ile bunu yapmanız mümkün!",
"TopMenuLayoutOptionDescription2": "Bunu gerçekleştirmek için LeptonX üst menü düzenini deneyin!",
"EasilyCustomizable": "Marka renkleriniz için kolayca özelleştirilebilir",
"EasilyCustomizableDescription1": "LeptonX temasını sadece birkaç SCSS değişkeni kullanarak özelleştirebilirsiniz. Geçersiz kılma yok, ekstra CSS yükü yok!",
"EasilyCustomizableDescription2": "LeptonX ile yönetici panelinizi istediğiniz gibi düzenleyebilirsiniz.",
"IndependentLayout": "Bağımsız düzen ve içerik alanı",
"IndependentLayoutDescription1": "LeptonX'in yerleşim altyapısı içerikten tamamen ayrı olarak tasarlandı.",
"IndependentLayoutDescription2": "Bu, isterseniz projenizi Bootstrap dışında bir içerik yapısı ile özgürce tasarlayabileceğiniz anlamına gelir.",
"MostUsedLibraries": "LeptonX ile entegre edilmiş en çok kullanılan kütüphaneler",
"MostUsedLibrariesDescription1": "LeptonX en çok kullandığınız kütüphaneleri içerir. ApexCharts, DataTables, DropZone, FullCalender, JSTree, Select2, Toastr gibi kütüphaneleri zahmetsizce kullanmanızı sağlar.",
"MostUsedLibrariesDescription2": "LeptonX ayrıca MVC Angular ve Blazor'a özgü kütüphaneleri de destekler.",
"CreateAndCustomize": "LeptonX özel sayfaları ile ihtiyacınız olan sayfaları saniyeler içinde oluşturun ve özelleştirin",
"CreateAndCustomizeDescription": "LeptonX Temasını kullanarak önceden hazırlanmış birçok html sayfasına da erişebilirsiniz. Bunlar arasında giriş sayfası, blog, SSS, abonelik listesi, fatura, fiyatlandırma, dosya yönetimi gibi birçok sayfa bulunmaktadır.",
"LeptonThemeForAdmin": "Yönetici kontrol paneliniz için Lepton Teması",
"LeptonThemeForAdminDescription": "Lepton Teması hala kullanılabilir durumdadır ve bakımı yapılacaktır. Bir Lepton Teması kullanıcısı olarak LeptonX Temasına geçmek istiyorsanız, nasıl yapılacağını öğrenmek için belgelere bakabilirsiniz.",
"LeptonCompatibleWith": "Lepton Teması aşağıdakilerle uyumludur",
"SeeLeptonDocumentation": "Lepton Dokümantasyonuna Bakın",
"GetLepton": "Lepton'u Şimdi Alın",
"WhyUseAbpIoPlatform": "Sıfırdan yeni bir çözüm oluşturmak yerine neden ABP.IO Platformunu kullanmalıyım?",
"WhyUseAbpIoPlatformFaqExplanation": "ABP.IO Platformunu kullanmanın her şeyi kendiniz yapmaya göre neden önemli bir avantaja sahip olduğuna dair ayrıntılı bir açıklama için <a href=\"https://docs.abp.io/en/commercial/latest/why-abp-io-platform\"> bu belgeye </a> bakın.",
"SupportPolicyFaqTitle": "Destek politikanız nedir?",
"SupportPolicyFaqExplanation": "Yalnızca etkin ve önceki ana sürümü destekliyoruz. Üçüncü ve daha eski ana sürümler için bir yama sürümünü garanti etmiyoruz. Örneğin, etkin sürüm 7.0.0 ise, hem 6.x.x hem de 7.x.x için yama sürümleri yayınlayacağız. Ayrıca, yalnızca ABP Framework ve ABP Commercial ile ilgili sorunlar için destek sağlıyoruz. Bu, ABP ürünleri tarafından kullanılan 3. taraf uygulamalar, bulut hizmetleri ve diğer çevresel kütüphaneler için destek verilmediği anlamına gelir. Müşterilerimize \"Volosoft Bilişim A.Ş\"nin resmi çalışma saatleri içinde teknik destek sağlamak için ticari olarak makul çabayı göstereceğiz. Öte yandan, bir hizmet seviyesi anlaşması (SLA) yanıt süresi taahhüt etmiyoruz, ancak teknik sorunlara resmi çalışma saatlerimiz içinde mümkün olduğunca çabuk yanıt vermeye çalışacağız. Müşteri ile özel bir anlaşma yapılmadığı sürece, yalnızca https://support.abp.io adresinden destek sağlıyoruz. Ayrıca, yalnızca Kurumsal Lisans sahiplerinin kullanabildiği özel e-posta desteğimiz de bulunmaktadır.",
"BlazoriseLicense": "Blazorise lisansı satın almamız gerekiyor mu?",
"BlazoriseLicenseExplanation": "Volosoft ve Megabit arasında bir anlaşmamız var, bu anlaşma ile Blazorise lisansı ABP Ticari ürünleri ile birlikte geliyor, bu nedenle müşterilerimizin ekstra bir Blazorise lisansı satın almasına gerek kalmıyor."
}
}

1
abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json

@ -537,6 +537,7 @@
"Pricing_Page_Testimonial_3": "我们大爱 ABP。 我们不必从头开始编写所有内容。 我们从\"开箱即用\"的功能开始,只需关注我们真正需要编写的内容。 此外,ABP 架构良好,代码质量高,错误少。 如果我们需要自己来编写所需的一切,我们可能需要花费数年时间。 另一点让我们喜欢的是新版本、问题修复或改进每隔一周很快地就会出现。 我们不会等太久。",
"Pricing_Page_Testimonial_4": "ABP 商业版 是一款很值得推荐的出色产品。 是在一个可配置的平台上为我们的客户推向市场的商业产品。 其框架和工具为任何团队提供的快速启动值得每一分钱。 ABP 商业版 最适合我们的需求。",
"Pricing_Page_Testimonial_5": "ABP Framework 不仅是一个框架,它还是项目开发/管理的指南,因为它提供了 DDD、GenericRepository、DI、微服务和模块化培训。 即使你不打算使用框架本身,你也可以通过 docs.abp.io 进行自己的开发,该文档已经做好了专业的准备(OpenIddict、Redis、Quartz 等)。 因为很多东西都是预先构建的,它大大缩短了项目开发时间(例如登录页面、异常处理、数据过滤、种子、审计日志、本地化、自动 API 控制器等)。 作为我们应用程序的一个示例,我使用本地事件总线进行库存控制。 因此我可以通过编写库存处理程序来管理订单移动。 不为 CreationTime,CreatorId 浪费时间真是太好了。 它们正在自动填充。",
"Pricing_Page_Testimonial_6": "ABP Framework 是一个很好的框架,但它需要时间来理解它使用的不同层、类和库(特别是 ABP)。 我花了很多时间阅读代码库,但是 ABP Commercial 为我们节省了创建项目专业实体 (AR) 和链接到每个实体的存储库的时间。 我也喜欢 ABP 中使用的方法非常成熟,我们知道它基于 DDD 和单体。",
"AbpBookDownloadArea_ClaimYourEBook": "领取您的<span class='gradient-framework'>掌握ABP框架</span>电子书",
"AddMemberModal_Warning_1": "如果您尝试添加的<strong>用户名</strong>在系统中不存在,请让您的团队成员在 <a href='{0}/账户/注册'>{0}</ 上注册 a> 并与您分享他/她帐户的用户名。",
"MyOrganizations_Detail_WelcomeMessage": "欢迎加入您的组织,{0}",

2
abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json

@ -93,7 +93,6 @@
"NoThanks": "Hayır teşekkürler",
"MaybeLater": "Belki sonra",
"JoinOurPostNewsletter": "Makale bültenimize katılın",
"Community": "Toplum",
"Marketing": "Pazarlama",
"CommunityPrivacyPolicyConfirmation": "Şartlar ve Koşullar ile <a href=\"https://commercial.abp.io/Privacy\">Gizlilik Politikası</a>'nı kabul ediyorum.",
"PostRequestMessageTitle": "Bu web sitesinde görmek istediğiniz bir makaleyi/eğiticiyi istemek için GitHub'da <a href=\"https://github.com/abpframework/abp/issues/new\">bir sorun açın</a>.",
@ -143,7 +142,6 @@
"Volo.AbpIo.Domain:060002": "Makale İçeriği Github(\"{PostUrl}\") kaynağında mevcut değil.",
"Volo.AbpIo.Domain:060003": "Makale içeriği bulunamadı!",
"MemberNotPublishedPostYet": "Bu üye henüz bir gönderi yayınlamadı.",
"WelcomeToABP": "ABP'ye Hoşgeldiniz",
"Browse": "Göz at",
"ArticleRequestsDescription": "Burada belirli bir içerik mi görmek istiyorsunuz? Topluluktan bunu oluşturmasını isteyebilirsiniz!",
"LatestContentRequests": "Son İçerik Talepleri",

30
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json

@ -1,7 +1,7 @@
{
"culture": "tr",
"texts": {
"GetStarted": "Başlamak - Başlangıç Templateleri",
"GetStarted": "Başlangıç Şablonları",
"Create": "Oluştur",
"NewProject": "Yeni Proje",
"DirectDownload": "Doğrudan İndir",
@ -82,7 +82,7 @@
"CLI_CommandLineInterface": "CLI (Command Line Interface)",
"CLI_CommandLineInterfaceExplanation": "CLI yeni proje oluşturma ve uygulamanıza modüller ekleme işlemlerini otomatik hale getirir.",
"StartupTemplates": "Başlangıç Templateler",
"StartupTemplatesExplanation": "Çeşitli başlangıç templateleri size geliştirme başlatmak için tam yapılandırılmış bir çözüm sağlar.",
"StartupTemplatesExplanation": "Çeşitli başlangıç şablonları size geliştirme başlatmak için tam yapılandırılmış bir çözüm sağlar.",
"BasedOnFamiliarTools": "Bilinen Araçlara Dayalı ",
"BasedOnFamiliarToolsExplanation": "Zaten bildiğiniz popüler araçlar ile geliştirilme ve egtegre edilmiştir. Düşük öğrenme eğrisi, koaly adaptasyon, rahat geliştirme.",
"ORMIndependent": "ORM Bağımsız",
@ -139,8 +139,8 @@
"AggregateRootEntity": "Aggregate Root, Entity",
"AutoRESTAPIsExplanation": "ABP, application servislerinizi otomatik olarak API Controller olarak kurallı bir şekilde yapılandırabilir.",
"DynamicClientProxiesExplanation": "Apilerinizi, JavaScript ve C# clients tarafından kolaylıkla kullanın.",
"DistributedEventBusWithRabbitMQIntegrationExplanation": "Easily publish & consume distributed events using built-in Distributed Event Bus with RabbitMQ integration available.",
"TestInfrastructureExplanation": "The framework has been developed unit & integration testing in mind. Provides you base classes to make it easier. Startup templates come with pre-configured for testing.",
"DistributedEventBusWithRabbitMQIntegrationExplanation": "RabbitMQ entegrasyonu ile yerleşik Dağıtılmış Event Bus kullanarak dağıtılmış olayları kolayca yayınlayın ve tüketin.",
"TestInfrastructureExplanation": "Çerçeve, birim ve entegrasyon testleri göz önünde bulundurularak geliştirilmiştir. İşinizi kolaylaştırmak için size temel sınıflar sağlar. Başlangıç şablonları test için önceden yapılandırılmış olarak gelir.",
"AuditLoggingEntityHistoriesExplanation": "İş açısından kritik uygulamalar için yerleşik denetim günlüğü. Özellik düzeyinde ayrıntılarla istek, hizmet, yöntem düzeyinde denetim günlüğü ve varlık geçmişleri.",
"EmailSMSAbstractionsWithTemplatingSupportExplanation": "IEmailSender ve ISmsSender soyutlamaları, uygulama mantığınızı altyapıdan ayırır. Gelişmiş e-posta şablon sistemi, e-posta şablonları oluşturmanıza ve yerelleştirmenize ve gerektiğinde kolayca kullanmanıza olanak tanır.",
"LocalizationExplanation": "Yerelleştirme sistemi, düz JSON dosyalarında kaynaklar oluşturmanıza ve bunları UI'nizi yerelleştirmek için kullanmanıza olanak tanır. AspNet Core'un yerelleştirme sistemi ile tam uyumlu iken kalıtım, uzantılar ve JavaScript entegrasyonu gibi gelişmiş senaryoları destekler.",
@ -163,7 +163,7 @@
"Strong": "Güçlü",
"Complete": "Tamamlayınız",
"BasedLayeringModel": "Tabanlı Katmanlama Modeli",
"Microservice": "mikro hizmet",
"Microservice": "Mikroservis",
"Compatible": "Uyumlu",
"MeeTTheABPCommunityInfo": "Misyonumuz, geliştiricilerin makaleler, öğreticiler, vaka çalışmaları vb. ile birbirlerine yardımcı olabilecekleri ve benzer düşünen insanlarla tanışabilecekleri bir ortam yaratmaktır.",
"JoinTheABPCommunityInfo": "Canlı bir topluluğa katılın ve ABP Çerçevesine katkıda bulunun!",
@ -178,7 +178,7 @@
"ProgressiveWebApplication": "Progresif Web Uygulaması",
"UseslatestPreVersion": "En son yayın öncesi sürümünü kullanır",
"ReadTheDocumentation": "<span class=\"text-primary\">Belgeleri okuyun</span><span class=\"text-success\"></span>",
"Documentation": "belgeler",
"Documentation": "Dökümanlar",
"GettingStartedTutorial": "Başlarken Eğitimi",
"ApplicationDevelopmentTutorial": "Uygulama Geliştirme Eğitimi",
"TheStartupTemplate": "Başlangıç Şablonu",
@ -285,7 +285,6 @@
"Database": "Veritabanı",
"Saas": "Saas",
"OpenSourceWebApp": " Açık <span class=\"forever\">kaynak </span> <br/> web uygulaması",
"Framework": "Çerçeve",
"AuditLoggingExplanation": "Sisteminizdeki tüm işlemleri ve veri değişikliklerini otomatik olarak izleyin.",
"AbpNewCommandExplanation": "ABP başlangıç şablonlarını kullanarak yeni çözümler oluşturur.",
"AbpAddModuleCommandExplanation": "Çözümünüze önceden oluşturulmuş uygulama modülleri yükler",
@ -300,10 +299,8 @@
"Preview": "Önizleme",
"CreateANewSolution": "Yeni bir çözüm oluşturun",
"ABPFrameworkFeatures": "ABP Çerçevesi <span class=\"gradient-framework\">Özellikleri</span>",
"Commercial": "Ticari",
"ThirdPartyTools": "Üçüncü taraf araçlar",
"Back": "Geri",
"Community": "Topluluk",
"SeeMore": "Daha fazla göster",
"DetailsOfTheEBook": "E-kitap detayları",
"JoinOurMarketingNewsletter": "Pazarlama bültenimize katılın",
@ -377,7 +374,18 @@
"CreateSolutionFolder": "Çözüm Klasörü Oluşturun",
"CreateSolutionFolderOption": "Projenin çıktı klasöründe yeni bir klasörde mi yoksa doğrudan çıktı klasöründe mi olacağını belirtir.",
"SelectUITheme": "UI Temasını Seçin",
"BooksPageTitle": "ABP Kitapları"
"BooksPageTitle": "ABP Kitapları",
"InstallAbpCliMessage": "Daha önce yüklemediyseniz, ABP CLI'yi bir komut satırı terminaline yükleyin:",
"RunTheFollowingCommand": "Aşağıdaki komutu bir komut satırı terminalinde çalıştırın:",
"ChangeSolutionOptionsBelow": "Aşağıdaki çözüm seçeneklerini değiştirebilirsiniz.",
"MultiLayerApplicationExplanation1": "Domain Driven Design uygulamalarına dayalı olarak tamamen katmanlı bir çözüm oluşturur.",
"MultiLayerApplicationExplanation2": "Sürdürülebilir ve genişletilebilir bir kod tabanına ihtiyaç duyan uzun vadeli projeler için önerilir.",
"SingleLayerApplicationExplanation1": "Tek katmanlı bir web uygulaması oluşturur.",
"SingleLayerApplicationExplanation2": "Daha basit ve anlaşılması kolay bir mimariye sahip bir uygulama oluşturmak için önerilir.",
"ApplicationModuleExplanation1": "Yeniden kullanılabilir, tamamen katmanlı bir uygulama modülü çözümü oluşturur.",
"ApplicationModuleExplanation2": "Modüler uygulamanız için modüller oluşturmak üzere bu seçeneği kullanabilirsiniz.",
"LeptonXLiteThemeInfo": " Modern ve şık bir Bootstrap UI teması. Üretime hazır bir UI temasına sahip olmak istiyorsanız idealdir. Bu en yeni temadır ve varsayılandır.",
"BasicThemeInfo": "Sade Bootstrap renkleri ve stilleri ile minimalist UI teması. Kendi UI temanızı oluşturacaksanız idealdir.",
"Details": "Detaylar"
}
}

3
build/common.ps1

@ -36,7 +36,8 @@ if ($full -eq "-f")
"../templates/console",
"../templates/wpf",
"../templates/app-nolayers/aspnet-core",
"../abp_io/AbpIoLocalization"
"../abp_io/AbpIoLocalization",
"../source-code"
)
}else{
Write-host ""

15
delete-bin-obj.ps1

@ -0,0 +1,15 @@
Clear-Host
Write-Host "Deleting all BIN and OBJ folders..." -ForegroundColor Cyan
Get-ChildItem -Path . -Include bin,obj -Recurse -Directory | ForEach-Object {
if ($_.FullName -notmatch "\\node_modules\\") {
Write-Host "Deleting:" $_.FullName -ForegroundColor Yellow
Remove-Item $_.FullName -Recurse -Force
} else {
Write-Host "Skipping:" $_.FullName -ForegroundColor Magenta
}
}
Write-Host "BIN and OBJ folders have been successfully deleted." -ForegroundColor Green

BIN
docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/abp-essential-features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

BIN
docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/abp-try-now.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/cover.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 788 KiB

BIN
docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/cross-platform.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/ddd-book.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/developer-focused.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

BIN
docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/key-features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/module-layers-and-packages.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/open-source.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

85
docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/post.md

@ -0,0 +1,85 @@
Building robust web applications has become more important than ever as the world is becoming more web-focused. With the rise of new tools and frameworks, choosing the right web development framework can be challenging. Especially if you are a .NET developer, there not so many popular ASPNET Framework around. However, the ABP Framework has become popular for many developers due to its flexibility, scalability, feature set and performance. Let's mention what's ABP Framework and what it promises to .NET developers.
## ASP.NET Core Architecture Best Practices
![ABP Key Features](images/key-features.png)
ABP Framework is an application design framework that provides developers with a powerful set of tools to build web applications quickly and efficiently. It is an open-source, cross-platform framework supporting monolithic and microservices architectures. ABP Framework is built on top of the ASP.NET Core architecture and incorporates best practices for developing web applications.
## ASP.NET Platform
The framework includes a wide range of features, such as an angular code generator with the help of [ABP Suite](https://commercial.abp.io/tools/suite), project templates, and web application themes. These features enable developers to create web applications that are both functional and visually appealing without spending much time on coding. Moreover, ABP Framework provides a common application framework that can be used for different applications, including SAAS, e-commerce, and social media platforms.
ABP Framework also supports the domain-driven design, which means that the framework is designed to be flexible and adaptable to different business requirements. This approach allows developers to build applications aligned with business needs, ensuring that they are efficient and effective.
## Open Source Dot Net Framework
One of the major advantages of ABP Framework is its open-source nature. Many developers continuously improve and update the framework, making it more reliable and secure. Moreover, the ABP Framework is compatible with multiple .NET frameworks, including ASP.NET and .NET Core. When starting your project on top of a solid Microsoft web framework, the ABP Framework is one of the best choices.
![ABP is cross platform](images\cross-platform.png)
Another advantage of ABP Framework is that it provides rapid web application development tools that are easy to use. The framework includes project templates that developers can use as a starting point for their web applications, which can significantly reduce the development time. ABP Framework also provides a web app builder that developers can use to create web applications quickly and efficiently.
## ASPNET Core Architecture
ABP Framework is also compatible with Microsoft's Clean Architecture, a software design pattern that promotes separation of concerns and maintainability. This integration ensures that the applications developed using ABP Framework are well-structured, easy to maintain, and scalable. Many application marketplace reviewers commented about ABP as the best web application framework. While ABP supports multiple UI choices like MVC, Angular, Blazor Web Assembly and Blazor Server, the most downloaded one is MVC microservice architecture. If you are here to find a NET application framework for your next NET Core application, you are in the right place!
![ABP Framework Project Hierarchy](images/module-layers-and-packages.png)
Clean Architecture is a design pattern that emphasizes the separation of concerns, ensuring that the code is organized in independent layers. This helps developers to write code that is easy to maintain, test and refactor. ABP Framework uses this pattern to structure its application code and ensure that it is easy to manage.
## Open Source Web Framework
ABP Framework is an open-source web framework that is free to use and distribute. The framework is licensed under the MIT license, meaning developers can use it for commercial and non-commercial purposes without any restrictions.
ABP Framework provides different templates, which are ASPNET Core web app compatible with various platforms, including Windows, Linux, and macOS.
## Domain Driven Design DotNet
The ABP Framework also implements Domain-Driven Design (DDD), a software design methodology that emphasizes the importance of the domain model. The framework provides a guide for implementing DDD through an implementing domain-driven design. It helps developers to create a domain model that is easy to understand, test, and maintain. As ABP is a C# framework, it supports most of the common application framework features for a core framework.
![ABP Framework - Domain Driven Design e-book](images/ddd-book.png)
There is also a free PDF e-book for Dotnet developers that explains the Domain Driven Design principle with real-world examples. You can download this e-book at https://abp.io/books/implementing-domain-driven-design
## It's a Dotnet Web Framework
ABP Framework is a dotnet web framework that is designed with C# and provides developers with a set of tools that makes it easy to build modern web applications. Whether you want to start a new dotnet monolithic solution or dotnet microservice solution, you can start with ABP. Creating your own dotnet framework architecture may be hard if you don't have many years of experience. The brain team of the ABP Framework specializes in ASP.NET framework architecture and ASP.NET application frameworks.
![Developer Focused](images/developer-focused.png)
## Essential Features of the ABP Framework:
ASP.NET Core modularity, ASP.NET Core modular development, ASP.NET Core localization, ASP.NET Core SaaS framework, ASP.NET Core distributed, event, bus, ASP.NET Core cross-cutting concerns, ASP.NET Core blob storing, ASP.NET Core audit logging, ASP.NET Core microservice, ASP.NET Core microservice solution, ASP.NET Core microservice example, ASP.NET Core API gateway, ASP.NET Core domain, driven, design, ASP.NET Core layered architecture, ASP.NET Core layering, ASP.NET Core clean architecture, ASP.NET Core authentication, ASP.NET Core authorization, ASP.NET Core UI theme, ASP.NET Core tag helpers, ASP.NET Core identity, ASP.NET Core, identity, server, ASP.NET Core IdentityServer, ASP.NET Core payment module, ASP.NET Core best practices, ASP.NET Core design patterns, ASP.NET Core background jobs, ASP.NET Core exception handling, ASP.NET Core, background, workers, ASP.NET Core repository, ASP.NET Core repository pattern, ASP.NET Core unit of work, ASP.NET Core domain services, ASP.NET Core Swagger, ASP.NET Core content management system, ASP.NET Core CMS module, ASP.NET Core user management, ASP.NET Core Role management, ASP.NET Core permission management
![ABP Essential Features](images/abp-essential-features.png)
## Open Source Web Application Framework
ABP Framework is an open-source web application development framework that is free to use and distribute. The framework is licensed under the MIT license, meaning developers can use it for commercial and non-commercial purposes without any restrictions.
![ABP Framework is open-source](images\open-source.png)
## C# Web Application Framework
ABP Framework is built using C#, which is a modern programming language that is widely used in the development of web applications. C# provides developers with features that make it easy to write clean and maintainable code. ABP Framework is a web framework designed to work with C# and provides developers with tools that make it easy to build modern web applications.
## Key Features
The following .NET features are available in the ABP Framework:
.NET modular development, .NET localization, .NET multi-tenancy, .NET SaaS framework, .NET distributed event bus, .NET cross-cutting concerns, .NET,microservice, .NET microservice solution, .NET microservice example, .NET domain driven design, .NET clean architecture, .NET authentication, .NET authorization, .NET best practices, .NET design,patterns, .NET exception handling, .NET background workers, .NET unit of work, .NET domain services, .NET user management, .NET role management, .NET permission management
![ABP Framework Features](images/features.png)
The following keywords best describe the ABP Framework;
Open source backend framework, open source development framework, open source web app builder, open source web applications, open source web development, web application development framework, web application framework, web application framework software, web application infrastructure, web application open source, asp net framework, asp net open source, ASP.NET application, ASP.NET software, ASP.NET web app, ASP.NET web development, web app builder open source, web app framework, Dotnet framework, Dotnet UI framework, Dotnet web application themes.
## Conclusion
ABP Framework is a powerful and flexible web application framework that provides developers with the tools to build high-quality web applications quickly and efficiently. It is an open-source, cross-platform framework that supports multiple .NET frameworks, including ASP.NET and .NET Core. ABP Framework provides rapid web application development tools, project templates, and web application themes that enable developers to create visually appealing and functional applications in no time.
![Try ABP now](images\abp-try-now.png)

BIN
docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/cover.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 25 KiB

4
docs/en/Migration-Guides/Abp-7_1.md

@ -2,6 +2,8 @@
This document is a guide for upgrading ABP v7.0 solutions to ABP v7.1. There are a few changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application.
> **Note**: Entity Framework developers may need to add a new code-first database migration to their projects since we made some improvements to the existing entities of some application modules.
## Navigation Menu - `CustomData` type changed to `Dictionary<string, object>`
`ApplicationMenu` and `ApplicationMenuItem` classes' `CustomData` property type has been changed to `Dictionary<string, object>`. So, if you use the optional `CustomData` property of these classes, change it accordingly. See [#15608](https://github.com/abpframework/abp/pull/15608) for more information.
@ -16,4 +18,4 @@ var menu = new ApplicationMenu("Home", L["Home"], "/", customData: new MyCustomD
```csharp
var menu = new ApplicationMenu("Home", L["Home"], "/").WithCustomData("CustomDataKey", new MyCustomData());
```
```

13
docs/en/Migration-Guides/Abp-7_2.md

@ -0,0 +1,13 @@
# ABP Version 7.2 Migration Guide
This document is a guide for upgrading ABP v7.1 solutions to ABP v7.2. There are a few changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application.
## `LastPasswordChangeTime` and `ShouldChangePasswordOnNextLogin` Properties Added to the `IdentityUser` Class
In this version, two new properties, which are `LastPasswordChangeTime` and `ShouldChangePasswordOnNextLogin` have been added to the `IdentityUser` class and to the corresponding entity. Therefore, you may need to create a new migration and apply it to your database.
## Renamed `OnRegistered` Method
There was a typo in an extension method, named as `OnRegistred`. In this version, we have fixed the typo and renamed the method as `OnRegistered`. Also, we have updated the related places in our modules that use this method.
However, if you have used this method in your projects, you need to rename it as `OnRegistered` in your code.

1
docs/en/Migration-Guides/Index.md

@ -2,6 +2,7 @@
The following documents explain how to migrate your existing ABP applications. We write migration documents only if you need to take an action while upgrading your solution. Otherwise, you can easily upgrade your solution using the [abp update command](../Upgrading.md).
- [7.1 to 7.2](Abp-7_2.md)
- [7.0 to 7.1](Abp-7_1.md)
- [6.0 to 7.0](Abp-7_0.md)
- [5.3 to 6.0](Abp-6_0.md)

13
docs/en/Modules/Cms-Kit/Comments.md

@ -19,6 +19,16 @@ Configure<CmsKitCommentOptions>(options =>
{
options.EntityTypes.Add(new CommentEntityTypeDefinition("Product"));
options.IsRecaptchaEnabled = true; //false by default
options.AllowedExternalUrls = new Dictionary<string, List<string>>
{
{
"quote",
new List<string>
{
"https://abp.io/"
}
}
};
});
```
@ -28,6 +38,7 @@ Configure<CmsKitCommentOptions>(options =>
- `EntityTypes`: List of defined entity types(`CmsKitCommentOptions`) in the comment system.
- `IsRecaptchaEnabled`: This flag enables or disables the reCaptcha for the comment system. You can set it as **true** if you want to use reCaptcha in your comment system.
- `AllowedExternalUrls`: Indicates the allowed external URLs by entity types, which can be included in a comment. If it's specified for a certain entity type, then only the specified external URLs are allowed in the comments.
`CommentEntityTypeDefinition` properties:
@ -46,7 +57,7 @@ The comment system provides a commenting [widget](../../UI/AspNetCore/Widgets.md
})
```
`entityType` was explained in the previous section. `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here. `referralLinks` is an optional parameter. You can use this parameter to add values (such as "nofollow", "noreferrer", or any other values) to the [rel attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel) of links.
`entityType` was explained in the previous section. `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here. `referralLinks` is an optional parameter. You can use this parameter to add values (such as "nofollow", "noreferrer", or any other values) to the [rel attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel) of links.
## User Interface

10
docs/en/Themes/LeptonXLite/Angular.md

@ -28,12 +28,8 @@ yarn add bootstrap-icons
* [Styles - Angular UI](../../UI/Angular/Theme-Configurations.md)
Add the following style
```json
"node_modules/bootstrap-icons/font/bootstrap-icons.css",
```
Note: You should remove the old theme styles from "angular.json" if you are switching from "ThemeBasic" or "Lepton."
Look at the [Theme Configurations](../../UI/Angular/Theme-Configurations) list of styles. Depending on your theme, you can alter your styles in angular.json.
- Finally, remove `ThemeBasicModule` from `app.module.ts`, and import the related modules in `app.module.ts`
```js
@ -44,7 +40,7 @@ import { SideMenuLayoutModule } from "@abp/ng.theme.lepton-x/layouts";
imports: [
// ...
// do not forget to remove ThemeBasicModule
// do not forget to remove ThemeBasicModule or other old theme module
// ThemeBasicModule.forRoot(),
ThemeLeptonXModule.forRoot(),
SideMenuLayoutModule.forRoot(),

8
framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs

@ -10,14 +10,22 @@ public class TableColumn
{
public string Title { get; set; }
public string Data { get; set; }
public string PropertyName { get; set; }
[CanBeNull]
public string DisplayFormat { get; set; }
public IFormatProvider DisplayFormatProvider { get; set; } = CultureInfo.CurrentCulture;
[CanBeNull]
public Type Component { get; set; }
public List<EntityAction> Actions { get; set; }
[CanBeNull]
public Func<object, string> ValueConverter { get; set; }
public bool Sortable { get; set; }
public TableColumn()

3
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj

@ -30,8 +30,7 @@
</ItemGroup>
<ItemGroup>
<Content Remove="Views\Components\Themes\Shared\**\*.cshtml" />
<EmbeddedResource Include="Views\Components\Themes\Shared\**\*.cshtml" />
<EmbeddedResource Include="Views\Components\Themes\Shared\**\*.cshtml"/>
</ItemGroup>
</Project>

8
framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs

@ -309,7 +309,7 @@ public abstract class AbpCrudPageBase<
{
CurrentSorting = e.Columns
.Where(c => c.SortDirection != SortDirection.Default)
.Select(c => c.Field + (c.SortDirection == SortDirection.Descending ? " DESC" : ""))
.Select(c => c.SortField + (c.SortDirection == SortDirection.Descending ? " DESC" : ""))
.JoinAsString(",");
CurrentPage = e.Page;
@ -608,7 +608,8 @@ public abstract class AbpCrudPageBase<
yield return new TableColumn
{
Title = lookupPropertyDefinition.GetLocalizedDisplayName(StringLocalizerFactory),
Data = $"ExtraProperties[{propertyInfo.Name}]"
Data = $"ExtraProperties[{propertyInfo.Name}]",
PropertyName = propertyInfo.Name
};
}
else
@ -616,7 +617,8 @@ public abstract class AbpCrudPageBase<
var column = new TableColumn
{
Title = propertyInfo.GetLocalizedDisplayName(StringLocalizerFactory),
Data = $"ExtraProperties[{propertyInfo.Name}]"
Data = $"ExtraProperties[{propertyInfo.Name}]",
PropertyName = propertyInfo.Name
};
if (propertyInfo.IsDate() || propertyInfo.IsDateTime())

2
framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor

@ -105,7 +105,7 @@
}
else
{
<DataGridColumn TItem="TItem" Field="@nameof(IHasExtraProperties.ExtraProperties)" Caption="@column.Title">
<DataGridColumn TItem="TItem" Field="@nameof(IHasExtraProperties.ExtraProperties)" SortField="@column.PropertyName" Caption="@column.Title">
<DisplayTemplate>
@{
var entity = context as IHasExtraProperties;

1
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor

@ -11,7 +11,6 @@
TValue="object"
TextField="item => item?.Text"
ValueField="item => item?.Value"
SelectedText="@SelectedText"
SelectedValue="@SelectedValue"
SelectedValueChanged="@SelectedValueChanged"
SearchChanged="@SearchFilterChangedAsync"

29
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor.cs

@ -23,7 +23,7 @@ namespace Volo.Abp.BlazoriseUI.Components.ObjectExtending;
public partial class LookupExtensionProperty<TEntity, TResourceType>
where TEntity : IHasExtraProperties
{
protected List<SelectItem<object>> lookupItems;
protected List<SelectItem<object>> lookupItems = new();
[Inject] public ILookupApiRequestService LookupApiService { get; set; }
@ -37,17 +37,28 @@ public partial class LookupExtensionProperty<TEntity, TResourceType>
}
}
public string SelectedText => Entity.GetProperty<string>(TextPropertyName);
public LookupExtensionProperty()
protected override void OnParametersSet()
{
lookupItems = new List<SelectItem<object>>();
var value = Entity.GetProperty(PropertyInfo.Name);
var text = Entity.GetProperty(TextPropertyName);
if (value != null && text != null)
{
lookupItems.Add(new SelectItem<object>
{
Text = Entity.GetProperty(TextPropertyName).ToString(),
Value = value
});
}
}
protected async override Task OnInitializedAsync()
protected async override Task OnAfterRenderAsync(bool firstRender)
{
await base.OnInitializedAsync();
await SearchFilterChangedAsync(string.Empty);
await base.OnAfterRenderAsync(firstRender);
if (firstRender)
{
await SearchFilterChangedAsync(string.Empty);
}
}
protected virtual void UpdateLookupTextProperty(object value)

2
framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj

@ -15,7 +15,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Castle.Core" Version="5.0.0" />
<PackageReference Include="Castle.Core" Version="5.1.1" />
<PackageReference Include="Castle.Core.AsyncInterceptor" Version="2.1.0" />
</ItemGroup>

9
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs

@ -123,10 +123,17 @@ public static class EntityHelper
return typeof(IEntity).IsAssignableFrom(type);
}
public static Func<Type, bool> IsValueObjectPredicate = type => typeof(ValueObject).IsAssignableFrom(type);
public static bool IsValueObject([NotNull] Type type)
{
Check.NotNull(type, nameof(type));
return typeof(ValueObject).IsAssignableFrom(type);
return IsValueObjectPredicate(type);
}
public static bool IsValueObject(object obj)
{
return obj != null && IsValueObject(obj.GetType());
}
public static void CheckEntity([NotNull] Type type)

2
framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj

@ -16,7 +16,7 @@
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Core\Volo.Abp.Core.csproj" />
<PackageReference Include="AsyncKeyedLock" Version="6.2.0" />
<PackageReference Include="AsyncKeyedLock" Version="6.2.1" />
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="$(MicrosoftPackageVersion)" />
</ItemGroup>

4
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs

@ -93,7 +93,7 @@ public class EntityHistoryHelper : IEntityHistoryHelper, ITransientDependency
}
var entityId = GetEntityId(entity);
if (entityId == null && changeType != EntityChangeType.Created && !(entity is ValueObject))
if (entityId == null && changeType != EntityChangeType.Created && !EntityHelper.IsValueObject(entity))
{
return null;
}
@ -151,7 +151,7 @@ public class EntityHistoryHelper : IEntityHistoryHelper, ITransientDependency
return keys.JoinAsString(",");
}
if (entityAsObj is ValueObject)
if (EntityHelper.IsValueObject(entityAsObj))
{
return null;
}

11
modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs

@ -1,3 +1,4 @@
using System.Collections.Generic;
using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
@ -168,6 +169,16 @@ public class CmsKitWebUnifiedModule : AbpModule
{
options.EntityTypes.Add(new CommentEntityTypeDefinition("quote"));
options.IsRecaptchaEnabled = true;
options.AllowedExternalUrls = new Dictionary<string, List<string>>
{
{
"quote",
new List<string>
{
"https://abp.io/"
}
}
};
});
Configure<CmsKitMediaOptions>(options =>

5
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CmsKitCommentOptions.cs

@ -13,4 +13,9 @@ public class CmsKitCommentOptions
/// Default: false
/// </summary>
public bool IsRecaptchaEnabled { get; set; }
/// <summary>
/// Indicates the allowed external URLs by entity types, which can be included in a comment.
/// </summary>
public Dictionary<string, List<string>> AllowedExternalUrls { get; set; } = new();
}

3
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json

@ -216,6 +216,7 @@
"CaptchaCode": "Captcha code",
"CommentTextRequired": "Comment is required",
"CaptchaCodeErrorMessage" : "The answer you entered for the CAPTCHA was not correct. Please try again",
"CaptchaCodeMissingMessage": "The captcha code is missing!"
"CaptchaCodeMissingMessage": "The captcha code is missing!",
"UnAllowedExternalUrlMessage": "You included an unallowed external URL. Please try again without the external URL."
}
}

2
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParameteresInput.cs → modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs

@ -6,7 +6,7 @@ using Volo.CmsKit.Comments;
namespace Volo.CmsKit.Public.Comments;
[Serializable]
public class CreateCommentWithParameteresInput
public class CreateCommentWithParametersInput
{
[Required]
[DynamicStringLength(typeof(CommentConsts), nameof(CommentConsts.MaxTextLength))]

60
modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs

@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Options;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Authorization;
using Volo.Abp.Data;
@ -23,24 +25,27 @@ namespace Volo.CmsKit.Public.Comments;
[RequiresGlobalFeature(typeof(CommentsFeature))]
public class CommentPublicAppService : CmsKitPublicAppServiceBase, ICommentPublicAppService
{
protected string RegexMarkdownUrlPattern = @"\[[^\]]*\]\((?<url>.*?)\)(?![^\x60]*\x60)";
protected ICommentRepository CommentRepository { get; }
protected ICmsUserLookupService CmsUserLookupService { get; }
public IDistributedEventBus DistributedEventBus { get; }
protected CommentManager CommentManager { get; }
protected IAuthorizationService AuthorizationService { get; }
protected CmsKitCommentOptions CmsCommentOptions { get; }
public CommentPublicAppService(
ICommentRepository commentRepository,
ICmsUserLookupService cmsUserLookupService,
IDistributedEventBus distributedEventBus,
CommentManager commentManager,
IAuthorizationService authorizationService)
IOptionsSnapshot<CmsKitCommentOptions> cmsCommentOptions)
{
CommentRepository = commentRepository;
CmsUserLookupService = cmsUserLookupService;
DistributedEventBus = distributedEventBus;
CommentManager = commentManager;
AuthorizationService = authorizationService;
CmsCommentOptions = cmsCommentOptions.Value;
}
public virtual async Task<ListResultDto<CommentWithDetailsDto>> GetListAsync(string entityType, string entityId)
@ -56,6 +61,8 @@ public class CommentPublicAppService : CmsKitPublicAppServiceBase, ICommentPubli
[Authorize]
public virtual async Task<CommentDto> CreateAsync(string entityType, string entityId, CreateCommentInput input)
{
CheckExternalUrls(entityType, input.Text);
var user = await CmsUserLookupService.GetByIdAsync(CurrentUser.GetId());
if (input.RepliedCommentId.HasValue)
@ -87,11 +94,12 @@ public class CommentPublicAppService : CmsKitPublicAppServiceBase, ICommentPubli
public virtual async Task<CommentDto> UpdateAsync(Guid id, UpdateCommentInput input)
{
var comment = await CommentRepository.GetAsync(id);
if (comment.CreatorId != CurrentUser.GetId())
{
throw new AbpAuthorizationException();
}
CheckExternalUrls(comment.EntityType, input.Text);
comment.SetText(input.Text);
comment.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
@ -148,4 +156,46 @@ public class CommentPublicAppService : CmsKitPublicAppServiceBase, ICommentPubli
{
return ObjectMapper.Map<CmsUser, CmsUserDto>(comments.Single(c => c.Comment.Id == commentId).Author);
}
private void CheckExternalUrls(string entityType, string text)
{
if (!CmsCommentOptions.AllowedExternalUrls.TryGetValue(entityType, out var allowedExternalUrls))
{
return;
}
var matches = Regex.Matches(text, RegexMarkdownUrlPattern,
RegexOptions.Compiled | RegexOptions.IgnoreCase);
foreach (Match match in matches)
{
if (!match.Success || match.Groups.Count < 2)
{
continue;
}
var url = NormalizeUrl(match.Groups[1].Value);
if (!IsExternalUrl(url))
{
continue;
}
if (!allowedExternalUrls.Any(allowedExternalUrl =>
url.Contains(NormalizeUrl(allowedExternalUrl), StringComparison.OrdinalIgnoreCase)))
{
throw new UserFriendlyException(L["UnAllowedExternalUrlMessage"]);
}
}
}
private static bool IsExternalUrl(string url)
{
return url.StartsWith("https", StringComparison.InvariantCultureIgnoreCase) ||
url.StartsWith("http", StringComparison.InvariantCultureIgnoreCase);
}
private static string NormalizeUrl(string url)
{
return url.Replace("www.", "").RemovePostFix("/");
}
}

2
modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebAutoMapperProfile.cs

@ -8,6 +8,6 @@ public class CmsKitPublicWebAutoMapperProfile : Profile
{
public CmsKitPublicWebAutoMapperProfile()
{
CreateMap<CreateCommentWithParameteresInput, CreateCommentInput>();
CreateMap<CreateCommentWithParametersInput, CreateCommentInput>();
}
}

4
modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicCommentsController.cs

@ -29,14 +29,14 @@ public class CmsKitPublicCommentsController : AbpController
}
[HttpPost]
public async Task ValidateAsync([FromBody] CreateCommentWithParameteresInput input)
public async Task ValidateAsync([FromBody] CreateCommentWithParametersInput input)
{
if (CmsKitCommentOptions.IsRecaptchaEnabled && input.CaptchaToken.HasValue)
{
SimpleMathsCaptchaGenerator.Validate(input.CaptchaToken.Value, input.CaptchaAnswer);
}
var dto = ObjectMapper.Map<CreateCommentWithParameteresInput, CreateCommentInput> (input);
var dto = ObjectMapper.Map<CreateCommentWithParametersInput, CreateCommentInput> (input);
await CommentPublicAppService.CreateAsync(input.EntityType, input.EntityId, dto);
}
}

2
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs

@ -121,7 +121,7 @@ public class CommentingViewComponent : AbpViewComponent
public string EntityType { get; set; }
public string EntityId { get; set; }
public IEnumerable<string> ReferralLinks { get; set; }
public string LoginUrl { get; set; }

21
modules/cms-kit/test/Volo.CmsKit.Application.Tests/CmsKitApplicationTestModule.cs

@ -1,4 +1,6 @@
using Volo.Abp.Modularity;
using System.Collections.Generic;
using Volo.Abp.Modularity;
using Volo.CmsKit.Comments;
namespace Volo.CmsKit;
@ -8,5 +10,20 @@ namespace Volo.CmsKit;
)]
public class CmsKitApplicationTestModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<CmsKitCommentOptions>(options =>
{
options.AllowedExternalUrls = new Dictionary<string, List<string>>
{
{
"EntityName1",
new List<string>
{
"https://abp.io/"
}
}
};
});
}
}

33
modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs

@ -3,6 +3,7 @@ using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using NSubstitute;
using Shouldly;
using Volo.Abp;
using Volo.Abp.Users;
using Volo.CmsKit.Public.Comments;
using Xunit;
@ -62,6 +63,23 @@ public class CommentPublicAppService_Tests : CmsKitApplicationTestBase
});
}
[Fact]
public async Task CreateAsync_ShouldThrowUserFriendlyException_If_Url_UnAllowed()
{
_currentUser.Id.Returns(_cmsKitTestData.User2Id);
await Should.ThrowAsync<UserFriendlyException>(async () =>
await _commentAppService.CreateAsync(
_cmsKitTestData.EntityType1,
_cmsKitTestData.EntityId1,
new CreateCommentInput
{
RepliedCommentId = null,
Text = "[ABP Community](https://community.abp.io/)", //not allowed URL
}
));
}
[Fact]
public async Task UpdateAsync()
{
@ -80,6 +98,21 @@ public class CommentPublicAppService_Tests : CmsKitApplicationTestBase
comment.Text.ShouldBe("I'm Updated");
});
}
[Fact]
public async Task UpdateAsync_ShouldThrowUserFriendlyException_If_Url_UnAllowed()
{
_currentUser.Id.Returns(_cmsKitTestData.User1Id);
await Should.ThrowAsync<UserFriendlyException>(async () =>
await _commentAppService.UpdateAsync(
_cmsKitTestData.CommentWithChildId,
new UpdateCommentInput
{
Text = "[ABP Community - Update](https://community.abp.io/)", //not allowed URL
}
));
}
[Fact]
public async Task DeleteAsync()

4
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.css

@ -2,3 +2,7 @@
margin-top: 1.5em !important;
background: rgba(233, 237, 241, 0.34) !important;
padding: 1px !important; }
.input-group .input-group-text{
background-color: transparent!important;
}

2
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.min.css

@ -1 +1 @@
.code-toolbar .line-highlight{margin-top:1.5em !important;background:rgba(233,237,241,.34) !important;padding:1px !important;}
.code-toolbar .line-highlight{margin-top:1.5em !important;background:rgba(233,237,241,.34) !important;padding:1px !important;} .input-group .input-group-text{background-color: transparent!important;}

6
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.scss

@ -5,3 +5,9 @@
padding: 1px !important;
}
}
.input-group{
.input-group-text{
background-color: transparent!important;
}
}

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs

@ -10,4 +10,5 @@ public static class IdentityErrorCodes
public const string StaticRoleDeletion = "Volo.Abp.Identity:010006";
public const string UsersCanNotChangeTwoFactor = "Volo.Abp.Identity:010007";
public const string CanNotChangeTwoFactor = "Volo.Abp.Identity:010008";
public const string YouCannotDelegateYourself = "Volo.Abp.Identity:010009";
}

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "لا يمكن حذف الأدوار الثابتة.",
"Volo.Abp.Identity:010007": "لا يمكنك تغيير إعداد العاملين.",
"Volo.Abp.Identity:010008": "لا يجوز تغيير إعداد عاملين.",
"Volo.Abp.Identity:010009": "لا يمكنك تفويض نفسك.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "العدد الأقصى المسموح به لعضوية الوحدة التنظيمية للمستخدم",
"ThisUserIsNotActiveMessage": "هذا المستخدم غير نشط.",
"Permission:IdentityManagement": "إدارة الهوية",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Statické role nemohou být smazány.",
"Volo.Abp.Identity:010007": "Nastavení dvou faktorů nemůžete změnit.",
"Volo.Abp.Identity:010008": "Není povoleno měnit nastavení dvou faktorů.",
"Volo.Abp.Identity:010009": "Nemůžete delegovat své vlastní oprávnění.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Maximální povolený počet členů organizační jednotky pro uživatele",
"ThisUserIsNotActiveMessage": "Tento uživatel není aktivní.",
"Permission:IdentityManagement": "Správa identit",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Statische Rollen können nicht gelöscht werden.",
"Volo.Abp.Identity:010007": "Sie können Ihre Zwei-Faktor-Einstellung nicht ändern.",
"Volo.Abp.Identity:010008": "Die Zwei-Faktor-Einstellung dürfen nicht geändert werden.",
"Volo.Abp.Identity:010009": "Sie können sich nicht selbst delegieren.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Maximal zulässige Anzahl an Mitgliedschaften in Organisationseinheiten für einen Benutzer",
"ThisUserIsNotActiveMessage": "Dieser Benutzer ist nicht aktiv.",
"Permission:IdentityManagement": "Identitätsverwaltung",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json

@ -70,6 +70,7 @@
"Volo.Abp.Identity:010006": "Οι στατικοί ρόλοι δεν μπορούν να διαγραφούν.",
"Volo.Abp.Identity:010007": "Δεν μπορείτε να αλλάξετε τη ρύθμιση δύο παραγόντων.",
"Volo.Abp.Identity:010008": "Δεν επιτρέπεται η αλλαγή της ρύθμισης δύο παραγόντων.",
"Volo.Abp.Identity:010009": "Δεν μπορείτε να αναθέσετε την εξουσιοδότησή σας σε εσάς ίδιο.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Μέγιστος επιτρεπόμενος αριθμός μελών μονάδας οργανισμού για έναν χρήστη",
"ThisUserIsNotActiveMessage": "Αυτός ο χρήστης δεν είναι ενεργός.",
"Permission:IdentityManagement": "Διαχείριση ταυτότητας",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json

@ -70,6 +70,7 @@
"Volo.Abp.Identity:010006": "Static roles cannot be deleted.",
"Volo.Abp.Identity:010007": "You can't change your two factor setting.",
"Volo.Abp.Identity:010008": "Changing the two factor setting is not allowed.",
"Volo.Abp.Identity:010009": "You cannot delegate yourself!",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Maximum allowed organisation unit membership count for a user",
"Permission:IdentityManagement": "Identity management",
"Permission:RoleManagement": "Role management",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Static roles can not be deleted.",
"Volo.Abp.Identity:010007": "You can't change your two factor setting.",
"Volo.Abp.Identity:010008": "It's not allowed to change two factor setting.",
"Volo.Abp.Identity:010009": "You can not delegate yourself.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Maximum allowed organization unit membership count for a user",
"ThisUserIsNotActiveMessage": "This user is not active.",
"Permission:IdentityManagement": "Identity management",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Los roles estáticos no pueden ser borrados.",
"Volo.Abp.Identity:010007": "No puedes cambiar tu configuración de autentificación de dos pasos.",
"Volo.Abp.Identity:010008": "No está permitido cambiar la configuración de autenticación de dos pasos.",
"Volo.Abp.Identity:010009": "No puedes delegar tu propia cuenta!",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Número máximo de unidades organizativas por usuario",
"ThisUserIsNotActiveMessage": "Este usuario no está activo.",
"Permission:IdentityManagement": "Gestión de identidades",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json

@ -70,6 +70,7 @@
"Volo.Abp.Identity:010006": "نقش/وظیفه ی استاتیک را نمی توان حذف کرد.",
"Volo.Abp.Identity:010007": "شما نمی توانید تنظیمات دو مرحله ای خود را تغییر دهید.",
"Volo.Abp.Identity:010008": "تغییر دادن تنظیمات دو مرحله ای مجاز نمی باشد.",
"Volo.Abp.Identity:010009": "شما نمی توانید خودتان را معرفی کنید.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "حداکثر تعداد مجاز عضویت در یک واحد سازمان برای یک کاربر",
"ThisUserIsNotActiveMessage": "این کاربر غیرفعال میباشد.",
"Permission:IdentityManagement": "مدیریت هویت",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Staattisia rooleja ei voi poistaa.",
"Volo.Abp.Identity:010007": "Et voi muuttaa kahden tekijän asetusta.",
"Volo.Abp.Identity:010008": "Kahden tekijän asetusta ei saa muuttaa.",
"Volo.Abp.Identity:010009": "Et voi delegoida itseäsi.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Suurin sallittu organisaatioyksikön jäsenmäärä käyttäjälle",
"ThisUserIsNotActiveMessage": "Tämä käyttäjä ei ole aktiivinen.",
"Permission:IdentityManagement": "Identiteetin hallinta",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Les rôles statiques ne peuvent pas être supprimés.",
"Volo.Abp.Identity:010007": "Vous ne pouvez pas modifier votre paramètre à deux facteurs.",
"Volo.Abp.Identity:010008": "Il n’est pas permis de changer deux facteurs de réglage.",
"Volo.Abp.Identity:010009": "Vous ne pouvez pas vous déléguer vous-même.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Nombre maximal d’adhésions autorisées à l’unité d’organisation pour un utilisateur",
"ThisUserIsNotActiveMessage": "Cet utilisateur n'est pas actif.",
"Permission:IdentityManagement": "Gestion de l’identité",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "स्टेटिक भूमिकाओं को हटाया नहीं जा सकता।",
"Volo.Abp.Identity:010007": "आप अपनी दो कारक सेटिंग नहीं बदल सकते।",
"Volo.Abp.Identity:010008": "इसे दो कारक सेटिंग बदलने की अनुमति नहीं है।",
"Volo.Abp.Identity:010009": "आप अपने आप को अधिकृत नहीं कर सकते हैं!",
"Identity.OrganizationUnit.MaxUserMembershipCount": "उपयोगकर्ता के लिए अधिकतम अनुमत संगठन इकाई सदस्यता गणना",
"ThisUserIsNotActiveMessage": "यह उपयोगकर्ता सक्रिय नहीं है।",
"Permission:IdentityManagement": "पहचान प्रबंधन",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Statičke uloge nije moguće izbrisati.",
"Volo.Abp.Identity:010007": "Ne možete promijeniti postavku dva faktora.",
"Volo.Abp.Identity:010008": "Nije dopušteno mijenjati postavke dvofaktorske autentifikacije.",
"Volo.Abp.Identity:010009": "Ne možete delegirati sami sebi.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Maksimalni dopušteni broj članstva u organizacijskoj jedinici za korisnika",
"ThisUserIsNotActiveMessage": "Ovaj korisnik nije aktivan.",
"Permission:IdentityManagement": "Upravljanje identitetom",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "A statikus szerepeket nem lehet törölni.",
"Volo.Abp.Identity:010007": "Nem változtathatja meg a kétlépcsős bejelentkezés beállítását.",
"Volo.Abp.Identity:010008": "Kétlépcsős bejelentkezés beállítás megváltoztatása nem megengedett.",
"Volo.Abp.Identity:010009": "Nem adhatja át a saját jogosultságait.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "A maximálisan megengedett szervezeti egység tagsági szám egy felhasználó számára",
"ThisUserIsNotActiveMessage": "Ez a felhasználó nem aktív.",
"Permission:IdentityManagement": "Identitáskezelés",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Ekki er hægt að eyða static hlutverkum.",
"Volo.Abp.Identity:010007": "Þú getur ekki breytt tveggja þátta stillingu þinni.",
"Volo.Abp.Identity:010008": "Það er ekki leyfilegt að breyta tvíþátta stillingu.",
"Volo.Abp.Identity:010009": "Þú getur ekki delegað þér sjálfum.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Hámarks leyfileg fjöldi aðildar að skipulagseiningu fyrir notanda",
"ThisUserIsNotActiveMessage": "Þessi notandi er ekki virkur.",
"Permission:IdentityManagement": "Auðkenninga umsjón",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "I ruoli statici non possono essere eliminati.",
"Volo.Abp.Identity:010007": "Non puoi modificare l'impostazione dei due fattori.",
"Volo.Abp.Identity:010008": "Non è consentito modificare l'impostazione a due fattori.",
"Volo.Abp.Identity:010009": "Non puoi delegare te stesso.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Numero massimo consentito di membri dell'unità organizzativa per un utente",
"ThisUserIsNotActiveMessage": "Questo utente non è attivo.",
"Permission:IdentityManagement": "Gestione identità",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Statische rollen kunnen niet worden verwijderd.",
"Volo.Abp.Identity:010007": "U kunt uw instelling voor tweefactor authenticatie niet wijzigen.",
"Volo.Abp.Identity:010008": "Het is niet toegestaan om de instelling van tweefactor authenticatie te wijzigen.",
"Volo.Abp.Identity:010009": "U kunt uzelf niet delegeren.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Maximaal toegestande aantal lidmaatschappen van organisatie-eenheden voor een gebruiker",
"ThisUserIsNotActiveMessage": "Deze gebruiker is niet actief.",
"Permission:IdentityManagement": "Identiteitsbeheer",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Statyczna rola nie może zostać usunięta.",
"Volo.Abp.Identity:010007": "Nie możesz zmienić ustawienia dwóch czynników.",
"Volo.Abp.Identity:010008": "Nie wolno zmieniać ustawienia dwuczynnikowego.",
"Volo.Abp.Identity:010009": "Nie możesz delegować swoich uprawnień.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Maksymalna dozwolona liczba członków jednostki organizacyjnej dla użytkownika",
"ThisUserIsNotActiveMessage": "Ten użytkownik nie jest aktywny.",
"Permission:IdentityManagement": "Zarządzanie tożsamością",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Perfis estáticos não podem ser excluídos.",
"Volo.Abp.Identity:010007": "Você não pode alterar sua configuração de dois fatores.",
"Volo.Abp.Identity:010008": "Não é permitido alterar a configuração de dois fatores.",
"Volo.Abp.Identity:010009": "Você não pode delegar a si mesmo.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Contagem máxima permitida de membros da unidade organizacional para um usuário",
"ThisUserIsNotActiveMessage": "Este usuário não está ativo.",
"Permission:IdentityManagement": "Acessos",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Rolurile statice nu pot fi şterse.",
"Volo.Abp.Identity:010007": "Nu vă puteţi schimba setările de autentificare în doi paşi.",
"Volo.Abp.Identity:010008": "Nu este permisă modificarea setărilor autentificării în doi paşi.",
"Volo.Abp.Identity:010009": "Nu vă puteţi delega singur.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Numărul maxim de unităţi organizaţionale permise pentru un utilizator",
"ThisUserIsNotActiveMessage": "Acest utilizator nu este activ.",
"Permission:IdentityManagement": "Administrare identităţii",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Статические роли не могут быть удалены.",
"Volo.Abp.Identity:010007": "Вы не можете изменить настройку двух факторов.",
"Volo.Abp.Identity:010008": "Изменение двухфакторной настройки не допускается.",
"Volo.Abp.Identity:010009": "Вы не можете делегировать свои собственные права.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Максимально допустимое количество членов организационного подразделения для пользователя",
"ThisUserIsNotActiveMessage": "Этот пользователь не активен.",
"Permission:IdentityManagement": "Управление идентификацией",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Statické roly nie je možné zmazať.",
"Volo.Abp.Identity:010007": "Dvojfaktorové nastavenie nie je možné zmeniť.",
"Volo.Abp.Identity:010008": "Dvojfaktorové nastavenie nie je povolené zmeniť.",
"Volo.Abp.Identity:010009": "Nemôžete delegovať svoje vlastné oprávnenia.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Maximálny povolený počet členov organizačnej jednotky pre používateľa",
"ThisUserIsNotActiveMessage": "Tento používateľ nie je aktívny.",
"Permission:IdentityManagement": "Správa identít",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Statičnih vlog ni mogoče izbrisati.",
"Volo.Abp.Identity:010007": "Nastavitve dveh faktorjev ne morete spremeniti.",
"Volo.Abp.Identity:010008": "Ni dovoljeno spreminjati nastavitve dveh faktorjev.",
"Volo.Abp.Identity:010009": "Ne morete delegirati svojih pravic.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Največje dovoljeno število članov v organizacijski enoti za uporabnika",
"ThisUserIsNotActiveMessage": "Ta uporabnik ni aktiven.",
"Permission:IdentityManagement": "Upravljanje identitet",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Bir Sabit rol silinemez.",
"Volo.Abp.Identity:010007": "İki faktörlü ayarınızı değiştiremezsiniz.",
"Volo.Abp.Identity:010008": "İki faktörlü ayarın değiştirilmesine izin verilmez.",
"Volo.Abp.Identity:010009": "Kendinizi yetkilendiremezsiniz.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Bir kullanıcı için izin verilen en fazla organizasyon birimi sayısı",
"ThisUserIsNotActiveMessage": "Bu kullanıcı aktif değil.",
"Permission:IdentityManagement": "Kimlik yönetimi",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "Vai trò này là cố định không được phép xóa.",
"Volo.Abp.Identity:010007": "Bạn không thể thay đổi cài đặt hai yếu tố của mình.",
"Volo.Abp.Identity:010008": "Không được phép thay đổi cài đặt hai yếu tố.",
"Volo.Abp.Identity:010009": "Bạn không thể ủy quyền cho chính mình.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Số lượng thành viên đơn vị tổ chức tối đa được phép cho một người dùng",
"ThisUserIsNotActiveMessage": "Người dùng này không hoạt động.",
"Permission:IdentityManagement": "Quản lý danh tính",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "无法删除静态角色.",
"Volo.Abp.Identity:010007": "你不能修改你的双因素身份验证设置",
"Volo.Abp.Identity:010008": "不允许修改双因素身份验证设置.",
"Volo.Abp.Identity:010009": "你不能委托给自己.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "组织单位最大允许的成员资格计数",
"ThisUserIsNotActiveMessage": "该用户不可用.",
"Permission:IdentityManagement": "身份标识管理",

1
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json

@ -71,6 +71,7 @@
"Volo.Abp.Identity:010006": "無法刪除靜態角色.",
"Volo.Abp.Identity:010007": "你不能修改你的雙因素身份驗證設置",
"Volo.Abp.Identity:010008": "不允許修改雙因素身份驗證設置.",
"Volo.Abp.Identity:010009": "你不能委派給自己",
"Identity.OrganizationUnit.MaxUserMembershipCount": "允許一個使用者至多可隸屬在幾個組織單位",
"ThisUserIsNotActiveMessage": "該用戶不可用.",
"Permission:IdentityManagement": "身份識別管理",

23
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserDelegationRepository.cs

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
namespace Volo.Abp.Identity;
public interface IIdentityUserDelegationRepository: IBasicRepository<IdentityUserDelegation, Guid>
{
Task<List<IdentityUserDelegation>> GetListAsync(
Guid? sourceUserId,
Guid? targetUserId,
CancellationToken cancellationToken = default);
Task<List<IdentityUserDelegation>> GetActiveDelegationsAsync(
Guid targetUserId,
CancellationToken cancellationToken = default);
Task<IdentityUserDelegation> FindActiveDelegationByIdAsync(
Guid id,
CancellationToken cancellationToken = default);
}

41
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserDelegation.cs

@ -0,0 +1,41 @@
using System;
using Volo.Abp.Domain.Entities;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Identity;
public class IdentityUserDelegation : BasicAggregateRoot<Guid>, IMultiTenant
{
public virtual Guid? TenantId { get; protected set; }
public virtual Guid SourceUserId { get; protected set; }
public virtual Guid TargetUserId { get; protected set; }
public virtual DateTime StartTime { get; protected set; }
public virtual DateTime EndTime { get; protected set; }
/// <summary>
/// Initializes a new instance of <see cref="IdentityUserDelegation"/>.
/// </summary>
protected IdentityUserDelegation()
{
}
public IdentityUserDelegation(
Guid id,
Guid sourceUserId,
Guid targetUserId,
DateTime startTime,
DateTime endTime,
Guid? tenantId = null)
: base(id)
{
TenantId = tenantId;
SourceUserId = sourceUserId;
TargetUserId = targetUserId;
StartTime = startTime;
EndTime = endTime;
}
}

61
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserDelegationManager.cs

@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Services;
namespace Volo.Abp.Identity;
public class IdentityUserDelegationManager : DomainService
{
protected IIdentityUserDelegationRepository IdentityUserDelegationRepository { get; }
public IdentityUserDelegationManager(IIdentityUserDelegationRepository identityUserDelegationRepository)
{
IdentityUserDelegationRepository = identityUserDelegationRepository;
}
public virtual async Task<List<IdentityUserDelegation>> GetListAsync(Guid? sourceUserId = null, Guid? targetUserId = null, CancellationToken cancellationToken = default)
{
return await IdentityUserDelegationRepository.GetListAsync(sourceUserId, targetUserId, cancellationToken: cancellationToken);
}
public virtual async Task<List<IdentityUserDelegation>> GetActiveDelegationsAsync(Guid targetUseId, CancellationToken cancellationToken = default)
{
return await IdentityUserDelegationRepository.GetActiveDelegationsAsync(targetUseId, cancellationToken: cancellationToken);
}
public virtual async Task<IdentityUserDelegation> FindActiveDelegationByIdAsync(Guid id, CancellationToken cancellationToken = default)
{
return await IdentityUserDelegationRepository.FindActiveDelegationByIdAsync(id, cancellationToken: cancellationToken);
}
public virtual async Task DelegateNewUserAsync(Guid sourceUserId, Guid targetUserId, DateTime startTime, DateTime endTime, CancellationToken cancellationToken = default)
{
if (sourceUserId == targetUserId)
{
throw new BusinessException(IdentityErrorCodes.YouCannotDelegateYourself);
}
await IdentityUserDelegationRepository.InsertAsync(
new IdentityUserDelegation(
GuidGenerator.Create(),
sourceUserId,
targetUserId,
startTime,
endTime
),
cancellationToken: cancellationToken
);
}
public virtual async Task DeleteDelegationAsync(Guid id, Guid sourceUserId, CancellationToken cancellationToken = default)
{
var delegation = await IdentityUserDelegationRepository.FindAsync(id, cancellationToken: cancellationToken);
if (delegation != null && delegation.SourceUserId == sourceUserId)
{
await IdentityUserDelegationRepository.DeleteAsync(delegation, cancellationToken: cancellationToken);
}
}
}

1
modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs

@ -19,6 +19,7 @@ public class AbpIdentityEntityFrameworkCoreModule : AbpModule
options.AddRepository<OrganizationUnit, EfCoreOrganizationUnitRepository>();
options.AddRepository<IdentitySecurityLog, EFCoreIdentitySecurityLogRepository>();
options.AddRepository<IdentityLinkUser, EfCoreIdentityLinkUserRepository>();
options.AddRepository<IdentityUserDelegation, EfCoreIdentityUserDelegationRepository>();
});
}
}

52
modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserDelegationRepository.cs

@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Timing;
namespace Volo.Abp.Identity.EntityFrameworkCore;
public class EfCoreIdentityUserDelegationRepository : EfCoreRepository<IIdentityDbContext, IdentityUserDelegation, Guid>, IIdentityUserDelegationRepository
{
protected IClock Clock { get; }
public EfCoreIdentityUserDelegationRepository(IDbContextProvider<IIdentityDbContext> dbContextProvider, IClock clock)
: base(dbContextProvider)
{
Clock = clock;
}
public async Task<List<IdentityUserDelegation>> GetListAsync(Guid? sourceUserId, Guid? targetUserId, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.AsNoTracking()
.WhereIf(sourceUserId.HasValue, x => x.SourceUserId == sourceUserId)
.WhereIf(targetUserId.HasValue, x => x.TargetUserId == targetUserId)
.ToListAsync(cancellationToken: cancellationToken);
}
public async Task<List<IdentityUserDelegation>> GetActiveDelegationsAsync(Guid targetUserId, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.AsNoTracking()
.Where(x => x.TargetUserId == targetUserId &&
x.StartTime <= Clock.Now &&
x.EndTime >= Clock.Now)
.ToListAsync(cancellationToken: cancellationToken);
}
public async Task<IdentityUserDelegation> FindActiveDelegationByIdAsync(Guid id, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.AsNoTracking()
.FirstOrDefaultAsync(x =>
x.Id == id &&
x.StartTime <= Clock.Now &&
x.EndTime >= Clock.Now
, cancellationToken: GetCancellationToken(cancellationToken));
}
}

2
modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs

@ -18,4 +18,6 @@ public interface IIdentityDbContext : IEfCoreDbContext
DbSet<IdentitySecurityLog> SecurityLogs { get; }
DbSet<IdentityLinkUser> LinkUsers { get; }
DbSet<IdentityUserDelegation> UserDelegations { get; }
}

2
modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs

@ -22,6 +22,8 @@ public class IdentityDbContext : AbpDbContext<IdentityDbContext>, IIdentityDbCon
public DbSet<IdentityLinkUser> LinkUsers { get; set; }
public DbSet<IdentityUserDelegation> UserDelegations { get; set; }
public IdentityDbContext(DbContextOptions<IdentityDbContext> options)
: base(options)
{

9
modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs

@ -270,6 +270,15 @@ public static class IdentityDbContextModelBuilderExtensions
});
}
builder.Entity<IdentityUserDelegation>(b =>
{
b.ToTable(AbpIdentityDbProperties.DbTablePrefix + "UserDelegations", AbpIdentityDbProperties.DbSchema);
b.ConfigureByConvention();
b.ApplyObjectExtensionMappings();
});
builder.TryConfigureObjectExtensions<IdentityDbContext>();
}
}

2
modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs

@ -19,6 +19,8 @@ public class AbpIdentityMongoDbContext : AbpMongoDbContext, IAbpIdentityMongoDbC
public IMongoCollection<IdentityLinkUser> LinkUsers => Collection<IdentityLinkUser>();
public IMongoCollection<IdentityUserDelegation> UserDelegations => Collection<IdentityUserDelegation>();
protected override void CreateModel(IMongoModelBuilder modelBuilder)
{
base.CreateModel(modelBuilder);

5
modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs

@ -37,5 +37,10 @@ public static class AbpIdentityMongoDbContextExtensions
{
b.CollectionName = AbpIdentityDbProperties.DbTablePrefix + "LinkUsers";
});
builder.Entity<IdentityUserDelegation>(b =>
{
b.CollectionName = AbpIdentityDbProperties.DbTablePrefix + "UserDelegations";
});
}
}

1
modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs

@ -20,6 +20,7 @@ public class AbpIdentityMongoDbModule : AbpModule
options.AddRepository<OrganizationUnit, MongoOrganizationUnitRepository>();
options.AddRepository<IdentitySecurityLog, MongoIdentitySecurityLogRepository>();
options.AddRepository<IdentityLinkUser, MongoIdentityLinkUserRepository>();
options.AddRepository<IdentityUserDelegation, MongoIdentityUserDelegationRepository>();
});
}
}

2
modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs

@ -18,4 +18,6 @@ public interface IAbpIdentityMongoDbContext : IAbpMongoDbContext
IMongoCollection<IdentitySecurityLog> SecurityLogs { get; }
IMongoCollection<IdentityLinkUser> LinkUsers { get; }
IMongoCollection<IdentityUserDelegation> UserDelegations { get; }
}

52
modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserDelegationRepository.cs

@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.MongoDB;
using Volo.Abp.Timing;
namespace Volo.Abp.Identity.MongoDB;
public class MongoIdentityUserDelegationRepository : MongoDbRepository<IAbpIdentityMongoDbContext, IdentityUserDelegation, Guid>, IIdentityUserDelegationRepository
{
protected IClock Clock { get; }
public MongoIdentityUserDelegationRepository(IMongoDbContextProvider<IAbpIdentityMongoDbContext> dbContextProvider, IClock clock)
: base(dbContextProvider)
{
Clock = clock;
}
public async Task<List<IdentityUserDelegation>> GetListAsync(Guid? sourceUserId, Guid? targetUserId,
CancellationToken cancellationToken = default)
{
return await (await GetMongoQueryableAsync(cancellationToken))
.WhereIf(sourceUserId.HasValue, x => x.SourceUserId == sourceUserId)
.WhereIf(targetUserId.HasValue, x => x.TargetUserId == targetUserId)
.As<IMongoQueryable<IdentityUserDelegation>>()
.ToListAsync(cancellationToken: cancellationToken);
}
public async Task<List<IdentityUserDelegation>> GetActiveDelegationsAsync(Guid targetUserId, CancellationToken cancellationToken = default)
{
return await (await GetMongoQueryableAsync(cancellationToken))
.Where(x => x.TargetUserId == targetUserId)
.Where(x => x.StartTime <= Clock.Now && x.EndTime >= Clock.Now)
.As<IMongoQueryable<IdentityUserDelegation>>()
.ToListAsync(cancellationToken: cancellationToken);
}
public async Task<IdentityUserDelegation> FindActiveDelegationByIdAsync(Guid id, CancellationToken cancellationToken = default)
{
return await (await GetMongoQueryableAsync(cancellationToken))
.FirstOrDefaultAsync(x =>
x.Id == id &&
x.StartTime <= Clock.Now &&
x.EndTime >= Clock.Now
, cancellationToken: GetCancellationToken(cancellationToken));
}
}

69
modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserDelegationManager_Tests.cs

@ -0,0 +1,69 @@
using System;
using System.Threading.Tasks;
using Shouldly;
using Xunit;
namespace Volo.Abp.Identity;
public class IdentityUserDelegationManager_Tests : AbpIdentityDomainTestBase
{
protected IdentityUserDelegationManager IdentityUserDelegationManager { get; }
protected IdentityTestData TestData { get; }
public IdentityUserDelegationManager_Tests()
{
IdentityUserDelegationManager = GetRequiredService<IdentityUserDelegationManager>();
TestData = GetRequiredService<IdentityTestData>();
}
[Fact]
public async Task GetListAsync()
{
(await IdentityUserDelegationManager.GetListAsync(Guid.NewGuid(), Guid.NewGuid())).Count.ShouldBe(0);
(await IdentityUserDelegationManager.GetListAsync(TestData.UserJohnId, null)).Count.ShouldBe(2);
(await IdentityUserDelegationManager.GetListAsync(null, TestData.UserDavidId)).Count.ShouldBe(3);
(await IdentityUserDelegationManager.GetListAsync(TestData.UserNeoId, TestData.UserDavidId)).Count.ShouldBe(1);
}
[Fact]
public async Task GetActiveDelegationsAsync()
{
var activeDelegations = await IdentityUserDelegationManager.GetActiveDelegationsAsync(TestData.UserDavidId);
activeDelegations.Count.ShouldBe(2);
activeDelegations[0].SourceUserId.ShouldBe(TestData.UserJohnId);
activeDelegations[0].TargetUserId.ShouldBe(TestData.UserDavidId);
activeDelegations[1].SourceUserId.ShouldBe(TestData.UserNeoId);
activeDelegations[1].TargetUserId.ShouldBe(TestData.UserDavidId);
}
[Fact]
public async Task FindActiveDelegationByIdAsync()
{
var activeDelegations = await IdentityUserDelegationManager.GetActiveDelegationsAsync(TestData.UserDavidId);
var activeDelegation = await IdentityUserDelegationManager.FindActiveDelegationByIdAsync(activeDelegations[0].Id);
activeDelegation.ShouldNotBeNull();
activeDelegation.SourceUserId.ShouldBe(TestData.UserJohnId);
activeDelegation.TargetUserId.ShouldBe(TestData.UserDavidId);
}
[Fact]
public async Task DelegateNewUserAsync()
{
await Should.ThrowAsync<BusinessException>(IdentityUserDelegationManager.DelegateNewUserAsync(
TestData.UserJohnId,
TestData.UserJohnId,
DateTime.Now.AddDays(-1),
DateTime.Now));
await IdentityUserDelegationManager.DelegateNewUserAsync(
TestData.UserJohnId,
TestData.UserBobId,
DateTime.Now.AddDays(-1),
DateTime.Now.AddDays(1));
(await IdentityUserDelegationManager.GetActiveDelegationsAsync(TestData.UserBobId)).Count.ShouldBe(1);
}
}

6
modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/IdentityUserDelegationepository_Tests.cs

@ -0,0 +1,6 @@
namespace Volo.Abp.Identity.EntityFrameworkCore;
public class IdentityUserDelegationepository_Tests : IdentityUserDelegationepository_Tests<AbpIdentityEntityFrameworkCoreTestModule>
{
}

9
modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/IdentityUserDelegationepository_Tests.cs

@ -0,0 +1,9 @@
using Xunit;
namespace Volo.Abp.Identity.MongoDB;
[Collection(MongoTestCollection.Name)]
public class IdentityUserDelegationepository_Tests: IdentityUserDelegationepository_Tests<AbpIdentityMongoDbTestModule>
{
}

30
modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs

@ -22,6 +22,7 @@ public class AbpIdentityTestDataBuilder : ITransientDependency
private readonly OrganizationUnitManager _organizationUnitManager;
private readonly IIdentityLinkUserRepository _identityLinkUserRepository;
private readonly IdentityLinkUserManager _identityLinkUserManager;
private readonly IIdentityUserDelegationRepository _identityUserDelegationRepository;
private IdentityRole _adminRole;
private IdentityRole _moderatorRole;
@ -42,7 +43,8 @@ public class AbpIdentityTestDataBuilder : ITransientDependency
IdentityTestData testData,
OrganizationUnitManager organizationUnitManager,
IIdentityLinkUserRepository identityLinkUserRepository,
IdentityLinkUserManager identityLinkUserManager)
IdentityLinkUserManager identityLinkUserManager,
IIdentityUserDelegationRepository identityUserDelegationRepository)
{
_guidGenerator = guidGenerator;
_userRepository = userRepository;
@ -55,6 +57,7 @@ public class AbpIdentityTestDataBuilder : ITransientDependency
_organizationUnitManager = organizationUnitManager;
_identityLinkUserRepository = identityLinkUserRepository;
_identityLinkUserManager = identityLinkUserManager;
_identityUserDelegationRepository = identityUserDelegationRepository;
_identitySecurityLogRepository = identitySecurityLogRepository;
}
@ -66,6 +69,7 @@ public class AbpIdentityTestDataBuilder : ITransientDependency
await AddLinkUsers();
await AddClaimTypes();
await AddSecurityLogs();
await AddUserDelegations();
}
private async Task AddRoles()
@ -197,4 +201,28 @@ public class AbpIdentityTestDataBuilder : ITransientDependency
CreationTime = new DateTime(2020, 01, 02, 10, 0, 0)
}));
}
private async Task AddUserDelegations()
{
await _identityUserDelegationRepository.InsertAsync(
new IdentityUserDelegation(_guidGenerator.Create(),
_testData.UserJohnId,
_testData.UserDavidId,
DateTime.Now.AddDays(-2),
DateTime.Now.AddDays(-1)));
await _identityUserDelegationRepository.InsertAsync(
new IdentityUserDelegation(_guidGenerator.Create(),
_testData.UserJohnId,
_testData.UserDavidId,
DateTime.Now.AddDays(-1),
DateTime.Now.AddDays(1)));
await _identityUserDelegationRepository.InsertAsync(
new IdentityUserDelegation(_guidGenerator.Create(),
_testData.UserNeoId,
_testData.UserDavidId,
DateTime.Now.AddDays(-1),
DateTime.Now.AddDays(1)));
}
}

55
modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserDelegationepository_Tests.cs

@ -0,0 +1,55 @@
using System;
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Modularity;
using Xunit;
namespace Volo.Abp.Identity;
public abstract class IdentityUserDelegationepository_Tests<TStartupModule> : AbpIdentityTestBase<TStartupModule>
where TStartupModule : IAbpModule
{
protected IIdentityUserRepository UserRepository { get; }
protected IIdentityUserDelegationRepository IdentityUserDelegationRepository { get; }
protected IdentityTestData TestData { get; }
public IdentityUserDelegationepository_Tests()
{
UserRepository = GetRequiredService<IIdentityUserRepository>();
IdentityUserDelegationRepository = GetRequiredService<IIdentityUserDelegationRepository>();
TestData = GetRequiredService<IdentityTestData>();
}
[Fact]
public async Task GetListAsync()
{
(await IdentityUserDelegationRepository.GetListAsync(Guid.NewGuid(), Guid.NewGuid())).Count.ShouldBe(0);
(await IdentityUserDelegationRepository.GetListAsync(TestData.UserJohnId, null)).Count.ShouldBe(2);
(await IdentityUserDelegationRepository.GetListAsync(null, TestData.UserDavidId)).Count.ShouldBe(3);
(await IdentityUserDelegationRepository.GetListAsync(TestData.UserNeoId, TestData.UserDavidId)).Count.ShouldBe(1);
}
[Fact]
public async Task GetActiveDelegationsAsync()
{
var activeDelegations = await IdentityUserDelegationRepository.GetActiveDelegationsAsync(TestData.UserDavidId);
activeDelegations.Count.ShouldBe(2);
activeDelegations[0].SourceUserId.ShouldBe(TestData.UserJohnId);
activeDelegations[0].TargetUserId.ShouldBe(TestData.UserDavidId);
activeDelegations[1].SourceUserId.ShouldBe(TestData.UserNeoId);
activeDelegations[1].TargetUserId.ShouldBe(TestData.UserDavidId);
}
[Fact]
public async Task GetActiveDelegationOrNullAsync()
{
var activeDelegations = await IdentityUserDelegationRepository.GetActiveDelegationsAsync(TestData.UserDavidId);
var activeDelegation = await IdentityUserDelegationRepository.FindActiveDelegationByIdAsync(activeDelegations[0].Id);
activeDelegation.ShouldNotBeNull();
activeDelegation.SourceUserId.ShouldBe(TestData.UserJohnId);
activeDelegation.TargetUserId.ShouldBe(TestData.UserDavidId);
}
}

2
modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Pages/Index.cshtml

@ -9,7 +9,7 @@
<div class="text-center">
<a class="btn btn-primary" href="/Login">Login</a>
<a class="btn btn-warning" href="/Logout">Loout</a>
<a class="btn btn-warning" href="/Logout">Logout</a>
@if (HttpContext.User.Identity != null && HttpContext.User.Identity.IsAuthenticated)
{

5
modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230307054116_Initial.Designer.cs → modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230404033745_Initial.Designer.cs

@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore;
namespace OpenIddict.Demo.Server.Migrations
{
[DbContext(typeof(ServerDbContext))]
[Migration("20230307054116_Initial")]
[Migration("20230404033745_Initial")]
partial class Initial
{
/// <inheritdoc />
@ -455,6 +455,9 @@ namespace OpenIddict.Demo.Server.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<DateTimeOffset?>("LastPasswordChangeTime")
.HasColumnType("datetimeoffset");
b.Property<bool>("LockoutEnabled")
.ValueGeneratedOnAdd()
.HasColumnType("bit")

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

Loading…
Cancel
Save