Browse Source

Merge branch 'dev' into automapper

pull/19564/head
maliming 2 years ago
parent
commit
b66ba368c6
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 4
      Directory.Packages.props
  2. 2
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/AbpAspNetCoreMvcUiThemeSharedModule.cs
  3. 3
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs
  4. 30
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/authentication-state/authentication-state-listener.js
  5. 26
      framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/Authentication/AbpAuthenticationHubFilter.cs
  6. 5
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/BackgroundEmailSendingJobArgs.cs
  7. 11
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/EmailSenderBase.cs
  8. 5
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/NullEmailSender.cs
  9. 4
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Smtp/SmtpEmailSender.cs
  10. 7
      framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/MailKitSmtpEmailSender.cs
  11. 4
      framework/test/Volo.Abp.MailKit.Tests/Volo/Abp/MailKit/MailKitSmtpEmailSender_Tests.cs
  12. 2
      latest-versions.json
  13. 1
      npm/ng-packs/packages/core/src/lib/models/common.ts
  14. 1
      npm/ng-packs/packages/core/src/lib/models/index.ts
  15. 5
      npm/ng-packs/packages/core/src/lib/models/sort.ts
  16. 38
      npm/ng-packs/packages/core/src/lib/tokens/compare-func.token.ts
  17. 2
      npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts
  18. 11
      npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts
  19. 14
      npm/ng-packs/packages/theme-shared/src/lib/services/abstract-menu.service.ts

4
Directory.Packages.props

@ -131,8 +131,8 @@
<PackageVersion Include="Quartz.Plugins.TimeZoneConverter" Version="3.7.0" />
<PackageVersion Include="Quartz.Serialization.Json" Version="3.7.0" />
<PackageVersion Include="RabbitMQ.Client" Version="6.6.0" />
<PackageVersion Include="Rebus" Version="8.0.1" />
<PackageVersion Include="Rebus.ServiceProvider" Version="10.0.0" />
<PackageVersion Include="Rebus" Version="8.4.2" />
<PackageVersion Include="Rebus.ServiceProvider" Version="10.1.2" />
<PackageVersion Include="Scriban" Version="5.9.0" />
<PackageVersion Include="Serilog" Version="3.1.1" />
<PackageVersion Include="Serilog.AspNetCore" Version="8.0.0" />

2
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/AbpAspNetCoreMvcUiThemeSharedModule.cs

@ -30,7 +30,7 @@ public class AbpAspNetCoreMvcUiThemeSharedModule : AbpModule
{
options.FileSets.AddEmbedded<AbpAspNetCoreMvcUiThemeSharedModule>("Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared");
});
Configure<AbpBundlingOptions>(options =>
{
options

3
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Bundling/SharedThemeGlobalScriptContributor.cs

@ -49,7 +49,8 @@ public class SharedThemeGlobalScriptContributor : BundleContributor
"/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/sweetalert2/abp-sweetalert2.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/toastr/abp-toastr.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-extensions.js"
"/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-extensions.js",
"/libs/abp/aspnetcore-mvc-ui-theme-shared/authentication-state/authentication-state-listener.js"
});
}
}

30
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/authentication-state/authentication-state-listener.js

@ -0,0 +1,30 @@
(function () {
const stateKey = 'authentication-state-id';
window.addEventListener('load', function () {
if (!abp || !abp.currentUser) {
return;
}
if (!abp.currentUser.isAuthenticated) {
localStorage.removeItem(stateKey);
} else {
localStorage.setItem(stateKey, abp.currentUser.id);
}
window.addEventListener('storage', function (event) {
if (event.key !== stateKey || event.oldValue === event.newValue) {
return;
}
if (event.oldValue || !event.newValue) {
window.location.reload();
} else {
location.assign('/')
}
});
});
}());

26
framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/Authentication/AbpAuthenticationHubFilter.cs

