diff --git a/common.props b/common.props index 2b4840f50a..889b6d8ca9 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ latest - 7.0.0-rc.3 + 7.0.0-rc.5 $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ diff --git a/docs/en/Audit-Logging.md b/docs/en/Audit-Logging.md index 92fc64ce40..2fdf34dca6 100644 --- a/docs/en/Audit-Logging.md +++ b/docs/en/Audit-Logging.md @@ -40,12 +40,14 @@ Here, a list of the options you can configure: * `HideErrors` (default: `true`): Audit log system hides and write regular [logs](Logging.md) if any error occurs while saving the audit log objects. If saving the audit logs is critical for your system, set this to `false` to throw exception in case of hiding the errors. * `IsEnabledForAnonymousUsers` (default: `true`): If you want to write audit logs only for the authenticated users, set this to `false`. If you save audit logs for anonymous users, you will see `null` for `UserId` values for these users. * `AlwaysLogOnException` (default: `true`): If you set to true, it always saves the audit log on an exception/error case without checking other options (except `IsEnabled`, which completely disables the audit logging). +* `IsEnabledForIntegrationService` (default: `false`): Audit Logging is disabled for [integration services](Integration-Services.md) by default. Set this property as `true` to enable it. * `IsEnabledForGetRequests` (default: `false`): HTTP GET requests should not make any change in the database normally and audit log system doesn't save audit log objects for GET request. Set this to `true` to enable it also for the GET requests. * `DisableLogActionInfo` (default: `false`):If you set to true, Will no longer log `AuditLogActionInfo`. -* `ApplicationName`: If multiple applications saving audit logs into a single database, set this property to your application name, so you can distinguish the logs of different applications. If you don't set, it is set from the `IApplicationInfoAccessor.ApplicationName` value, which is the entry assembly name by default. +* `ApplicationName`: If multiple applications are saving audit logs into a single database, set this property to your application name, so you can distinguish the logs of different applications. If you don't set, it will set from the `IApplicationInfoAccessor.ApplicationName` value, which is the entry assembly name by default. * `IgnoredTypes`: A list of `Type`s to be ignored for audit logging. If this is an entity type, changes for this type of entities will not be saved. This list is also used while serializing the action parameters. * `EntityHistorySelectors`: A list of selectors those are used to determine if an entity type is selected for saving the entity change. See the section below for details. * `Contributors`: A list of `AuditLogContributor` implementations. A contributor is a way of extending the audit log system. See the "Audit Log Contributors" section below. +* `AlwaysLogSelectors`: A list of selectors to save the audit logs for the matched criteria. ### Entity History Selectors diff --git a/docs/en/Getting-Started-React-Native.md b/docs/en/Getting-Started-React-Native.md index fe4cf478de..be0505b9f1 100644 --- a/docs/en/Getting-Started-React-Native.md +++ b/docs/en/Getting-Started-React-Native.md @@ -95,6 +95,20 @@ A React Native application running on an Android emulator or a physical phone ** Run the backend application as described in the [getting started document](Getting-Started.md). +> You should turn off the "Https Restriction" if you're using OpenIddict as a central identity management solution. Because the IOS Simulator doesn't support self-signed certificates and OpenIddict is set to only work with HTTPS by default. +## How to disable the Https-only settings of OpenIddict + + Go to MyProjectNameHttpApiHostModule.cs under the host project. Add put these codes under the `PreConfigureServices` function. + +```csharp +#if DEBUG + PreConfigure(options => { + options.UseAspNetCore() + .DisableTransportSecurityRequirement(); + }); +#endif +``` + ## How to Configure & Run the React Native Application diff --git a/docs/en/Integration-Services.md b/docs/en/Integration-Services.md new file mode 100644 index 0000000000..966b383ef7 --- /dev/null +++ b/docs/en/Integration-Services.md @@ -0,0 +1,80 @@ +# Integration Services + +The *Integration Service* concept was created to distinguish the [application services](Application-Services.md) that are built for inter-module (or inter-microservice) communication from the application services that are intended to be consumed from a UI or a client application. + +The following figure shows a few microservices behind an API Gateway that is consumed by a UI application and 3rd-party client applications: + +![integration-services](images/integration-services.png) + +HTTP requests coming from out of the API Gateway can be called as *external request*, while the HTTP requests performed between microservices can be considered as *internal requests*. The application services that are designed to respond to these external requests are called as *integration services*, because their purpose is to integrate microservices in the system, rather than respond to user requests. + +## Marking an Application Service as Integration Service + +Assume that you have an application service named `ProductAppService`, and you want to use that application service as an integration service. In that case, you can use the `[IntegrationService]` attribute on top of the application service class as shown below: + +```csharp +[IntegrationService] +public class ProductAppService : ApplicationService, IProductAppService +{ + // ... +} +``` + +If your application service has an interface, like `IProductService` in this example, you can use it on the service interface: + +```csharp +[IntegrationService] +public interface IProductAppService : IApplicationService +{ + // ... +} +``` + +> If you've used the `[IntegrationService]` on top of your service interface, it is *not needed* to use on the service class too. + +That's all. From now, ABP will handle your application service as integration service and implement the followings by convention: + +* If you are using the [Auto API Controllers](API/Auto-API-Controllers.md) feature in your application, the URL prefix will be `/integration-api` instead of `/api` for your integration services. Thus, you can distinguish internal and external service communications and take additional actions, such as preventing REST API calls for integration services out of API Gateway. +* Audit logging is disabled by default for the integration services. See the next section if you want to enable it. + +## Configuration + +### Enabling/Disabling the Audit Logging + +Audit Logging is disabled by default for integration services but it can be enabled by configuring the `AbpAuditingOptions` [options class](Options.md) in the `ConfigureServices` method of your [module class](Module-Development-Basics.md): + +```csharp +Configure(options => +{ + options.IsEnabledForIntegrationService = true; +}); +``` + +> Please refer to the [audit logging document](Audit-Logging.md) for other options and details. + +### Filtering Auto API Controllers + +You can filter integration services (or non-integration services) while creating [Auto API Controllers](API/Auto-API-Controllers.md), using the `ApplicationServiceTypes` option of the `ConventionalControllerSetting` by configuring the `AbpAspNetCoreMvcOptions` as shown below: + +```csharp +Configure(options => +{ + options.ConventionalControllers.Create( + typeof(MyApplicationModule).Assembly, + conventionalControllerSetting => + { + conventionalControllerSetting.ApplicationServiceTypes = + ApplicationServiceTypes.IntegrationServices; + }); +}); +``` + +Tip: You can call the `options.ConventionalControllers.Create` multiple times to configure regular application services and integration services with different options. + +> Please refer to the [Auto API Controllers document](API/Auto-API-Controllers.md) for more information about the Auto API Controller system. + +## See Also + +* [Application Services](Application-Services.md) +* [Auto API Controllers](API/Auto-API-Controllers.md) +* [Audit Logging](Audit-Logging.md) \ No newline at end of file diff --git a/docs/en/Migration-Guides/Abp-7_0.md b/docs/en/Migration-Guides/Abp-7_0.md index 7c3a0d90b5..0127c8ef9f 100644 --- a/docs/en/Migration-Guides/Abp-7_0.md +++ b/docs/en/Migration-Guides/Abp-7_0.md @@ -108,4 +108,11 @@ See https://github.com/abpframework/abp/pull/13845 for more info. - See the [PR#13499](https://github.com/abpframework/abp/pull/13499) for more information. -> You can ignore this if you don't use CMS Kit Module. \ No newline at end of file +> You can ignore this if you don't use CMS Kit Module. + +## Oracle.EntityFrameworkCore and Devart.Data.Oracle.EFCore + +These two packages do not yet support EF Core 7.0, If you use `AbpEntityFrameworkCoreOracleModule(Volo.Abp.EntityFrameworkCore.Oracle)` or `AbpEntityFrameworkCoreOracleDevartModule(Volo.Abp.EntityFrameworkCore.Oracle.Devart)` may not work as expected, We will release new packages as soon as they are updated. + +See https://github.com/abpframework/abp/issues/14412 for more info. + diff --git a/docs/en/Tutorials/Part-9.md b/docs/en/Tutorials/Part-9.md index 4e7914eba1..76d6d9c8d8 100644 --- a/docs/en/Tutorials/Part-9.md +++ b/docs/en/Tutorials/Part-9.md @@ -1115,8 +1115,8 @@ namespace Acme.BookStore.Blazor.Pages private async Task OnDataGridReadAsync(DataGridReadDataEventArgs e) { CurrentSorting = e.Columns - .Where(c => c.Direction != SortDirection.None) - .Select(c => c.Field + (c.Direction == SortDirection.Descending ? " DESC" : "")) + .Where(c => c.SortDirection != SortDirection.Default) + .Select(c => c.Field + (c.SortDirection == SortDirection.Descending ? " DESC" : "")) .JoinAsString(","); CurrentPage = e.Page - 1; @@ -1166,7 +1166,7 @@ namespace Acme.BookStore.Blazor.Pages private async Task CreateAuthorAsync() { - if (CreateValidationsRef.ValidateAll()) + if (await CreateValidationsRef.ValidateAll()) { await AuthorAppService.CreateAsync(NewAuthor); await GetAuthorsAsync(); @@ -1176,7 +1176,7 @@ namespace Acme.BookStore.Blazor.Pages private async Task UpdateAuthorAsync() { - if (EditValidationsRef.ValidateAll()) + if (await EditValidationsRef.ValidateAll()) { await AuthorAppService.UpdateAsync(EditingAuthorId, EditingAuthor); await GetAuthorsAsync(); diff --git a/docs/en/UI/AspNetCore/AutoComplete-Select.md b/docs/en/UI/AspNetCore/AutoComplete-Select.md index 86d8c14b8a..e0ad7ceb24 100644 --- a/docs/en/UI/AspNetCore/AutoComplete-Select.md +++ b/docs/en/UI/AspNetCore/AutoComplete-Select.md @@ -22,7 +22,8 @@ A simple usage is presented below. data-autocomplete-display-property="name" data-autocomplete-value-property="id" data-autocomplete-items-property="items" - data-autocomplete-filter-param-name="filter"> + data-autocomplete-filter-param-name="filter" + data-autocomplete-allow-clear="true"> @@ -38,6 +39,8 @@ The select must have the `auto-complete-select` class and the following attribut - `data-autocomplete-filter-param-name`: * Filter text property name. _(For example: `filter`)_. - `data-autocomplete-selected-item-name`: Text to display as selected item. - `data-autocomplete-parent-selector`: jQuery selector expression for parent DOM. _(If it's in a modal, it's suggested to send the modal selector as this parameter)_. +- `data-autocomplete-allow-clear`: If `true`, it'll allow to clear the selected value. Default value: `false`. +- `data-autocomplete-placeholder`: Placeholder text to display when no value is selected. Also, selected value(s) should be defined with the `