diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/AppClientCoordinator.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/AppClientCoordinator.cs index 777164e7a1..f1dbfb7d14 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/AppClientCoordinator.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/AppClientCoordinator.cs @@ -177,7 +177,7 @@ private void AuthenticationStateChanged(Task task) //#if (signalR == true) private void SubscribeToSignalREventsMessages() { - signalROnDisposables.Add(hubConnection.On(SignalREvents.SHOW_MESSAGE, async (message, data) => + signalROnDisposables.Add(hubConnection.On?, bool>(SignalREvents.SHOW_MESSAGE, async (message, data) => { logger.LogInformation("SignalR Message {Message} received from server to show.", message); if (await notification.IsNotificationAvailable()) diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Controllers/AttachmentController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Controllers/AttachmentController.cs index 76064017f9..d6748bd10a 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Controllers/AttachmentController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Controllers/AttachmentController.cs @@ -103,7 +103,7 @@ private async Task PublishUserProfileUpdated(User user, CancellationToken cancel .Where(us => us.UserId == user.Id && us.Id != currentUserSessionId && us.SignalRConnectionId != null) .Select(us => us.SignalRConnectionId!) .ToArrayAsync(cancellationToken); - await appHubContext.Clients.Clients(userSessionIdsExceptCurrentUserSessionId).SendAsync(SignalREvents.PUBLISH_MESSAGE, SharedPubSubMessages.PROFILE_UPDATED, user, cancellationToken); + await appHubContext.Clients.Clients(userSessionIdsExceptCurrentUserSessionId).SendAsync(SignalREvents.PUBLISH_MESSAGE, SharedPubSubMessages.PROFILE_UPDATED, user.Map(), cancellationToken); } //#endif diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Controllers/Diagnostics/DiagnosticsController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Controllers/Diagnostics/DiagnosticsController.cs index 19b2801bc9..3567ecc572 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Controllers/Diagnostics/DiagnosticsController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Controllers/Diagnostics/DiagnosticsController.cs @@ -59,7 +59,7 @@ public async Task PerformDiagnostics([FromQuery] string? signalRConnecti //#if (signalR == true) if (string.IsNullOrEmpty(signalRConnectionId) is false) { - var success = await appHubContext.Clients.Client(signalRConnectionId).InvokeAsync(SignalREvents.SHOW_MESSAGE, $"Open terms page. {DateTimeOffset.Now:HH:mm:ss}", new { pageUrl = PageUrls.Terms, action = "testAction" }, cancellationToken); + var success = await appHubContext.Clients.Client(signalRConnectionId).InvokeAsync(SignalREvents.SHOW_MESSAGE, $"Open terms page. {DateTimeOffset.Now:HH:mm:ss}", new Dictionary { { "pageUrl", PageUrls.Terms }, { "action", "testAction" } }, cancellationToken); if (success is false) // Client would return false if it's unable to show the message with custom action. { await appHubContext.Clients.Client(signalRConnectionId).SendAsync(SignalREvents.SHOW_MESSAGE, $"Simple message. {DateTimeOffset.Now:HH:mm:ss}", null, cancellationToken); diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Controllers/Identity/RoleManagementController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Controllers/Identity/RoleManagementController.cs index 36296ee43b..9c56bdc54c 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Controllers/Identity/RoleManagementController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Controllers/Identity/RoleManagementController.cs @@ -227,14 +227,14 @@ public async Task SendNotification(SendNotificationToRoleDto dto, CancellationTo .Select(us => us.SignalRConnectionId!).ToArrayAsync(cancellationToken); await appHubContext.Clients.Clients(signalRConnectionIds) - .SendAsync(SignalREvents.SHOW_MESSAGE, dto.Message, dto.PageUrl is null ? null : new { pageUrl = dto.PageUrl }, cancellationToken); + .SendAsync(SignalREvents.SHOW_MESSAGE, dto.Message, dto.PageUrl is null ? null : new Dictionary { { "pageUrl", dto.PageUrl } }, cancellationToken); //#endif //#if (notification == true) - await pushNotificationService.RequestPush(message: dto.Message, + await pushNotificationService.RequestPush(message: dto.Message, pageUrl: dto.PageUrl, - userRelatedPush: true, - customSubscriptionFilter: s => s.UserSession!.User!.Roles.Any(r => r.RoleId == dto.RoleId), + userRelatedPush: true, + customSubscriptionFilter: s => s.UserSession!.User!.Roles.Any(r => r.RoleId == dto.RoleId), cancellationToken: cancellationToken); //#endif } diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs index 3e6bd64366..fbf39dcb61 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs @@ -178,7 +178,7 @@ string GetValue(string connectionString, string key, string? defaultValue = null policy.SetIsOriginAllowed(origin => Uri.TryCreate(origin, UriKind.Absolute, out var uri) && settings.IsTrustedOrigin(uri)) .AllowAnyHeader() .AllowAnyMethod() - .WithExposedHeaders(HeaderNames.RequestId, + .WithExposedHeaders(HeaderNames.RequestId, HeaderNames.Age, "App-Cache-Response", "X-App-Platform", "X-App-Version", "X-Origin"); }); }); @@ -228,6 +228,16 @@ string GetValue(string connectionString, string key, string? defaultValue = null var signalRBuilder = services.AddSignalR(options => { options.EnableDetailedErrors = env.IsDevelopment(); + }).AddJsonProtocol(options => + { + JsonSerializerOptions jsonOptions = new JsonSerializerOptions(AppJsonContext.Default.Options); + jsonOptions.TypeInfoResolverChain.Add(IdentityJsonContext.Default); + jsonOptions.TypeInfoResolverChain.Add(ServerJsonContext.Default); + + foreach (var chain in jsonOptions.TypeInfoResolverChain) + { + options.PayloadSerializerOptions.TypeInfoResolverChain.Add(chain); + } }); if (string.IsNullOrEmpty(configuration["Azure:SignalR:ConnectionString"]) is false) { diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Services/ServerExceptionHandler.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Services/ServerExceptionHandler.cs index f010a75cc2..82ec0ea8e4 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Services/ServerExceptionHandler.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Services/ServerExceptionHandler.cs @@ -44,7 +44,7 @@ private void Handle(Exception exception, Dictionary? parameters, HttpContext? httpContext, out int statusCode, - out ProblemDetails? problemDetails) + out AppProblemDetails? problemDetails) { var data = new Dictionary() { @@ -143,7 +143,7 @@ private void Handle(Exception exception, message = Localizer[message]; } - problemDetails = new ProblemDetails + problemDetails = new AppProblemDetails { Title = message, Status = statusCode, @@ -170,7 +170,7 @@ private void Handle(Exception exception, } } - public ProblemDetails? Handle(Exception exp, + public AppProblemDetails? Handle(Exception exp, Dictionary? parameters = null) { Handle(UnWrapException(exp), parameters, httpContextAccessor.HttpContext, out var _, out var problemDetails);