@ -1,7 +1,9 @@
using System;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.Security.Claims;
namespace Volo.Abp.AspNetCore.SignalR.Authentication;
@ -11,7 +13,7 @@ public class AbpAuthenticationHubFilter : IHubFilter
public virtual async ValueTask<object?> InvokeMethodAsync(HubInvocationContext invocationContext, Func<HubInvocationContext, ValueTask<object?>> next)
{
var currentPrincipalAccessor = invocationContext.ServiceProvider.GetRequiredService<ICurrentPrincipalAccessor>();
using (currentPrincipalAccessor.Change(invocationContext.Context.User!))
using (currentPrincipalAccessor.Change((await GetDynamicClaimsPrincipalAsync(invocationContext.Context.User, invocationContext.ServiceProvider))!))
{
return await next(invocationContext);
}
@ -20,7 +22,7 @@ public class AbpAuthenticationHubFilter : IHubFilter
public virtual async Task OnConnectedAsync(HubLifetimeContext context, Func<HubLifetimeContext, Task> next)
{
var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService<ICurrentPrincipalAccessor>();
using (currentPrincipalAccessor.Change(context.Context.User!))
using (currentPrincipalAccessor.Change((await GetDynamicClaimsPrincipalAsync(context.Context.User, context.ServiceProvider))!))
{
await next(context);
}
@ -29,9 +31,27 @@ public class AbpAuthenticationHubFilter : IHubFilter
public virtual async Task OnDisconnectedAsync(HubLifetimeContext context, Exception? exception, Func<HubLifetimeContext, Exception?, Task> next)
{
var currentPrincipalAccessor = context.ServiceProvider.GetRequiredService<ICurrentPrincipalAccessor>();
using (currentPrincipalAccessor.Change(context.Context.User!))
using (currentPrincipalAccessor.Change((await GetDynamicClaimsPrincipalAsync(context.Context.User, context.ServiceProvider))!))
{
await next(context, exception);
}
}
protected virtual async Task<ClaimsPrincipal?> GetDynamicClaimsPrincipalAsync(ClaimsPrincipal? claimsPrincipal, IServiceProvider serviceProvider)
{
if (claimsPrincipal == null)
{
return claimsPrincipal;
}
if (claimsPrincipal.Identity != null &&
claimsPrincipal.Identity.IsAuthenticated &&
serviceProvider.GetRequiredService<IOptions<AbpClaimsPrincipalFactoryOptions>>().Value.IsDynamicClaimsEnabled)
{
var abpClaimsPrincipalFactory = serviceProvider.GetRequiredService<IAbpClaimsPrincipalFactory>();
claimsPrincipal = await abpClaimsPrincipalFactory.CreateDynamicAsync(claimsPrincipal);
}
return claimsPrincipal;
}
}

5
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/BackgroundEmailSendingJobArgs.cs

@ -1,12 +1,15 @@
using System;
using System.Collections.Generic;
using Volo.Abp.Data;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Emailing;
[Serializable]
public class BackgroundEmailSendingJobArgs
public class BackgroundEmailSendingJobArgs : IMultiTenant
{
public Guid? TenantId { get; set; }
public string? From { get; set; }
public string To { get; set; } = default!;

11
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/EmailSenderBase.cs

@ -7,6 +7,7 @@ using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.BackgroundJobs;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Validation;
namespace Volo.Abp.Emailing;
@ -18,6 +19,8 @@ public abstract class EmailSenderBase : IEmailSender
{
public ILogger<EmailSenderBase> Logger { get; set; }
protected ICurrentTenant CurrentTenant { get; }
protected IEmailSenderConfiguration Configuration { get; }
protected IBackgroundJobManager BackgroundJobManager { get; }
@ -25,10 +28,14 @@ public abstract class EmailSenderBase : IEmailSender
/// <summary>
/// Constructor.
/// </summary>
protected EmailSenderBase(IEmailSenderConfiguration configuration, IBackgroundJobManager backgroundJobManager)
protected EmailSenderBase(
ICurrentTenant currentTenant,
IEmailSenderConfiguration configuration,
IBackgroundJobManager backgroundJobManager)
{
Logger = NullLogger<EmailSenderBase>.Instance;
CurrentTenant = currentTenant;
Configuration = configuration;
BackgroundJobManager = backgroundJobManager;
}
@ -96,6 +103,7 @@ public abstract class EmailSenderBase : IEmailSender
await BackgroundJobManager.EnqueueAsync(
new BackgroundEmailSendingJobArgs
{
TenantId = CurrentTenant.Id,
To = to,
Subject = subject,
Body = body,
@ -118,6 +126,7 @@ public abstract class EmailSenderBase : IEmailSender
await BackgroundJobManager.EnqueueAsync(
new BackgroundEmailSendingJobArgs
{
TenantId = CurrentTenant.Id,
From = from,
To = to,
Subject = subject,

5
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/NullEmailSender.cs

@ -3,6 +3,7 @@ using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.BackgroundJobs;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Emailing;
@ -15,8 +16,8 @@ public class NullEmailSender : EmailSenderBase
/// <summary>
/// Creates a new <see cref="NullEmailSender"/> object.
/// </summary>
public NullEmailSender(IEmailSenderConfiguration configuration, IBackgroundJobManager backgroundJobManager)
: base(configuration, backgroundJobManager)
public NullEmailSender(ICurrentTenant currentTenant, IEmailSenderConfiguration configuration, IBackgroundJobManager backgroundJobManager)
: base(currentTenant, configuration, backgroundJobManager)
{
}

4
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Smtp/SmtpEmailSender.cs

@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Volo.Abp.BackgroundJobs;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Emailing.Smtp;
@ -19,9 +20,10 @@ public class SmtpEmailSender : EmailSenderBase, ISmtpEmailSender, ITransientDepe
/// Creates a new <see cref="SmtpEmailSender"/>.
/// </summary>
public SmtpEmailSender(
ICurrentTenant currentTenant,
ISmtpEmailSenderConfiguration smtpConfiguration,
IBackgroundJobManager backgroundJobManager)
: base(smtpConfiguration, backgroundJobManager)
: base(currentTenant, smtpConfiguration, backgroundJobManager)
{
SmtpConfiguration = smtpConfiguration;
}

7
framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/MailKitSmtpEmailSender.cs

@ -9,6 +9,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using MimeKit;
using MimeKit.Utils;
using Volo.Abp.MultiTenancy;
using SmtpClient = MailKit.Net.Smtp.SmtpClient;
namespace Volo.Abp.MailKit;
@ -20,10 +21,12 @@ public class MailKitSmtpEmailSender : EmailSenderBase, IMailKitSmtpEmailSender
protected ISmtpEmailSenderConfiguration SmtpConfiguration { get; }
public MailKitSmtpEmailSender(ISmtpEmailSenderConfiguration smtpConfiguration,
public MailKitSmtpEmailSender(
ICurrentTenant currentTenant,
ISmtpEmailSenderConfiguration smtpConfiguration,
IBackgroundJobManager backgroundJobManager,
IOptions<AbpMailKitOptions> abpMailKitConfiguration)
: base(smtpConfiguration, backgroundJobManager)
: base(currentTenant, smtpConfiguration, backgroundJobManager)
{
AbpMailKitOptions = abpMailKitConfiguration.Value;
SmtpConfiguration = smtpConfiguration;

4
framework/test/Volo.Abp.MailKit.Tests/Volo/Abp/MailKit/MailKitSmtpEmailSender_Tests.cs

@ -3,6 +3,7 @@ using System.Threading.Tasks;
using NSubstitute;
using Volo.Abp.BackgroundJobs;
using Volo.Abp.Emailing.Smtp;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Testing;
using Xunit;
@ -35,6 +36,7 @@ public class MailKitSmtpEmailSender_Tests : AbpIntegratedTest<AbpMailKitTestModu
private static MailKitSmtpEmailSender CreateMailKitEmailSender()
{
var currentTenant = Substitute.For<ICurrentTenant>();
var mailConfig = Substitute.For<ISmtpEmailSenderConfiguration>();
var bgJob = Substitute.For<IBackgroundJobManager>();
@ -44,7 +46,7 @@ public class MailKitSmtpEmailSender_Tests : AbpIntegratedTest<AbpMailKitTestModu
mailConfig.GetPortAsync().Returns(Task.FromResult(587));
mailConfig.GetEnableSslAsync().Returns(Task.FromResult(false));
var mailSender = new MailKitSmtpEmailSender(mailConfig, bgJob, null);
var mailSender = new MailKitSmtpEmailSender(currentTenant, mailConfig, bgJob, null);
return mailSender;
}
}

2
latest-versions.json

@ -1,6 +1,6 @@
[
{
"version": "8.1.0",
"version": "8.1.1",
"releaseDate": "",
"type": "stable",
"message": ""

1
npm/ng-packs/packages/core/src/lib/models/common.ts

@ -9,6 +9,7 @@ export namespace ABP {
environment: Partial<Environment>;
registerLocaleFn: (locale: string) => Promise<any>;
skipGetAppConfiguration?: boolean;
skipInitAuthService?: boolean;
sendNullsAsQueryParam?: boolean;
tenantKey?: string;
localizations?: Localization[];

1
npm/ng-packs/packages/core/src/lib/models/index.ts

@ -8,3 +8,4 @@ export * from './session';
export * from './utility';
export * from './auth';
export * from './auth-events';
export * from './sort';

5
npm/ng-packs/packages/core/src/lib/models/sort.ts

@ -0,0 +1,5 @@
export interface SortableItem {
id?: string | number;
name?: string;
order?: number;
}

38
npm/ng-packs/packages/core/src/lib/tokens/compare-func.token.ts

@ -1,27 +1,33 @@
import { InjectionToken, inject } from '@angular/core';
import { SortableItem } from '../models';
import { LocalizationService } from '../services';
export const SORT_COMPARE_FUNC = new InjectionToken< 0 | 1 | -1 >('SORT_COMPARE_FUNC');
export const SORT_COMPARE_FUNC = new InjectionToken<(a: SortableItem, b: SortableItem) => number>(
'SORT_COMPARE_FUNC',
);
export function compareFuncFactory() {
const localizationService = inject(LocalizationService)
const fn = (a,b) => {
const localizationService = inject(LocalizationService);
const fn = (a: SortableItem, b: SortableItem) => {
const aName = localizationService.instant(a.name);
const bName = localizationService.instant(b.name);
const aNumber = a.order;
const bNumber = b.order;
if (!Number.isInteger(aNumber)) return 1;
if (!Number.isInteger(bNumber)) return -1;
if (aNumber > bNumber) return 1
if (aNumber < bNumber) return -1
if ( aName > bName ) return 1;
if ( aName < bName ) return -1;
return 0
}
return fn
}
if (aNumber > bNumber) return 1;
if (aNumber < bNumber) return -1;
if (aName > bName) return 1;
if (aName < bName) return -1;
if (a.id > b.id) return 1;
if (a.id < b.id) return -1;
return 0;
};
return fn;
}

2
npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts

@ -29,7 +29,7 @@ export function getInitialData(injector: Injector) {
const checkAuthenticationState = injector.get(CHECK_AUTHENTICATION_STATE_FN_KEY, noop, {
optional: true,
});
if (authService) {
if (!options.skipInitAuthService && authService) {
await authService.init();
}
if (options.skipGetAppConfiguration) return;

11
npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts

@ -8,6 +8,9 @@ import {
PermissionService,
RestService,
INCUDE_LOCALIZATION_RESOURCES_TOKEN,
OTHERS_GROUP,
compareFuncFactory,
SORT_COMPARE_FUNC,
} from '@abp/ng.core';
import { APP_BASE_HREF } from '@angular/common';
import { ModuleWithProviders, NgModule } from '@angular/core';
@ -66,6 +69,14 @@ export class CoreTestingModule {
provide: INCUDE_LOCALIZATION_RESOURCES_TOKEN,
useValue: false,
},
{
provide: OTHERS_GROUP,
useValue: 'AbpUi::OthersGroup',
},
{
provide: SORT_COMPARE_FUNC,
useFactory: compareFuncFactory,
},
provideRoutes(routes),
],
};

14
npm/ng-packs/packages/theme-shared/src/lib/services/abstract-menu.service.ts

@ -1,10 +1,13 @@
import { BehaviorSubject, Observable } from 'rxjs';
import { NavItem } from '../models/nav-item';
import { Type } from '@angular/core';
import { inject, Type } from '@angular/core';
import { SORT_COMPARE_FUNC } from '@abp/ng.core';
export abstract class AbstractMenuService<T extends NavItem> {
protected abstract baseClass: Type<any>;
protected readonly sortFn = inject(SORT_COMPARE_FUNC);
protected _items$ = new BehaviorSubject<T[]>([]);
get items(): T[] {
@ -52,10 +55,7 @@ export abstract class AbstractMenuService<T extends NavItem> {
this._items$.next(items);
}
private sortItems(a: T, b: T) {
if (!a.order) return 1;
if (!b.order) return -1;
return a.order - b.order;
}
sortItems = (a: T, b: T) => {
return this.sortFn(a, b);
};
}

Loading…
Cancel
Save