From a1ca5979f87d725a820f97f2a6b2dd76f440ad31 Mon Sep 17 00:00:00 2001
From: maliming <6908465+maliming@users.noreply.github.com>
Date: Mon, 13 Jul 2020 17:57:35 +0800
Subject: [PATCH 001/345] Cache the AccessToken in
IdentityModelAuthenticationService.
Resolve #4603
---
.../Volo.Abp.IdentityModel.csproj | 1 +
.../IdentityModel/AbpIdentityModelModule.cs | 4 +-
.../IdentityModelAuthenticationService.cs | 45 ++++++++++++++-----
.../IdentityModelTokenCacheItem.cs | 29 ++++++++++++
4 files changed, 68 insertions(+), 11 deletions(-)
create mode 100644 framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelTokenCacheItem.cs
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj b/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj
index 0143db8265..1fb77b36d9 100644
--- a/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj
+++ b/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj
@@ -17,6 +17,7 @@
+
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/AbpIdentityModelModule.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/AbpIdentityModelModule.cs
index 7ab97c49fe..bf499e7b5f 100644
--- a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/AbpIdentityModelModule.cs
+++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/AbpIdentityModelModule.cs
@@ -1,4 +1,5 @@
using Microsoft.Extensions.DependencyInjection;
+using Volo.Abp.Caching;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
@@ -7,7 +8,8 @@ namespace Volo.Abp.IdentityModel
{
[DependsOn(
typeof(AbpThreadingModule),
- typeof(AbpMultiTenancyModule)
+ typeof(AbpMultiTenancyModule),
+ typeof(AbpCachingModule)
)]
public class AbpIdentityModelModule : AbpModule
{
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs
index 5e8c67a9ab..c20d473f81 100644
--- a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs
+++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs
@@ -10,6 +10,8 @@ using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
+using Microsoft.Extensions.Caching.Distributed;
+using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
@@ -26,18 +28,21 @@ namespace Volo.Abp.IdentityModel
protected IHttpClientFactory HttpClientFactory { get; }
protected ICurrentTenant CurrentTenant { get; }
protected IdentityModelHttpRequestMessageOptions IdentityModelHttpRequestMessageOptions { get; }
+ protected IDistributedCache Cache { get; }
public IdentityModelAuthenticationService(
IOptions options,
ICancellationTokenProvider cancellationTokenProvider,
IHttpClientFactory httpClientFactory,
ICurrentTenant currentTenant,
- IOptions identityModelHttpRequestMessageOptions)
+ IOptions identityModelHttpRequestMessageOptions,
+ IDistributedCache cache)
{
ClientOptions = options.Value;
CancellationTokenProvider = cancellationTokenProvider;
HttpClientFactory = httpClientFactory;
CurrentTenant = currentTenant;
+ Cache = cache;
IdentityModelHttpRequestMessageOptions = identityModelHttpRequestMessageOptions.Value;
Logger = NullLogger.Instance;
}
@@ -76,21 +81,36 @@ namespace Volo.Abp.IdentityModel
throw new AbpException($"Could not retrieve the OpenId Connect discovery document! ErrorType: {discoveryResponse.ErrorType}. Error: {discoveryResponse.Error}");
}
- var tokenResponse = await GetTokenResponse(discoveryResponse, configuration);
-
- if (tokenResponse.IsError)
+ var cacheKey = CalculateCacheKey(discoveryResponse, configuration);
+ var tokenCacheItem = await Cache.GetAsync(cacheKey);
+ if (tokenCacheItem == null)
{
- if (tokenResponse.ErrorDescription != null)
+ var tokenResponse = await GetTokenResponse(discoveryResponse, configuration);
+
+ if (tokenResponse.IsError)
{
- throw new AbpException($"Could not get token from the OpenId Connect server! ErrorType: {tokenResponse.ErrorType}. Error: {tokenResponse.Error}. ErrorDescription: {tokenResponse.ErrorDescription}. HttpStatusCode: {tokenResponse.HttpStatusCode}");
+ if (tokenResponse.ErrorDescription != null)
+ {
+ throw new AbpException($"Could not get token from the OpenId Connect server! ErrorType: {tokenResponse.ErrorType}. " +
+ $"Error: {tokenResponse.Error}. ErrorDescription: {tokenResponse.ErrorDescription}. HttpStatusCode: {tokenResponse.HttpStatusCode}");
+ }
+
+ var rawError = tokenResponse.Raw;
+ var withoutInnerException = rawError.Split(new string[] { "" }, StringSplitOptions.RemoveEmptyEntries);
+ throw new AbpException(withoutInnerException[0]);
}
- var rawError = tokenResponse.Raw;
- var withoutInnerException = rawError.Split(new string[] { "" }, StringSplitOptions.RemoveEmptyEntries);
- throw new AbpException(withoutInnerException[0]);
+ await Cache.SetAsync(cacheKey, new IdentityModelTokenCacheItem(tokenResponse.AccessToken),
+ new DistributedCacheEntryOptions()
+ {
+ //Subtract 10 seconds of network request time.
+ AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(tokenResponse.ExpiresIn - 10)
+ });
+
+ return tokenResponse.AccessToken;
}
- return tokenResponse.AccessToken;
+ return tokenCacheItem.AccessToken;
}
protected virtual void SetAccessToken(HttpClient client, string accessToken)
@@ -209,5 +229,10 @@ namespace Volo.Abp.IdentityModel
client.DefaultRequestHeaders.Add(TenantResolverConsts.DefaultTenantKey, CurrentTenant.Id.Value.ToString());
}
}
+
+ protected virtual string CalculateCacheKey(DiscoveryDocumentResponse discoveryResponse, IdentityClientConfiguration configuration)
+ {
+ return IdentityModelTokenCacheItem.CalculateCacheKey(discoveryResponse, configuration);
+ }
}
}
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelTokenCacheItem.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelTokenCacheItem.cs
new file mode 100644
index 0000000000..8d01b83c32
--- /dev/null
+++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelTokenCacheItem.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Linq;
+using IdentityModel.Client;
+using Volo.Abp.MultiTenancy;
+
+namespace Volo.Abp.IdentityModel
+{
+ [Serializable]
+ [IgnoreMultiTenancy]
+ public class IdentityModelTokenCacheItem
+ {
+ public string AccessToken { get; set; }
+
+ public IdentityModelTokenCacheItem()
+ {
+
+ }
+
+ public IdentityModelTokenCacheItem(string accessToken)
+ {
+ AccessToken = accessToken;
+ }
+
+ public static string CalculateCacheKey(DiscoveryDocumentResponse discoveryResponse, IdentityClientConfiguration configuration)
+ {
+ return discoveryResponse.TokenEndpoint + string.Join(",", configuration.Select(x => x.Key + ":" + x.Value));
+ }
+ }
+}
From c509499ac402f96882d6eab37306a23b3d1df0c5 Mon Sep 17 00:00:00 2001
From: maliming <6908465+maliming@users.noreply.github.com>
Date: Fri, 17 Jul 2020 15:57:36 +0800
Subject: [PATCH 002/345] Cache Identity Server discover document.
---
.../IdentityModelAuthenticationService.cs | 72 +++++++++++++------
...IdentityModelDiscoveryDocumentCacheItem.cs | 27 +++++++
.../IdentityModelTokenCacheItem.cs | 5 +-
3 files changed, 80 insertions(+), 24 deletions(-)
create mode 100644 framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelDiscoveryDocumentCacheItem.cs
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs
index c20d473f81..5d22d0c7a5 100644
--- a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs
+++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs
@@ -28,7 +28,8 @@ namespace Volo.Abp.IdentityModel
protected IHttpClientFactory HttpClientFactory { get; }
protected ICurrentTenant CurrentTenant { get; }
protected IdentityModelHttpRequestMessageOptions IdentityModelHttpRequestMessageOptions { get; }
- protected IDistributedCache Cache { get; }
+ protected IDistributedCache TokenCache { get; }
+ protected IDistributedCache DiscoveryDocumentCache { get; }
public IdentityModelAuthenticationService(
IOptions options,
@@ -36,13 +37,15 @@ namespace Volo.Abp.IdentityModel
IHttpClientFactory httpClientFactory,
ICurrentTenant currentTenant,
IOptions identityModelHttpRequestMessageOptions,
- IDistributedCache cache)
+ IDistributedCache tokenCache,
+ IDistributedCache discoveryDocumentCache)
{
ClientOptions = options.Value;
CancellationTokenProvider = cancellationTokenProvider;
HttpClientFactory = httpClientFactory;
CurrentTenant = currentTenant;
- Cache = cache;
+ TokenCache = tokenCache;
+ DiscoveryDocumentCache = discoveryDocumentCache;
IdentityModelHttpRequestMessageOptions = identityModelHttpRequestMessageOptions.Value;
Logger = NullLogger.Instance;
}
@@ -75,17 +78,13 @@ namespace Volo.Abp.IdentityModel
public virtual async Task GetAccessTokenAsync(IdentityClientConfiguration configuration)
{
- var discoveryResponse = await GetDiscoveryResponse(configuration);
- if (discoveryResponse.IsError)
- {
- throw new AbpException($"Could not retrieve the OpenId Connect discovery document! ErrorType: {discoveryResponse.ErrorType}. Error: {discoveryResponse.Error}");
- }
+ var tokenEndpoint = await GetTokenEndpoint(configuration);
- var cacheKey = CalculateCacheKey(discoveryResponse, configuration);
- var tokenCacheItem = await Cache.GetAsync(cacheKey);
+ var cacheKey = CalculateTokenCacheKey(configuration);
+ var tokenCacheItem = await TokenCache.GetAsync(cacheKey);
if (tokenCacheItem == null)
{
- var tokenResponse = await GetTokenResponse(discoveryResponse, configuration);
+ var tokenResponse = await GetTokenResponse(tokenEndpoint, configuration);
if (tokenResponse.IsError)
{
@@ -100,7 +99,7 @@ namespace Volo.Abp.IdentityModel
throw new AbpException(withoutInnerException[0]);
}
- await Cache.SetAsync(cacheKey, new IdentityModelTokenCacheItem(tokenResponse.AccessToken),
+ await TokenCache.SetAsync(cacheKey, new IdentityModelTokenCacheItem(tokenResponse.AccessToken),
new DistributedCacheEntryOptions()
{
//Subtract 10 seconds of network request time.
@@ -130,6 +129,32 @@ namespace Volo.Abp.IdentityModel
ClientOptions.IdentityClients.Default;
}
+ protected virtual async Task GetTokenEndpoint(IdentityClientConfiguration configuration)
+ {
+ //TODO: Can use (configuration.Authority + /connect/token) directly?
+
+ var tokenEndpointUrlCacheKey = CalculateDiscoveryDocumentCacheKey(configuration);
+ var discoveryDocumentCacheItem = await DiscoveryDocumentCache.GetAsync(tokenEndpointUrlCacheKey);
+ if (discoveryDocumentCacheItem == null)
+ {
+ var discoveryResponse = await GetDiscoveryResponse(configuration);
+ if (discoveryResponse.IsError)
+ {
+ throw new AbpException($"Could not retrieve the OpenId Connect discovery document! " +
+ $"ErrorType: {discoveryResponse.ErrorType}. Error: {discoveryResponse.Error}");
+ }
+
+ discoveryDocumentCacheItem = new IdentityModelDiscoveryDocumentCacheItem(discoveryResponse.TokenEndpoint);
+ await DiscoveryDocumentCache.SetAsync(tokenEndpointUrlCacheKey, discoveryDocumentCacheItem,
+ new DistributedCacheEntryOptions
+ {
+ SlidingExpiration = TimeSpan.FromMinutes(30)
+ });
+ }
+
+ return discoveryDocumentCacheItem.TokenEndpoint;
+ }
+
protected virtual async Task GetDiscoveryResponse(
IdentityClientConfiguration configuration)
{
@@ -149,7 +174,7 @@ namespace Volo.Abp.IdentityModel
}
protected virtual async Task GetTokenResponse(
- DiscoveryDocumentResponse discoveryResponse,
+ string tokenEndpoint,
IdentityClientConfiguration configuration)
{
using (var httpClient = HttpClientFactory.CreateClient(HttpClientName))
@@ -160,12 +185,12 @@ namespace Volo.Abp.IdentityModel
{
case OidcConstants.GrantTypes.ClientCredentials:
return await httpClient.RequestClientCredentialsTokenAsync(
- await CreateClientCredentialsTokenRequestAsync(discoveryResponse, configuration),
+ await CreateClientCredentialsTokenRequestAsync(tokenEndpoint, configuration),
CancellationTokenProvider.Token
);
case OidcConstants.GrantTypes.Password:
return await httpClient.RequestPasswordTokenAsync(
- await CreatePasswordTokenRequestAsync(discoveryResponse, configuration),
+ await CreatePasswordTokenRequestAsync(tokenEndpoint, configuration),
CancellationTokenProvider.Token
);
default:
@@ -174,11 +199,11 @@ namespace Volo.Abp.IdentityModel
}
}
- protected virtual Task CreatePasswordTokenRequestAsync(DiscoveryDocumentResponse discoveryResponse, IdentityClientConfiguration configuration)
+ protected virtual Task CreatePasswordTokenRequestAsync(string tokenEndpoint, IdentityClientConfiguration configuration)
{
var request = new PasswordTokenRequest
{
- Address = discoveryResponse.TokenEndpoint,
+ Address = tokenEndpoint,
Scope = configuration.Scope,
ClientId = configuration.ClientId,
ClientSecret = configuration.ClientSecret,
@@ -193,12 +218,12 @@ namespace Volo.Abp.IdentityModel
}
protected virtual Task CreateClientCredentialsTokenRequestAsync(
- DiscoveryDocumentResponse discoveryResponse,
+ string tokenEndpoint,
IdentityClientConfiguration configuration)
{
var request = new ClientCredentialsTokenRequest
{
- Address = discoveryResponse.TokenEndpoint,
+ Address = tokenEndpoint,
Scope = configuration.Scope,
ClientId = configuration.ClientId,
ClientSecret = configuration.ClientSecret
@@ -230,9 +255,14 @@ namespace Volo.Abp.IdentityModel
}
}
- protected virtual string CalculateCacheKey(DiscoveryDocumentResponse discoveryResponse, IdentityClientConfiguration configuration)
+ protected virtual string CalculateDiscoveryDocumentCacheKey(IdentityClientConfiguration configuration)
+ {
+ return IdentityModelDiscoveryDocumentCacheItem.CalculateCacheKey(configuration);
+ }
+
+ protected virtual string CalculateTokenCacheKey(IdentityClientConfiguration configuration)
{
- return IdentityModelTokenCacheItem.CalculateCacheKey(discoveryResponse, configuration);
+ return IdentityModelTokenCacheItem.CalculateCacheKey(configuration);
}
}
}
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelDiscoveryDocumentCacheItem.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelDiscoveryDocumentCacheItem.cs
new file mode 100644
index 0000000000..3a07cb3735
--- /dev/null
+++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelDiscoveryDocumentCacheItem.cs
@@ -0,0 +1,27 @@
+using System;
+using Volo.Abp.MultiTenancy;
+
+namespace Volo.Abp.IdentityModel
+{
+ [Serializable]
+ [IgnoreMultiTenancy]
+ public class IdentityModelDiscoveryDocumentCacheItem
+ {
+ public string TokenEndpoint { get; set; }
+
+ public IdentityModelDiscoveryDocumentCacheItem()
+ {
+
+ }
+
+ public IdentityModelDiscoveryDocumentCacheItem(string tokenEndpoint)
+ {
+ TokenEndpoint = tokenEndpoint;
+ }
+
+ public static string CalculateCacheKey(IdentityClientConfiguration configuration)
+ {
+ return configuration.Authority.ToLower().ToMd5();
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelTokenCacheItem.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelTokenCacheItem.cs
index 8d01b83c32..e8f8dfb8db 100644
--- a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelTokenCacheItem.cs
+++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelTokenCacheItem.cs
@@ -1,6 +1,5 @@
using System;
using System.Linq;
-using IdentityModel.Client;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.IdentityModel
@@ -21,9 +20,9 @@ namespace Volo.Abp.IdentityModel
AccessToken = accessToken;
}
- public static string CalculateCacheKey(DiscoveryDocumentResponse discoveryResponse, IdentityClientConfiguration configuration)
+ public static string CalculateCacheKey(IdentityClientConfiguration configuration)
{
- return discoveryResponse.TokenEndpoint + string.Join(",", configuration.Select(x => x.Key + ":" + x.Value));
+ return string.Join(",", configuration.Select(x => x.Key + ":" + x.Value)).ToMd5();
}
}
}
From c5bfdb7053fbf02bb4efff6997b5e3da772e997a Mon Sep 17 00:00:00 2001
From: maliming <6908465+maliming@users.noreply.github.com>
Date: Fri, 17 Jul 2020 17:03:02 +0800
Subject: [PATCH 003/345] Add CacheAbsoluteExpiration to
IdentityClientConfiguration.
---
.../IdentityClientConfiguration.cs | 25 ++++++++++++----
.../IdentityModelAuthenticationService.cs | 29 +++++++------------
2 files changed, 30 insertions(+), 24 deletions(-)
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs
index 17040ff1db..d831c28808 100644
--- a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs
+++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
using IdentityModel;
namespace Volo.Abp.IdentityModel
@@ -81,21 +82,32 @@ namespace Volo.Abp.IdentityModel
get => this.GetOrDefault(nameof(RequireHttps))?.To() ?? true;
set => this[nameof(RequireHttps)] = value.ToString().ToLowerInvariant();
}
-
+
+ ///
+ /// Cache absolute expiration
+ /// Default: 30 minutes.
+ ///
+ public double CacheAbsoluteExpiration
+ {
+ get => this.GetOrDefault(nameof(CacheAbsoluteExpiration ))?.To() ?? 60 * 30;
+ set => this[nameof(CacheAbsoluteExpiration)] = value.ToString(CultureInfo.InvariantCulture);
+ }
+
public IdentityClientConfiguration()
{
-
+
}
public IdentityClientConfiguration(
string authority,
string scope,
- string clientId,
- string clientSecret,
+ string clientId,
+ string clientSecret,
string grantType = OidcConstants.GrantTypes.ClientCredentials,
string userName = null,
string userPassword = null,
- bool requireHttps = true)
+ bool requireHttps = true,
+ double cacheAbsoluteExpiration = 60 * 30)
{
this[nameof(Authority)] = authority;
this[nameof(Scope)] = scope;
@@ -105,6 +117,7 @@ namespace Volo.Abp.IdentityModel
this[nameof(UserName)] = userName;
this[nameof(UserPassword)] = userPassword;
this[nameof(RequireHttps)] = requireHttps.ToString().ToLowerInvariant();
+ this[nameof(CacheAbsoluteExpiration)] = cacheAbsoluteExpiration.ToString(CultureInfo.InvariantCulture);
}
}
-}
\ No newline at end of file
+}
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs
index 5d22d0c7a5..0fb4c32648 100644
--- a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs
+++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityModelAuthenticationService.cs
@@ -78,13 +78,11 @@ namespace Volo.Abp.IdentityModel
public virtual async Task GetAccessTokenAsync(IdentityClientConfiguration configuration)
{
- var tokenEndpoint = await GetTokenEndpoint(configuration);
-
var cacheKey = CalculateTokenCacheKey(configuration);
var tokenCacheItem = await TokenCache.GetAsync(cacheKey);
if (tokenCacheItem == null)
{
- var tokenResponse = await GetTokenResponse(tokenEndpoint, configuration);
+ var tokenResponse = await GetTokenResponse(configuration);
if (tokenResponse.IsError)
{
@@ -99,14 +97,12 @@ namespace Volo.Abp.IdentityModel
throw new AbpException(withoutInnerException[0]);
}
- await TokenCache.SetAsync(cacheKey, new IdentityModelTokenCacheItem(tokenResponse.AccessToken),
- new DistributedCacheEntryOptions()
+ tokenCacheItem = new IdentityModelTokenCacheItem(tokenResponse.AccessToken);
+ await TokenCache.SetAsync(cacheKey, tokenCacheItem,
+ new DistributedCacheEntryOptions
{
- //Subtract 10 seconds of network request time.
- AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(tokenResponse.ExpiresIn - 10)
+ AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(configuration.CacheAbsoluteExpiration)
});
-
- return tokenResponse.AccessToken;
}
return tokenCacheItem.AccessToken;
@@ -148,15 +144,14 @@ namespace Volo.Abp.IdentityModel
await DiscoveryDocumentCache.SetAsync(tokenEndpointUrlCacheKey, discoveryDocumentCacheItem,
new DistributedCacheEntryOptions
{
- SlidingExpiration = TimeSpan.FromMinutes(30)
+ AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(configuration.CacheAbsoluteExpiration)
});
}
return discoveryDocumentCacheItem.TokenEndpoint;
}
- protected virtual async Task GetDiscoveryResponse(
- IdentityClientConfiguration configuration)
+ protected virtual async Task GetDiscoveryResponse(IdentityClientConfiguration configuration)
{
using (var httpClient = HttpClientFactory.CreateClient(HttpClientName))
{
@@ -173,10 +168,10 @@ namespace Volo.Abp.IdentityModel
}
}
- protected virtual async Task GetTokenResponse(
- string tokenEndpoint,
- IdentityClientConfiguration configuration)
+ protected virtual async Task GetTokenResponse(IdentityClientConfiguration configuration)
{
+ var tokenEndpoint = await GetTokenEndpoint(configuration);
+
using (var httpClient = HttpClientFactory.CreateClient(HttpClientName))
{
AddHeaders(httpClient);
@@ -217,9 +212,7 @@ namespace Volo.Abp.IdentityModel
return Task.FromResult(request);
}
- protected virtual Task CreateClientCredentialsTokenRequestAsync(
- string tokenEndpoint,
- IdentityClientConfiguration configuration)
+ protected virtual Task CreateClientCredentialsTokenRequestAsync(string tokenEndpoint, IdentityClientConfiguration configuration)
{
var request = new ClientCredentialsTokenRequest
{
From 717f8b68fb65793f1ae3c3893041d8339af13633 Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Fri, 7 Aug 2020 18:25:36 +0300
Subject: [PATCH 004/345] test: update initial-utils.spec
---
npm/ng-packs/packages/core/src/lib/tests/initial-utils.spec.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/npm/ng-packs/packages/core/src/lib/tests/initial-utils.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/initial-utils.spec.ts
index c81ce081b2..1657f418e3 100644
--- a/npm/ng-packs/packages/core/src/lib/tests/initial-utils.spec.ts
+++ b/npm/ng-packs/packages/core/src/lib/tests/initial-utils.spec.ts
@@ -32,6 +32,7 @@ describe('InitialUtils', () => {
const injector = spectator.inject(Injector);
const injectorSpy = jest.spyOn(injector, 'get');
const store = spectator.inject(Store);
+ const oAuthService = spectator.inject(OAuthService);
const dispatchSpy = jest.spyOn(store, 'dispatch');
const parseTenantFromUrlSpy = jest.spyOn(multiTenancyUtils, 'parseTenantFromUrl');
const getRemoteEnvSpy = jest.spyOn(environmentUtils, 'getRemoteEnv');
@@ -40,6 +41,7 @@ describe('InitialUtils', () => {
injectorSpy.mockReturnValueOnce(store);
injectorSpy.mockReturnValueOnce({ skipGetAppConfiguration: false });
+ injectorSpy.mockReturnValueOnce(oAuthService);
injectorSpy.mockReturnValueOnce({ hasValidAccessToken: () => false });
dispatchSpy.mockReturnValue(of('test'));
From bbad96fdc2f2e4864e3f2dbb2c8aaa257d367867 Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Fri, 7 Aug 2020 18:28:16 +0300
Subject: [PATCH 005/345] feat: create authentication-flow.guard
---
.../account/src/lib/account-routing.module.ts | 2 ++
.../packages/account/src/lib/account.module.ts | 2 ++
.../src/lib/guards/authentication-flow.guard.ts | 17 +++++++++++++++++
3 files changed, 21 insertions(+)
create mode 100644 npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts
diff --git a/npm/ng-packs/packages/account/src/lib/account-routing.module.ts b/npm/ng-packs/packages/account/src/lib/account-routing.module.ts
index 2225e7c592..a77ea4134b 100644
--- a/npm/ng-packs/packages/account/src/lib/account-routing.module.ts
+++ b/npm/ng-packs/packages/account/src/lib/account-routing.module.ts
@@ -10,12 +10,14 @@ import { LoginComponent } from './components/login/login.component';
import { ManageProfileComponent } from './components/manage-profile/manage-profile.component';
import { RegisterComponent } from './components/register/register.component';
import { eAccountComponents } from './enums/components';
+import { AuthenticationFlowGuard } from './guards/authentication-flow.guard';
const routes: Routes = [
{ path: '', pathMatch: 'full', redirectTo: 'login' },
{
path: '',
component: DynamicLayoutComponent,
+ canActivate: [AuthenticationFlowGuard],
children: [
{
path: 'login',
diff --git a/npm/ng-packs/packages/account/src/lib/account.module.ts b/npm/ng-packs/packages/account/src/lib/account.module.ts
index 0ee605a75a..7f2151dfd1 100644
--- a/npm/ng-packs/packages/account/src/lib/account.module.ts
+++ b/npm/ng-packs/packages/account/src/lib/account.module.ts
@@ -14,6 +14,7 @@ import { TenantBoxComponent } from './components/tenant-box/tenant-box.component
import { Options } from './models/options';
import { ACCOUNT_OPTIONS } from './tokens/options.token';
import { accountOptionsFactory } from './utils/factory-utils';
+import { AuthenticationFlowGuard } from './guards/authentication-flow.guard';
@NgModule({
declarations: [
@@ -39,6 +40,7 @@ export class AccountModule {
return {
ngModule: AccountModule,
providers: [
+ AuthenticationFlowGuard,
{ provide: ACCOUNT_OPTIONS, useValue: options },
{
provide: 'ACCOUNT_OPTIONS',
diff --git a/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts b/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts
new file mode 100644
index 0000000000..bd22318acd
--- /dev/null
+++ b/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts
@@ -0,0 +1,17 @@
+import { Injectable } from '@angular/core';
+import { CanActivate } from '@angular/router';
+import { OAuthService } from 'angular-oauth2-oidc';
+
+@Injectable()
+export class AuthenticationFlowGuard implements CanActivate {
+ constructor(private oauthService: OAuthService) {}
+
+ canActivate() {
+ if (this.oauthService.responseType === 'code') {
+ this.oauthService.initCodeFlow();
+ return false;
+ }
+
+ return true;
+ }
+}
From e049d02ef4d1fda603309d30c3ab2d4ee20700c2 Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Fri, 7 Aug 2020 18:30:08 +0300
Subject: [PATCH 006/345] feat: change the oauth configuration according to
code flow
---
.../dev-app/src/environments/environment.prod.ts | 11 ++++++-----
.../apps/dev-app/src/environments/environment.ts | 11 ++++++-----
.../angular/src/environments/environment.prod.ts | 14 ++++++--------
.../app/angular/src/environments/environment.ts | 15 ++++++---------
4 files changed, 24 insertions(+), 27 deletions(-)
diff --git a/npm/ng-packs/apps/dev-app/src/environments/environment.prod.ts b/npm/ng-packs/apps/dev-app/src/environments/environment.prod.ts
index 21e1302773..70af33346f 100644
--- a/npm/ng-packs/apps/dev-app/src/environments/environment.prod.ts
+++ b/npm/ng-packs/apps/dev-app/src/environments/environment.prod.ts
@@ -1,20 +1,21 @@
import { Config } from '@abp/ng.core';
+const baseUrl = 'http://localhost:4200';
+
export const environment = {
production: true,
hmr: false,
application: {
- baseUrl: 'http://localhost:4200/',
+ baseUrl,
name: 'MyProjectName',
logoUrl: '',
},
oAuthConfig: {
issuer: 'https://localhost:44305',
+ redirectUri: baseUrl,
clientId: 'MyProjectName_App',
- dummyClientSecret: '1q2w3e*',
- scope: 'MyProjectName',
- oidc: false,
- requireHttps: true,
+ responseType: 'code',
+ scope: 'offline_access MyProjectName',
},
apis: {
default: {
diff --git a/npm/ng-packs/apps/dev-app/src/environments/environment.ts b/npm/ng-packs/apps/dev-app/src/environments/environment.ts
index 8cae243d46..2bf42cf7dc 100644
--- a/npm/ng-packs/apps/dev-app/src/environments/environment.ts
+++ b/npm/ng-packs/apps/dev-app/src/environments/environment.ts
@@ -1,20 +1,21 @@
import { Config } from '@abp/ng.core';
+const baseUrl = 'http://localhost:4200';
+
export const environment = {
production: false,
hmr: false,
application: {
- baseUrl: 'http://localhost:4200/',
+ baseUrl,
name: 'MyProjectName',
logoUrl: '',
},
oAuthConfig: {
issuer: 'https://localhost:44305',
+ redirectUri: baseUrl,
clientId: 'MyProjectName_App',
- dummyClientSecret: '1q2w3e*',
- scope: 'MyProjectName',
- oidc: false,
- requireHttps: true,
+ responseType: 'code',
+ scope: 'offline_access MyProjectName',
},
apis: {
default: {
diff --git a/templates/app/angular/src/environments/environment.prod.ts b/templates/app/angular/src/environments/environment.prod.ts
index cfe0401dee..719dd1fe53 100644
--- a/templates/app/angular/src/environments/environment.prod.ts
+++ b/templates/app/angular/src/environments/environment.prod.ts
@@ -1,26 +1,24 @@
import { Config } from '@abp/ng.core';
+const baseUrl = 'http://localhost:4200';
+
export const environment = {
production: true,
application: {
- baseUrl: 'http://localhost:4200/',
+ baseUrl,
name: 'MyProjectName',
logoUrl: '',
},
oAuthConfig: {
issuer: 'https://localhost:44305',
+ redirectUri: baseUrl,
clientId: 'MyProjectName_App',
- dummyClientSecret: '1q2w3e*',
- scope: 'MyProjectName',
- oidc: false,
- requireHttps: true,
+ responseType: 'code',
+ scope: 'offline_access MyProjectName',
},
apis: {
default: {
url: 'https://localhost:44305',
},
},
- localization: {
- defaultResourceName: 'MyProjectName',
- },
} as Config.Environment;
diff --git a/templates/app/angular/src/environments/environment.ts b/templates/app/angular/src/environments/environment.ts
index 2039e8a2dc..cb0be073c2 100644
--- a/templates/app/angular/src/environments/environment.ts
+++ b/templates/app/angular/src/environments/environment.ts
@@ -1,27 +1,24 @@
import { Config } from '@abp/ng.core';
+const baseUrl = 'http://localhost:4200';
+
export const environment = {
production: false,
application: {
- baseUrl: 'http://localhost:4200/',
+ baseUrl,
name: 'MyProjectName',
logoUrl: '',
},
oAuthConfig: {
issuer: 'https://localhost:44305',
+ redirectUri: baseUrl,
clientId: 'MyProjectName_App',
- dummyClientSecret: '1q2w3e*',
- scope: 'MyProjectName',
- showDebugInformation: true,
- oidc: false,
- requireHttps: true,
+ responseType: 'code',
+ scope: 'offline_access MyProjectName',
},
apis: {
default: {
url: 'https://localhost:44305',
},
},
- localization: {
- defaultResourceName: 'MyProjectName',
- },
} as Config.Environment;
From f14396e7d8243266f0110de367a23fa15175ba05 Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Fri, 7 Aug 2020 18:30:32 +0300
Subject: [PATCH 007/345] feat: call setupAutomaticSilentRefresh on app
initialization
---
.../core/src/lib/handlers/oauth-configuration.handler.ts | 3 +++
1 file changed, 3 insertions(+)
diff --git a/npm/ng-packs/packages/core/src/lib/handlers/oauth-configuration.handler.ts b/npm/ng-packs/packages/core/src/lib/handlers/oauth-configuration.handler.ts
index d9c6806900..b3f1b62a23 100644
--- a/npm/ng-packs/packages/core/src/lib/handlers/oauth-configuration.handler.ts
+++ b/npm/ng-packs/packages/core/src/lib/handlers/oauth-configuration.handler.ts
@@ -17,6 +17,9 @@ export class OAuthConfigurationHandler {
@Inject(CORE_OPTIONS) private options: ABP.Root,
) {
this.oAuthService.configure(this.options.environment.oAuthConfig);
+ if (this.oAuthService.responseType === 'code') {
+ this.oAuthService.setupAutomaticSilentRefresh();
+ }
this.listenToSetEnvironment();
}
From 014a2fc1670d75a9745d32e89c49a48cca897480 Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Fri, 7 Aug 2020 18:30:54 +0300
Subject: [PATCH 008/345] feat: add an if condition to auth service for code
flow
---
.../packages/core/src/lib/services/auth.service.ts | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/npm/ng-packs/packages/core/src/lib/services/auth.service.ts b/npm/ng-packs/packages/core/src/lib/services/auth.service.ts
index 3a343fd2cb..063b1bc74f 100644
--- a/npm/ng-packs/packages/core/src/lib/services/auth.service.ts
+++ b/npm/ng-packs/packages/core/src/lib/services/auth.service.ts
@@ -3,13 +3,13 @@ import { Inject, Injectable, Optional } from '@angular/core';
import { Navigate } from '@ngxs/router-plugin';
import { Store } from '@ngxs/store';
import { OAuthService } from 'angular-oauth2-oidc';
-import { from, Observable } from 'rxjs';
-import { switchMap, tap, take } from 'rxjs/operators';
+import { from, Observable, of } from 'rxjs';
+import { switchMap, take, tap } from 'rxjs/operators';
import snq from 'snq';
import { GetAppConfiguration } from '../actions/config.actions';
+import { ConfigState } from '../states/config.state';
import { SessionState } from '../states/session.state';
import { RestService } from './rest.service';
-import { ConfigState } from '../states/config.state';
@Injectable({
providedIn: 'root',
@@ -48,6 +48,11 @@ export class AuthService {
logout(): Observable {
const issuer = this.store.selectSnapshot(ConfigState.getDeep('environment.oAuthConfig.issuer'));
+ if (this.oAuthService.responseType === 'code') {
+ this.oAuthService.logOut();
+ return of(null);
+ }
+
return this.rest
.request(
{
@@ -59,7 +64,7 @@ export class AuthService {
)
.pipe(
switchMap(() => {
- this.oAuthService.logOut(true);
+ this.oAuthService.logOut();
return this.store.dispatch(new GetAppConfiguration());
}),
);
From 5fa82a25d7e9be9d00cd2ead99edd1a4bbc101d1 Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Fri, 7 Aug 2020 18:31:12 +0300
Subject: [PATCH 009/345] feat: call loadDiscoveryDocumentAndTryLogin method in
initial-utils
---
npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts
index a79077b89d..b1f9701343 100644
--- a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts
+++ b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts
@@ -14,6 +14,11 @@ export function getInitialData(injector: Injector) {
const fn = async () => {
const store: Store = injector.get(Store);
const options = injector.get(CORE_OPTIONS) as ABP.Root;
+ const oAuthService = injector.get(OAuthService);
+
+ if (oAuthService.responseType === 'code') {
+ await oAuthService.loadDiscoveryDocumentAndTryLogin();
+ }
await getRemoteEnv(injector, options.environment);
await parseTenantFromUrl(injector);
From 577386600b0d60f42aba141109158e552f30265b Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Fri, 7 Aug 2020 18:31:25 +0300
Subject: [PATCH 010/345] chore: updata angular-oauth2-oidc version
---
npm/ng-packs/package.json | 2 +-
npm/ng-packs/packages/core/package.json | 2 +-
npm/ng-packs/yarn.lock | 102 +++++++++++++++---------
3 files changed, 65 insertions(+), 41 deletions(-)
diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json
index fa58409270..658c2dac67 100644
--- a/npm/ng-packs/package.json
+++ b/npm/ng-packs/package.json
@@ -60,7 +60,7 @@
"@swimlane/ngx-datatable": "^17.0.0",
"@types/jest": "^25.2.3",
"@types/node": "^12.11.1",
- "angular-oauth2-oidc": "^9.2.2",
+ "angular-oauth2-oidc": "^10.0.3",
"bootstrap": "^4.5.0",
"chart.js": "^2.9.3",
"codelyzer": "^5.1.2",
diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json
index 4053f0fcc4..4ccafae3a0 100644
--- a/npm/ng-packs/packages/core/package.json
+++ b/npm/ng-packs/packages/core/package.json
@@ -12,7 +12,7 @@
"@ngxs/router-plugin": "^3.6.2",
"@ngxs/storage-plugin": "^3.6.2",
"@ngxs/store": "^3.6.2",
- "angular-oauth2-oidc": "^9.2.2",
+ "angular-oauth2-oidc": "^10.0.0",
"just-clone": "^3.1.0",
"just-compare": "^1.3.0",
"snq": "^1.0.3",
diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock
index 56434e11b2..850b85c248 100644
--- a/npm/ng-packs/yarn.lock
+++ b/npm/ng-packs/yarn.lock
@@ -715,9 +715,9 @@
js-tokens "^4.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.1", "@babel/parser@^7.8.3", "@babel/parser@^7.8.6", "@babel/parser@^7.9.6":
- version "7.11.1"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.1.tgz#d91a387990b21e5d20047b336bb19b0553f02ff5"
- integrity sha512-u9QMIRdKVF7hfEkb3nu2LgZDIzCQPv+yHD9Eg6ruoJLjkrQ9fFz4IBSlF/9XwoNri9+2F1IY+dYuOfZrXq8t3w==
+ version "7.11.2"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.2.tgz#0882ab8a455df3065ea2dcb4c753b2460a24bead"
+ integrity sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw==
"@babel/plugin-proposal-async-generator-functions@^7.8.3":
version "7.10.5"
@@ -1224,9 +1224,9 @@
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4":
- version "7.11.1"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.1.tgz#087afc57e7bf1073e792fe54f8fb3cfa752f9230"
- integrity sha512-nH5y8fLvVl3HAb+ezbgcgwrH8QbClWo8xzkOu7+oyqngo3EVorwpWJQaqXPjGRpfj7mQvsJCl/S8knkfkPWqrw==
+ version "7.11.2"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
+ integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
dependencies:
regenerator-runtime "^0.13.4"
@@ -2736,9 +2736,9 @@
integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==
"@types/node@^12.11.1":
- version "12.12.53"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.53.tgz#be0d375933c3d15ef2380dafb3b0350ea7021129"
- integrity sha512-51MYTDTyCziHb70wtGNFRwB4l+5JNvdqzFSkbDvpbftEgVUBEE+T5f7pROhWMp/fxp07oNIEQZd5bbfAH22ohQ==
+ version "12.12.54"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.54.tgz#a4b58d8df3a4677b6c08bfbc94b7ad7a7a5f82d1"
+ integrity sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w==
"@types/node@^8.0.31":
version "8.10.62"
@@ -2814,9 +2814,9 @@
integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==
"@types/yargs@^13.0.0":
- version "13.0.9"
- resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.9.tgz#44028e974343c7afcf3960f1a2b1099c39a7b5e1"
- integrity sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==
+ version "13.0.10"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.10.tgz#e77bf3fc73c781d48c2eb541f87c453e321e5f4b"
+ integrity sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==
dependencies:
"@types/yargs-parser" "*"
@@ -3120,6 +3120,20 @@ alphanum-sort@^1.0.0:
resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
+angular-oauth2-oidc-jwks@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/angular-oauth2-oidc-jwks/-/angular-oauth2-oidc-jwks-9.0.0.tgz#f11e4e561ff423928ab63ca2cca84703a00ff85d"
+ integrity sha512-3hTJc7vEI/ka/nnliMcCQuDnszzL3AhGInBBbn96BO+ZOdvP/4PbEumUsDto2WRpPMPxD6HAmExwYeQWljcc5A==
+ dependencies:
+ jsrsasign "^8.0.12"
+
+angular-oauth2-oidc@^10.0.3:
+ version "10.0.3"
+ resolved "https://registry.yarnpkg.com/angular-oauth2-oidc/-/angular-oauth2-oidc-10.0.3.tgz#612ef75c2e07b56592d2506f9618ee6a61857ad9"
+ integrity sha512-9wC8I3e3cN6rMBOlo5JB2y3Fd2erp8pJ67t4vEVzyPbnRG6BJ4rreSOznSL9zw/2SjhC9kRV2OfFie29CUCzEg==
+ dependencies:
+ tslib "^2.0.0"
+
angular-oauth2-oidc@^9.2.2:
version "9.2.2"
resolved "https://registry.yarnpkg.com/angular-oauth2-oidc/-/angular-oauth2-oidc-9.2.2.tgz#2b888337953a8773e0269b5ef1709f30316448f1"
@@ -3678,9 +3692,9 @@ boolbase@^1.0.0, boolbase@~1.0.0:
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
bootstrap@^4.5.0:
- version "4.5.1"
- resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.1.tgz#f7322c7dd3e6376d430efc0c3f57e4d8005eb5b2"
- integrity sha512-bxUooHBSbvefnIZfjD0LE8nfdPKrtiFy2sgrxQwUZ0UpFzpjVbVMUxaGIoo9XWT4B2LG1HX6UQg0UMOakT0prQ==
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.2.tgz#a85c4eda59155f0d71186b6e6ad9b875813779ab"
+ integrity sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A==
boxen@^4.2.0:
version "4.2.0"
@@ -3806,14 +3820,14 @@ browserify-zlib@^0.2.0:
pako "~1.0.5"
browserslist@^4.0.0, browserslist@^4.11.1, browserslist@^4.12.0, browserslist@^4.7.0, browserslist@^4.8.5, browserslist@^4.9.1:
- version "4.13.0"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.13.0.tgz#42556cba011e1b0a2775b611cba6a8eca18e940d"
- integrity sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==
+ version "4.14.0"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.0.tgz#2908951abfe4ec98737b72f34c3bcedc8d43b000"
+ integrity sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==
dependencies:
- caniuse-lite "^1.0.30001093"
- electron-to-chromium "^1.3.488"
- escalade "^3.0.1"
- node-releases "^1.1.58"
+ caniuse-lite "^1.0.30001111"
+ electron-to-chromium "^1.3.523"
+ escalade "^3.0.2"
+ node-releases "^1.1.60"
browserstack@^1.5.1:
version "1.6.0"
@@ -4095,10 +4109,10 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001061, caniuse-lite@^1.0.30001093, caniuse-lite@^1.0.30001109:
- version "1.0.30001111"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001111.tgz#dd0ce822c70eb6c7c068e4a55c22e19ec1501298"
- integrity sha512-xnDje2wchd/8mlJu8sXvWxOGvMgv+uT3iZ3bkIAynKOzToCssWCmkz/ZIkQBs/2pUB4uwnJKVORWQ31UkbVjOg==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001061, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001111:
+ version "1.0.30001112"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001112.tgz#0fffc3b934ff56ff0548c37bc9dad7d882bcf672"
+ integrity sha512-J05RTQlqsatidif/38aN3PGULCLrg8OYQOlJUKbeYVzC2mGZkZLIztwRlB3MtrfLmawUmjFlNJvy/uhwniIe1Q==
canonical-path@1.0.0:
version "1.0.0"
@@ -4182,9 +4196,9 @@ chartjs-color@^2.1.0:
color-convert "^1.9.3"
"chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.0.2, chokidar@^3.2.1, chokidar@^3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1"
- integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d"
+ integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==
dependencies:
anymatch "~3.1.1"
braces "~3.0.2"
@@ -5675,10 +5689,10 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
-electron-to-chromium@^1.3.488:
- version "1.3.520"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.520.tgz#dfda0a14a4aed785cbddfdb505ea122f75978392"
- integrity sha512-q6H9E1sXDCjRHP+X06vcP+N0ki8ZvYoRPZfKnDuiRX10WWXxEHzKFVf4O9rBFMpuPtR3M+2KAdJnugJoBBp3Rw==
+electron-to-chromium@^1.3.523:
+ version "1.3.524"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.524.tgz#dd49646594466192de35956a5369bb20d616aa78"
+ integrity sha512-ZUvklIBkfXQyA6IeiEss1nfKRICcdB5afAGZAaPGaExdfrkpUu/WWVO+X7QpNnphaVMllXnAcvKnVPdyM+DCPQ==
elliptic@^6.5.3:
version "6.5.3"
@@ -5848,7 +5862,7 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3:
d "^1.0.1"
ext "^1.1.2"
-escalade@^3.0.1:
+escalade@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4"
integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==
@@ -8449,6 +8463,11 @@ jsprim@^1.2.2:
json-schema "0.2.3"
verror "1.10.0"
+jsrsasign@^8.0.12:
+ version "8.0.23"
+ resolved "https://registry.yarnpkg.com/jsrsasign/-/jsrsasign-8.0.23.tgz#4427ed0bbbd809d65b8e5ac9d48ba5383b49ee0c"
+ integrity sha512-COwd/XmwaxBwf/6E3FO21DGK504KdjfNMYv6hVd2q6W6lzTeaL2UKQ0cIBw6SFMBCdaQl8fGUm4dHFt7Wmo9xw==
+
jszip@^3.1.3:
version "3.5.0"
resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.5.0.tgz#b4fd1f368245346658e781fec9675802489e15f6"
@@ -9565,7 +9584,7 @@ node-notifier@^6.0.0:
shellwords "^0.1.1"
which "^1.3.1"
-node-releases@^1.1.58:
+node-releases@^1.1.60:
version "1.1.60"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084"
integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==
@@ -13092,16 +13111,16 @@ ts-pnp@^1.1.6:
integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==
ts-toolbelt@^6.9.9:
- version "6.14.0"
- resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.14.0.tgz#6f1082c5f59b39ff5d71ff427207bb92ffca4534"
- integrity sha512-/EihMSk7AQn1n1zad6765tZNr7OCxAP75nS/VGzcZlWLlDa2izLJZV7SJSNDweSKusKuTDyHZhKFyUZW6UUnqg==
+ version "6.15.0"
+ resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.15.0.tgz#e1806c4904f5dc819d8dd2c48e09ccc60bfb742f"
+ integrity sha512-WuXbnXmVgzAGdruH7jbYf4j/0Y4anfMOD0KUU8iw6/4SbzdQVpfso4BJ1Z/t7hKLN2++gWYIseaw/ciyWKLreQ==
tsickle@^0.38.1:
version "0.38.1"
resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.38.1.tgz#30762db759d40c435943093b6972c7f2efb384ef"
integrity sha512-4xZfvC6+etRu6ivKCNqMOd1FqcY/m6JY3Y+yr5+Xw+i751ciwrWINi6x/3l1ekcODH9GZhlf0ny2LpzWxnjWYA==
-tslib@2.0.0, tslib@^2.0.0:
+tslib@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.0.tgz#18d13fc2dce04051e20f074cc8387fd8089ce4f3"
integrity sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==
@@ -13111,6 +13130,11 @@ tslib@^1.10.0, tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
+tslib@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e"
+ integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==
+
tslint@~6.1.0:
version "6.1.3"
resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904"
From 8b3758d395801e78671b858830f18217e6ae045d Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Fri, 7 Aug 2020 18:32:58 +0300
Subject: [PATCH 011/345] chore: change redirecting to login method in home
component
---
.../apps/dev-app/src/app/home/home.component.html | 7 +------
npm/ng-packs/apps/dev-app/src/app/home/home.component.ts | 4 ++++
templates/app/angular/src/app/home/home.component.html | 8 +-------
templates/app/angular/src/app/home/home.component.ts | 4 ++++
4 files changed, 10 insertions(+), 13 deletions(-)
diff --git a/npm/ng-packs/apps/dev-app/src/app/home/home.component.html b/npm/ng-packs/apps/dev-app/src/app/home/home.component.html
index 2733150b71..ae3196c0c6 100644
--- a/npm/ng-packs/apps/dev-app/src/app/home/home.component.html
+++ b/npm/ng-packs/apps/dev-app/src/app/home/home.component.html
@@ -8,12 +8,7 @@
abp.io
- {{ 'AbpIdentity::Login' | abpLocalization }}
diff --git a/npm/ng-packs/apps/dev-app/src/app/home/home.component.ts b/npm/ng-packs/apps/dev-app/src/app/home/home.component.ts
index a42b960493..9daacbabaf 100644
--- a/npm/ng-packs/apps/dev-app/src/app/home/home.component.ts
+++ b/npm/ng-packs/apps/dev-app/src/app/home/home.component.ts
@@ -11,4 +11,8 @@ export class HomeComponent {
}
constructor(private oAuthService: OAuthService) {}
+
+ login() {
+ this.oAuthService.initCodeFlow();
+ }
}
diff --git a/templates/app/angular/src/app/home/home.component.html b/templates/app/angular/src/app/home/home.component.html
index f4d41daf4f..fc7a0a4183 100644
--- a/templates/app/angular/src/app/home/home.component.html
+++ b/templates/app/angular/src/app/home/home.component.html
@@ -8,13 +8,7 @@
abp.io
- {{ 'AbpAccount::Login' | abpLocalization }}
diff --git a/templates/app/angular/src/app/home/home.component.ts b/templates/app/angular/src/app/home/home.component.ts
index a42b960493..9daacbabaf 100644
--- a/templates/app/angular/src/app/home/home.component.ts
+++ b/templates/app/angular/src/app/home/home.component.ts
@@ -11,4 +11,8 @@ export class HomeComponent {
}
constructor(private oAuthService: OAuthService) {}
+
+ login() {
+ this.oAuthService.initCodeFlow();
+ }
}
From 25e18b52a835303604a0cccd937aa496a789fc0f Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Mon, 10 Aug 2020 17:30:07 +0300
Subject: [PATCH 012/345] feat: create oauth strategy
---
.../packages/core/src/lib/strategies/index.ts | 1 +
.../core/src/lib/strategies/oauth.strategy.ts | 112 ++++++++++++++++++
2 files changed, 113 insertions(+)
create mode 100644 npm/ng-packs/packages/core/src/lib/strategies/oauth.strategy.ts
diff --git a/npm/ng-packs/packages/core/src/lib/strategies/index.ts b/npm/ng-packs/packages/core/src/lib/strategies/index.ts
index 2e621e7907..d2a56ad2a6 100644
--- a/npm/ng-packs/packages/core/src/lib/strategies/index.ts
+++ b/npm/ng-packs/packages/core/src/lib/strategies/index.ts
@@ -5,4 +5,5 @@ export * from './context.strategy';
export * from './cross-origin.strategy';
export * from './dom.strategy';
export * from './loading.strategy';
+export * from './oauth.strategy';
export * from './projection.strategy';
diff --git a/npm/ng-packs/packages/core/src/lib/strategies/oauth.strategy.ts b/npm/ng-packs/packages/core/src/lib/strategies/oauth.strategy.ts
new file mode 100644
index 0000000000..b9f05d9021
--- /dev/null
+++ b/npm/ng-packs/packages/core/src/lib/strategies/oauth.strategy.ts
@@ -0,0 +1,112 @@
+import { Injector } from '@angular/core';
+import { Store } from '@ngxs/store';
+import { AuthConfig, OAuthService, OAuthSuccessEvent } from 'angular-oauth2-oidc';
+import { ConfigState } from '../states/config.state';
+import { CORE_OPTIONS } from '../tokens/options.token';
+import { Router } from '@angular/router';
+import { Observable, of } from 'rxjs';
+import { RestService } from '../services/rest.service';
+import { switchMap } from 'rxjs/operators';
+import { GetAppConfiguration } from '../actions/config.actions';
+
+export abstract class OAuthStrategy {
+ protected oAuthService: OAuthService;
+ protected oAuthConfig: AuthConfig;
+ abstract navigateToLogin(): void;
+ abstract canActivate(): boolean;
+ abstract logOut(): Observable;
+
+ private catchError = err => {
+ // TODO: handle the error
+ };
+
+ constructor(protected injector: Injector) {
+ this.oAuthService = injector.get(OAuthService);
+ this.oAuthConfig = injector.get(CORE_OPTIONS).environment.oAuthConfig;
+ }
+
+ async init(): Promise {
+ this.oAuthService.configure(this.oAuthConfig);
+ return this.oAuthService.loadDiscoveryDocument().catch(this.catchError);
+ }
+}
+
+export class OAuthCodeFlowStrategy extends OAuthStrategy {
+ async init() {
+ return super
+ .init()
+ .then(() => this.oAuthService.tryLogin())
+ .then(() => this.oAuthService.setupAutomaticSilentRefresh());
+ }
+
+ navigateToLogin() {
+ this.oAuthService.initCodeFlow();
+ }
+
+ canActivate() {
+ this.oAuthService.initCodeFlow();
+ return false;
+ }
+
+ logOut() {
+ this.oAuthService.logOut();
+ return of(null);
+ }
+}
+
+export class OAuthPasswordFlowStrategy extends OAuthStrategy {
+ navigateToLogin() {
+ const router = this.injector.get(Router);
+ router.navigateByUrl('/account/login');
+ }
+
+ canActivate() {
+ return true;
+ }
+
+ logOut() {
+ const store = this.injector.get(Store);
+ const rest = this.injector.get(RestService);
+
+ const issuer = store.selectSnapshot(ConfigState.getDeep('environment.oAuthConfig.issuer'));
+ return rest
+ .request(
+ {
+ method: 'GET',
+ url: '/api/account/logout',
+ },
+ null,
+ issuer,
+ )
+ .pipe(
+ switchMap(() => {
+ this.oAuthService.logOut();
+ return store.dispatch(new GetAppConfiguration());
+ }),
+ );
+ }
+}
+
+export const OAUTH_STRATEGY = {
+ async Init(injector: Injector) {
+ return getOAuthStrategy(injector).init();
+ },
+ NavigateToLogin(injector: Injector) {
+ return getOAuthStrategy(injector).navigateToLogin();
+ },
+ CanActivate(injector: Injector) {
+ return getOAuthStrategy(injector).canActivate();
+ },
+ LogOut(injector: Injector) {
+ return getOAuthStrategy(injector).logOut();
+ },
+};
+
+function getOAuthStrategy(injector: Injector) {
+ const codeFlow =
+ injector
+ .get(Store)
+ .selectSnapshot(ConfigState.getDeep('environment.oAuthConfig.responseType')) === 'code';
+
+ return codeFlow ? new OAuthCodeFlowStrategy(injector) : new OAuthPasswordFlowStrategy(injector);
+}
From a67c552393cf409ec887024a1f32b224a1f62d08 Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Mon, 10 Aug 2020 17:30:34 +0300
Subject: [PATCH 013/345] feat: implement the oauth strategy
---
.../dev-app/src/app/home/home.component.ts | 7 ++--
.../account/src/lib/account-routing.module.ts | 3 +-
.../lib/guards/authentication-flow.guard.ts | 13 +++----
.../handlers/oauth-configuration.handler.ts | 5 ---
.../core/src/lib/services/auth.service.ts | 36 +++++++------------
.../core/src/lib/utils/initial-utils.ts | 7 ++--
.../nav-items/current-user.component.ts | 8 ++---
.../angular/src/app/home/home.component.ts | 7 ++--
8 files changed, 33 insertions(+), 53 deletions(-)
diff --git a/npm/ng-packs/apps/dev-app/src/app/home/home.component.ts b/npm/ng-packs/apps/dev-app/src/app/home/home.component.ts
index 9daacbabaf..720034d928 100644
--- a/npm/ng-packs/apps/dev-app/src/app/home/home.component.ts
+++ b/npm/ng-packs/apps/dev-app/src/app/home/home.component.ts
@@ -1,4 +1,5 @@
-import { Component } from '@angular/core';
+import { OAUTH_STRATEGY } from '@abp/ng.core';
+import { Component, Injector } from '@angular/core';
import { OAuthService } from 'angular-oauth2-oidc';
@Component({
@@ -10,9 +11,9 @@ export class HomeComponent {
return this.oAuthService.hasValidAccessToken();
}
- constructor(private oAuthService: OAuthService) {}
+ constructor(private oAuthService: OAuthService, private injector: Injector) {}
login() {
- this.oAuthService.initCodeFlow();
+ OAUTH_STRATEGY.NavigateToLogin(this.injector);
}
}
diff --git a/npm/ng-packs/packages/account/src/lib/account-routing.module.ts b/npm/ng-packs/packages/account/src/lib/account-routing.module.ts
index a77ea4134b..6883921202 100644
--- a/npm/ng-packs/packages/account/src/lib/account-routing.module.ts
+++ b/npm/ng-packs/packages/account/src/lib/account-routing.module.ts
@@ -17,11 +17,11 @@ const routes: Routes = [
{
path: '',
component: DynamicLayoutComponent,
- canActivate: [AuthenticationFlowGuard],
children: [
{
path: 'login',
component: ReplaceableRouteContainerComponent,
+ canActivate: [AuthenticationFlowGuard],
data: {
replaceableComponent: {
key: eAccountComponents.Login,
@@ -32,6 +32,7 @@ const routes: Routes = [
{
path: 'register',
component: ReplaceableRouteContainerComponent,
+ canActivate: [AuthenticationFlowGuard],
data: {
replaceableComponent: {
key: eAccountComponents.Register,
diff --git a/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts b/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts
index bd22318acd..f892916582 100644
--- a/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts
+++ b/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts
@@ -1,17 +1,12 @@
-import { Injectable } from '@angular/core';
+import { Injectable, Injector } from '@angular/core';
import { CanActivate } from '@angular/router';
-import { OAuthService } from 'angular-oauth2-oidc';
+import { OAUTH_STRATEGY } from '@abp/ng.core';
@Injectable()
export class AuthenticationFlowGuard implements CanActivate {
- constructor(private oauthService: OAuthService) {}
+ constructor(private injector: Injector) {}
canActivate() {
- if (this.oauthService.responseType === 'code') {
- this.oauthService.initCodeFlow();
- return false;
- }
-
- return true;
+ return OAUTH_STRATEGY.CanActivate(this.injector);
}
}
diff --git a/npm/ng-packs/packages/core/src/lib/handlers/oauth-configuration.handler.ts b/npm/ng-packs/packages/core/src/lib/handlers/oauth-configuration.handler.ts
index b3f1b62a23..e0505d2f2d 100644
--- a/npm/ng-packs/packages/core/src/lib/handlers/oauth-configuration.handler.ts
+++ b/npm/ng-packs/packages/core/src/lib/handlers/oauth-configuration.handler.ts
@@ -16,11 +16,6 @@ export class OAuthConfigurationHandler {
private oAuthService: OAuthService,
@Inject(CORE_OPTIONS) private options: ABP.Root,
) {
- this.oAuthService.configure(this.options.environment.oAuthConfig);
- if (this.oAuthService.responseType === 'code') {
- this.oAuthService.setupAutomaticSilentRefresh();
- }
-
this.listenToSetEnvironment();
}
diff --git a/npm/ng-packs/packages/core/src/lib/services/auth.service.ts b/npm/ng-packs/packages/core/src/lib/services/auth.service.ts
index 063b1bc74f..3d4bdb9a0a 100644
--- a/npm/ng-packs/packages/core/src/lib/services/auth.service.ts
+++ b/npm/ng-packs/packages/core/src/lib/services/auth.service.ts
@@ -1,14 +1,15 @@
import { HttpHeaders } from '@angular/common/http';
-import { Inject, Injectable, Optional } from '@angular/core';
+import { Inject, Injectable, Injector, Optional } from '@angular/core';
import { Navigate } from '@ngxs/router-plugin';
import { Store } from '@ngxs/store';
import { OAuthService } from 'angular-oauth2-oidc';
-import { from, Observable, of } from 'rxjs';
+import { from, Observable } from 'rxjs';
import { switchMap, take, tap } from 'rxjs/operators';
import snq from 'snq';
import { GetAppConfiguration } from '../actions/config.actions';
import { ConfigState } from '../states/config.state';
import { SessionState } from '../states/session.state';
+import { OAUTH_STRATEGY } from '../strategies/oauth.strategy';
import { RestService } from './rest.service';
@Injectable({
@@ -16,6 +17,7 @@ import { RestService } from './rest.service';
})
export class AuthService {
constructor(
+ private injector: Injector,
private rest: RestService,
private oAuthService: OAuthService,
private store: Store,
@@ -45,28 +47,16 @@ export class AuthService {
);
}
- logout(): Observable {
- const issuer = this.store.selectSnapshot(ConfigState.getDeep('environment.oAuthConfig.issuer'));
-
- if (this.oAuthService.responseType === 'code') {
- this.oAuthService.logOut();
- return of(null);
+ /**
+ * @deprecated use LogOut prop of OAUTH_STRATEGY instead, will be deleted in v3.3
+ */
+ logout(): Observable {
+ if (!this.store.selectSnapshot(ConfigState.getDeep('environment.production'))) {
+ console.warn(
+ 'The logout method of AuthService is depracated. Use LogOut prop of OAUTH_STRATEGY instead.',
+ );
}
- return this.rest
- .request(
- {
- method: 'GET',
- url: '/api/account/logout',
- },
- null,
- issuer,
- )
- .pipe(
- switchMap(() => {
- this.oAuthService.logOut();
- return this.store.dispatch(new GetAppConfiguration());
- }),
- );
+ return OAUTH_STRATEGY.LogOut(this.injector);
}
}
diff --git a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts
index b1f9701343..17d39ed2c0 100644
--- a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts
+++ b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts
@@ -9,19 +9,16 @@ import { ConfigState } from '../states/config.state';
import { CORE_OPTIONS } from '../tokens/options.token';
import { getRemoteEnv } from './environment-utils';
import { parseTenantFromUrl } from './multi-tenancy-utils';
+import { OAUTH_STRATEGY } from '../strategies/oauth.strategy';
export function getInitialData(injector: Injector) {
const fn = async () => {
const store: Store = injector.get(Store);
const options = injector.get(CORE_OPTIONS) as ABP.Root;
- const oAuthService = injector.get(OAuthService);
-
- if (oAuthService.responseType === 'code') {
- await oAuthService.loadDiscoveryDocumentAndTryLogin();
- }
await getRemoteEnv(injector, options.environment);
await parseTenantFromUrl(injector);
+ await OAUTH_STRATEGY.Init(injector);
if (options.skipGetAppConfiguration) return;
diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts
index 70238d3538..6969de8ced 100644
--- a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts
+++ b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts
@@ -1,5 +1,5 @@
-import { ApplicationConfiguration, AuthService, ConfigState } from '@abp/ng.core';
-import { Component, OnInit } from '@angular/core';
+import { ApplicationConfiguration, OAUTH_STRATEGY, ConfigState } from '@abp/ng.core';
+import { Component, OnInit, Injector } from '@angular/core';
import { Router } from '@angular/router';
import { Select } from '@ngxs/store';
import { Observable } from 'rxjs';
@@ -55,12 +55,12 @@ export class CurrentUserComponent implements OnInit {
return window.innerWidth < 992;
}
- constructor(private authService: AuthService, private router: Router) {}
+ constructor(private injector: Injector, private router: Router) {}
ngOnInit() {}
logout() {
- this.authService.logout().subscribe(() => {
+ OAUTH_STRATEGY.LogOut(this.injector).subscribe(() => {
this.router.navigate(['/'], { state: { redirectUrl: this.router.url } });
});
}
diff --git a/templates/app/angular/src/app/home/home.component.ts b/templates/app/angular/src/app/home/home.component.ts
index 9daacbabaf..720034d928 100644
--- a/templates/app/angular/src/app/home/home.component.ts
+++ b/templates/app/angular/src/app/home/home.component.ts
@@ -1,4 +1,5 @@
-import { Component } from '@angular/core';
+import { OAUTH_STRATEGY } from '@abp/ng.core';
+import { Component, Injector } from '@angular/core';
import { OAuthService } from 'angular-oauth2-oidc';
@Component({
@@ -10,9 +11,9 @@ export class HomeComponent {
return this.oAuthService.hasValidAccessToken();
}
- constructor(private oAuthService: OAuthService) {}
+ constructor(private oAuthService: OAuthService, private injector: Injector) {}
login() {
- this.oAuthService.initCodeFlow();
+ OAUTH_STRATEGY.NavigateToLogin(this.injector);
}
}
From 8ed298365817686a032cd1fd6cac01977bba65c2 Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Mon, 10 Aug 2020 18:01:36 +0300
Subject: [PATCH 014/345] test: fix getInitialData fn of initial-utils file
test
---
.../packages/core/src/lib/tests/initial-utils.spec.ts | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/npm/ng-packs/packages/core/src/lib/tests/initial-utils.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/initial-utils.spec.ts
index 1657f418e3..e0074e936f 100644
--- a/npm/ng-packs/packages/core/src/lib/tests/initial-utils.spec.ts
+++ b/npm/ng-packs/packages/core/src/lib/tests/initial-utils.spec.ts
@@ -8,6 +8,7 @@ import { CORE_OPTIONS } from '../tokens/options.token';
import { checkAccessToken, getInitialData, localeInitializer } from '../utils';
import * as multiTenancyUtils from '../utils/multi-tenancy-utils';
import * as environmentUtils from '../utils/environment-utils';
+import { OAUTH_STRATEGY } from '../strategies/oauth.strategy';
@Component({
selector: 'abp-dummy',
@@ -32,18 +33,18 @@ describe('InitialUtils', () => {
const injector = spectator.inject(Injector);
const injectorSpy = jest.spyOn(injector, 'get');
const store = spectator.inject(Store);
- const oAuthService = spectator.inject(OAuthService);
const dispatchSpy = jest.spyOn(store, 'dispatch');
const parseTenantFromUrlSpy = jest.spyOn(multiTenancyUtils, 'parseTenantFromUrl');
const getRemoteEnvSpy = jest.spyOn(environmentUtils, 'getRemoteEnv');
+ const initOAuthSpy = jest.spyOn(OAUTH_STRATEGY, 'Init');
parseTenantFromUrlSpy.mockReturnValue(Promise.resolve());
getRemoteEnvSpy.mockReturnValue(Promise.resolve());
injectorSpy.mockReturnValueOnce(store);
injectorSpy.mockReturnValueOnce({ skipGetAppConfiguration: false });
- injectorSpy.mockReturnValueOnce(oAuthService);
injectorSpy.mockReturnValueOnce({ hasValidAccessToken: () => false });
dispatchSpy.mockReturnValue(of('test'));
+ initOAuthSpy.mockReturnValue(Promise.resolve());
expect(typeof getInitialData(injector)).toBe('function');
expect(await getInitialData(injector)()).toBe('test');
From f1240ef79a460c82aa4d8844515fedd703200f26 Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Tue, 11 Aug 2020 10:46:08 +0300
Subject: [PATCH 015/345] chore: remove CoreModule from identity-routing.module
& organize imports
---
.../packages/identity/src/lib/identity-routing.module.ts | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts
index f7d5463fcd..27986ae0d7 100644
--- a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts
+++ b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts
@@ -2,12 +2,11 @@ import {
AuthGuard,
DynamicLayoutComponent,
PermissionGuard,
- CoreModule,
- ReplaceableRouteContainerComponent,
ReplaceableComponents,
+ ReplaceableRouteContainerComponent,
} from '@abp/ng.core';
-import { NgModule, Type } from '@angular/core';
-import { RouterModule, Routes, Router, ActivatedRoute } from '@angular/router';
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
import { RolesComponent } from './components/roles/roles.component';
import { UsersComponent } from './components/users/users.component';
import { eIdentityComponents } from './enums/components';
@@ -46,7 +45,7 @@ const routes: Routes = [
];
@NgModule({
- imports: [RouterModule.forChild(routes), CoreModule],
+ imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
})
export class IdentityRoutingModule {}
From ad1107189e8e89c3c400d6741e06fde548d607dc Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Tue, 11 Aug 2020 11:06:37 +0300
Subject: [PATCH 016/345] chore: export the authentication guard
---
npm/ng-packs/packages/account/src/lib/guards/index.ts | 1 +
npm/ng-packs/packages/account/src/public-api.ts | 3 ++-
.../packages/core/src/lib/strategies/oauth.strategy.ts | 2 +-
3 files changed, 4 insertions(+), 2 deletions(-)
create mode 100644 npm/ng-packs/packages/account/src/lib/guards/index.ts
diff --git a/npm/ng-packs/packages/account/src/lib/guards/index.ts b/npm/ng-packs/packages/account/src/lib/guards/index.ts
new file mode 100644
index 0000000000..382170b2b1
--- /dev/null
+++ b/npm/ng-packs/packages/account/src/lib/guards/index.ts
@@ -0,0 +1 @@
+export * from './authentication-flow.guard';
diff --git a/npm/ng-packs/packages/account/src/public-api.ts b/npm/ng-packs/packages/account/src/public-api.ts
index 8d1ef3c43a..aebccb74cc 100644
--- a/npm/ng-packs/packages/account/src/public-api.ts
+++ b/npm/ng-packs/packages/account/src/public-api.ts
@@ -1,6 +1,7 @@
export * from './lib/account.module';
export * from './lib/components';
export * from './lib/enums';
-export * from './lib/tokens';
+export * from './lib/guards';
export * from './lib/models';
export * from './lib/services';
+export * from './lib/tokens';
diff --git a/npm/ng-packs/packages/core/src/lib/strategies/oauth.strategy.ts b/npm/ng-packs/packages/core/src/lib/strategies/oauth.strategy.ts
index b9f05d9021..b01de5e936 100644
--- a/npm/ng-packs/packages/core/src/lib/strategies/oauth.strategy.ts
+++ b/npm/ng-packs/packages/core/src/lib/strategies/oauth.strategy.ts
@@ -25,7 +25,7 @@ export abstract class OAuthStrategy {
this.oAuthConfig = injector.get(CORE_OPTIONS).environment.oAuthConfig;
}
- async init(): Promise {
+ async init(): Promise {
this.oAuthService.configure(this.oAuthConfig);
return this.oAuthService.loadDiscoveryDocument().catch(this.catchError);
}
From df8ad3bcbc97223c777e43e361a68a2019d45747 Mon Sep 17 00:00:00 2001
From: maliming <6908465+maliming@users.noreply.github.com>
Date: Tue, 11 Aug 2020 17:30:55 +0800
Subject: [PATCH 017/345] Update Volo.Abp.IdentityModel.csproj
---
.../src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj b/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj
index 1fb77b36d9..b96da9be3e 100644
--- a/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj
+++ b/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj
@@ -16,7 +16,7 @@
-
+
From 1f72c489a4ee408e88dac1142173045173b318b7 Mon Sep 17 00:00:00 2001
From: maliming <6908465+maliming@users.noreply.github.com>
Date: Tue, 11 Aug 2020 17:31:54 +0800
Subject: [PATCH 018/345] Update Volo.Abp.IdentityModel.csproj
---
.../src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj | 3 ---
1 file changed, 3 deletions(-)
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj b/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj
index 3cdc6f6c98..b96da9be3e 100644
--- a/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj
+++ b/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj
@@ -17,10 +17,7 @@
-<<<<<<< maliming/CachetheAccessToken
-=======
->>>>>>> dev
From ef3ffd8fe1bbf0d30e299998deb8dd4922bf9093 Mon Sep 17 00:00:00 2001
From: liangshiwei
Date: Tue, 11 Aug 2020 18:47:42 +0800
Subject: [PATCH 019/345] Add redis precondition to the document
---
docs/en/Startup-Templates/Module.md | 4 ++++
docs/zh-Hans/Startup-Templates/Module.md | 4 ++++
2 files changed, 8 insertions(+)
diff --git a/docs/en/Startup-Templates/Module.md b/docs/en/Startup-Templates/Module.md
index ea2fe5acca..2dc0896c65 100644
--- a/docs/en/Startup-Templates/Module.md
+++ b/docs/en/Startup-Templates/Module.md
@@ -149,6 +149,10 @@ The diagram below shows the relation of the applications:
`.Web.Host` project uses OpenId Connect Authentication to get identity and access tokens for the current user from the `.IdentityServer`. Then uses the access token to call the `.HttpApi.Host`. HTTP API server uses bearer token authentication to obtain claims from the access token to authorize the current user.
+##### Pre-requirements
+
+* [Redis](https://redis.io/): The applications use Redis as as distributed cache. So, you need to have Redis installed & running.
+
##### How to Run?
You should run the application with the given order:
diff --git a/docs/zh-Hans/Startup-Templates/Module.md b/docs/zh-Hans/Startup-Templates/Module.md
index 8341670af4..03f87a5c0c 100644
--- a/docs/zh-Hans/Startup-Templates/Module.md
+++ b/docs/zh-Hans/Startup-Templates/Module.md
@@ -149,6 +149,10 @@ abp new Acme.IssueManagement -t module --no-ui
`.Web.Host` 项目使用OpenId Connect身份认证从`.IdentityServer`获取当前用户的身份和访问令牌. 然后使用访问令牌调用 `.HttpApi.Host`. HTTP API 服务器使用bearer token验证访问令牌获取当前用户声明并授权用户.
+##### 前置条件
+
+* [Redis](https://redis.io/): 应用程序使用Redis做分布式缓存,你需要安装并运行Redis.
+
##### 如何运行?
你需要按照以下顺序运行应用程序:
From 85fc8ce9be75dccc447164843f41b902a24c051c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?=
Date: Tue, 11 Aug 2020 14:42:57 +0300
Subject: [PATCH 020/345] Update www home page texts.
---
.../Www/Localization/Resources/en.json | 32 +++++++++----------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
index 6a1d10ee51..fa7b216bd0 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
@@ -15,7 +15,7 @@
"Tutorial": "Tutorial",
"UsingCLI": "Using CLI",
"SeeDetails": "See Details",
- "AbpShortDescription": "ABP is a complete architecture and strong infrastructure to create modern web applications! Follows best practices and conventions to provide you a SOLID development experience.",
+ "AbpShortDescription": "ABP Framework is a complete infrastructure to create modern web applications by following the software development best practices and conventions.",
"SourceCodeUpper": "SOURCE CODE",
"LatestReleaseLogs": "Latest release logs",
"Infrastructure": "Infrastructure",
@@ -31,31 +31,31 @@
"MultiTenancy": "Multi-Tenancy",
"MultiTenancyExplanationShort": "SaaS applications made easy! Integrated multi-tenancy from database to UI.",
"CrossCuttingConcerns": "Cross Cutting Concerns",
- "CrossCuttingConcernsExplanationShort": "Complete infrastructure for authorization, validation, exception handling, caching, audit logging, transaction management and so on.",
+ "CrossCuttingConcernsExplanationShort": "Complete infrastructure for authorization, validation, exception handling, caching, audit logging, transaction management and more.",
"BuiltInBundlingMinification": "Built-In Bundling & Minification",
- "BuiltInBundlingMinificationExplanation": "Stop to use external tools for bundling & minification. ABP offers a simpler, dynamic, powerful, modular and built-in way!",
+ "BuiltInBundlingMinificationExplanation": "No need to use external tools for bundling & minification. ABP offers a simpler, dynamic, powerful, modular and built-in way!",
"VirtualFileSystem": "Virtual File System",
- "VirtualFileSystemExplanation": "Embed views, scripts, styles, images... into packages/libraries and reuse in different applications.",
+ "VirtualFileSystemExplanation": "Embed views, scripts, styles, images... into packages/libraries and reuse them in different applications.",
"Theming": "Theming",
- "ThemingExplanationShort": "Use and customize the bootstrap-based standard UI theme or create your own one.",
+ "ThemingExplanationShort": "Use and customize the bootstrap-based standard UI theme or create your own.",
"BootstrapTagHelpersDynamicForms": "Bootstrap Tag Helpers & Dynamic Forms",
- "BootstrapTagHelpersDynamicFormsExplanation": "Instead of manually writing the repeating details of bootstrap components, Use ABP's tag helpers to simplify it and take advantage of intellisense. Dynamic form can create the complete form from a C# class as the model.",
+ "BootstrapTagHelpersDynamicFormsExplanation": "Instead of manually writing the repeating details of bootstrap components, Use ABP's tag helpers to simplify it and take advantage of intellisense. Quickly build UI forms based on a C# model using the dynamic form tag helper.",
"HTTPAPIsDynamicProxies": "HTTP APIs & Dynamic Proxies",
- "HTTPAPIsDynamicProxiesExplanation": "Automatically expose application services as REST style HTTP APIs and consume with dynamic JavaScript & C# proxies.",
+ "HTTPAPIsDynamicProxiesExplanation": "Automatically expose application services as REST style HTTP APIs, and consume them with dynamic JavaScript and C# proxies.",
"CompleteArchitectureInfo": "Modern architecture to create maintainable software solutions.",
"DomainDrivenDesignBasedLayeringModelExplanation": "Helps you to implement a DDD based layered architecture and build a maintainable code base.",
"DomainDrivenDesignBasedLayeringModelExplanationCont": "Provides startup templates, abstractions, base classes, services, documentation and guides to help you to develop your application based on DDD patterns & principles.",
"MicroserviceCompatibleModelExplanation": "The core framework & pre-build modules are designed the microservice architecture in mind.",
"MicroserviceCompatibleModelExplanationCont": "Provides infrastructure, integrations, samples and documentation to implement microservice solutions easier, while it doesn\u2019t bring additional complexity if you want a monolithic application.",
- "ModularInfo": "ABP provides complete modularity system to allow you to develop reusable application modules.",
+ "ModularInfo": "ABP provides a module system that allows you to develop reusable application modules, tie into application lifecycle events, and express dependencies between core parts of your system.",
"PreBuiltModulesThemes": "Pre-Built Modules & Themes",
"PreBuiltModulesThemesExplanation": "Open source and commercial modules & themes are ready to use in your business application.",
"NuGetNPMPackages": "NuGet & NPM Packages",
"NuGetNPMPackagesExplanation": "Distributed as NuGet & NPM packages. Easy to install and upgrade.",
"ExtensibleReplaceable": "Extensible/Replaceable",
- "ExtensibleReplaceableExplanation": "All services & modules are designed extensibility in mind. You can replace services, pages, styles, components...",
- "CrossCuttingConcernsExplanation2": "Keep your code cleaner and focus on your own business code.",
- "CrossCuttingConcernsExplanation3": "Don\u2019t send time to implement common application requirements again and again.",
+ "ExtensibleReplaceableExplanation": "All services & modules are designed extensibility in mind. You can replace services, pages, styles and components.",
+ "CrossCuttingConcernsExplanation2": "Keep your codebase smaller so you can maintain focus on the code that’s specific to your business.",
+ "CrossCuttingConcernsExplanation3": "Don\u2019t send time implementing common application requirements on multiple projects.",
"AuthenticationAuthorization": "Authentication & Authorization",
"ExceptionHandling": "Exception Handling",
"Validation": "Validation",
@@ -76,14 +76,14 @@
"BaseClasses": "Base Classes",
"BaseClassesExplanation": "Pre-built base classes for common application patterns.",
"DeveloperFocusedExplanation": "ABP is for developers.",
- "DeveloperFocusedExplanationCont": "It aims to simplify your daily software development while not restricting you to work low level when you need it.",
+ "DeveloperFocusedExplanationCont": "It aims to simplify your daily software development while not restricting you from writing low level code.",
"SeeAllFeatures": "See All Features",
"CLI_CommandLineInterface": "CLI (Command Line Interface)",
- "CLI_CommandLineInterfaceExplanation": "CLI automates to create new projects and add modules to your application.",
+ "CLI_CommandLineInterfaceExplanation": "Includes a CLI to help you automate the creation of new projects and the addition of new modules.",
"StartupTemplates": "Startup Templates",
- "StartupTemplatesExplanation": "Various startup templates provide you fully configured solution to jump start your development.",
+ "StartupTemplatesExplanation": "Various startup templates provide a fully configured solution to jump start your development.",
"BasedOnFamiliarTools": "Based on Familiar Tools",
- "BasedOnFamiliarToolsExplanation": "Built on and integrated to popular tools you already know. Low learning curve, easy adaptation, comfortable development.",
+ "BasedOnFamiliarToolsExplanation": "Built on and integrated with popular tools you already know. Low learning curve, easy adaptation, comfortable development.",
"ORMIndependent": "ORM Independent",
"ORMIndependentExplanation": "The core framework is ORM/database independent and can work with any data source. Entity Framework Core and MongoDB providers are already available.",
"Features": "Explore the ABP Framework Features",
@@ -158,4 +158,4 @@
"Mobile": "Mobile",
"ReactNative": "React Native"
}
-}
\ No newline at end of file
+}
From ed1c200bf4ef0c8ae3b16a9694a507313fa98852 Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Tue, 11 Aug 2020 15:09:41 +0300
Subject: [PATCH 021/345] refactor: rename oauth strategty and improve it
---
.../dev-app/src/app/home/home.component.ts | 8 +--
.../lib/guards/authentication-flow.guard.ts | 11 ++--
.../core/src/lib/services/auth.service.ts | 59 +++++++++++++----
...auth.strategy.ts => auth-flow.strategy.ts} | 65 +++++++++----------
.../packages/core/src/lib/strategies/index.ts | 2 +-
.../core/src/lib/utils/initial-utils.ts | 4 +-
npm/ng-packs/yarn.lock | 12 ----
.../angular/src/app/home/home.component.ts | 8 +--
8 files changed, 96 insertions(+), 73 deletions(-)
rename npm/ng-packs/packages/core/src/lib/strategies/{oauth.strategy.ts => auth-flow.strategy.ts} (62%)
diff --git a/npm/ng-packs/apps/dev-app/src/app/home/home.component.ts b/npm/ng-packs/apps/dev-app/src/app/home/home.component.ts
index 720034d928..3790f8fe3f 100644
--- a/npm/ng-packs/apps/dev-app/src/app/home/home.component.ts
+++ b/npm/ng-packs/apps/dev-app/src/app/home/home.component.ts
@@ -1,5 +1,5 @@
-import { OAUTH_STRATEGY } from '@abp/ng.core';
-import { Component, Injector } from '@angular/core';
+import { AuthService } from '@abp/ng.core';
+import { Component } from '@angular/core';
import { OAuthService } from 'angular-oauth2-oidc';
@Component({
@@ -11,9 +11,9 @@ export class HomeComponent {
return this.oAuthService.hasValidAccessToken();
}
- constructor(private oAuthService: OAuthService, private injector: Injector) {}
+ constructor(private oAuthService: OAuthService, private authService: AuthService) {}
login() {
- OAUTH_STRATEGY.NavigateToLogin(this.injector);
+ this.authService.initLogin();
}
}
diff --git a/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts b/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts
index f892916582..7cb719628e 100644
--- a/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts
+++ b/npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts
@@ -1,12 +1,15 @@
-import { Injectable, Injector } from '@angular/core';
+import { AuthService } from '@abp/ng.core';
+import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
-import { OAUTH_STRATEGY } from '@abp/ng.core';
@Injectable()
export class AuthenticationFlowGuard implements CanActivate {
- constructor(private injector: Injector) {}
+ constructor(private authService: AuthService) {}
canActivate() {
- return OAUTH_STRATEGY.CanActivate(this.injector);
+ if (this.authService.isInternalAuth) return true;
+
+ this.authService.initLogin();
+ return false;
}
}
diff --git a/npm/ng-packs/packages/core/src/lib/services/auth.service.ts b/npm/ng-packs/packages/core/src/lib/services/auth.service.ts
index 3d4bdb9a0a..6502bc3a61 100644
--- a/npm/ng-packs/packages/core/src/lib/services/auth.service.ts
+++ b/npm/ng-packs/packages/core/src/lib/services/auth.service.ts
@@ -1,28 +1,62 @@
import { HttpHeaders } from '@angular/common/http';
import { Inject, Injectable, Injector, Optional } from '@angular/core';
import { Navigate } from '@ngxs/router-plugin';
-import { Store } from '@ngxs/store';
+import { Store, Actions, ofActionSuccessful } from '@ngxs/store';
import { OAuthService } from 'angular-oauth2-oidc';
import { from, Observable } from 'rxjs';
import { switchMap, take, tap } from 'rxjs/operators';
import snq from 'snq';
-import { GetAppConfiguration } from '../actions/config.actions';
+import { GetAppConfiguration, SetEnvironment } from '../actions/config.actions';
import { ConfigState } from '../states/config.state';
import { SessionState } from '../states/session.state';
-import { OAUTH_STRATEGY } from '../strategies/oauth.strategy';
import { RestService } from './rest.service';
+import {
+ AuthCodeFlowStrategy,
+ AuthPasswordFlowStrategy,
+ AUTH_FLOW_STRATEGY,
+} from '../strategies/auth-flow.strategy';
@Injectable({
providedIn: 'root',
})
export class AuthService {
+ private flow: string;
+ private strategy: AuthCodeFlowStrategy | AuthPasswordFlowStrategy;
+
+ get isInternalAuth() {
+ return this.strategy.isInternalAuth;
+ }
+
constructor(
+ private actions: Actions,
private injector: Injector,
private rest: RestService,
private oAuthService: OAuthService,
private store: Store,
@Optional() @Inject('ACCOUNT_OPTIONS') private options: any,
- ) {}
+ ) {
+ this.setStrategy();
+ this.listenToSetEnvironment();
+ }
+
+ private setStrategy = () => {
+ const flow =
+ this.store.selectSnapshot(ConfigState.getDeep('environment.oAuthConfig.responseType')) ||
+ 'password';
+ if (this.flow === flow) return;
+
+ if (this.strategy) this.strategy.destroy();
+
+ this.flow = flow;
+ this.strategy =
+ this.flow === 'code'
+ ? AUTH_FLOW_STRATEGY.Code(this.injector)
+ : AUTH_FLOW_STRATEGY.Password(this.injector);
+ };
+
+ private listenToSetEnvironment() {
+ this.actions.pipe(ofActionSuccessful(SetEnvironment)).subscribe(this.setStrategy);
+ }
login(username: string, password: string): Observable {
const tenant = this.store.selectSnapshot(SessionState.getTenant);
@@ -47,16 +81,15 @@ export class AuthService {
);
}
- /**
- * @deprecated use LogOut prop of OAUTH_STRATEGY instead, will be deleted in v3.3
- */
+ async init() {
+ return await this.strategy.init();
+ }
+
logout(): Observable {
- if (!this.store.selectSnapshot(ConfigState.getDeep('environment.production'))) {
- console.warn(
- 'The logout method of AuthService is depracated. Use LogOut prop of OAUTH_STRATEGY instead.',
- );
- }
+ return this.strategy.logout();
+ }
- return OAUTH_STRATEGY.LogOut(this.injector);
+ initLogin() {
+ this.strategy.login();
}
}
diff --git a/npm/ng-packs/packages/core/src/lib/strategies/oauth.strategy.ts b/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts
similarity index 62%
rename from npm/ng-packs/packages/core/src/lib/strategies/oauth.strategy.ts
rename to npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts
index b01de5e936..cf8f9c039a 100644
--- a/npm/ng-packs/packages/core/src/lib/strategies/oauth.strategy.ts
+++ b/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts
@@ -1,6 +1,6 @@
import { Injector } from '@angular/core';
import { Store } from '@ngxs/store';
-import { AuthConfig, OAuthService, OAuthSuccessEvent } from 'angular-oauth2-oidc';
+import { AuthConfig, OAuthService } from 'angular-oauth2-oidc';
import { ConfigState } from '../states/config.state';
import { CORE_OPTIONS } from '../tokens/options.token';
import { Router } from '@angular/router';
@@ -9,12 +9,18 @@ import { RestService } from '../services/rest.service';
import { switchMap } from 'rxjs/operators';
import { GetAppConfiguration } from '../actions/config.actions';
-export abstract class OAuthStrategy {
+export abstract class AuthFlowStrategy {
+ protected abstract _isInternalAuth: boolean;
+ get isInternalAuth(): boolean {
+ return this._isInternalAuth;
+ }
+
protected oAuthService: OAuthService;
protected oAuthConfig: AuthConfig;
- abstract navigateToLogin(): void;
- abstract canActivate(): boolean;
- abstract logOut(): Observable;
+ abstract checkIfInternalAuth(): boolean;
+ abstract login(): void;
+ abstract logout(): Observable;
+ abstract destroy(): void;
private catchError = err => {
// TODO: handle the error
@@ -31,7 +37,9 @@ export abstract class OAuthStrategy {
}
}
-export class OAuthCodeFlowStrategy extends OAuthStrategy {
+export class AuthCodeFlowStrategy extends AuthFlowStrategy {
+ protected _isInternalAuth = false;
+
async init() {
return super
.init()
@@ -39,32 +47,36 @@ export class OAuthCodeFlowStrategy extends OAuthStrategy {
.then(() => this.oAuthService.setupAutomaticSilentRefresh());
}
- navigateToLogin() {
+ login() {
this.oAuthService.initCodeFlow();
}
- canActivate() {
+ checkIfInternalAuth() {
this.oAuthService.initCodeFlow();
return false;
}
- logOut() {
+ logout() {
this.oAuthService.logOut();
return of(null);
}
+
+ destroy() {}
}
-export class OAuthPasswordFlowStrategy extends OAuthStrategy {
- navigateToLogin() {
+export class AuthPasswordFlowStrategy extends AuthFlowStrategy {
+ protected _isInternalAuth = true;
+
+ login() {
const router = this.injector.get(Router);
router.navigateByUrl('/account/login');
}
- canActivate() {
+ checkIfInternalAuth() {
return true;
}
- logOut() {
+ logout() {
const store = this.injector.get(Store);
const rest = this.injector.get(RestService);
@@ -85,28 +97,15 @@ export class OAuthPasswordFlowStrategy extends OAuthStrategy {
}),
);
}
+
+ destroy() {}
}
-export const OAUTH_STRATEGY = {
- async Init(injector: Injector) {
- return getOAuthStrategy(injector).init();
+export const AUTH_FLOW_STRATEGY = {
+ Code(injector: Injector) {
+ return new AuthCodeFlowStrategy(injector);
},
- NavigateToLogin(injector: Injector) {
- return getOAuthStrategy(injector).navigateToLogin();
- },
- CanActivate(injector: Injector) {
- return getOAuthStrategy(injector).canActivate();
- },
- LogOut(injector: Injector) {
- return getOAuthStrategy(injector).logOut();
+ Password(injector: Injector) {
+ return new AuthPasswordFlowStrategy(injector);
},
};
-
-function getOAuthStrategy(injector: Injector) {
- const codeFlow =
- injector
- .get(Store)
- .selectSnapshot(ConfigState.getDeep('environment.oAuthConfig.responseType')) === 'code';
-
- return codeFlow ? new OAuthCodeFlowStrategy(injector) : new OAuthPasswordFlowStrategy(injector);
-}
diff --git a/npm/ng-packs/packages/core/src/lib/strategies/index.ts b/npm/ng-packs/packages/core/src/lib/strategies/index.ts
index d2a56ad2a6..d71f952307 100644
--- a/npm/ng-packs/packages/core/src/lib/strategies/index.ts
+++ b/npm/ng-packs/packages/core/src/lib/strategies/index.ts
@@ -1,3 +1,4 @@
+export * from './auth-flow.strategy';
export * from './container.strategy';
export * from './content-security.strategy';
export * from './content.strategy';
@@ -5,5 +6,4 @@ export * from './context.strategy';
export * from './cross-origin.strategy';
export * from './dom.strategy';
export * from './loading.strategy';
-export * from './oauth.strategy';
export * from './projection.strategy';
diff --git a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts
index 17d39ed2c0..73e986493c 100644
--- a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts
+++ b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts
@@ -9,7 +9,7 @@ import { ConfigState } from '../states/config.state';
import { CORE_OPTIONS } from '../tokens/options.token';
import { getRemoteEnv } from './environment-utils';
import { parseTenantFromUrl } from './multi-tenancy-utils';
-import { OAUTH_STRATEGY } from '../strategies/oauth.strategy';
+import { AuthService } from '../services/auth.service';
export function getInitialData(injector: Injector) {
const fn = async () => {
@@ -18,7 +18,7 @@ export function getInitialData(injector: Injector) {
await getRemoteEnv(injector, options.environment);
await parseTenantFromUrl(injector);
- await OAUTH_STRATEGY.Init(injector);
+ await injector.get(AuthService).init();
if (options.skipGetAppConfiguration) return;
diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock
index 850b85c248..612ce7011d 100644
--- a/npm/ng-packs/yarn.lock
+++ b/npm/ng-packs/yarn.lock
@@ -3120,13 +3120,6 @@ alphanum-sort@^1.0.0:
resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
-angular-oauth2-oidc-jwks@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/angular-oauth2-oidc-jwks/-/angular-oauth2-oidc-jwks-9.0.0.tgz#f11e4e561ff423928ab63ca2cca84703a00ff85d"
- integrity sha512-3hTJc7vEI/ka/nnliMcCQuDnszzL3AhGInBBbn96BO+ZOdvP/4PbEumUsDto2WRpPMPxD6HAmExwYeQWljcc5A==
- dependencies:
- jsrsasign "^8.0.12"
-
angular-oauth2-oidc@^10.0.3:
version "10.0.3"
resolved "https://registry.yarnpkg.com/angular-oauth2-oidc/-/angular-oauth2-oidc-10.0.3.tgz#612ef75c2e07b56592d2506f9618ee6a61857ad9"
@@ -8463,11 +8456,6 @@ jsprim@^1.2.2:
json-schema "0.2.3"
verror "1.10.0"
-jsrsasign@^8.0.12:
- version "8.0.23"
- resolved "https://registry.yarnpkg.com/jsrsasign/-/jsrsasign-8.0.23.tgz#4427ed0bbbd809d65b8e5ac9d48ba5383b49ee0c"
- integrity sha512-COwd/XmwaxBwf/6E3FO21DGK504KdjfNMYv6hVd2q6W6lzTeaL2UKQ0cIBw6SFMBCdaQl8fGUm4dHFt7Wmo9xw==
-
jszip@^3.1.3:
version "3.5.0"
resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.5.0.tgz#b4fd1f368245346658e781fec9675802489e15f6"
diff --git a/templates/app/angular/src/app/home/home.component.ts b/templates/app/angular/src/app/home/home.component.ts
index 720034d928..3790f8fe3f 100644
--- a/templates/app/angular/src/app/home/home.component.ts
+++ b/templates/app/angular/src/app/home/home.component.ts
@@ -1,5 +1,5 @@
-import { OAUTH_STRATEGY } from '@abp/ng.core';
-import { Component, Injector } from '@angular/core';
+import { AuthService } from '@abp/ng.core';
+import { Component } from '@angular/core';
import { OAuthService } from 'angular-oauth2-oidc';
@Component({
@@ -11,9 +11,9 @@ export class HomeComponent {
return this.oAuthService.hasValidAccessToken();
}
- constructor(private oAuthService: OAuthService, private injector: Injector) {}
+ constructor(private oAuthService: OAuthService, private authService: AuthService) {}
login() {
- OAUTH_STRATEGY.NavigateToLogin(this.injector);
+ this.authService.initLogin();
}
}
From ede9dc9b8cfcc3c3604068e2fb72b9e58f6dc42a Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Tue, 11 Aug 2020 15:13:56 +0300
Subject: [PATCH 022/345] test: fix testing error
---
.../packages/core/src/lib/tests/initial-utils.spec.ts | 6 ++----
npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts | 2 +-
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/npm/ng-packs/packages/core/src/lib/tests/initial-utils.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/initial-utils.spec.ts
index e0074e936f..07dfc84d67 100644
--- a/npm/ng-packs/packages/core/src/lib/tests/initial-utils.spec.ts
+++ b/npm/ng-packs/packages/core/src/lib/tests/initial-utils.spec.ts
@@ -6,9 +6,8 @@ import { of } from 'rxjs';
import { GetAppConfiguration } from '../actions';
import { CORE_OPTIONS } from '../tokens/options.token';
import { checkAccessToken, getInitialData, localeInitializer } from '../utils';
-import * as multiTenancyUtils from '../utils/multi-tenancy-utils';
import * as environmentUtils from '../utils/environment-utils';
-import { OAUTH_STRATEGY } from '../strategies/oauth.strategy';
+import * as multiTenancyUtils from '../utils/multi-tenancy-utils';
@Component({
selector: 'abp-dummy',
@@ -36,15 +35,14 @@ describe('InitialUtils', () => {
const dispatchSpy = jest.spyOn(store, 'dispatch');
const parseTenantFromUrlSpy = jest.spyOn(multiTenancyUtils, 'parseTenantFromUrl');
const getRemoteEnvSpy = jest.spyOn(environmentUtils, 'getRemoteEnv');
- const initOAuthSpy = jest.spyOn(OAUTH_STRATEGY, 'Init');
parseTenantFromUrlSpy.mockReturnValue(Promise.resolve());
getRemoteEnvSpy.mockReturnValue(Promise.resolve());
injectorSpy.mockReturnValueOnce(store);
injectorSpy.mockReturnValueOnce({ skipGetAppConfiguration: false });
+ injectorSpy.mockReturnValueOnce({ init: () => null });
injectorSpy.mockReturnValueOnce({ hasValidAccessToken: () => false });
dispatchSpy.mockReturnValue(of('test'));
- initOAuthSpy.mockReturnValue(Promise.resolve());
expect(typeof getInitialData(injector)).toBe('function');
expect(await getInitialData(injector)()).toBe('test');
diff --git a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts
index 73e986493c..36e2c22bca 100644
--- a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts
+++ b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts
@@ -5,11 +5,11 @@ import { OAuthService } from 'angular-oauth2-oidc';
import { tap } from 'rxjs/operators';
import { GetAppConfiguration } from '../actions/config.actions';
import { ABP } from '../models/common';
+import { AuthService } from '../services/auth.service';
import { ConfigState } from '../states/config.state';
import { CORE_OPTIONS } from '../tokens/options.token';
import { getRemoteEnv } from './environment-utils';
import { parseTenantFromUrl } from './multi-tenancy-utils';
-import { AuthService } from '../services/auth.service';
export function getInitialData(injector: Injector) {
const fn = async () => {
From da1c0ad7938394f416efd353a6274e2a91c4e27e Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Tue, 11 Aug 2020 15:23:20 +0300
Subject: [PATCH 023/345] refactor: improve code quality
---
.../packages/core/src/lib/services/auth.service.ts | 10 +++-------
.../core/src/lib/strategies/auth-flow.strategy.ts | 9 +++------
2 files changed, 6 insertions(+), 13 deletions(-)
diff --git a/npm/ng-packs/packages/core/src/lib/services/auth.service.ts b/npm/ng-packs/packages/core/src/lib/services/auth.service.ts
index 6502bc3a61..6b86b580df 100644
--- a/npm/ng-packs/packages/core/src/lib/services/auth.service.ts
+++ b/npm/ng-packs/packages/core/src/lib/services/auth.service.ts
@@ -1,7 +1,7 @@
import { HttpHeaders } from '@angular/common/http';
import { Inject, Injectable, Injector, Optional } from '@angular/core';
import { Navigate } from '@ngxs/router-plugin';
-import { Store, Actions, ofActionSuccessful } from '@ngxs/store';
+import { Actions, ofActionSuccessful, Store } from '@ngxs/store';
import { OAuthService } from 'angular-oauth2-oidc';
import { from, Observable } from 'rxjs';
import { switchMap, take, tap } from 'rxjs/operators';
@@ -9,19 +9,15 @@ import snq from 'snq';
import { GetAppConfiguration, SetEnvironment } from '../actions/config.actions';
import { ConfigState } from '../states/config.state';
import { SessionState } from '../states/session.state';
+import { AuthFlowStrategy, AUTH_FLOW_STRATEGY } from '../strategies/auth-flow.strategy';
import { RestService } from './rest.service';
-import {
- AuthCodeFlowStrategy,
- AuthPasswordFlowStrategy,
- AUTH_FLOW_STRATEGY,
-} from '../strategies/auth-flow.strategy';
@Injectable({
providedIn: 'root',
})
export class AuthService {
private flow: string;
- private strategy: AuthCodeFlowStrategy | AuthPasswordFlowStrategy;
+ private strategy: AuthFlowStrategy;
get isInternalAuth() {
return this.strategy.isInternalAuth;
diff --git a/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts b/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts
index cf8f9c039a..b7aa5601e2 100644
--- a/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts
+++ b/npm/ng-packs/packages/core/src/lib/strategies/auth-flow.strategy.ts
@@ -10,10 +10,7 @@ import { switchMap } from 'rxjs/operators';
import { GetAppConfiguration } from '../actions/config.actions';
export abstract class AuthFlowStrategy {
- protected abstract _isInternalAuth: boolean;
- get isInternalAuth(): boolean {
- return this._isInternalAuth;
- }
+ abstract readonly isInternalAuth: boolean;
protected oAuthService: OAuthService;
protected oAuthConfig: AuthConfig;
@@ -38,7 +35,7 @@ export abstract class AuthFlowStrategy {
}
export class AuthCodeFlowStrategy extends AuthFlowStrategy {
- protected _isInternalAuth = false;
+ readonly isInternalAuth = false;
async init() {
return super
@@ -65,7 +62,7 @@ export class AuthCodeFlowStrategy extends AuthFlowStrategy {
}
export class AuthPasswordFlowStrategy extends AuthFlowStrategy {
- protected _isInternalAuth = true;
+ readonly isInternalAuth = true;
login() {
const router = this.injector.get(Router);
From dec9694549e5d3e71282cc131a5770ba4bc7485e Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Tue, 11 Aug 2020 15:35:02 +0300
Subject: [PATCH 024/345] fix: remove a constant that is not found
---
npm/ng-packs/package.json | 2 +-
.../lib/components/nav-items/current-user.component.ts | 8 ++++----
npm/ng-packs/packages/theme-shared/package.json | 2 +-
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json
index 658c2dac67..0951ad2d1c 100644
--- a/npm/ng-packs/package.json
+++ b/npm/ng-packs/package.json
@@ -51,7 +51,7 @@
"@fortawesome/fontawesome-free": "^5.13.0",
"@ng-bootstrap/ng-bootstrap": "^6.1.0",
"@ngneat/spectator": "^5.11.0",
- "@ngx-validate/core": "^0.0.10",
+ "@ngx-validate/core": "^0.0.11",
"@ngxs/devtools-plugin": "^3.6.2",
"@ngxs/logger-plugin": "^3.6.2",
"@ngxs/router-plugin": "^3.6.2",
diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts
index 6969de8ced..6f362b0ee8 100644
--- a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts
+++ b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/current-user.component.ts
@@ -1,5 +1,5 @@
-import { ApplicationConfiguration, OAUTH_STRATEGY, ConfigState } from '@abp/ng.core';
-import { Component, OnInit, Injector } from '@angular/core';
+import { ApplicationConfiguration, ConfigState, AuthService } from '@abp/ng.core';
+import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { Select } from '@ngxs/store';
import { Observable } from 'rxjs';
@@ -55,12 +55,12 @@ export class CurrentUserComponent implements OnInit {
return window.innerWidth < 992;
}
- constructor(private injector: Injector, private router: Router) {}
+ constructor(private authService: AuthService, private router: Router) {}
ngOnInit() {}
logout() {
- OAUTH_STRATEGY.LogOut(this.injector).subscribe(() => {
+ this.authService.logout().subscribe(() => {
this.router.navigate(['/'], { state: { redirectUrl: this.router.url } });
});
}
diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json
index 1558f1c824..ee2b5d7ffa 100644
--- a/npm/ng-packs/packages/theme-shared/package.json
+++ b/npm/ng-packs/packages/theme-shared/package.json
@@ -10,7 +10,7 @@
"@abp/ng.core": "~3.0.5",
"@fortawesome/fontawesome-free": "^5.13.1",
"@ng-bootstrap/ng-bootstrap": "^6.1.0",
- "@ngx-validate/core": "^0.0.10",
+ "@ngx-validate/core": "^0.0.11",
"@swimlane/ngx-datatable": "^17.0.0",
"bootstrap": "^4.5.0",
"chart.js": "^2.9.3",
From fd9400826b6cf0687477b5c64b92e14d925cf9c6 Mon Sep 17 00:00:00 2001
From: mehmet-erim
Date: Tue, 11 Aug 2020 15:57:39 +0300
Subject: [PATCH 025/345] chore: update yarn.lock
---
npm/ng-packs/yarn.lock | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock
index 612ce7011d..e9caca6fac 100644
--- a/npm/ng-packs/yarn.lock
+++ b/npm/ng-packs/yarn.lock
@@ -2336,6 +2336,13 @@
dependencies:
tslib "^1.9.0"
+"@ngx-validate/core@^0.0.11":
+ version "0.0.11"
+ resolved "https://registry.yarnpkg.com/@ngx-validate/core/-/core-0.0.11.tgz#bec771546a09f2a5f44305fcdd1186851b4df152"
+ integrity sha512-eUoARAyyLE3Gd+PjDSWypJIPDqudPNInaaZdpPWhqAseecRtejLGD33f211Se3E0IZpnLhQAAOnM9hFfpNpr9w==
+ dependencies:
+ tslib "^1.9.0"
+
"@ngxs/devtools-plugin@^3.6.2":
version "3.6.2"
resolved "https://registry.yarnpkg.com/@ngxs/devtools-plugin/-/devtools-plugin-3.6.2.tgz#aa0a4835f90fb905951d7712dc3ce508cbc15a2c"
From bd442b815f47a25293a0f0616cd4d74bda15c004 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?=
Date: Tue, 11 Aug 2020 22:07:05 +0300
Subject: [PATCH 026/345] Update sample links
---
docs/en/Samples/Index.md | 33 +++++++++++++++++----------------
1 file changed, 17 insertions(+), 16 deletions(-)
diff --git a/docs/en/Samples/Index.md b/docs/en/Samples/Index.md
index e715d3d1ca..dc9ffa9104 100644
--- a/docs/en/Samples/Index.md
+++ b/docs/en/Samples/Index.md
@@ -15,15 +15,11 @@ A complete solution to demonstrate how to build systems based on the microservic
A simple CRUD application to show basic principles of developing an application with the ABP Framework. The same sample was implemented with different technologies:
* **Book Store: Razor Pages UI & Entity Framework Core**
-
- * [Tutorial](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=MVC)
- * [Source code](https://github.com/abpframework/abp-samples/tree/master/BookStore)
-
+ * [Tutorial](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=MVC&DB=EF)
+ * [Source code](https://github.com/abpframework/abp-samples/tree/master/BookStore-Mvc-EfCore)
* **Book Store: Angular UI & MongoDB**
-
- * [Tutorial](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=NG)
+ * [Tutorial](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=NG&DB=Mongo)
* [Source code](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb)
-
* **Book Store: Modular application (Razor Pages UI & EF Core)**
* [Source code](https://github.com/abpframework/abp-samples/tree/master/BookStore-Modular)
@@ -33,11 +29,14 @@ While there is no Razor Pages & MongoDB combination, you can check both document
### Other Samples
* **Entity Framework Migrations**: A solution to demonstrate how to split your application into multiple databases each database contains different modules.
- * [Source code](https://github.com/abpframework/abp-samples/tree/master/DashboardDemo)
+ * [Source code](https://github.com/abpframework/abp-samples/tree/master/EfCoreMigrationDemo)
* [EF Core database migrations document](../Entity-Framework-Core-Migrations.md)
* **SignalR Demo**: A simple chat application that allows to send and receive messages among authenticated users.
* [Source code](https://github.com/abpframework/abp-samples/tree/master/SignalRDemo)
* [SignalR Integration document](../SignalR-Integration.md)
+* **Real Time Messaging In A Distributed Architecture** (using SingalR & RabbitMQ)
+ * [Source code](https://github.com/abpframework/abp-samples/tree/master/SignalRTieredDemo)
+ * [Article](https://community.abp.io/articles/real-time-messaging-in-a-distributed-architecture-using-abp-framework-singalr-rabbitmq-daf47e17)
* **Dashboard Demo**: A simple application to show how to use the widget system for the ASP.NET Core MVC UI.
* [Source code](https://github.com/abpframework/abp-samples/tree/master/DashboardDemo)
* [Widget documentation](../UI/AspNetCore/Widgets.md)
@@ -50,15 +49,17 @@ While there is no Razor Pages & MongoDB combination, you can check both document
* [Text templating documentation](../Text-Templating.md)
* **Stored Procedure Demo**: Demonstrates how to use stored procedures, database views and functions with best practices.
* [Source code](https://github.com/abpframework/abp-samples/tree/master/StoredProcedureDemo)
+* **Passwordless Authentication**: Shows how to add a custom token provider to authenticate a user with a link, instead of entering a password.
+ * [Source code](https://github.com/abpframework/abp-samples/tree/master/PasswordlessAuthentication)
+ * [Article](https://community.abp.io/articles/implementing-passwordless-authentication-with-asp.net-core-identity-c25l8koj)
* **Authentication Customization**: A solution to show how to customize the authentication for ASP.NET Core MVC / Razor Pages applications.
* [Source code](https://github.com/abpframework/abp-samples/tree/master/aspnet-core/Authentication-Customization)
- * Related "[How To](../How-To/Index.md)" documents:
- * [Azure Active Directory Authentication](../How-To/Azure-Active-Directory-Authentication-MVC.md)
- * [Customize the Login Page](../How-To/Customize-Login-Page-MVC.md)
- * [Customize the SignIn Manager](../How-To/Customize-SignIn-Manager.md)
+ * Related articles:
+ * [Azure Active Directory Authentication](https://community.abp.io/articles/how-to-use-the-azure-active-directory-authentication-for-mvc-razor-page-applications-4603b9cf)
+ * [Customize the Login Page](https://community.abp.io/articles/how-to-customize-the-login-page-for-mvc-razor-page-applications-9a40f3cd)
+ * [Customize the SignIn Manager](https://community.abp.io/articles/how-to-customize-the-signin-manager-3e858753)
+* **GRPC Demo**: Shows how to add a gRPC service to an ABP Framework based web application and consume it from a console application.
+ * [Source code](https://github.com/abpframework/abp-samples/tree/master/GrpcDemo)
* **Empty ASP.NET Core Application**: The most basic ASP.NET Core application with the ABP Framework installed.
* [Source code](https://github.com/abpframework/abp-samples/tree/master/BasicAspNetCoreApplication)
- * [Documentation](../Getting-Started-AspNetCore-Application.md)
-* **Empty Console Application**: The most basic console application with the ABP Framework installed.
- * [Source code](https://github.com/abpframework/abp-samples/tree/master/BasicConsoleApplication)
- * [Documentation](../Getting-Started-Console-Application.md)
\ No newline at end of file
+ * [Documentation](../Getting-Started-AspNetCore-Application.md)
\ No newline at end of file
From 2871c28d7022a682e6677f3191d04cc62f2c6bd2 Mon Sep 17 00:00:00 2001
From: Paul Williams <43178452+paulfwilliams@users.noreply.github.com>
Date: Tue, 11 Aug 2020 16:38:25 -0500
Subject: [PATCH 027/345] correct spelling of Principle to Principal
A "principle" is a guiding idea. The correct usage here is principal as in a chief actor or leader. (See also the ClaimsPrincipal class https://docs.microsoft.com/en-us/dotnet/api/system.security.claims.claimsprincipal?view=netcore-3.1.)
---
docs/en/CurrentUser.md | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/docs/en/CurrentUser.md b/docs/en/CurrentUser.md
index e4aca40811..5a400dc098 100644
--- a/docs/en/CurrentUser.md
+++ b/docs/en/CurrentUser.md
@@ -1,4 +1,4 @@
-# Current User
+# Current User
It is very common to retrieve the information about the logged in user in a web application. The current user is the active user related to the current request in a web application.
@@ -86,7 +86,7 @@ Beside these standard methods, there are some extension methods:
## ICurrentPrincipalAccessor
-`ICurrentPrincipalAccessor` is the service that should be used (by the ABP Framework and your application code) whenever the current principle of the current user is needed.
+`ICurrentPrincipalAccessor` is the service that should be used (by the ABP Framework and your application code) whenever the current principal of the current user is needed.
For a web application, it gets the `User` property of the current `HttpContext`. For a non-web application, it returns the `Thread.CurrentPrincipal`.
@@ -114,9 +114,9 @@ public class MyService : ITransientDependency
}
````
-### Changing the Current Principle
+### Changing the Current Principal
-Current principle is not something you want to set or change, except at some advanced scenarios. If you need it, use the `Change` method of the `ICurrentPrincipalAccessor`. It takes a `ClaimsPrinciple` object and makes it "current" for a scope.
+Current principal is not something you want to set or change, except at some advanced scenarios. If you need it, use the `Change` method of the `ICurrentPrincipalAccessor`. It takes a `ClaimsPrincipal` object and makes it "current" for a scope.
Example:
@@ -132,7 +132,7 @@ public class MyAppService : ApplicationService
public void Foo()
{
- var newPrinciple = new ClaimsPrincipal(
+ var newPrincipal = new ClaimsPrincipal(
new ClaimsIdentity(
new Claim[]
{
@@ -143,7 +143,7 @@ public class MyAppService : ApplicationService
)
);
- using (_currentPrincipalAccessor.Change(newPrinciple))
+ using (_currentPrincipalAccessor.Change(newPrincipal))
{
var userName = CurrentUser.UserName; //returns "john"
//...
From b53df4c4ffe61d5756eb9dd094d02421c9a68e0b Mon Sep 17 00:00:00 2001
From: liangshiwei
Date: Wed, 12 Aug 2020 09:13:32 +0800
Subject: [PATCH 028/345] Update CurrentUser.md
---
docs/zh-Hans/CurrentUser.md | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/docs/zh-Hans/CurrentUser.md b/docs/zh-Hans/CurrentUser.md
index 49ebaaaba0..8d930b0911 100644
--- a/docs/zh-Hans/CurrentUser.md
+++ b/docs/zh-Hans/CurrentUser.md
@@ -86,7 +86,7 @@ namespace AbpDemo
## ICurrentPrincipalAccessor
-`ICurrentPrincipalAccessor` 是当需要当前用户的principle时使用的服务(由ABP框架和你的应用程序代码使用).
+`ICurrentPrincipalAccessor` 是当需要当前用户的Principal时使用的服务(由ABP框架和你的应用程序代码使用).
对于Web应用程序, 它获取当前 `HttpContext` 的 `User` 属性,对于非Web应用程序它将返回 `Thread.CurrentPrincipal`.
@@ -114,9 +114,9 @@ public class MyService : ITransientDependency
}
````
-### 更改当前Principle
+### 更改当前Principal
-除了某些高级场景外,你不需要设置或更改当前principle. 如果需要可以使用 `ICurrentPrincipalAccessor` 的 `Change` 方法. 它接受一个 `ClaimsPrinciple` 对象并使其成为作用域的"当前"对象.
+除了某些高级场景外,你不需要设置或更改当前Principal. 如果需要可以使用 `ICurrentPrincipalAccessor` 的 `Change` 方法. 它接受一个 `ClaimsPrincipal` 对象并使其成为作用域的"当前"对象.
示例:
@@ -132,7 +132,7 @@ public class MyAppService : ApplicationService
public void Foo()
{
- var newPrinciple = new ClaimsPrincipal(
+ var newPrincipal = new ClaimsPrincipal(
new ClaimsIdentity(
new Claim[]
{
@@ -143,7 +143,7 @@ public class MyAppService : ApplicationService
)
);
- using (_currentPrincipalAccessor.Change(newPrinciple))
+ using (_currentPrincipalAccessor.Change(newPrincipal))
{
var userName = CurrentUser.UserName; //returns "john"
//...
@@ -164,4 +164,4 @@ public class MyAppService : ApplicationService
* 其他属性,如 `EmailVerified`, `PhoneNumber`, `TenantId` ...是由ABP框架通过尽可能遵循标准名称来定义的.
-建议使用这个类的属性来代替声明名称的魔术字符串.
\ No newline at end of file
+建议使用这个类的属性来代替声明名称的魔术字符串.
From 2eb0913378932a85a5817766f83f5351f01a68d3 Mon Sep 17 00:00:00 2001
From: maliming <6908465+maliming@users.noreply.github.com>
Date: Wed, 12 Aug 2020 11:18:03 +0800
Subject: [PATCH 029/345] Use integer instead of double.
---
.../Abp/IdentityModel/IdentityClientConfiguration.cs | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs
index d831c28808..5f2f4af573 100644
--- a/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs
+++ b/framework/src/Volo.Abp.IdentityModel/Volo/Abp/IdentityModel/IdentityClientConfiguration.cs
@@ -84,12 +84,12 @@ namespace Volo.Abp.IdentityModel
}
///
- /// Cache absolute expiration
- /// Default: 30 minutes.
+ /// Absolute expiration duration (as seconds) for the access token cache.
+ /// Default: 1800 seconds (30 minutes)
///
- public double CacheAbsoluteExpiration
+ public int CacheAbsoluteExpiration
{
- get => this.GetOrDefault(nameof(CacheAbsoluteExpiration ))?.To() ?? 60 * 30;
+ get => this.GetOrDefault(nameof(CacheAbsoluteExpiration ))?.To() ?? 60 * 30;
set => this[nameof(CacheAbsoluteExpiration)] = value.ToString(CultureInfo.InvariantCulture);
}
@@ -107,7 +107,7 @@ namespace Volo.Abp.IdentityModel
string userName = null,
string userPassword = null,
bool requireHttps = true,
- double cacheAbsoluteExpiration = 60 * 30)
+ int cacheAbsoluteExpiration = 60 * 30)
{
this[nameof(Authority)] = authority;
this[nameof(Scope)] = scope;
From 9dbae3afe3dd9314a21a5c53c78e7f63dd597f98 Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 11:55:24 +0300
Subject: [PATCH 030/345] build: add dependencies for schematics
---
npm/ng-packs/package.json | 4 ++++
npm/ng-packs/yarn.lock | 7 ++++++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json
index 0951ad2d1c..082cfce422 100644
--- a/npm/ng-packs/package.json
+++ b/npm/ng-packs/package.json
@@ -13,6 +13,8 @@
"test": "ng test --watchAll --runInBand",
"commit": "git-cz",
"lint": "ng lint",
+ "build:schematics": "cd scripts && yarn && yarn build:schematics && cd ..",
+ "dev:schematics": "tsc -p packages/schematics/tsconfig.json -w",
"scripts:build": "cd scripts && yarn && yarn build",
"prepare:workspace": "yarn scripts:build --noInstall",
"ci": "yarn ng lint && yarn prepare:workspace && yarn ci:test && yarn ci:build",
@@ -57,6 +59,7 @@
"@ngxs/router-plugin": "^3.6.2",
"@ngxs/storage-plugin": "^3.6.2",
"@ngxs/store": "^3.6.2",
+ "@schematics/angular": "~10.0.5",
"@swimlane/ngx-datatable": "^17.0.0",
"@types/jest": "^25.2.3",
"@types/node": "^12.11.1",
@@ -70,6 +73,7 @@
"jest": "^25.0.0",
"jest-canvas-mock": "^2.2.0",
"jest-preset-angular": "^8.2.0",
+ "jsonc-parser": "^2.3.0",
"just-clone": "^3.1.0",
"just-compare": "^1.3.0",
"lerna": "^3.19.0",
diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock
index e9caca6fac..af7083c75f 100644
--- a/npm/ng-packs/yarn.lock
+++ b/npm/ng-packs/yarn.lock
@@ -2562,7 +2562,7 @@
estree-walker "^1.0.1"
picomatch "^2.2.2"
-"@schematics/angular@10.0.5":
+"@schematics/angular@10.0.5", "@schematics/angular@~10.0.5":
version "10.0.5"
resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-10.0.5.tgz#905f7c58547fdf9847fb004c1689bc0af7a09a7a"
integrity sha512-zg8QxgW3uLva/MSKMRYfV7dzj00SUki4nxYN4j1rw42VlwNPnFrPtzFVEilL6N7wFgoHP/6cZRgm4bfXYvLBvg==
@@ -8432,6 +8432,11 @@ json5@^1.0.1:
dependencies:
minimist "^1.2.0"
+jsonc-parser@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.3.0.tgz#7c7fc988ee1486d35734faaaa866fadb00fa91ee"
+ integrity sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==
+
jsonfile@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
From 9641e4c1f5f4d23368f3c526d8de3c93369c5d1c Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 11:56:25 +0300
Subject: [PATCH 031/345] chore: make VS Code ignore template files
---
npm/ng-packs/.vscode/settings.json | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/npm/ng-packs/.vscode/settings.json b/npm/ng-packs/.vscode/settings.json
index a04bf7ca0c..cee01836fc 100644
--- a/npm/ng-packs/.vscode/settings.json
+++ b/npm/ng-packs/.vscode/settings.json
@@ -1,4 +1,22 @@
{
+ "[typescriptreact]": {
+ "editor.formatOnSave": false,
+ "editor.codeActionsOnSave": {
+ "source.fixAll": false,
+ "source.organizeImports": false
+ }
+ },
+ "[xml]": {
+ "editor.formatOnSave": false,
+ "editor.codeActionsOnSave": {
+ "source.fixAll": false,
+ "source.organizeImports": false
+ }
+ },
+ "files.associations": {
+ "*.ts.template": "typescriptreact",
+ "*.html.template": "xml"
+ },
"search.exclude": {
"**/dist": true
},
From 50407d19a113564d51792c824e52f666d4389f6f Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 11:57:50 +0300
Subject: [PATCH 032/345] build: add build scripts for schematics
---
npm/ng-packs/scripts/build-schematics.ts | 59 ++++++++++++++++++++++++
npm/ng-packs/scripts/package.json | 1 +
2 files changed, 60 insertions(+)
create mode 100644 npm/ng-packs/scripts/build-schematics.ts
diff --git a/npm/ng-packs/scripts/build-schematics.ts b/npm/ng-packs/scripts/build-schematics.ts
new file mode 100644
index 0000000000..9b4f32cd30
--- /dev/null
+++ b/npm/ng-packs/scripts/build-schematics.ts
@@ -0,0 +1,59 @@
+import execa from 'execa';
+import fse from 'fs-extra';
+
+class FileCopy {
+ src: string;
+ dest: string;
+ options?: fse.CopyOptions;
+
+ constructor(filecopyOrSrc: FileCopy | string) {
+ if (typeof filecopyOrSrc === 'string') {
+ this.src = filecopyOrSrc;
+ this.dest = filecopyOrSrc;
+ } else {
+ this.src = filecopyOrSrc.src;
+ this.dest = filecopyOrSrc.dest;
+ this.options = filecopyOrSrc.options;
+ }
+ }
+}
+
+const PACKAGE_TO_BUILD = 'schematics';
+const FILES_TO_COPY_AFTER_BUILD: (FileCopy | string)[] = [
+ { src: 'src/commands/proxy/files-enum', dest: 'commands/proxy/files-enum' },
+ { src: 'src/commands/proxy/files-model', dest: 'commands/proxy/files-model' },
+ { src: 'src/commands/proxy/files-service', dest: 'commands/proxy/files-service' },
+ { src: 'src/collection.json', dest: 'collection.json' },
+ 'package.json',
+ 'README.md',
+];
+
+async function* copyPackageFile(packageName: string, filecopy: FileCopy | string) {
+ filecopy = new FileCopy(filecopy);
+ const { src, dest, options = { overwrite: true } } = filecopy;
+
+ await fse.copy(`../packages/${packageName}/${src}`, `../dist/${packageName}/${dest}`, options);
+
+ yield filecopy;
+}
+
+async function* copyPackageFiles(packageName: string) {
+ for (const filecopy of FILES_TO_COPY_AFTER_BUILD) {
+ yield* copyPackageFile(packageName, filecopy);
+ }
+}
+
+(async () => {
+ await execa(
+ 'tsc',
+ ['-p', `packages/${PACKAGE_TO_BUILD}/tsconfig.json`, '--outDir', `dist/${PACKAGE_TO_BUILD}`],
+ {
+ stdout: 'inherit',
+ cwd: '../',
+ },
+ );
+
+ for await (const filecopy of copyPackageFiles(PACKAGE_TO_BUILD)) {
+ // do nothing
+ }
+})();
diff --git a/npm/ng-packs/scripts/package.json b/npm/ng-packs/scripts/package.json
index 932abe4f64..3984a00b14 100644
--- a/npm/ng-packs/scripts/package.json
+++ b/npm/ng-packs/scripts/package.json
@@ -6,6 +6,7 @@
"scripts": {
"build": "ts-node -r tsconfig-paths/register build.ts",
"build:prod": "ts-node -r tsconfig-paths/register prod-build.ts",
+ "build:schematics": "ts-node -r tsconfig-paths/register build-schematics.ts",
"publish-packages": "ts-node -r tsconfig-paths/register publish.ts",
"replace-with-tilde": "ts-node -r tsconfig-paths/register replace-with-tilde.ts"
},
From bdb82177c2a08cc6c4403e0f377771a558e1764d Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 11:58:53 +0300
Subject: [PATCH 033/345] feat: add an empty schematics project
---
npm/ng-packs/packages/schematics/.gitignore | 18 +++++++++++
npm/ng-packs/packages/schematics/.npmignore | 3 ++
npm/ng-packs/packages/schematics/README.md | 3 ++
.../packages/schematics/jest.config.js | 7 ++++
npm/ng-packs/packages/schematics/package.json | 23 +++++++++++++
.../packages/schematics/src/collection.json | 9 ++++++
.../enums/__name@kebab__.ts.template | 0
.../enums/__name@kebab__.ts.template | 0
.../enums/__name@kebab__.service.ts.template | 0
.../schematics/src/commands/proxy/index.ts | 10 ++++++
.../schematics/src/commands/proxy/schema.json | 32 +++++++++++++++++++
.../schematics/src/commands/proxy/schema.ts | 16 ++++++++++
.../packages/schematics/tsconfig.json | 24 ++++++++++++++
npm/ng-packs/packages/schematics/tslint.json | 8 +++++
14 files changed, 153 insertions(+)
create mode 100644 npm/ng-packs/packages/schematics/.gitignore
create mode 100644 npm/ng-packs/packages/schematics/.npmignore
create mode 100644 npm/ng-packs/packages/schematics/README.md
create mode 100644 npm/ng-packs/packages/schematics/jest.config.js
create mode 100644 npm/ng-packs/packages/schematics/package.json
create mode 100644 npm/ng-packs/packages/schematics/src/collection.json
create mode 100644 npm/ng-packs/packages/schematics/src/commands/proxy/files-enum/__namespacePath__/enums/__name@kebab__.ts.template
create mode 100644 npm/ng-packs/packages/schematics/src/commands/proxy/files-model/__sharedPath__/enums/__name@kebab__.ts.template
create mode 100644 npm/ng-packs/packages/schematics/src/commands/proxy/files-service/__sharedPath__/enums/__name@kebab__.service.ts.template
create mode 100644 npm/ng-packs/packages/schematics/src/commands/proxy/index.ts
create mode 100644 npm/ng-packs/packages/schematics/src/commands/proxy/schema.json
create mode 100644 npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts
create mode 100644 npm/ng-packs/packages/schematics/tsconfig.json
create mode 100644 npm/ng-packs/packages/schematics/tslint.json
diff --git a/npm/ng-packs/packages/schematics/.gitignore b/npm/ng-packs/packages/schematics/.gitignore
new file mode 100644
index 0000000000..82677b5884
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/.gitignore
@@ -0,0 +1,18 @@
+# Outputs
+src/**/*.js
+src/**/*.js.map
+src/**/*.d.ts
+
+# IDEs
+.idea/
+jsconfig.json
+.vscode/
+
+# Misc
+node_modules/
+npm-debug.log*
+yarn-error.log*
+
+# Mac OSX Finder files.
+**/.DS_Store
+.DS_Store
diff --git a/npm/ng-packs/packages/schematics/.npmignore b/npm/ng-packs/packages/schematics/.npmignore
new file mode 100644
index 0000000000..c55ccfc3f5
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/.npmignore
@@ -0,0 +1,3 @@
+# Ignores TypeScript files, but keeps definitions.
+*.ts
+!*.d.ts
diff --git a/npm/ng-packs/packages/schematics/README.md b/npm/ng-packs/packages/schematics/README.md
new file mode 100644
index 0000000000..19e68b6796
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/README.md
@@ -0,0 +1,3 @@
+# ABP Suite Schematics
+
+TODO: Add usage and development information
diff --git a/npm/ng-packs/packages/schematics/jest.config.js b/npm/ng-packs/packages/schematics/jest.config.js
new file mode 100644
index 0000000000..351bc0355b
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/jest.config.js
@@ -0,0 +1,7 @@
+const jestConfig = require('../../jest.config');
+
+module.exports = {
+ ...jestConfig,
+ name: 'schematics',
+ testMatch: ['/packages/schematics/**/+(*.)+(spec).+(ts)'],
+};
diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json
new file mode 100644
index 0000000000..adde31639e
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "@abp/ng.schematics",
+ "version": "3.0.5",
+ "description": "Schematics that works with ABP Suite",
+ "keywords": [
+ "schematics"
+ ],
+ "author": "",
+ "license": "MIT",
+ "schematics": "./src/collection.json",
+ "dependencies": {
+ "@angular-devkit/core": "~10.0.3",
+ "@angular-devkit/schematics": "~10.0.3",
+ "typescript": "~3.9.2"
+ },
+ "devDependencies": {
+ "@types/node": "^12.11.1",
+ "@types/jest": "^26.0.0",
+ "jest": "^26.0.0",
+ "jest-preset-angular": "^8.2.0",
+ "@schematics/angular": "~10.0.3"
+ }
+}
diff --git a/npm/ng-packs/packages/schematics/src/collection.json b/npm/ng-packs/packages/schematics/src/collection.json
new file mode 100644
index 0000000000..6cfecd4d4a
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/collection.json
@@ -0,0 +1,9 @@
+{
+ "schematics": {
+ "proxy": {
+ "description": "ABP Proxy Generator Schematics",
+ "factory": "./commands/proxy",
+ "schema": "./commands/proxy/schema.json"
+ }
+ }
+}
diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/files-enum/__namespacePath__/enums/__name@kebab__.ts.template b/npm/ng-packs/packages/schematics/src/commands/proxy/files-enum/__namespacePath__/enums/__name@kebab__.ts.template
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/files-model/__sharedPath__/enums/__name@kebab__.ts.template b/npm/ng-packs/packages/schematics/src/commands/proxy/files-model/__sharedPath__/enums/__name@kebab__.ts.template
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/files-service/__sharedPath__/enums/__name@kebab__.service.ts.template b/npm/ng-packs/packages/schematics/src/commands/proxy/files-service/__sharedPath__/enums/__name@kebab__.service.ts.template
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts b/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts
new file mode 100644
index 0000000000..6c232805c3
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts
@@ -0,0 +1,10 @@
+import { chain, SchematicContext, Tree } from '@angular-devkit/schematics';
+import { Schema as GenerateProxySchema } from './schema';
+
+export default function(_params: GenerateProxySchema) {
+ return chain([
+ async (_tree: Tree, _context: SchematicContext) => {
+ return chain([]);
+ },
+ ]);
+}
diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json
new file mode 100644
index 0000000000..e61ee25567
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json
@@ -0,0 +1,32 @@
+{
+ "$schema": "http://json-schema.org/schema",
+ "id": "SchematicsAbpEntityModule",
+ "title": "ABP Entity Module Schema",
+ "type": "object",
+ "properties": {
+ "module": {
+ "alias": "m",
+ "description": "The name of the module to generate code for",
+ "type": "string",
+ "$default": {
+ "$source": "argv",
+ "index": 1
+ },
+ "x-prompt": "Please enter name of the module you wish to generate proxies for. (default: app)"
+ },
+ "apiUrl": {
+ "alias": "a",
+ "description": "The URL to get API configuration from",
+ "type": "string",
+ "x-prompt": "Plese enter URL to get API config from. Leave blank to use environment variables."
+ },
+ "out": {
+ "alias": "o",
+ "description": "The path to place the generated code at",
+ "type": "string",
+ "format": "path",
+ "x-prompt": "Plese enter a custom output path. Leave blank if you do not need one."
+ }
+ },
+ "required": []
+}
diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts
new file mode 100644
index 0000000000..1acf932886
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts
@@ -0,0 +1,16 @@
+export interface Schema {
+ /**
+ * The URL to get API configuration from
+ */
+ apiUrl?: string;
+
+ /**
+ * The name of the module to generate code for
+ */
+ module?: string;
+
+ /**
+ * The path to place the generated code at
+ */
+ out?: string;
+}
diff --git a/npm/ng-packs/packages/schematics/tsconfig.json b/npm/ng-packs/packages/schematics/tsconfig.json
new file mode 100644
index 0000000000..dd80972b48
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/tsconfig.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "baseUrl": "tsconfig",
+ "lib": ["es2018", "dom"],
+ "declaration": true,
+ "module": "commonjs",
+ "moduleResolution": "node",
+ "noEmitOnError": true,
+ "noFallthroughCasesInSwitch": true,
+ "noImplicitAny": true,
+ "noImplicitThis": true,
+ "noUnusedParameters": true,
+ "noUnusedLocals": true,
+ "rootDir": "src/",
+ "skipDefaultLibCheck": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strictNullChecks": true,
+ "target": "es2017",
+ "types": ["jest", "node"]
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist", "src/*/files/**/*", "**/*.spec.ts"]
+}
diff --git a/npm/ng-packs/packages/schematics/tslint.json b/npm/ng-packs/packages/schematics/tslint.json
new file mode 100644
index 0000000000..7380ad5e40
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/tslint.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../tslint.json",
+ "rules": {
+ "variable-name": {
+ "options": ["allow-leading-underscore", "ban-keywords", "check-format", "allow-pascal-case"]
+ }
+ }
+}
From 0b4c7e3dea302788f0d42e0bad1bff887692a2a3 Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 12:00:19 +0300
Subject: [PATCH 034/345] build: add schematics library to angular.json
---
npm/ng-packs/angular.json | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/npm/ng-packs/angular.json b/npm/ng-packs/angular.json
index d7d267dc06..916dea8457 100644
--- a/npm/ng-packs/angular.json
+++ b/npm/ng-packs/angular.json
@@ -366,6 +366,29 @@
}
}
},
+ "schematics": {
+ "projectType": "library",
+ "root": "packages/schematics",
+ "sourceRoot": "packages/schematics/src",
+ "prefix": "abp",
+ "architect": {
+ "test": {
+ "builder": "@angular-builders/jest:run",
+ "options": {
+ "tsConfig": "tsconfig.json",
+ "coverage": true,
+ "passWithNoTests": true
+ }
+ },
+ "lint": {
+ "builder": "@angular-devkit/build-angular:tslint",
+ "options": {
+ "tsConfig": ["packages/schematics/tsconfig.json"],
+ "exclude": ["**/node_modules/**"]
+ }
+ }
+ }
+ },
"dev-app": {
"projectType": "application",
"schematics": {
From 863d66e34c32ce4b09135b612ce804adceee2550 Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 12:00:47 +0300
Subject: [PATCH 035/345] chore: add mock api-definition.json to schematics
---
.../schematics/src/mocks/api-definition.json | 11519 ++++++++++++++++
1 file changed, 11519 insertions(+)
create mode 100644 npm/ng-packs/packages/schematics/src/mocks/api-definition.json
diff --git a/npm/ng-packs/packages/schematics/src/mocks/api-definition.json b/npm/ng-packs/packages/schematics/src/mocks/api-definition.json
new file mode 100644
index 0000000000..b754409756
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/mocks/api-definition.json
@@ -0,0 +1,11519 @@
+{
+ "modules": {
+ "leptonThemeManagement": {
+ "rootPath": "leptonThemeManagement",
+ "remoteServiceName": "LeptonThemeManagement",
+ "controllers": {
+ "Volo.Abp.LeptonTheme.LeptonThemeSettingsController": {
+ "controllerName": "LeptonThemeSettings",
+ "type": "Volo.Abp.LeptonTheme.LeptonThemeSettingsController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.LeptonTheme.Management.ILeptonThemeSettingsAppService"
+ }
+ ],
+ "actions": {
+ "GetAsync": {
+ "uniqueName": "GetAsync",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/lepton-theme-management/settings",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "Volo.Abp.LeptonTheme.Management.LeptonThemeSettingsDto",
+ "typeSimple": "Volo.Abp.LeptonTheme.Management.LeptonThemeSettingsDto"
+ }
+ },
+ "UpdateAsyncByInput": {
+ "uniqueName": "UpdateAsyncByInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/lepton-theme-management/settings",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.LeptonTheme.Management.UpdateLeptonThemeSettingsDto, Volo.Abp.LeptonTheme.Management.Application.Contracts",
+ "type": "Volo.Abp.LeptonTheme.Management.UpdateLeptonThemeSettingsDto",
+ "typeSimple": "Volo.Abp.LeptonTheme.Management.UpdateLeptonThemeSettingsDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.LeptonTheme.Management.UpdateLeptonThemeSettingsDto",
+ "typeSimple": "Volo.Abp.LeptonTheme.Management.UpdateLeptonThemeSettingsDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ }
+ }
+ },
+ "auditLogging": {
+ "rootPath": "auditLogging",
+ "remoteServiceName": "AbpAuditLogging",
+ "controllers": {
+ "Volo.Abp.AuditLogging.AuditLogsController": {
+ "controllerName": "AuditLogs",
+ "type": "Volo.Abp.AuditLogging.AuditLogsController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.AuditLogging.IAuditLogsAppService"
+ }
+ ],
+ "actions": {
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/audit-logging/audit-logs",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.AuditLogging.GetAuditLogListDto, Volo.Abp.AuditLogging.Application.Contracts",
+ "type": "Volo.Abp.AuditLogging.GetAuditLogListDto",
+ "typeSimple": "Volo.Abp.AuditLogging.GetAuditLogListDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Url",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "ApplicationName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "CorrelationId",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "HttpMethod",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "HttpStatusCode",
+ "type": "System.Net.HttpStatusCode?",
+ "typeSimple": "System.Net.HttpStatusCode?",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxExecutionDuration",
+ "type": "System.Int32?",
+ "typeSimple": "number?",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MinExecutionDuration",
+ "type": "System.Int32?",
+ "typeSimple": "number?",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "HasException",
+ "type": "System.Boolean?",
+ "typeSimple": "boolean?",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "GetAsyncById": {
+ "uniqueName": "GetAsyncById",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/audit-logging/audit-logs/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.AuditLogging.AuditLogDto",
+ "typeSimple": "Volo.Abp.AuditLogging.AuditLogDto"
+ }
+ },
+ "GetErrorRateAsyncByFilter": {
+ "uniqueName": "GetErrorRateAsyncByFilter",
+ "name": "GetErrorRateAsync",
+ "httpMethod": "GET",
+ "url": "api/audit-logging/audit-logs/statistics/error-rate",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "filter",
+ "typeAsString": "Volo.Abp.AuditLogging.GetErrorRateFilter, Volo.Abp.AuditLogging.Application.Contracts",
+ "type": "Volo.Abp.AuditLogging.GetErrorRateFilter",
+ "typeSimple": "Volo.Abp.AuditLogging.GetErrorRateFilter",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "filter",
+ "name": "StartDate",
+ "type": "System.DateTime",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "filter"
+ },
+ {
+ "nameOnMethod": "filter",
+ "name": "EndDate",
+ "type": "System.DateTime",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "filter"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.AuditLogging.GetErrorRateOutput",
+ "typeSimple": "Volo.Abp.AuditLogging.GetErrorRateOutput"
+ }
+ },
+ "GetAverageExecutionDurationPerDayAsyncByFilter": {
+ "uniqueName": "GetAverageExecutionDurationPerDayAsyncByFilter",
+ "name": "GetAverageExecutionDurationPerDayAsync",
+ "httpMethod": "GET",
+ "url": "api/audit-logging/audit-logs/statistics/average-execution-duration-per-day",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "filter",
+ "typeAsString": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayInput, Volo.Abp.AuditLogging.Application.Contracts",
+ "type": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayInput",
+ "typeSimple": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "filter",
+ "name": "StartDate",
+ "type": "System.DateTime",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "filter"
+ },
+ {
+ "nameOnMethod": "filter",
+ "name": "EndDate",
+ "type": "System.DateTime",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "filter"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayOutput",
+ "typeSimple": "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayOutput"
+ }
+ },
+ "GetEntityChangesAsyncByInput": {
+ "uniqueName": "GetEntityChangesAsyncByInput",
+ "name": "GetEntityChangesAsync",
+ "httpMethod": "GET",
+ "url": "api/audit-logging/audit-logs/entity-changes",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.AuditLogging.GetEntityChangesDto, Volo.Abp.AuditLogging.Application.Contracts",
+ "type": "Volo.Abp.AuditLogging.GetEntityChangesDto",
+ "typeSimple": "Volo.Abp.AuditLogging.GetEntityChangesDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "AuditLogId",
+ "type": "System.Guid?",
+ "typeSimple": "string?",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "EntityChangeType",
+ "type": "Volo.Abp.Auditing.EntityChangeType?",
+ "typeSimple": "Volo.Abp.Auditing.EntityChangeType?",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "EntityId",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "EntityTypeFullName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "StartDate",
+ "type": "System.DateTime?",
+ "typeSimple": "string?",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "EndDate",
+ "type": "System.DateTime?",
+ "typeSimple": "string?",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "GetEntityChangesWithUsernameAsyncByInput": {
+ "uniqueName": "GetEntityChangesWithUsernameAsyncByInput",
+ "name": "GetEntityChangesWithUsernameAsync",
+ "httpMethod": "GET",
+ "url": "api/audit-logging/audit-logs/entity-changes-with-username",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.AuditLogging.EntityChangeFilter, Volo.Abp.AuditLogging.Application.Contracts",
+ "type": "Volo.Abp.AuditLogging.EntityChangeFilter",
+ "typeSimple": "Volo.Abp.AuditLogging.EntityChangeFilter",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "EntityId",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "EntityTypeFullName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.AuditLogging.EntityChangeWithUsernameDto]"
+ }
+ },
+ "GetEntityChangeWithUsernameAsyncByEntityChangeId": {
+ "uniqueName": "GetEntityChangeWithUsernameAsyncByEntityChangeId",
+ "name": "GetEntityChangeWithUsernameAsync",
+ "httpMethod": "GET",
+ "url": "api/audit-logging/audit-logs/entity-change-with-username/{entityChangeId}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "entityChangeId",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "entityChangeId",
+ "name": "entityChangeId",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.AuditLogging.EntityChangeWithUsernameDto",
+ "typeSimple": "Volo.Abp.AuditLogging.EntityChangeWithUsernameDto"
+ }
+ },
+ "GetEntityChangeAsyncByEntityChangeId": {
+ "uniqueName": "GetEntityChangeAsyncByEntityChangeId",
+ "name": "GetEntityChangeAsync",
+ "httpMethod": "GET",
+ "url": "api/audit-logging/audit-logs/entity-changes/{entityChangeId}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "entityChangeId",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "entityChangeId",
+ "name": "entityChangeId",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.AuditLogging.EntityChangeDto",
+ "typeSimple": "Volo.Abp.AuditLogging.EntityChangeDto"
+ }
+ }
+ }
+ }
+ }
+ },
+ "identity": {
+ "rootPath": "identity",
+ "remoteServiceName": "AbpIdentity",
+ "controllers": {
+ "Volo.Abp.Identity.IdentityClaimTypeController": {
+ "controllerName": "IdentityClaimType",
+ "type": "Volo.Abp.Identity.IdentityClaimTypeController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.Identity.IIdentityClaimTypeAppService"
+ }
+ ],
+ "actions": {
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/claim-types",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.GetIdentityClaimTypesInput, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.GetIdentityClaimTypesInput",
+ "typeSimple": "Volo.Abp.Identity.GetIdentityClaimTypesInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "GetAsyncById": {
+ "uniqueName": "GetAsyncById",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/claim-types/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.ClaimTypeDto",
+ "typeSimple": "Volo.Abp.Identity.ClaimTypeDto"
+ }
+ },
+ "CreateAsyncByInput": {
+ "uniqueName": "CreateAsyncByInput",
+ "name": "CreateAsync",
+ "httpMethod": "POST",
+ "url": "api/identity/claim-types",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.CreateClaimTypeDto, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.CreateClaimTypeDto",
+ "typeSimple": "Volo.Abp.Identity.CreateClaimTypeDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.CreateClaimTypeDto",
+ "typeSimple": "Volo.Abp.Identity.CreateClaimTypeDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.ClaimTypeDto",
+ "typeSimple": "Volo.Abp.Identity.ClaimTypeDto"
+ }
+ },
+ "UpdateAsyncByIdAndInput": {
+ "uniqueName": "UpdateAsyncByIdAndInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/claim-types/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.UpdateClaimTypeDto, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.UpdateClaimTypeDto",
+ "typeSimple": "Volo.Abp.Identity.UpdateClaimTypeDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.UpdateClaimTypeDto",
+ "typeSimple": "Volo.Abp.Identity.UpdateClaimTypeDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.ClaimTypeDto",
+ "typeSimple": "Volo.Abp.Identity.ClaimTypeDto"
+ }
+ },
+ "DeleteAsyncById": {
+ "uniqueName": "DeleteAsyncById",
+ "name": "DeleteAsync",
+ "httpMethod": "DELETE",
+ "url": "api/identity/claim-types/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ },
+ "Volo.Abp.Identity.IdentityRoleController": {
+ "controllerName": "IdentityRole",
+ "type": "Volo.Abp.Identity.IdentityRoleController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.Identity.IIdentityRoleAppService"
+ }
+ ],
+ "actions": {
+ "GetAsyncById": {
+ "uniqueName": "GetAsyncById",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/roles/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.IdentityRoleDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityRoleDto"
+ }
+ },
+ "CreateAsyncByInput": {
+ "uniqueName": "CreateAsyncByInput",
+ "name": "CreateAsync",
+ "httpMethod": "POST",
+ "url": "api/identity/roles",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.IdentityRoleCreateDto, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.IdentityRoleCreateDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityRoleCreateDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.IdentityRoleCreateDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityRoleCreateDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.IdentityRoleDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityRoleDto"
+ }
+ },
+ "UpdateAsyncByIdAndInput": {
+ "uniqueName": "UpdateAsyncByIdAndInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/roles/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.IdentityRoleUpdateDto, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.IdentityRoleUpdateDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityRoleUpdateDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.IdentityRoleUpdateDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityRoleUpdateDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.IdentityRoleDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityRoleDto"
+ }
+ },
+ "DeleteAsyncById": {
+ "uniqueName": "DeleteAsyncById",
+ "name": "DeleteAsync",
+ "httpMethod": "DELETE",
+ "url": "api/identity/roles/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "GetAllListAsync": {
+ "uniqueName": "GetAllListAsync",
+ "name": "GetAllListAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/roles/all",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.ListResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto"
+ }
+ },
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/roles",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.GetIdentityRoleListInput, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.GetIdentityRoleListInput",
+ "typeSimple": "Volo.Abp.Identity.GetIdentityRoleListInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "UpdateClaimsAsyncByIdAndInput": {
+ "uniqueName": "UpdateClaimsAsyncByIdAndInput",
+ "name": "UpdateClaimsAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/roles/{id}/claims",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "System.Collections.Generic.List`1[[Volo.Abp.Identity.IdentityRoleClaimDto, Volo.Abp.Identity.Pro.Application.Contracts, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib",
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.Identity.IdentityRoleClaimDto]",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.Identity.IdentityRoleClaimDto]",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "GetClaimsAsyncById": {
+ "uniqueName": "GetClaimsAsyncById",
+ "name": "GetClaimsAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/roles/{id}/claims",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.Identity.IdentityRoleClaimDto]"
+ }
+ },
+ "GetAllClaimTypesAsync": {
+ "uniqueName": "GetAllClaimTypesAsync",
+ "name": "GetAllClaimTypesAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/roles/all-claim-types",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.Identity.ClaimTypeDto]"
+ }
+ }
+ }
+ },
+ "Volo.Abp.Identity.IdentitySecurityLogController": {
+ "controllerName": "IdentitySecurityLog",
+ "type": "Volo.Abp.Identity.IdentitySecurityLogController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.Identity.IIdentitySecurityLogAppService"
+ }
+ ],
+ "actions": {
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/security-logs",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.GetIdentitySecurityLogListInput, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.GetIdentitySecurityLogListInput",
+ "typeSimple": "Volo.Abp.Identity.GetIdentitySecurityLogListInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "StartTime",
+ "type": "System.DateTime?",
+ "typeSimple": "string?",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "EndTime",
+ "type": "System.DateTime?",
+ "typeSimple": "string?",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "ApplicationName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Identity",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Action",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "ClientId",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "CorrelationId",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "GetAsyncById": {
+ "uniqueName": "GetAsyncById",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/security-logs/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.IdentitySecurityLogDto",
+ "typeSimple": "Volo.Abp.Identity.IdentitySecurityLogDto"
+ }
+ },
+ "GetMyListAsyncByInput": {
+ "uniqueName": "GetMyListAsyncByInput",
+ "name": "GetMyListAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/security-logs/my",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.GetIdentitySecurityLogListInput, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.GetIdentitySecurityLogListInput",
+ "typeSimple": "Volo.Abp.Identity.GetIdentitySecurityLogListInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "StartTime",
+ "type": "System.DateTime?",
+ "typeSimple": "string?",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "EndTime",
+ "type": "System.DateTime?",
+ "typeSimple": "string?",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "ApplicationName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Identity",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Action",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "ClientId",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "CorrelationId",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Query",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "GetMyAsyncById": {
+ "uniqueName": "GetMyAsyncById",
+ "name": "GetMyAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/security-logs/my/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.IdentitySecurityLogDto",
+ "typeSimple": "Volo.Abp.Identity.IdentitySecurityLogDto"
+ }
+ }
+ }
+ },
+ "Volo.Abp.Identity.IdentitySettingsController": {
+ "controllerName": "IdentitySettings",
+ "type": "Volo.Abp.Identity.IdentitySettingsController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.Identity.IIdentitySettingsAppService"
+ }
+ ],
+ "actions": {
+ "GetAsync": {
+ "uniqueName": "GetAsync",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/settings",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.IdentitySettingsDto",
+ "typeSimple": "Volo.Abp.Identity.IdentitySettingsDto"
+ }
+ },
+ "UpdateAsyncByInput": {
+ "uniqueName": "UpdateAsyncByInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/settings",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.IdentitySettingsDto, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.IdentitySettingsDto",
+ "typeSimple": "Volo.Abp.Identity.IdentitySettingsDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.IdentitySettingsDto",
+ "typeSimple": "Volo.Abp.Identity.IdentitySettingsDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ },
+ "Volo.Abp.Identity.IdentityUserController": {
+ "controllerName": "IdentityUser",
+ "type": "Volo.Abp.Identity.IdentityUserController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.Identity.IIdentityUserAppService"
+ }
+ ],
+ "actions": {
+ "GetAsyncById": {
+ "uniqueName": "GetAsyncById",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.IdentityUserDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserDto"
+ }
+ },
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.GetIdentityUsersInput, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.GetIdentityUsersInput",
+ "typeSimple": "Volo.Abp.Identity.GetIdentityUsersInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "CreateAsyncByInput": {
+ "uniqueName": "CreateAsyncByInput",
+ "name": "CreateAsync",
+ "httpMethod": "POST",
+ "url": "api/identity/users",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.IdentityUserCreateDto, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.IdentityUserCreateDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserCreateDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.IdentityUserCreateDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserCreateDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.IdentityUserDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserDto"
+ }
+ },
+ "UpdateAsyncByIdAndInput": {
+ "uniqueName": "UpdateAsyncByIdAndInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/users/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.IdentityUserUpdateDto, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.IdentityUserUpdateDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserUpdateDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.IdentityUserUpdateDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserUpdateDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.IdentityUserDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserDto"
+ }
+ },
+ "DeleteAsyncById": {
+ "uniqueName": "DeleteAsyncById",
+ "name": "DeleteAsync",
+ "httpMethod": "DELETE",
+ "url": "api/identity/users/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "GetRolesAsyncById": {
+ "uniqueName": "GetRolesAsyncById",
+ "name": "GetRolesAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users/{id}/roles",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.ListResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto"
+ }
+ },
+ "GetAssignableRolesAsync": {
+ "uniqueName": "GetAssignableRolesAsync",
+ "name": "GetAssignableRolesAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users/assignable-roles",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.ListResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto"
+ }
+ },
+ "GetAvailableOrganizationUnitsAsync": {
+ "uniqueName": "GetAvailableOrganizationUnitsAsync",
+ "name": "GetAvailableOrganizationUnitsAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users/available-organization-units",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.ListResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto"
+ }
+ },
+ "GetAllClaimTypesAsync": {
+ "uniqueName": "GetAllClaimTypesAsync",
+ "name": "GetAllClaimTypesAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users/all-claim-types",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.Identity.ClaimTypeDto]"
+ }
+ },
+ "GetClaimsAsyncById": {
+ "uniqueName": "GetClaimsAsyncById",
+ "name": "GetClaimsAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users/{id}/claims",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.Identity.IdentityUserClaimDto]"
+ }
+ },
+ "GetOrganizationUnitsAsyncById": {
+ "uniqueName": "GetOrganizationUnitsAsyncById",
+ "name": "GetOrganizationUnitsAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users/{id}/organization-units",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.Identity.OrganizationUnitDto]"
+ }
+ },
+ "UpdateRolesAsyncByIdAndInput": {
+ "uniqueName": "UpdateRolesAsyncByIdAndInput",
+ "name": "UpdateRolesAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/users/{id}/roles",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.IdentityUserUpdateRolesDto, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.IdentityUserUpdateRolesDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserUpdateRolesDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.IdentityUserUpdateRolesDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserUpdateRolesDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "UpdateClaimsAsyncByIdAndInput": {
+ "uniqueName": "UpdateClaimsAsyncByIdAndInput",
+ "name": "UpdateClaimsAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/users/{id}/claims",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "System.Collections.Generic.List`1[[Volo.Abp.Identity.IdentityUserClaimDto, Volo.Abp.Identity.Pro.Application.Contracts, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib",
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.Identity.IdentityUserClaimDto]",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.Identity.IdentityUserClaimDto]",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "UnlockAsyncById": {
+ "uniqueName": "UnlockAsyncById",
+ "name": "UnlockAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/users/{id}/unlock",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "FindByUsernameAsyncByUsername": {
+ "uniqueName": "FindByUsernameAsyncByUsername",
+ "name": "FindByUsernameAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users/by-username/{username}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "username",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "username",
+ "name": "username",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.IdentityUserDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserDto"
+ }
+ },
+ "FindByEmailAsyncByEmail": {
+ "uniqueName": "FindByEmailAsyncByEmail",
+ "name": "FindByEmailAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users/by-email/{email}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "email",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "email",
+ "name": "email",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.IdentityUserDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserDto"
+ }
+ },
+ "UpdatePasswordAsyncByIdAndInput": {
+ "uniqueName": "UpdatePasswordAsyncByIdAndInput",
+ "name": "UpdatePasswordAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/users/{id}/change-password",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.IdentityUserUpdatePasswordInput, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.IdentityUserUpdatePasswordInput",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserUpdatePasswordInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.IdentityUserUpdatePasswordInput",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserUpdatePasswordInput",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ },
+ "Volo.Abp.Identity.IdentityUserLookupController": {
+ "controllerName": "IdentityUserLookup",
+ "type": "Volo.Abp.Identity.IdentityUserLookupController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.Identity.IIdentityUserLookupAppService"
+ }
+ ],
+ "actions": {
+ "FindByIdAsyncById": {
+ "uniqueName": "FindByIdAsyncById",
+ "name": "FindByIdAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users/lookup/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Users.UserData",
+ "typeSimple": "Volo.Abp.Users.UserData"
+ }
+ },
+ "FindByUserNameAsyncByUserName": {
+ "uniqueName": "FindByUserNameAsyncByUserName",
+ "name": "FindByUserNameAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users/lookup/by-username/{userName}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "userName",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "userName",
+ "name": "userName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Users.UserData",
+ "typeSimple": "Volo.Abp.Users.UserData"
+ }
+ },
+ "SearchAsyncByInput": {
+ "uniqueName": "SearchAsyncByInput",
+ "name": "SearchAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users/lookup/search",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.UserLookupSearchInputDto, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.UserLookupSearchInputDto",
+ "typeSimple": "Volo.Abp.Identity.UserLookupSearchInputDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.ListResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto"
+ }
+ },
+ "GetCountAsyncByInput": {
+ "uniqueName": "GetCountAsyncByInput",
+ "name": "GetCountAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/users/lookup/count",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.UserLookupCountInputDto, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.UserLookupCountInputDto",
+ "typeSimple": "Volo.Abp.Identity.UserLookupCountInputDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "System.Int64",
+ "typeSimple": "number"
+ }
+ }
+ }
+ },
+ "Volo.Abp.Identity.OrganizationUnitController": {
+ "controllerName": "OrganizationUnit",
+ "type": "Volo.Abp.Identity.OrganizationUnitController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.Identity.IOrganizationUnitAppService"
+ }
+ ],
+ "actions": {
+ "AddRolesAsyncByIdAndInput": {
+ "uniqueName": "AddRolesAsyncByIdAndInput",
+ "name": "AddRolesAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/organization-units/{id}/roles",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.OrganizationUnitRoleInput, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.OrganizationUnitRoleInput",
+ "typeSimple": "Volo.Abp.Identity.OrganizationUnitRoleInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.OrganizationUnitRoleInput",
+ "typeSimple": "Volo.Abp.Identity.OrganizationUnitRoleInput",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "AddMembersAsyncByIdAndInput": {
+ "uniqueName": "AddMembersAsyncByIdAndInput",
+ "name": "AddMembersAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/organization-units/{id}/members",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.OrganizationUnitUserInput, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.OrganizationUnitUserInput",
+ "typeSimple": "Volo.Abp.Identity.OrganizationUnitUserInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.OrganizationUnitUserInput",
+ "typeSimple": "Volo.Abp.Identity.OrganizationUnitUserInput",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "CreateAsyncByInput": {
+ "uniqueName": "CreateAsyncByInput",
+ "name": "CreateAsync",
+ "httpMethod": "POST",
+ "url": "api/identity/organization-units",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.OrganizationUnitCreateDto, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.OrganizationUnitCreateDto",
+ "typeSimple": "Volo.Abp.Identity.OrganizationUnitCreateDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.OrganizationUnitCreateDto",
+ "typeSimple": "Volo.Abp.Identity.OrganizationUnitCreateDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto",
+ "typeSimple": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto"
+ }
+ },
+ "DeleteAsyncById": {
+ "uniqueName": "DeleteAsyncById",
+ "name": "DeleteAsync",
+ "httpMethod": "DELETE",
+ "url": "api/identity/organization-units",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "GetAsyncById": {
+ "uniqueName": "GetAsyncById",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/organization-units/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto",
+ "typeSimple": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto"
+ }
+ },
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/organization-units",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.GetOrganizationUnitInput, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.GetOrganizationUnitInput",
+ "typeSimple": "Volo.Abp.Identity.GetOrganizationUnitInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "GetListAllAsync": {
+ "uniqueName": "GetListAllAsync",
+ "name": "GetListAllAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/organization-units/all",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.ListResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto"
+ }
+ },
+ "GetRolesAsyncByIdAndInput": {
+ "uniqueName": "GetRolesAsyncByIdAndInput",
+ "name": "GetRolesAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/organization-units/{id}/roles",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto, Volo.Abp.Ddd.Application.Contracts",
+ "type": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "GetMembersAsyncByIdAndInput": {
+ "uniqueName": "GetMembersAsyncByIdAndInput",
+ "name": "GetMembersAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/organization-units/{id}/members",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.GetIdentityUsersInput, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.GetIdentityUsersInput",
+ "typeSimple": "Volo.Abp.Identity.GetIdentityUsersInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "MoveAsyncByIdAndInput": {
+ "uniqueName": "MoveAsyncByIdAndInput",
+ "name": "MoveAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/organization-units/{id}/move",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.OrganizationUnitMoveInput, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.OrganizationUnitMoveInput",
+ "typeSimple": "Volo.Abp.Identity.OrganizationUnitMoveInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.OrganizationUnitMoveInput",
+ "typeSimple": "Volo.Abp.Identity.OrganizationUnitMoveInput",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "UpdateAsyncByIdAndInput": {
+ "uniqueName": "UpdateAsyncByIdAndInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/organization-units/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.OrganizationUnitUpdateDto, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.OrganizationUnitUpdateDto",
+ "typeSimple": "Volo.Abp.Identity.OrganizationUnitUpdateDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.OrganizationUnitUpdateDto",
+ "typeSimple": "Volo.Abp.Identity.OrganizationUnitUpdateDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto",
+ "typeSimple": "Volo.Abp.Identity.OrganizationUnitWithDetailsDto"
+ }
+ },
+ "RemoveMemberAsyncByIdAndMemberId": {
+ "uniqueName": "RemoveMemberAsyncByIdAndMemberId",
+ "name": "RemoveMemberAsync",
+ "httpMethod": "DELETE",
+ "url": "api/identity/organization-units/{id}/members/{memberId}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "memberId",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "memberId",
+ "name": "memberId",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "RemoveRoleAsyncByIdAndRoleId": {
+ "uniqueName": "RemoveRoleAsyncByIdAndRoleId",
+ "name": "RemoveRoleAsync",
+ "httpMethod": "DELETE",
+ "url": "api/identity/organization-units/{id}/roles/{roleId}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "roleId",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "roleId",
+ "name": "roleId",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ },
+ "Volo.Abp.Identity.ProfileController": {
+ "controllerName": "Profile",
+ "type": "Volo.Abp.Identity.ProfileController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.Identity.IProfileAppService"
+ }
+ ],
+ "actions": {
+ "GetAsync": {
+ "uniqueName": "GetAsync",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/identity/my-profile",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.ProfileDto",
+ "typeSimple": "Volo.Abp.Identity.ProfileDto"
+ }
+ },
+ "UpdateAsyncByInput": {
+ "uniqueName": "UpdateAsyncByInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity/my-profile",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.UpdateProfileDto, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.UpdateProfileDto",
+ "typeSimple": "Volo.Abp.Identity.UpdateProfileDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.UpdateProfileDto",
+ "typeSimple": "Volo.Abp.Identity.UpdateProfileDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.ProfileDto",
+ "typeSimple": "Volo.Abp.Identity.ProfileDto"
+ }
+ },
+ "ChangePasswordAsyncByInput": {
+ "uniqueName": "ChangePasswordAsyncByInput",
+ "name": "ChangePasswordAsync",
+ "httpMethod": "POST",
+ "url": "api/identity/my-profile/change-password",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Identity.ChangePasswordInput, Volo.Abp.Identity.Pro.Application.Contracts",
+ "type": "Volo.Abp.Identity.ChangePasswordInput",
+ "typeSimple": "Volo.Abp.Identity.ChangePasswordInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Identity.ChangePasswordInput",
+ "typeSimple": "Volo.Abp.Identity.ChangePasswordInput",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ }
+ }
+ },
+ "account": {
+ "rootPath": "account",
+ "remoteServiceName": "AbpAccountPublic",
+ "controllers": {
+ "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.AccountController": {
+ "controllerName": "Account",
+ "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.AccountController",
+ "interfaces": [],
+ "actions": {
+ "LoginByLogin": {
+ "uniqueName": "LoginByLogin",
+ "name": "Login",
+ "httpMethod": "POST",
+ "url": "api/account/login",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "login",
+ "typeAsString": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo, Volo.Abp.Account.Pro.Public.Web",
+ "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo",
+ "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "login",
+ "name": "login",
+ "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo",
+ "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.AbpLoginResult",
+ "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.AbpLoginResult"
+ }
+ },
+ "Logout": {
+ "uniqueName": "Logout",
+ "name": "Logout",
+ "httpMethod": "GET",
+ "url": "api/account/logout",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "CheckPasswordByLogin": {
+ "uniqueName": "CheckPasswordByLogin",
+ "name": "CheckPassword",
+ "httpMethod": "POST",
+ "url": "api/account/checkPassword",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "login",
+ "typeAsString": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo, Volo.Abp.Account.Pro.Public.Web",
+ "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo",
+ "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "login",
+ "name": "login",
+ "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo",
+ "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.AbpLoginResult",
+ "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.AbpLoginResult"
+ }
+ }
+ }
+ },
+ "Volo.Abp.Account.AccountController": {
+ "controllerName": "Account",
+ "type": "Volo.Abp.Account.AccountController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.Account.IAccountAppService"
+ }
+ ],
+ "actions": {
+ "RegisterAsyncByInput": {
+ "uniqueName": "RegisterAsyncByInput",
+ "name": "RegisterAsync",
+ "httpMethod": "POST",
+ "url": "api/account/register",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Account.RegisterDto, Volo.Abp.Account.Pro.Public.Application.Contracts",
+ "type": "Volo.Abp.Account.RegisterDto",
+ "typeSimple": "Volo.Abp.Account.RegisterDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Account.RegisterDto",
+ "typeSimple": "Volo.Abp.Account.RegisterDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Identity.IdentityUserDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserDto"
+ }
+ },
+ "SendPasswordResetCodeAsyncByInput": {
+ "uniqueName": "SendPasswordResetCodeAsyncByInput",
+ "name": "SendPasswordResetCodeAsync",
+ "httpMethod": "POST",
+ "url": "api/account/send-password-reset-code",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Account.SendPasswordResetCodeDto, Volo.Abp.Account.Pro.Public.Application.Contracts",
+ "type": "Volo.Abp.Account.SendPasswordResetCodeDto",
+ "typeSimple": "Volo.Abp.Account.SendPasswordResetCodeDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Account.SendPasswordResetCodeDto",
+ "typeSimple": "Volo.Abp.Account.SendPasswordResetCodeDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "ResetPasswordAsyncByInput": {
+ "uniqueName": "ResetPasswordAsyncByInput",
+ "name": "ResetPasswordAsync",
+ "httpMethod": "POST",
+ "url": "api/account/reset-password",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Account.ResetPasswordDto, Volo.Abp.Account.Pro.Public.Application.Contracts",
+ "type": "Volo.Abp.Account.ResetPasswordDto",
+ "typeSimple": "Volo.Abp.Account.ResetPasswordDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Account.ResetPasswordDto",
+ "typeSimple": "Volo.Abp.Account.ResetPasswordDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "SendPhoneNumberConfirmationTokenAsync": {
+ "uniqueName": "SendPhoneNumberConfirmationTokenAsync",
+ "name": "SendPhoneNumberConfirmationTokenAsync",
+ "httpMethod": "POST",
+ "url": "api/account/send-phone-number-confirmation-token",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "ConfirmPhoneNumberAsyncByInput": {
+ "uniqueName": "ConfirmPhoneNumberAsyncByInput",
+ "name": "ConfirmPhoneNumberAsync",
+ "httpMethod": "POST",
+ "url": "api/account/confirm-phone-number",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Account.ConfirmPhoneNumberInput, Volo.Abp.Account.Pro.Public.Application.Contracts",
+ "type": "Volo.Abp.Account.ConfirmPhoneNumberInput",
+ "typeSimple": "Volo.Abp.Account.ConfirmPhoneNumberInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Account.ConfirmPhoneNumberInput",
+ "typeSimple": "Volo.Abp.Account.ConfirmPhoneNumberInput",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "ConfirmEmailAsyncByInput": {
+ "uniqueName": "ConfirmEmailAsyncByInput",
+ "name": "ConfirmEmailAsync",
+ "httpMethod": "POST",
+ "url": "api/account/confirm-email",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Account.ConfirmEmailInput, Volo.Abp.Account.Pro.Public.Application.Contracts",
+ "type": "Volo.Abp.Account.ConfirmEmailInput",
+ "typeSimple": "Volo.Abp.Account.ConfirmEmailInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Account.ConfirmEmailInput",
+ "typeSimple": "Volo.Abp.Account.ConfirmEmailInput",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ }
+ }
+ },
+ "featureManagement": {
+ "rootPath": "featureManagement",
+ "remoteServiceName": "AbpFeatureManagement",
+ "controllers": {
+ "Volo.Abp.FeatureManagement.FeaturesController": {
+ "controllerName": "Features",
+ "type": "Volo.Abp.FeatureManagement.FeaturesController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.FeatureManagement.IFeatureAppService"
+ }
+ ],
+ "actions": {
+ "GetAsyncByProviderNameAndProviderKey": {
+ "uniqueName": "GetAsyncByProviderNameAndProviderKey",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/feature-management/features",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "providerName",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "providerKey",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "providerName",
+ "name": "providerName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "providerKey",
+ "name": "providerKey",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.FeatureManagement.FeatureListDto",
+ "typeSimple": "Volo.Abp.FeatureManagement.FeatureListDto"
+ }
+ },
+ "UpdateAsyncByProviderNameAndProviderKeyAndInput": {
+ "uniqueName": "UpdateAsyncByProviderNameAndProviderKeyAndInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/feature-management/features",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "providerName",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "providerKey",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.FeatureManagement.UpdateFeaturesDto, Volo.Abp.FeatureManagement.Application.Contracts",
+ "type": "Volo.Abp.FeatureManagement.UpdateFeaturesDto",
+ "typeSimple": "Volo.Abp.FeatureManagement.UpdateFeaturesDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "providerName",
+ "name": "providerName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "providerKey",
+ "name": "providerKey",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.FeatureManagement.UpdateFeaturesDto",
+ "typeSimple": "Volo.Abp.FeatureManagement.UpdateFeaturesDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ }
+ }
+ },
+ "textTemplateManagement": {
+ "rootPath": "textTemplateManagement",
+ "remoteServiceName": "TextTemplateManagement",
+ "controllers": {
+ "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateContentController": {
+ "controllerName": "TemplateContent",
+ "type": "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateContentController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.TextTemplateManagement.TextTemplates.ITemplateContentAppService"
+ }
+ ],
+ "actions": {
+ "GetAsyncByInput": {
+ "uniqueName": "GetAsyncByInput",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/text-template-management/template-contents",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateContentInput, Volo.Abp.TextTemplateManagement.Application.Contracts",
+ "type": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateContentInput",
+ "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateContentInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "TemplateName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "CultureName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto",
+ "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto"
+ }
+ },
+ "RestoreToDefaultAsyncByInput": {
+ "uniqueName": "RestoreToDefaultAsyncByInput",
+ "name": "RestoreToDefaultAsync",
+ "httpMethod": "PUT",
+ "url": "api/text-template-management/template-contents/restore-to-default",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput, Volo.Abp.TextTemplateManagement.Application.Contracts",
+ "type": "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput",
+ "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput",
+ "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "UpdateAsyncByInput": {
+ "uniqueName": "UpdateAsyncByInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/text-template-management/template-contents",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput, Volo.Abp.TextTemplateManagement.Application.Contracts",
+ "type": "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput",
+ "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput",
+ "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto",
+ "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto"
+ }
+ }
+ }
+ },
+ "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateDefinitionController": {
+ "controllerName": "TemplateDefinition",
+ "type": "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateDefinitionController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.TextTemplateManagement.TextTemplates.ITemplateDefinitionAppService"
+ }
+ ],
+ "actions": {
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/text-template-management/template-definitions",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateDefinitionListInput, Volo.Abp.TextTemplateManagement.Application.Contracts",
+ "type": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateDefinitionListInput",
+ "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateDefinitionListInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "FilterText",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "GetAsyncByName": {
+ "uniqueName": "GetAsyncByName",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/text-template-management/template-definitions/{name}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "name",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "name",
+ "name": "name",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateDefinitionDto",
+ "typeSimple": "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateDefinitionDto"
+ }
+ }
+ }
+ }
+ }
+ },
+ "languageManagement": {
+ "rootPath": "languageManagement",
+ "remoteServiceName": "LanguageManagement",
+ "controllers": {
+ "Volo.Abp.LanguageManagement.LanguageController": {
+ "controllerName": "Language",
+ "type": "Volo.Abp.LanguageManagement.LanguageController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.LanguageManagement.ILanguageAppService"
+ }
+ ],
+ "actions": {
+ "GetAllListAsync": {
+ "uniqueName": "GetAllListAsync",
+ "name": "GetAllListAsync",
+ "httpMethod": "GET",
+ "url": "api/language-management/languages/all",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.ListResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto"
+ }
+ },
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/language-management/languages",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput, Volo.Abp.LanguageManagement.Application.Contracts",
+ "type": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput",
+ "typeSimple": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "ResourceName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "BaseCultureName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "TargetCultureName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "GetOnlyEmptyValues",
+ "type": "System.Boolean",
+ "typeSimple": "boolean",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.ListResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.ListResultDto"
+ }
+ },
+ "GetAsyncById": {
+ "uniqueName": "GetAsyncById",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/language-management/languages/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.LanguageManagement.Dto.LanguageDto",
+ "typeSimple": "Volo.Abp.LanguageManagement.Dto.LanguageDto"
+ }
+ },
+ "CreateAsyncByInput": {
+ "uniqueName": "CreateAsyncByInput",
+ "name": "CreateAsync",
+ "httpMethod": "POST",
+ "url": "api/language-management/languages",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto, Volo.Abp.LanguageManagement.Application.Contracts",
+ "type": "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto",
+ "typeSimple": "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto",
+ "typeSimple": "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.LanguageManagement.Dto.LanguageDto",
+ "typeSimple": "Volo.Abp.LanguageManagement.Dto.LanguageDto"
+ }
+ },
+ "UpdateAsyncByIdAndInput": {
+ "uniqueName": "UpdateAsyncByIdAndInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/language-management/languages/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.LanguageManagement.Dto.UpdateLanguageDto, Volo.Abp.LanguageManagement.Application.Contracts",
+ "type": "Volo.Abp.LanguageManagement.Dto.UpdateLanguageDto",
+ "typeSimple": "Volo.Abp.LanguageManagement.Dto.UpdateLanguageDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.LanguageManagement.Dto.UpdateLanguageDto",
+ "typeSimple": "Volo.Abp.LanguageManagement.Dto.UpdateLanguageDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.LanguageManagement.Dto.LanguageDto",
+ "typeSimple": "Volo.Abp.LanguageManagement.Dto.LanguageDto"
+ }
+ },
+ "DeleteAsyncById": {
+ "uniqueName": "DeleteAsyncById",
+ "name": "DeleteAsync",
+ "httpMethod": "DELETE",
+ "url": "api/language-management/languages/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "SetAsDefaultAsyncById": {
+ "uniqueName": "SetAsDefaultAsyncById",
+ "name": "SetAsDefaultAsync",
+ "httpMethod": "PUT",
+ "url": "api/language-management/languages/{id}/set-as-default",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "GetResourcesAsync": {
+ "uniqueName": "GetResourcesAsync",
+ "name": "GetResourcesAsync",
+ "httpMethod": "GET",
+ "url": "api/language-management/languages/resources",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.LanguageManagement.Dto.LanguageResourceDto]"
+ }
+ },
+ "GetCulturelistAsync": {
+ "uniqueName": "GetCulturelistAsync",
+ "name": "GetCulturelistAsync",
+ "httpMethod": "GET",
+ "url": "api/language-management/languages/culture-list",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.LanguageManagement.Dto.CultureInfoDto]"
+ }
+ }
+ }
+ },
+ "Volo.Abp.LanguageManagement.LanguageTextController": {
+ "controllerName": "LanguageText",
+ "type": "Volo.Abp.LanguageManagement.LanguageTextController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.LanguageManagement.ILanguageTextAppService"
+ }
+ ],
+ "actions": {
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/language-management/language-texts",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput, Volo.Abp.LanguageManagement.Application.Contracts",
+ "type": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput",
+ "typeSimple": "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "ResourceName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "BaseCultureName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "TargetCultureName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "GetOnlyEmptyValues",
+ "type": "System.Boolean",
+ "typeSimple": "boolean",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "GetAsyncByResourceNameAndCultureNameAndNameAndBaseCultureName": {
+ "uniqueName": "GetAsyncByResourceNameAndCultureNameAndNameAndBaseCultureName",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/language-management/language-texts/{resourceName}/{cultureName}/{name}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "resourceName",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "cultureName",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "name",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "baseCultureName",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "resourceName",
+ "name": "resourceName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "cultureName",
+ "name": "cultureName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "name",
+ "name": "name",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "baseCultureName",
+ "name": "baseCultureName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.LanguageManagement.Dto.LanguageTextDto",
+ "typeSimple": "Volo.Abp.LanguageManagement.Dto.LanguageTextDto"
+ }
+ },
+ "UpdateAsyncByResourceNameAndCultureNameAndNameAndValue": {
+ "uniqueName": "UpdateAsyncByResourceNameAndCultureNameAndNameAndValue",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/language-management/language-texts/{resourceName}/{cultureName}/{name}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "resourceName",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "cultureName",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "name",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "value",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "resourceName",
+ "name": "resourceName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "cultureName",
+ "name": "cultureName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "name",
+ "name": "name",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "value",
+ "name": "value",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "RestoreToDefaultAsyncByResourceNameAndCultureNameAndName": {
+ "uniqueName": "RestoreToDefaultAsyncByResourceNameAndCultureNameAndName",
+ "name": "RestoreToDefaultAsync",
+ "httpMethod": "PUT",
+ "url": "api/language-management/language-texts/{resourceName}/{cultureName}/{name}/restore",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "resourceName",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "cultureName",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "name",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "resourceName",
+ "name": "resourceName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "cultureName",
+ "name": "cultureName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "name",
+ "name": "name",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ }
+ }
+ },
+ "saas": {
+ "rootPath": "saas",
+ "remoteServiceName": "SaasHost",
+ "controllers": {
+ "Volo.Saas.Host.EditionController": {
+ "controllerName": "Edition",
+ "type": "Volo.Saas.Host.EditionController",
+ "interfaces": [
+ {
+ "type": "Volo.Saas.Host.IEditionAppService"
+ }
+ ],
+ "actions": {
+ "GetAsyncById": {
+ "uniqueName": "GetAsyncById",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/saas/editions/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Saas.Host.Dtos.EditionDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.EditionDto"
+ }
+ },
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/saas/editions",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Saas.Host.Dtos.GetEditionsInput, Volo.Saas.Host.Application.Contracts",
+ "type": "Volo.Saas.Host.Dtos.GetEditionsInput",
+ "typeSimple": "Volo.Saas.Host.Dtos.GetEditionsInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "CreateAsyncByInput": {
+ "uniqueName": "CreateAsyncByInput",
+ "name": "CreateAsync",
+ "httpMethod": "POST",
+ "url": "api/saas/editions",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Saas.Host.Dtos.EditionCreateDto, Volo.Saas.Host.Application.Contracts",
+ "type": "Volo.Saas.Host.Dtos.EditionCreateDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.EditionCreateDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Saas.Host.Dtos.EditionCreateDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.EditionCreateDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Saas.Host.Dtos.EditionDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.EditionDto"
+ }
+ },
+ "UpdateAsyncByIdAndInput": {
+ "uniqueName": "UpdateAsyncByIdAndInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/saas/editions/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Saas.Host.Dtos.EditionUpdateDto, Volo.Saas.Host.Application.Contracts",
+ "type": "Volo.Saas.Host.Dtos.EditionUpdateDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.EditionUpdateDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Saas.Host.Dtos.EditionUpdateDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.EditionUpdateDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Saas.Host.Dtos.EditionDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.EditionDto"
+ }
+ },
+ "DeleteAsyncById": {
+ "uniqueName": "DeleteAsyncById",
+ "name": "DeleteAsync",
+ "httpMethod": "DELETE",
+ "url": "api/saas/editions/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "GetUsageStatistics": {
+ "uniqueName": "GetUsageStatistics",
+ "name": "GetUsageStatistics",
+ "httpMethod": "GET",
+ "url": "api/saas/editions/statistics/usage-statistic",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "Volo.Saas.Host.GetEditionUsageStatisticsResult",
+ "typeSimple": "Volo.Saas.Host.GetEditionUsageStatisticsResult"
+ }
+ }
+ }
+ },
+ "Volo.Saas.Host.TenantController": {
+ "controllerName": "Tenant",
+ "type": "Volo.Saas.Host.TenantController",
+ "interfaces": [
+ {
+ "type": "Volo.Saas.Host.ITenantAppService"
+ }
+ ],
+ "actions": {
+ "GetAsyncById": {
+ "uniqueName": "GetAsyncById",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/saas/tenants/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Saas.Host.Dtos.SaasTenantDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantDto"
+ }
+ },
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/saas/tenants",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Saas.Host.Dtos.GetTenantsInput, Volo.Saas.Host.Application.Contracts",
+ "type": "Volo.Saas.Host.Dtos.GetTenantsInput",
+ "typeSimple": "Volo.Saas.Host.Dtos.GetTenantsInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "GetEditionNames",
+ "type": "System.Boolean",
+ "typeSimple": "boolean",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "CreateAsyncByInput": {
+ "uniqueName": "CreateAsyncByInput",
+ "name": "CreateAsync",
+ "httpMethod": "POST",
+ "url": "api/saas/tenants",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Saas.Host.Dtos.SaasTenantCreateDto, Volo.Saas.Host.Application.Contracts",
+ "type": "Volo.Saas.Host.Dtos.SaasTenantCreateDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantCreateDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Saas.Host.Dtos.SaasTenantCreateDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantCreateDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Saas.Host.Dtos.SaasTenantDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantDto"
+ }
+ },
+ "UpdateAsyncByIdAndInput": {
+ "uniqueName": "UpdateAsyncByIdAndInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/saas/tenants/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Saas.Host.Dtos.SaasTenantUpdateDto, Volo.Saas.Host.Application.Contracts",
+ "type": "Volo.Saas.Host.Dtos.SaasTenantUpdateDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantUpdateDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Saas.Host.Dtos.SaasTenantUpdateDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantUpdateDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Saas.Host.Dtos.SaasTenantDto",
+ "typeSimple": "Volo.Saas.Host.Dtos.SaasTenantDto"
+ }
+ },
+ "DeleteAsyncById": {
+ "uniqueName": "DeleteAsyncById",
+ "name": "DeleteAsync",
+ "httpMethod": "DELETE",
+ "url": "api/saas/tenants/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "GetDefaultConnectionStringAsyncById": {
+ "uniqueName": "GetDefaultConnectionStringAsyncById",
+ "name": "GetDefaultConnectionStringAsync",
+ "httpMethod": "GET",
+ "url": "api/saas/tenants/{id}/default-connection-string",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ },
+ "UpdateDefaultConnectionStringAsyncByIdAndDefaultConnectionString": {
+ "uniqueName": "UpdateDefaultConnectionStringAsyncByIdAndDefaultConnectionString",
+ "name": "UpdateDefaultConnectionStringAsync",
+ "httpMethod": "PUT",
+ "url": "api/saas/tenants/{id}/default-connection-string",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "defaultConnectionString",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "defaultConnectionString",
+ "name": "defaultConnectionString",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "DeleteDefaultConnectionStringAsyncById": {
+ "uniqueName": "DeleteDefaultConnectionStringAsyncById",
+ "name": "DeleteDefaultConnectionStringAsync",
+ "httpMethod": "DELETE",
+ "url": "api/saas/tenants/{id}/default-connection-string",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ }
+ }
+ },
+ "abp": {
+ "rootPath": "abp",
+ "remoteServiceName": "abp",
+ "controllers": {
+ "Pages.Abp.MultiTenancy.AbpTenantController": {
+ "controllerName": "AbpTenant",
+ "type": "Pages.Abp.MultiTenancy.AbpTenantController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.IAbpTenantAppService"
+ }
+ ],
+ "actions": {
+ "FindTenantByNameAsyncByName": {
+ "uniqueName": "FindTenantByNameAsyncByName",
+ "name": "FindTenantByNameAsync",
+ "httpMethod": "GET",
+ "url": "api/abp/multi-tenancy/tenants/by-name/{name}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "name",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "name",
+ "name": "name",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto"
+ }
+ },
+ "FindTenantByIdAsyncById": {
+ "uniqueName": "FindTenantByIdAsyncById",
+ "name": "FindTenantByIdAsync",
+ "httpMethod": "GET",
+ "url": "api/abp/multi-tenancy/tenants/by-id/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto"
+ }
+ }
+ }
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController": {
+ "controllerName": "AbpApplicationConfiguration",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationConfigurationAppService"
+ }
+ ],
+ "actions": {
+ "GetAsync": {
+ "uniqueName": "GetAsync",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/abp/application-configuration",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto"
+ }
+ }
+ }
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController": {
+ "controllerName": "AbpApiDefinition",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController",
+ "interfaces": [],
+ "actions": {
+ "GetByModel": {
+ "uniqueName": "GetByModel",
+ "name": "Get",
+ "httpMethod": "GET",
+ "url": "api/abp/api-definition",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "model",
+ "typeAsString": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto, Volo.Abp.Http",
+ "type": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto",
+ "typeSimple": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "model",
+ "name": "IncludeTypes",
+ "type": "System.Boolean",
+ "typeSimple": "boolean",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "model"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel",
+ "typeSimple": "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel"
+ }
+ }
+ }
+ }
+ }
+ },
+ "identityServer": {
+ "rootPath": "identityServer",
+ "remoteServiceName": "AbpIdentityServer",
+ "controllers": {
+ "Volo.Abp.IdentityServer.ApiResourcesController": {
+ "controllerName": "ApiResources",
+ "type": "Volo.Abp.IdentityServer.ApiResourcesController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.IdentityServer.ApiResource.IApiResourceAppService"
+ }
+ ],
+ "actions": {
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/identity-server/api-resources",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.IdentityServer.ApiResource.Dtos.GetApiResourceListInput, Volo.Abp.IdentityServer.Application.Contracts",
+ "type": "Volo.Abp.IdentityServer.ApiResource.Dtos.GetApiResourceListInput",
+ "typeSimple": "Volo.Abp.IdentityServer.ApiResource.Dtos.GetApiResourceListInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "GetAllListAsync": {
+ "uniqueName": "GetAllListAsync",
+ "name": "GetAllListAsync",
+ "httpMethod": "GET",
+ "url": "api/identity-server/api-resources/all",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.IdentityServer.ApiResource.Dtos.ApiResourceWithDetailsDto]"
+ }
+ },
+ "GetAsyncById": {
+ "uniqueName": "GetAsyncById",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/identity-server/api-resources/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.IdentityServer.ApiResource.Dtos.ApiResourceWithDetailsDto",
+ "typeSimple": "Volo.Abp.IdentityServer.ApiResource.Dtos.ApiResourceWithDetailsDto"
+ }
+ },
+ "CreateAsyncByInput": {
+ "uniqueName": "CreateAsyncByInput",
+ "name": "CreateAsync",
+ "httpMethod": "POST",
+ "url": "api/identity-server/api-resources",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.IdentityServer.ApiResource.Dtos.CreateApiResourceDto, Volo.Abp.IdentityServer.Application.Contracts",
+ "type": "Volo.Abp.IdentityServer.ApiResource.Dtos.CreateApiResourceDto",
+ "typeSimple": "Volo.Abp.IdentityServer.ApiResource.Dtos.CreateApiResourceDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.IdentityServer.ApiResource.Dtos.CreateApiResourceDto",
+ "typeSimple": "Volo.Abp.IdentityServer.ApiResource.Dtos.CreateApiResourceDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.IdentityServer.ApiResource.Dtos.ApiResourceWithDetailsDto",
+ "typeSimple": "Volo.Abp.IdentityServer.ApiResource.Dtos.ApiResourceWithDetailsDto"
+ }
+ },
+ "UpdateAsyncByIdAndInput": {
+ "uniqueName": "UpdateAsyncByIdAndInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity-server/api-resources/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.IdentityServer.ApiResource.Dtos.UpdateApiResourceDto, Volo.Abp.IdentityServer.Application.Contracts",
+ "type": "Volo.Abp.IdentityServer.ApiResource.Dtos.UpdateApiResourceDto",
+ "typeSimple": "Volo.Abp.IdentityServer.ApiResource.Dtos.UpdateApiResourceDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.IdentityServer.ApiResource.Dtos.UpdateApiResourceDto",
+ "typeSimple": "Volo.Abp.IdentityServer.ApiResource.Dtos.UpdateApiResourceDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.IdentityServer.ApiResource.Dtos.ApiResourceWithDetailsDto",
+ "typeSimple": "Volo.Abp.IdentityServer.ApiResource.Dtos.ApiResourceWithDetailsDto"
+ }
+ },
+ "DeleteAsyncById": {
+ "uniqueName": "DeleteAsyncById",
+ "name": "DeleteAsync",
+ "httpMethod": "DELETE",
+ "url": "api/identity-server/api-resources",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ },
+ "Volo.Abp.IdentityServer.ClientsController": {
+ "controllerName": "Clients",
+ "type": "Volo.Abp.IdentityServer.ClientsController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.IdentityServer.Client.IClientAppService"
+ }
+ ],
+ "actions": {
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/identity-server/clients",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.IdentityServer.Client.Dtos.GetClientListInput, Volo.Abp.IdentityServer.Application.Contracts",
+ "type": "Volo.Abp.IdentityServer.Client.Dtos.GetClientListInput",
+ "typeSimple": "Volo.Abp.IdentityServer.Client.Dtos.GetClientListInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "GetAsyncById": {
+ "uniqueName": "GetAsyncById",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/identity-server/clients/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.IdentityServer.Client.Dtos.ClientWithDetailsDto",
+ "typeSimple": "Volo.Abp.IdentityServer.Client.Dtos.ClientWithDetailsDto"
+ }
+ },
+ "CreateAsyncByInput": {
+ "uniqueName": "CreateAsyncByInput",
+ "name": "CreateAsync",
+ "httpMethod": "POST",
+ "url": "api/identity-server/clients",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.IdentityServer.Client.Dtos.CreateClientDto, Volo.Abp.IdentityServer.Application.Contracts",
+ "type": "Volo.Abp.IdentityServer.Client.Dtos.CreateClientDto",
+ "typeSimple": "Volo.Abp.IdentityServer.Client.Dtos.CreateClientDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.IdentityServer.Client.Dtos.CreateClientDto",
+ "typeSimple": "Volo.Abp.IdentityServer.Client.Dtos.CreateClientDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.IdentityServer.Client.Dtos.ClientWithDetailsDto",
+ "typeSimple": "Volo.Abp.IdentityServer.Client.Dtos.ClientWithDetailsDto"
+ }
+ },
+ "UpdateAsyncByIdAndInput": {
+ "uniqueName": "UpdateAsyncByIdAndInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity-server/clients/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.IdentityServer.Client.Dtos.UpdateClientDto, Volo.Abp.IdentityServer.Application.Contracts",
+ "type": "Volo.Abp.IdentityServer.Client.Dtos.UpdateClientDto",
+ "typeSimple": "Volo.Abp.IdentityServer.Client.Dtos.UpdateClientDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.IdentityServer.Client.Dtos.UpdateClientDto",
+ "typeSimple": "Volo.Abp.IdentityServer.Client.Dtos.UpdateClientDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.IdentityServer.Client.Dtos.ClientWithDetailsDto",
+ "typeSimple": "Volo.Abp.IdentityServer.Client.Dtos.ClientWithDetailsDto"
+ }
+ },
+ "DeleteAsyncById": {
+ "uniqueName": "DeleteAsyncById",
+ "name": "DeleteAsync",
+ "httpMethod": "DELETE",
+ "url": "api/identity-server/clients",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ },
+ "Volo.Abp.IdentityServer.IdentityResourcesController": {
+ "controllerName": "IdentityResources",
+ "type": "Volo.Abp.IdentityServer.IdentityResourcesController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.IdentityServer.IdentityResource.IIdentityResourceAppService"
+ }
+ ],
+ "actions": {
+ "GetListAsyncByInput": {
+ "uniqueName": "GetListAsyncByInput",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/identity-server/identity-resources",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.IdentityServer.IdentityResource.Dtos.GetIdentityResourceListInput, Volo.Abp.IdentityServer.Application.Contracts",
+ "type": "Volo.Abp.IdentityServer.IdentityResource.Dtos.GetIdentityResourceListInput",
+ "typeSimple": "Volo.Abp.IdentityServer.IdentityResource.Dtos.GetIdentityResourceListInput",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": "input"
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.Application.Dtos.PagedResultDto",
+ "typeSimple": "Volo.Abp.Application.Dtos.PagedResultDto"
+ }
+ },
+ "GetAllListAsync": {
+ "uniqueName": "GetAllListAsync",
+ "name": "GetAllListAsync",
+ "httpMethod": "GET",
+ "url": "api/identity-server/identity-resources/all",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.IdentityServer.IdentityResource.Dtos.IdentityResourceWithDetailsDto]"
+ }
+ },
+ "GetAsyncById": {
+ "uniqueName": "GetAsyncById",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/identity-server/identity-resources/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.IdentityServer.IdentityResource.Dtos.IdentityResourceWithDetailsDto",
+ "typeSimple": "Volo.Abp.IdentityServer.IdentityResource.Dtos.IdentityResourceWithDetailsDto"
+ }
+ },
+ "CreateAsyncByInput": {
+ "uniqueName": "CreateAsyncByInput",
+ "name": "CreateAsync",
+ "httpMethod": "POST",
+ "url": "api/identity-server/identity-resources",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.IdentityServer.IdentityResource.Dtos.CreateIdentityResourceDto, Volo.Abp.IdentityServer.Application.Contracts",
+ "type": "Volo.Abp.IdentityServer.IdentityResource.Dtos.CreateIdentityResourceDto",
+ "typeSimple": "Volo.Abp.IdentityServer.IdentityResource.Dtos.CreateIdentityResourceDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.IdentityServer.IdentityResource.Dtos.CreateIdentityResourceDto",
+ "typeSimple": "Volo.Abp.IdentityServer.IdentityResource.Dtos.CreateIdentityResourceDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.IdentityServer.IdentityResource.Dtos.IdentityResourceWithDetailsDto",
+ "typeSimple": "Volo.Abp.IdentityServer.IdentityResource.Dtos.IdentityResourceWithDetailsDto"
+ }
+ },
+ "UpdateAsyncByIdAndInput": {
+ "uniqueName": "UpdateAsyncByIdAndInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/identity-server/identity-resources/{id}",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.IdentityServer.IdentityResource.Dtos.UpdateIdentityResourceDto, Volo.Abp.IdentityServer.Application.Contracts",
+ "type": "Volo.Abp.IdentityServer.IdentityResource.Dtos.UpdateIdentityResourceDto",
+ "typeSimple": "Volo.Abp.IdentityServer.IdentityResource.Dtos.UpdateIdentityResourceDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": [],
+ "bindingSourceId": "Path",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.IdentityServer.IdentityResource.Dtos.UpdateIdentityResourceDto",
+ "typeSimple": "Volo.Abp.IdentityServer.IdentityResource.Dtos.UpdateIdentityResourceDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.IdentityServer.IdentityResource.Dtos.IdentityResourceWithDetailsDto",
+ "typeSimple": "Volo.Abp.IdentityServer.IdentityResource.Dtos.IdentityResourceWithDetailsDto"
+ }
+ },
+ "DeleteAsyncById": {
+ "uniqueName": "DeleteAsyncById",
+ "name": "DeleteAsync",
+ "httpMethod": "DELETE",
+ "url": "api/identity-server/identity-resources",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "id",
+ "typeAsString": "System.Guid, System.Private.CoreLib",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "id",
+ "name": "id",
+ "type": "System.Guid",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ },
+ "CreateStandardResourcesAsync": {
+ "uniqueName": "CreateStandardResourcesAsync",
+ "name": "CreateStandardResourcesAsync",
+ "httpMethod": "POST",
+ "url": "api/identity-server/identity-resources/create-standard-resources",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ },
+ "Volo.Abp.IdentityServer.IdentityServerClaimTypesController": {
+ "controllerName": "IdentityServerClaimTypes",
+ "type": "Volo.Abp.IdentityServer.IdentityServerClaimTypesController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.IdentityServer.ClaimType.IIdentityServerClaimTypeAppService"
+ }
+ ],
+ "actions": {
+ "GetListAsync": {
+ "uniqueName": "GetListAsync",
+ "name": "GetListAsync",
+ "httpMethod": "GET",
+ "url": "api/identity-server/claim-types",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "System.Collections.Generic.List",
+ "typeSimple": "[Volo.Abp.IdentityServer.ClaimType.Dtos.IdentityClaimTypeDto]"
+ }
+ }
+ }
+ }
+ }
+ },
+ "accountAdmin": {
+ "rootPath": "accountAdmin",
+ "remoteServiceName": "AbpAccountAdmin",
+ "controllers": {
+ "Volo.Abp.Account.AccountSettingsController": {
+ "controllerName": "AccountSettings",
+ "type": "Volo.Abp.Account.AccountSettingsController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.Account.IAccountSettingsAppService"
+ }
+ ],
+ "actions": {
+ "GetAsync": {
+ "uniqueName": "GetAsync",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/account-admin/settings",
+ "supportedVersions": [],
+ "parametersOnMethod": [],
+ "parameters": [],
+ "returnValue": {
+ "type": "Volo.Abp.Account.AccountSettingsDto",
+ "typeSimple": "Volo.Abp.Account.AccountSettingsDto"
+ }
+ },
+ "UpdateAsyncByInput": {
+ "uniqueName": "UpdateAsyncByInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/account-admin/settings",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.Account.AccountSettingsDto, Volo.Abp.Account.Pro.Admin.Application.Contracts",
+ "type": "Volo.Abp.Account.AccountSettingsDto",
+ "typeSimple": "Volo.Abp.Account.AccountSettingsDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.Account.AccountSettingsDto",
+ "typeSimple": "Volo.Abp.Account.AccountSettingsDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ }
+ }
+ },
+ "permissionManagement": {
+ "rootPath": "permissionManagement",
+ "remoteServiceName": "AbpPermissionManagement",
+ "controllers": {
+ "Volo.Abp.PermissionManagement.PermissionsController": {
+ "controllerName": "Permissions",
+ "type": "Volo.Abp.PermissionManagement.PermissionsController",
+ "interfaces": [
+ {
+ "type": "Volo.Abp.PermissionManagement.IPermissionAppService"
+ }
+ ],
+ "actions": {
+ "GetAsyncByProviderNameAndProviderKey": {
+ "uniqueName": "GetAsyncByProviderNameAndProviderKey",
+ "name": "GetAsync",
+ "httpMethod": "GET",
+ "url": "api/permission-management/permissions",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "providerName",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "providerKey",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "providerName",
+ "name": "providerName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "providerKey",
+ "name": "providerKey",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "Volo.Abp.PermissionManagement.GetPermissionListResultDto",
+ "typeSimple": "Volo.Abp.PermissionManagement.GetPermissionListResultDto"
+ }
+ },
+ "UpdateAsyncByProviderNameAndProviderKeyAndInput": {
+ "uniqueName": "UpdateAsyncByProviderNameAndProviderKeyAndInput",
+ "name": "UpdateAsync",
+ "httpMethod": "PUT",
+ "url": "api/permission-management/permissions",
+ "supportedVersions": [],
+ "parametersOnMethod": [
+ {
+ "name": "providerName",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "providerKey",
+ "typeAsString": "System.String, System.Private.CoreLib",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null
+ },
+ {
+ "name": "input",
+ "typeAsString": "Volo.Abp.PermissionManagement.UpdatePermissionsDto, Volo.Abp.PermissionManagement.Application.Contracts",
+ "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto",
+ "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto",
+ "isOptional": false,
+ "defaultValue": null
+ }
+ ],
+ "parameters": [
+ {
+ "nameOnMethod": "providerName",
+ "name": "providerName",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "providerKey",
+ "name": "providerKey",
+ "type": "System.String",
+ "typeSimple": "string",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "ModelBinding",
+ "descriptorName": ""
+ },
+ {
+ "nameOnMethod": "input",
+ "name": "input",
+ "type": "Volo.Abp.PermissionManagement.UpdatePermissionsDto",
+ "typeSimple": "Volo.Abp.PermissionManagement.UpdatePermissionsDto",
+ "isOptional": false,
+ "defaultValue": null,
+ "constraintTypes": null,
+ "bindingSourceId": "Body",
+ "descriptorName": ""
+ }
+ ],
+ "returnValue": {
+ "type": "System.Void",
+ "typeSimple": "System.Void"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "types": {
+ "Volo.Abp.Account.AccountSettingsDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "IsSelfRegistrationEnabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "EnableLocalLogin",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "IsRememberBrowserEnabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.UserLoginInfo": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "UserNameOrEmailAddress",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Password",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "RememberMe",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "TenanId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ }
+ ]
+ },
+ "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.AbpLoginResult": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Result",
+ "type": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.LoginResultType",
+ "typeSimple": "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.LoginResultType"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Account.Public.Web.Areas.Account.Controllers.Models.LoginResultType": {
+ "baseType": "System.Enum",
+ "isEnum": true,
+ "enumNames": [
+ "Success",
+ "InvalidUserNameOrPassword",
+ "NotAllowed",
+ "LockedOut",
+ "RequiresTwoFactor"
+ ],
+ "enumValues": [1, 2, 3, 4, 5],
+ "genericArguments": null,
+ "properties": null
+ },
+ "Volo.Abp.Account.RegisterDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "EmailAddress",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Password",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "AppName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityUserDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "TenantId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Email",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Surname",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "EmailConfirmed",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "PhoneNumber",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "PhoneNumberConfirmed",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "TwoFactorEnabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "LockoutEnabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "IsLockedOut",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "ConcurrencyStamp",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Application.Dtos.ExtensibleEntityDto": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": ["TKey"],
+ "properties": [
+ {
+ "name": "Id",
+ "type": "TKey",
+ "typeSimple": "TKey"
+ }
+ ]
+ },
+ "Volo.Abp.ObjectExtending.ExtensibleObject": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ExtraProperties",
+ "type": "{System.String:System.Object}",
+ "typeSimple": "{string:object}"
+ }
+ ]
+ },
+ "Volo.Abp.Account.SendPasswordResetCodeDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Email",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "AppName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Account.ResetPasswordDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "UserId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ResetToken",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Password",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Account.ConfirmPhoneNumberInput": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Token",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Account.ConfirmEmailInput": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "UserId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Token",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.MultiTenancy.FindTenantResultDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Success",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "TenantId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.AuditLogging.GetAuditLogListDto": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Url",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ApplicationName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "CorrelationId",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "HttpMethod",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "HttpStatusCode",
+ "type": "System.Net.HttpStatusCode?",
+ "typeSimple": "System.Net.HttpStatusCode?"
+ },
+ {
+ "name": "MaxExecutionDuration",
+ "type": "System.Int32?",
+ "typeSimple": "number?"
+ },
+ {
+ "name": "MinExecutionDuration",
+ "type": "System.Int32?",
+ "typeSimple": "number?"
+ },
+ {
+ "name": "HasException",
+ "type": "System.Boolean?",
+ "typeSimple": "boolean?"
+ }
+ ]
+ },
+ "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Application.Dtos.PagedResultRequestDto": {
+ "baseType": "Volo.Abp.Application.Dtos.LimitedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "SkipCount",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ }
+ ]
+ },
+ "Volo.Abp.Application.Dtos.LimitedResultRequestDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "DefaultMaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "MaxMaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "MaxResultCount",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ }
+ ]
+ },
+ "System.Nullable": {
+ "baseType": "System.ValueType",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": ["T"],
+ "properties": [
+ {
+ "name": "HasValue",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Value",
+ "type": "T",
+ "typeSimple": "T"
+ }
+ ]
+ },
+ "System.Net.HttpStatusCode": {
+ "baseType": "System.Enum",
+ "isEnum": true,
+ "enumNames": [
+ "Continue",
+ "SwitchingProtocols",
+ "Processing",
+ "EarlyHints",
+ "OK",
+ "Created",
+ "Accepted",
+ "NonAuthoritativeInformation",
+ "NoContent",
+ "ResetContent",
+ "PartialContent",
+ "MultiStatus",
+ "AlreadyReported",
+ "IMUsed",
+ "MultipleChoices",
+ "Ambiguous",
+ "MovedPermanently",
+ "Moved",
+ "Found",
+ "Redirect",
+ "SeeOther",
+ "RedirectMethod",
+ "NotModified",
+ "UseProxy",
+ "Unused",
+ "TemporaryRedirect",
+ "RedirectKeepVerb",
+ "PermanentRedirect",
+ "BadRequest",
+ "Unauthorized",
+ "PaymentRequired",
+ "Forbidden",
+ "NotFound",
+ "MethodNotAllowed",
+ "NotAcceptable",
+ "ProxyAuthenticationRequired",
+ "RequestTimeout",
+ "Conflict",
+ "Gone",
+ "LengthRequired",
+ "PreconditionFailed",
+ "RequestEntityTooLarge",
+ "RequestUriTooLong",
+ "UnsupportedMediaType",
+ "RequestedRangeNotSatisfiable",
+ "ExpectationFailed",
+ "MisdirectedRequest",
+ "UnprocessableEntity",
+ "Locked",
+ "FailedDependency",
+ "UpgradeRequired",
+ "PreconditionRequired",
+ "TooManyRequests",
+ "RequestHeaderFieldsTooLarge",
+ "UnavailableForLegalReasons",
+ "InternalServerError",
+ "NotImplemented",
+ "BadGateway",
+ "ServiceUnavailable",
+ "GatewayTimeout",
+ "HttpVersionNotSupported",
+ "VariantAlsoNegotiates",
+ "InsufficientStorage",
+ "LoopDetected",
+ "NotExtended",
+ "NetworkAuthenticationRequired"
+ ],
+ "enumValues": [
+ 100,
+ 101,
+ 102,
+ 103,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 226,
+ 300,
+ 300,
+ 301,
+ 301,
+ 302,
+ 302,
+ 303,
+ 303,
+ 304,
+ 305,
+ 306,
+ 307,
+ 307,
+ 308,
+ 400,
+ 401,
+ 402,
+ 403,
+ 404,
+ 405,
+ 406,
+ 407,
+ 408,
+ 409,
+ 410,
+ 411,
+ 412,
+ 413,
+ 414,
+ 415,
+ 416,
+ 417,
+ 421,
+ 422,
+ 423,
+ 424,
+ 426,
+ 428,
+ 429,
+ 431,
+ 451,
+ 500,
+ 501,
+ 502,
+ 503,
+ 504,
+ 505,
+ 506,
+ 507,
+ 508,
+ 510,
+ 511
+ ],
+ "genericArguments": null,
+ "properties": null
+ },
+ "Volo.Abp.Application.Dtos.PagedResultDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ListResultDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": ["T"],
+ "properties": [
+ {
+ "name": "TotalCount",
+ "type": "System.Int64",
+ "typeSimple": "number"
+ }
+ ]
+ },
+ "Volo.Abp.Application.Dtos.ListResultDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": ["T"],
+ "properties": [
+ {
+ "name": "Items",
+ "type": "[T]",
+ "typeSimple": "[T]"
+ }
+ ]
+ },
+ "Volo.Abp.AuditLogging.AuditLogDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "UserId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "TenantId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "ImpersonatorUserId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "ImpersonatorTenantId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "ExecutionTime",
+ "type": "System.DateTime",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ExecutionDuration",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "ClientIpAddress",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ClientName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "BrowserInfo",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "HttpMethod",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Url",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Exceptions",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Comments",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "HttpStatusCode",
+ "type": "System.Int32?",
+ "typeSimple": "number?"
+ },
+ {
+ "name": "ApplicationName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "CorrelationId",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "EntityChanges",
+ "type": "[Volo.Abp.AuditLogging.EntityChangeDto]",
+ "typeSimple": "[Volo.Abp.AuditLogging.EntityChangeDto]"
+ },
+ {
+ "name": "Actions",
+ "type": "[Volo.Abp.AuditLogging.AuditLogActionDto]",
+ "typeSimple": "[Volo.Abp.AuditLogging.AuditLogActionDto]"
+ }
+ ]
+ },
+ "Volo.Abp.AuditLogging.EntityChangeDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "AuditLogId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "TenantId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "ChangeTime",
+ "type": "System.DateTime",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ChangeType",
+ "type": "Volo.Abp.Auditing.EntityChangeType",
+ "typeSimple": "Volo.Abp.Auditing.EntityChangeType"
+ },
+ {
+ "name": "EntityId",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "EntityTypeFullName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "PropertyChanges",
+ "type": "[Volo.Abp.AuditLogging.EntityPropertyChangeDto]",
+ "typeSimple": "[Volo.Abp.AuditLogging.EntityPropertyChangeDto]"
+ }
+ ]
+ },
+ "Volo.Abp.Auditing.EntityChangeType": {
+ "baseType": "System.Enum",
+ "isEnum": true,
+ "enumNames": ["Created", "Updated", "Deleted"],
+ "enumValues": [0, 1, 2],
+ "genericArguments": null,
+ "properties": null
+ },
+ "Volo.Abp.AuditLogging.EntityPropertyChangeDto": {
+ "baseType": "Volo.Abp.Application.Dtos.EntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "TenantId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "EntityChangeId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "NewValue",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "OriginalValue",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "PropertyName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "PropertyTypeFullName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Application.Dtos.EntityDto": {
+ "baseType": "Volo.Abp.Application.Dtos.EntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": ["TKey"],
+ "properties": [
+ {
+ "name": "Id",
+ "type": "TKey",
+ "typeSimple": "TKey"
+ }
+ ]
+ },
+ "Volo.Abp.Application.Dtos.EntityDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": []
+ },
+ "Volo.Abp.AuditLogging.AuditLogActionDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "TenantId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "AuditLogId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ServiceName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "MethodName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Parameters",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ExecutionTime",
+ "type": "System.DateTime",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ExecutionDuration",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ }
+ ]
+ },
+ "Volo.Abp.AuditLogging.GetErrorRateFilter": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "StartDate",
+ "type": "System.DateTime",
+ "typeSimple": "string"
+ },
+ {
+ "name": "EndDate",
+ "type": "System.DateTime",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.AuditLogging.GetErrorRateOutput": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Data",
+ "type": "{System.String:System.Int64}",
+ "typeSimple": "{string:number}"
+ }
+ ]
+ },
+ "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayInput": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "StartDate",
+ "type": "System.DateTime",
+ "typeSimple": "string"
+ },
+ {
+ "name": "EndDate",
+ "type": "System.DateTime",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.AuditLogging.GetAverageExecutionDurationPerDayOutput": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Data",
+ "type": "{System.String:System.Double}",
+ "typeSimple": "{string:number}"
+ }
+ ]
+ },
+ "Volo.Abp.AuditLogging.GetEntityChangesDto": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "AuditLogId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "EntityChangeType",
+ "type": "Volo.Abp.Auditing.EntityChangeType?",
+ "typeSimple": "Volo.Abp.Auditing.EntityChangeType?"
+ },
+ {
+ "name": "EntityId",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "EntityTypeFullName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "StartDate",
+ "type": "System.DateTime?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "EndDate",
+ "type": "System.DateTime?",
+ "typeSimple": "string?"
+ }
+ ]
+ },
+ "Volo.Abp.AuditLogging.EntityChangeFilter": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "EntityId",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "EntityTypeFullName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.AuditLogging.EntityChangeWithUsernameDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "EntityChange",
+ "type": "Volo.Abp.AuditLogging.EntityChangeDto",
+ "typeSimple": "Volo.Abp.AuditLogging.EntityChangeDto"
+ },
+ {
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.GetIdentityClaimTypesInput": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.ClaimTypeDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Required",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "IsStatic",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Regex",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "RegexDescription",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ValueType",
+ "type": "Volo.Abp.Identity.IdentityClaimValueType",
+ "typeSimple": "Volo.Abp.Identity.IdentityClaimValueType"
+ },
+ {
+ "name": "ValueTypeAsString",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityClaimValueType": {
+ "baseType": "System.Enum",
+ "isEnum": true,
+ "enumNames": ["String", "Int", "Boolean", "DateTime"],
+ "enumValues": [0, 1, 2, 3],
+ "genericArguments": null,
+ "properties": null
+ },
+ "Volo.Abp.Identity.CreateClaimTypeDto": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Required",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Regex",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "RegexDescription",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ValueType",
+ "type": "Volo.Abp.Identity.IdentityClaimValueType",
+ "typeSimple": "Volo.Abp.Identity.IdentityClaimValueType"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.UpdateClaimTypeDto": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Required",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Regex",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "RegexDescription",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ValueType",
+ "type": "Volo.Abp.Identity.IdentityClaimValueType",
+ "typeSimple": "Volo.Abp.Identity.IdentityClaimValueType"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityRoleDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsDefault",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "IsStatic",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "IsPublic",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "ConcurrencyStamp",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityRoleCreateDto": {
+ "baseType": "Volo.Abp.Identity.IdentityRoleCreateOrUpdateDtoBase",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": []
+ },
+ "Volo.Abp.Identity.IdentityRoleCreateOrUpdateDtoBase": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsDefault",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "IsPublic",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityRoleUpdateDto": {
+ "baseType": "Volo.Abp.Identity.IdentityRoleCreateOrUpdateDtoBase",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ConcurrencyStamp",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.GetIdentityRoleListInput": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityRoleClaimDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "RoleId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ClaimType",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ClaimValue",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.GetIdentitySecurityLogListInput": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "StartTime",
+ "type": "System.DateTime?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "EndTime",
+ "type": "System.DateTime?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "ApplicationName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Identity",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Action",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ClientId",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "CorrelationId",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentitySecurityLogDto": {
+ "baseType": "Volo.Abp.Application.Dtos.EntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "TenantId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "ApplicationName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Identity",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Action",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "UserId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "TenantName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ClientId",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "CorrelationId",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ClientIpAddress",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "BrowserInfo",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "CreationTime",
+ "type": "System.DateTime",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ExtraProperties",
+ "type": "{System.String:System.Object}",
+ "typeSimple": "{string:object}"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentitySettingsDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Password",
+ "type": "Volo.Abp.Identity.IdentityPasswordSettingsDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityPasswordSettingsDto"
+ },
+ {
+ "name": "Lockout",
+ "type": "Volo.Abp.Identity.IdentityLockoutSettingsDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityLockoutSettingsDto"
+ },
+ {
+ "name": "SignIn",
+ "type": "Volo.Abp.Identity.IdentitySignInSettingsDto",
+ "typeSimple": "Volo.Abp.Identity.IdentitySignInSettingsDto"
+ },
+ {
+ "name": "User",
+ "type": "Volo.Abp.Identity.IdentityUserSettingsDto",
+ "typeSimple": "Volo.Abp.Identity.IdentityUserSettingsDto"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityPasswordSettingsDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "RequiredLength",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "RequiredUniqueChars",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "RequireNonAlphanumeric",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "RequireLowercase",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "RequireUppercase",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "RequireDigit",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityLockoutSettingsDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "AllowedForNewUsers",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "LockoutDuration",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "MaxFailedAccessAttempts",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentitySignInSettingsDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "RequireConfirmedEmail",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "EnablePhoneNumberConfirmation",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "RequireConfirmedPhoneNumber",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityUserSettingsDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "IsUserNameUpdateEnabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "IsEmailUpdateEnabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.GetIdentityUsersInput": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityUserCreateDto": {
+ "baseType": "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Password",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Surname",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Email",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "PhoneNumber",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "TwoFactorEnabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "LockoutEnabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "RoleNames",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ },
+ {
+ "name": "OrganizationUnitIds",
+ "type": "[System.Guid]",
+ "typeSimple": "[string]"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityUserUpdateDto": {
+ "baseType": "Volo.Abp.Identity.IdentityUserCreateOrUpdateDtoBase",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ConcurrencyStamp",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.OrganizationUnitWithDetailsDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleFullAuditedEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ParentId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "Code",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Roles",
+ "type": "[Volo.Abp.Identity.IdentityRoleDto]",
+ "typeSimple": "[Volo.Abp.Identity.IdentityRoleDto]"
+ }
+ ]
+ },
+ "Volo.Abp.Application.Dtos.ExtensibleFullAuditedEntityDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": ["TPrimaryKey"],
+ "properties": [
+ {
+ "name": "IsDeleted",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "DeleterId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "DeletionTime",
+ "type": "System.DateTime?",
+ "typeSimple": "string?"
+ }
+ ]
+ },
+ "Volo.Abp.Application.Dtos.ExtensibleAuditedEntityDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": ["TPrimaryKey"],
+ "properties": [
+ {
+ "name": "LastModificationTime",
+ "type": "System.DateTime?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "LastModifierId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ }
+ ]
+ },
+ "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": ["TPrimaryKey"],
+ "properties": [
+ {
+ "name": "CreationTime",
+ "type": "System.DateTime",
+ "typeSimple": "string"
+ },
+ {
+ "name": "CreatorId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityUserClaimDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "UserId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ClaimType",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ClaimValue",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.OrganizationUnitDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleFullAuditedEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ParentId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "Code",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Roles",
+ "type": "[Volo.Abp.Identity.OrganizationUnitRoleDto]",
+ "typeSimple": "[Volo.Abp.Identity.OrganizationUnitRoleDto]"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.OrganizationUnitRoleDto": {
+ "baseType": "Volo.Abp.Application.Dtos.CreationAuditedEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "OrganizationUnitId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "RoleId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Application.Dtos.CreationAuditedEntityDto": {
+ "baseType": "Volo.Abp.Application.Dtos.EntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "CreationTime",
+ "type": "System.DateTime",
+ "typeSimple": "string"
+ },
+ {
+ "name": "CreatorId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityUserUpdateRolesDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "RoleNames",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.IdentityUserUpdatePasswordInput": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "NewPassword",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Users.UserData": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Id",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "TenantId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Surname",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Email",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "EmailConfirmed",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "PhoneNumber",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "PhoneNumberConfirmed",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.UserLookupSearchInputDto": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Sorting",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.UserLookupCountInputDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.OrganizationUnitRoleInput": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "RoleIds",
+ "type": "[System.Guid]",
+ "typeSimple": "[string]"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.OrganizationUnitUserInput": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "UserIds",
+ "type": "[System.Guid]",
+ "typeSimple": "[string]"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.OrganizationUnitCreateDto": {
+ "baseType": "Volo.Abp.Identity.OrganizationUnitCreateOrUpdateDtoBase",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ParentId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.OrganizationUnitCreateOrUpdateDtoBase": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.GetOrganizationUnitInput": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.OrganizationUnitMoveInput": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "NewParentId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.OrganizationUnitUpdateDto": {
+ "baseType": "Volo.Abp.Identity.OrganizationUnitCreateOrUpdateDtoBase",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": []
+ },
+ "Volo.Abp.Identity.ProfileDto": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Email",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Surname",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "PhoneNumber",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "PhoneNumberConfirmed",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.UpdateProfileDto": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Email",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Surname",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "PhoneNumber",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Identity.ChangePasswordInput": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "CurrentPassword",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "NewPassword",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.ApiResource.Dtos.GetApiResourceListInput": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.ApiResource.Dtos.ApiResourceWithDetailsDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Enabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "UserClaims",
+ "type": "[Volo.Abp.IdentityServer.ApiResource.Dtos.ApiResourceClaimClaimDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.ApiResource.Dtos.ApiResourceClaimClaimDto]"
+ },
+ {
+ "name": "Properties",
+ "type": "{System.String:System.String}",
+ "typeSimple": "{string:string}"
+ },
+ {
+ "name": "Scopes",
+ "type": "[Volo.Abp.IdentityServer.ApiResource.Dtos.ApiScopeDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.ApiResource.Dtos.ApiScopeDto]"
+ },
+ {
+ "name": "Secrets",
+ "type": "[Volo.Abp.IdentityServer.ApiResource.Dtos.ApiSecretDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.ApiResource.Dtos.ApiSecretDto]"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.ApiResource.Dtos.ApiResourceClaimClaimDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ApiResourceId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Type",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.ApiResource.Dtos.ApiScopeDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ApiResourceId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Required",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Emphasize",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "ShowInDiscoveryDocument",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "UserClaims",
+ "type": "[Volo.Abp.IdentityServer.ApiResource.Dtos.ApiScopeClaimDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.ApiResource.Dtos.ApiScopeClaimDto]"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.ApiResource.Dtos.ApiScopeClaimDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ApiResourceId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Type",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.ApiResource.Dtos.ApiSecretDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ApiResourceId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Type",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Value",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Expiration",
+ "type": "System.DateTime?",
+ "typeSimple": "string?"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.ApiResource.Dtos.CreateApiResourceDto": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Claims",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.ApiResource.Dtos.UpdateApiResourceDto": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Enabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Claims",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ },
+ {
+ "name": "Scopes",
+ "type": "[Volo.Abp.IdentityServer.ApiResource.Dtos.ApiScopeDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.ApiResource.Dtos.ApiScopeDto]"
+ },
+ {
+ "name": "Secrets",
+ "type": "[Volo.Abp.IdentityServer.ApiResource.Dtos.ApiSecretDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.ApiResource.Dtos.ApiSecretDto]"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.Client.Dtos.GetClientListInput": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.Client.Dtos.ClientWithDetailsDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ClientId",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ClientName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ClientUri",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "LogoUri",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Enabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "ProtocolType",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "RequireClientSecret",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "RequireConsent",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "AllowRememberConsent",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "AlwaysIncludeUserClaimsInIdToken",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "RequirePkce",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "AllowPlainTextPkce",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "AllowAccessTokensViaBrowser",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "FrontChannelLogoutUri",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "FrontChannelLogoutSessionRequired",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "BackChannelLogoutUri",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "BackChannelLogoutSessionRequired",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "AllowOfflineAccess",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "IdentityTokenLifetime",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "AccessTokenLifetime",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "AuthorizationCodeLifetime",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "ConsentLifetime",
+ "type": "System.Int32?",
+ "typeSimple": "number?"
+ },
+ {
+ "name": "AbsoluteRefreshTokenLifetime",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "SlidingRefreshTokenLifetime",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "RefreshTokenUsage",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "UpdateAccessTokenClaimsOnRefresh",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "RefreshTokenExpiration",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "AccessTokenType",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "EnableLocalLogin",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "IncludeJwtId",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "AlwaysSendClientClaims",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "ClientClaimsPrefix",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "PairWiseSubjectSalt",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "UserSsoLifetime",
+ "type": "System.Int32?",
+ "typeSimple": "number?"
+ },
+ {
+ "name": "UserCodeType",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DeviceCodeLifetime",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "ClientSecrets",
+ "type": "[Volo.Abp.IdentityServer.Client.Dtos.ClientSecretDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.Client.Dtos.ClientSecretDto]"
+ },
+ {
+ "name": "AllowedScopes",
+ "type": "[Volo.Abp.IdentityServer.Client.Dtos.ClientScopeDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.Client.Dtos.ClientScopeDto]"
+ },
+ {
+ "name": "Claims",
+ "type": "[Volo.Abp.IdentityServer.Client.Dtos.ClientClaimDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.Client.Dtos.ClientClaimDto]"
+ },
+ {
+ "name": "AllowedGrantTypes",
+ "type": "[Volo.Abp.IdentityServer.Client.Dtos.ClientGrantTypeDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.Client.Dtos.ClientGrantTypeDto]"
+ },
+ {
+ "name": "IdentityProviderRestrictions",
+ "type": "[Volo.Abp.IdentityServer.Client.Dtos.ClientIdentityProviderRestrictionDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.Client.Dtos.ClientIdentityProviderRestrictionDto]"
+ },
+ {
+ "name": "Properties",
+ "type": "[Volo.Abp.IdentityServer.Client.Dtos.ClientPropertyDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.Client.Dtos.ClientPropertyDto]"
+ },
+ {
+ "name": "AllowedCorsOrigins",
+ "type": "[Volo.Abp.IdentityServer.Client.Dtos.ClientCorsOriginDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.Client.Dtos.ClientCorsOriginDto]"
+ },
+ {
+ "name": "RedirectUris",
+ "type": "[Volo.Abp.IdentityServer.Client.Dtos.ClientRedirectUriDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.Client.Dtos.ClientRedirectUriDto]"
+ },
+ {
+ "name": "PostLogoutRedirectUris",
+ "type": "[Volo.Abp.IdentityServer.Client.Dtos.ClientPostLogoutRedirectUriDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.Client.Dtos.ClientPostLogoutRedirectUriDto]"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.Client.Dtos.ClientSecretDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ClientId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Type",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Value",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Expiration",
+ "type": "System.DateTime?",
+ "typeSimple": "string?"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.Client.Dtos.ClientScopeDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ClientId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Scope",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.Client.Dtos.ClientClaimDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Type",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Value",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.Client.Dtos.ClientGrantTypeDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ClientId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "GrantType",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.Client.Dtos.ClientIdentityProviderRestrictionDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ClientId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Provider",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.Client.Dtos.ClientPropertyDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ClientId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Key",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Value",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.Client.Dtos.ClientCorsOriginDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ClientId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Origin",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.Client.Dtos.ClientRedirectUriDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ClientId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "RedirectUri",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.Client.Dtos.ClientPostLogoutRedirectUriDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ClientId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "PostLogoutRedirectUri",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.Client.Dtos.CreateClientDto": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ClientId",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ClientName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ClientUri",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "LogoUri",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "RequireConsent",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "CallbackUrl",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "LogoutUrl",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Secrets",
+ "type": "[Volo.Abp.IdentityServer.Client.Dtos.ClientSecretDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.Client.Dtos.ClientSecretDto]"
+ },
+ {
+ "name": "Scopes",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.Client.Dtos.UpdateClientDto": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ClientName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ClientUri",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "LogoUri",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Enabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "RequireConsent",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "AllowOfflineAccess",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "AllowRememberConsent",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "RequirePkce",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "RequireClientSecret",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "AccessTokenLifetime",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "ConsentLifetime",
+ "type": "System.Int32?",
+ "typeSimple": "number?"
+ },
+ {
+ "name": "AccessTokenType",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "EnableLocalLogin",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "FrontChannelLogoutUri",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "FrontChannelLogoutSessionRequired",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "BackChannelLogoutUri",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "BackChannelLogoutSessionRequired",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "IncludeJwtId",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "AlwaysSendClientClaims",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "PairWiseSubjectSalt",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "UserSsoLifetime",
+ "type": "System.Int32?",
+ "typeSimple": "number?"
+ },
+ {
+ "name": "UserCodeType",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DeviceCodeLifetime",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "ClientSecrets",
+ "type": "[Volo.Abp.IdentityServer.Client.Dtos.ClientSecretDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.Client.Dtos.ClientSecretDto]"
+ },
+ {
+ "name": "Claims",
+ "type": "[Volo.Abp.IdentityServer.Client.Dtos.ClientClaimDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.Client.Dtos.ClientClaimDto]"
+ },
+ {
+ "name": "Properties",
+ "type": "[Volo.Abp.IdentityServer.Client.Dtos.ClientPropertyDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.Client.Dtos.ClientPropertyDto]"
+ },
+ {
+ "name": "AllowedGrantTypes",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ },
+ {
+ "name": "IdentityProviderRestrictions",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ },
+ {
+ "name": "Scopes",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ },
+ {
+ "name": "AllowedCorsOrigins",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ },
+ {
+ "name": "RedirectUris",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ },
+ {
+ "name": "PostLogoutRedirectUris",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.IdentityResource.Dtos.GetIdentityResourceListInput": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.IdentityResource.Dtos.IdentityResourceWithDetailsDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Enabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Required",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Emphasize",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "ShowInDiscoveryDocument",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "UserClaims",
+ "type": "[Volo.Abp.IdentityServer.IdentityResource.Dtos.IdentityClaimDto]",
+ "typeSimple": "[Volo.Abp.IdentityServer.IdentityResource.Dtos.IdentityClaimDto]"
+ },
+ {
+ "name": "Properties",
+ "type": "{System.String:System.String}",
+ "typeSimple": "{string:string}"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.IdentityResource.Dtos.IdentityClaimDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "IdentityResourceId",
+ "type": "System.Guid",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Type",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.IdentityResource.Dtos.CreateIdentityResourceDto": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Enabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Required",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Emphasize",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "ShowInDiscoveryDocument",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Claims",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.IdentityResource.Dtos.UpdateIdentityResourceDto": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Enabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Required",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Emphasize",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "ShowInDiscoveryDocument",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Claims",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ }
+ ]
+ },
+ "Volo.Abp.IdentityServer.ClaimType.Dtos.IdentityClaimTypeDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.LanguageManagement.Dto.LanguageDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleCreationAuditedEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "CultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "UiCultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "FlagIcon",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsEnabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "IsDefaultLanguage",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.LanguageManagement.Dto.GetLanguagesTextsInput": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ResourceName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "BaseCultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "TargetCultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "GetOnlyEmptyValues",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.LanguageManagement.Dto.CreateLanguageDto": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "CultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "UiCultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "FlagIcon",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsEnabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.LanguageManagement.Dto.UpdateLanguageDto": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "FlagIcon",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsEnabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.LanguageManagement.Dto.LanguageResourceDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.LanguageManagement.Dto.CultureInfoDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.LanguageManagement.Dto.LanguageTextDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ResourceName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "CultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "BaseCultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "BaseValue",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Value",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.LeptonTheme.Management.LeptonThemeSettingsDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "BoxedLayout",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "MenuPlacement",
+ "type": "Volo.Abp.LeptonTheme.Management.MenuPlacement",
+ "typeSimple": "Volo.Abp.LeptonTheme.Management.MenuPlacement"
+ },
+ {
+ "name": "MenuStatus",
+ "type": "Volo.Abp.LeptonTheme.Management.MenuStatus",
+ "typeSimple": "Volo.Abp.LeptonTheme.Management.MenuStatus"
+ },
+ {
+ "name": "Style",
+ "type": "Volo.Abp.LeptonTheme.Management.LeptonStyle",
+ "typeSimple": "Volo.Abp.LeptonTheme.Management.LeptonStyle"
+ }
+ ]
+ },
+ "Volo.Abp.LeptonTheme.Management.MenuPlacement": {
+ "baseType": "System.Enum",
+ "isEnum": true,
+ "enumNames": ["Left", "Top"],
+ "enumValues": [0, 1],
+ "genericArguments": null,
+ "properties": null
+ },
+ "Volo.Abp.LeptonTheme.Management.MenuStatus": {
+ "baseType": "System.Enum",
+ "isEnum": true,
+ "enumNames": ["AlwaysOpened", "OpenOnHover"],
+ "enumValues": [0, 1],
+ "genericArguments": null,
+ "properties": null
+ },
+ "Volo.Abp.LeptonTheme.Management.LeptonStyle": {
+ "baseType": "System.Enum",
+ "isEnum": true,
+ "enumNames": ["Style1", "Style2", "Style3", "Style4", "Style5", "Style6"],
+ "enumValues": [0, 1, 2, 3, 4, 5],
+ "genericArguments": null,
+ "properties": null
+ },
+ "Volo.Abp.LeptonTheme.Management.UpdateLeptonThemeSettingsDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "BoxedLayout",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "MenuPlacement",
+ "type": "Volo.Abp.LeptonTheme.Management.MenuPlacement",
+ "typeSimple": "Volo.Abp.LeptonTheme.Management.MenuPlacement"
+ },
+ {
+ "name": "MenuStatus",
+ "type": "Volo.Abp.LeptonTheme.Management.MenuStatus",
+ "typeSimple": "Volo.Abp.LeptonTheme.Management.MenuStatus"
+ },
+ {
+ "name": "Style",
+ "type": "Volo.Abp.LeptonTheme.Management.LeptonStyle",
+ "typeSimple": "Volo.Abp.LeptonTheme.Management.LeptonStyle"
+ }
+ ]
+ },
+ "Volo.Abp.PermissionManagement.GetPermissionListResultDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "EntityDisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Groups",
+ "type": "[Volo.Abp.PermissionManagement.PermissionGroupDto]",
+ "typeSimple": "[Volo.Abp.PermissionManagement.PermissionGroupDto]"
+ }
+ ]
+ },
+ "Volo.Abp.PermissionManagement.PermissionGroupDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Permissions",
+ "type": "[Volo.Abp.PermissionManagement.PermissionGrantInfoDto]",
+ "typeSimple": "[Volo.Abp.PermissionManagement.PermissionGrantInfoDto]"
+ }
+ ]
+ },
+ "Volo.Abp.PermissionManagement.PermissionGrantInfoDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ParentName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsGranted",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "AllowedProviders",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ },
+ {
+ "name": "GrantedProviders",
+ "type": "[Volo.Abp.PermissionManagement.ProviderInfoDto]",
+ "typeSimple": "[Volo.Abp.PermissionManagement.ProviderInfoDto]"
+ }
+ ]
+ },
+ "Volo.Abp.PermissionManagement.ProviderInfoDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ProviderName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ProviderKey",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.PermissionManagement.UpdatePermissionsDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Permissions",
+ "type": "[Volo.Abp.PermissionManagement.UpdatePermissionDto]",
+ "typeSimple": "[Volo.Abp.PermissionManagement.UpdatePermissionDto]"
+ }
+ ]
+ },
+ "Volo.Abp.PermissionManagement.UpdatePermissionDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsGranted",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateContentInput": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "TemplateName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "CultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.TextTemplateManagement.TextTemplates.TextTemplateContentDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "CultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Content",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.TextTemplateManagement.TextTemplates.RestoreTemplateContentInput": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "TemplateName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "CultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.TextTemplateManagement.TextTemplates.UpdateTemplateContentInput": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "TemplateName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "CultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Content",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.TextTemplateManagement.TextTemplates.GetTemplateDefinitionListInput": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "FilterText",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.TextTemplateManagement.TextTemplates.TemplateDefinitionDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsLayout",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Layout",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsInlineLocalized",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "DefaultCultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Saas.Host.Dtos.EditionDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Saas.Host.Dtos.GetEditionsInput": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Saas.Host.Dtos.EditionCreateDto": {
+ "baseType": "Volo.Saas.Host.Dtos.EditionCreateOrUpdateDtoBase",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": []
+ },
+ "Volo.Saas.Host.Dtos.EditionCreateOrUpdateDtoBase": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Saas.Host.Dtos.EditionUpdateDto": {
+ "baseType": "Volo.Saas.Host.Dtos.EditionCreateOrUpdateDtoBase",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": []
+ },
+ "Volo.Saas.Host.GetEditionUsageStatisticsResult": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Data",
+ "type": "{System.String:System.Int32}",
+ "typeSimple": "{string:number}"
+ }
+ ]
+ },
+ "Volo.Saas.Host.Dtos.SaasTenantDto": {
+ "baseType": "Volo.Abp.Application.Dtos.ExtensibleEntityDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "EditionId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "EditionName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Saas.Host.Dtos.GetTenantsInput": {
+ "baseType": "Volo.Abp.Application.Dtos.PagedAndSortedResultRequestDto",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Filter",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "GetEditionNames",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Saas.Host.Dtos.SaasTenantCreateDto": {
+ "baseType": "Volo.Saas.Host.Dtos.SaasTenantCreateOrUpdateDtoBase",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "AdminEmailAddress",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "AdminPassword",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Saas.Host.Dtos.SaasTenantCreateOrUpdateDtoBase": {
+ "baseType": "Volo.Abp.ObjectExtending.ExtensibleObject",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "EditionId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ }
+ ]
+ },
+ "Volo.Saas.Host.Dtos.SaasTenantUpdateDto": {
+ "baseType": "Volo.Saas.Host.Dtos.SaasTenantCreateOrUpdateDtoBase",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": []
+ },
+ "Volo.Abp.FeatureManagement.FeatureListDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Features",
+ "type": "[Volo.Abp.FeatureManagement.FeatureDto]",
+ "typeSimple": "[Volo.Abp.FeatureManagement.FeatureDto]"
+ }
+ ]
+ },
+ "Volo.Abp.FeatureManagement.FeatureDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Value",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Description",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ValueType",
+ "type": "Volo.Abp.Validation.StringValues.IStringValueType",
+ "typeSimple": "Volo.Abp.Validation.StringValues.IStringValueType"
+ },
+ {
+ "name": "Depth",
+ "type": "System.Int32",
+ "typeSimple": "number"
+ },
+ {
+ "name": "ParentName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Validation.StringValues.IStringValueType": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Item",
+ "type": "System.Object",
+ "typeSimple": "object"
+ },
+ {
+ "name": "Properties",
+ "type": "{System.String:System.Object}",
+ "typeSimple": "{string:object}"
+ },
+ {
+ "name": "Validator",
+ "type": "Volo.Abp.Validation.StringValues.IValueValidator",
+ "typeSimple": "Volo.Abp.Validation.StringValues.IValueValidator"
+ }
+ ]
+ },
+ "Volo.Abp.Validation.StringValues.IValueValidator": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Item",
+ "type": "System.Object",
+ "typeSimple": "object"
+ },
+ {
+ "name": "Properties",
+ "type": "{System.String:System.Object}",
+ "typeSimple": "{string:object}"
+ }
+ ]
+ },
+ "Volo.Abp.FeatureManagement.UpdateFeaturesDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Features",
+ "type": "[Volo.Abp.FeatureManagement.UpdateFeatureDto]",
+ "typeSimple": "[Volo.Abp.FeatureManagement.UpdateFeatureDto]"
+ }
+ ]
+ },
+ "Volo.Abp.FeatureManagement.UpdateFeatureDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Value",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Localization",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto"
+ },
+ {
+ "name": "Auth",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto"
+ },
+ {
+ "name": "Setting",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto"
+ },
+ {
+ "name": "CurrentUser",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto"
+ },
+ {
+ "name": "Features",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto"
+ },
+ {
+ "name": "MultiTenancy",
+ "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto"
+ },
+ {
+ "name": "CurrentTenant",
+ "type": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto"
+ },
+ {
+ "name": "Timing",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto"
+ },
+ {
+ "name": "Clock",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto"
+ },
+ {
+ "name": "ObjectExtensions",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationConfigurationDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Values",
+ "type": "{System.String:{System.String:System.String}}",
+ "typeSimple": "{string:{string:string}}"
+ },
+ {
+ "name": "Languages",
+ "type": "[Volo.Abp.Localization.LanguageInfo]",
+ "typeSimple": "[Volo.Abp.Localization.LanguageInfo]"
+ },
+ {
+ "name": "CurrentCulture",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto"
+ },
+ {
+ "name": "DefaultResourceName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "LanguagesMap",
+ "type": "{System.String:[Volo.Abp.NameValue]}",
+ "typeSimple": "{string:[Volo.Abp.NameValue]}"
+ },
+ {
+ "name": "LanguageFilesMap",
+ "type": "{System.String:[Volo.Abp.NameValue]}",
+ "typeSimple": "{string:[Volo.Abp.NameValue]}"
+ }
+ ]
+ },
+ "Volo.Abp.Localization.LanguageInfo": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "CultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "UiCultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "FlagIcon",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentCultureDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "DisplayName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "EnglishName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ThreeLetterIsoLanguageName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "TwoLetterIsoLanguageName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsRightToLeft",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "CultureName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "NativeName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DateTimeFormat",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.DateTimeFormatDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "CalendarAlgorithmType",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DateTimeFormatLong",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ShortDatePattern",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "FullDateTimePattern",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DateSeparator",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "ShortTimePattern",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "LongTimePattern",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.NameValue": {
+ "baseType": "Volo.Abp.NameValue",
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": []
+ },
+ "Volo.Abp.NameValue": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": ["T"],
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Value",
+ "type": "T",
+ "typeSimple": "T"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationAuthConfigurationDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Policies",
+ "type": "{System.String:System.Boolean}",
+ "typeSimple": "{string:boolean}"
+ },
+ {
+ "name": "GrantedPolicies",
+ "type": "{System.String:System.Boolean}",
+ "typeSimple": "{string:boolean}"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationSettingConfigurationDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Values",
+ "type": "{System.String:System.String}",
+ "typeSimple": "{string:string}"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.CurrentUserDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "IsAuthenticated",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "Id",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "TenantId",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "UserName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Email",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Roles",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationFeatureConfigurationDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Values",
+ "type": "{System.String:System.String}",
+ "typeSimple": "{string:string}"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.MultiTenancy.MultiTenancyInfoDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "IsEnabled",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.MultiTenancy.CurrentTenantDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Id",
+ "type": "System.Guid?",
+ "typeSimple": "string?"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsAvailable",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimingDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "TimeZone",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.TimeZone": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Iana",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone"
+ },
+ {
+ "name": "Windows",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IanaTimeZone": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "TimeZoneName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.WindowsTimeZone": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "TimeZoneId",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClockDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Kind",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ObjectExtensionsDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Modules",
+ "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto}",
+ "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto}"
+ },
+ {
+ "name": "Enums",
+ "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto}",
+ "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto}"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ModuleExtensionDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Entities",
+ "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto}",
+ "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto}"
+ },
+ {
+ "name": "Configuration",
+ "type": "{System.String:System.Object}",
+ "typeSimple": "{string:object}"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.EntityExtensionDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Properties",
+ "type": "{System.String:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto}",
+ "typeSimple": "{string:Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto}"
+ },
+ {
+ "name": "Configuration",
+ "type": "{System.String:System.Object}",
+ "typeSimple": "{string:object}"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Type",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "TypeSimple",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DisplayName",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto"
+ },
+ {
+ "name": "Api",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto"
+ },
+ {
+ "name": "Ui",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto"
+ },
+ {
+ "name": "Attributes",
+ "type": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto]",
+ "typeSimple": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto]"
+ },
+ {
+ "name": "Configuration",
+ "type": "{System.String:System.Object}",
+ "typeSimple": "{string:object}"
+ },
+ {
+ "name": "DefaultValue",
+ "type": "System.Object",
+ "typeSimple": "object"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.LocalizableStringDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Resource",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "OnGet",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto"
+ },
+ {
+ "name": "OnCreate",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto"
+ },
+ {
+ "name": "OnUpdate",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiGetDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "IsAvailable",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiCreateDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "IsAvailable",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyApiUpdateDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "IsAvailable",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "OnTable",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto"
+ },
+ {
+ "name": "OnCreateForm",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto"
+ },
+ {
+ "name": "OnEditForm",
+ "type": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto",
+ "typeSimple": "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiTableDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "IsVisible",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyUiFormDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "IsVisible",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionPropertyAttributeDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "TypeSimple",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Config",
+ "type": "{System.String:System.Object}",
+ "typeSimple": "{string:object}"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Fields",
+ "type": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto]",
+ "typeSimple": "[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto]"
+ },
+ {
+ "name": "LocalizationResource",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ObjectExtending.ExtensionEnumFieldDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Value",
+ "type": "System.Object",
+ "typeSimple": "object"
+ }
+ ]
+ },
+ "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "IncludeTypes",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ }
+ ]
+ },
+ "Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Modules",
+ "type": "{System.String:Volo.Abp.Http.Modeling.ModuleApiDescriptionModel}",
+ "typeSimple": "{string:Volo.Abp.Http.Modeling.ModuleApiDescriptionModel}"
+ },
+ {
+ "name": "Types",
+ "type": "{System.String:Volo.Abp.Http.Modeling.TypeApiDescriptionModel}",
+ "typeSimple": "{string:Volo.Abp.Http.Modeling.TypeApiDescriptionModel}"
+ }
+ ]
+ },
+ "Volo.Abp.Http.Modeling.ModuleApiDescriptionModel": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "RootPath",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "RemoteServiceName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Controllers",
+ "type": "{System.String:Volo.Abp.Http.Modeling.ControllerApiDescriptionModel}",
+ "typeSimple": "{string:Volo.Abp.Http.Modeling.ControllerApiDescriptionModel}"
+ }
+ ]
+ },
+ "Volo.Abp.Http.Modeling.ControllerApiDescriptionModel": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "ControllerName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Type",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Interfaces",
+ "type": "[Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel]",
+ "typeSimple": "[Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel]"
+ },
+ {
+ "name": "Actions",
+ "type": "{System.String:Volo.Abp.Http.Modeling.ActionApiDescriptionModel}",
+ "typeSimple": "{string:Volo.Abp.Http.Modeling.ActionApiDescriptionModel}"
+ }
+ ]
+ },
+ "Volo.Abp.Http.Modeling.ControllerInterfaceApiDescriptionModel": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Type",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Http.Modeling.ActionApiDescriptionModel": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "UniqueName",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "HttpMethod",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Url",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "SupportedVersions",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ },
+ {
+ "name": "ParametersOnMethod",
+ "type": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]",
+ "typeSimple": "[Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel]"
+ },
+ {
+ "name": "Parameters",
+ "type": "[Volo.Abp.Http.Modeling.ParameterApiDescriptionModel]",
+ "typeSimple": "[Volo.Abp.Http.Modeling.ParameterApiDescriptionModel]"
+ },
+ {
+ "name": "ReturnValue",
+ "type": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel",
+ "typeSimple": "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel"
+ }
+ ]
+ },
+ "Volo.Abp.Http.Modeling.MethodParameterApiDescriptionModel": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "TypeAsString",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Type",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "TypeSimple",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsOptional",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "DefaultValue",
+ "type": "System.Object",
+ "typeSimple": "object"
+ }
+ ]
+ },
+ "Volo.Abp.Http.Modeling.ParameterApiDescriptionModel": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "NameOnMethod",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Type",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "TypeSimple",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsOptional",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "DefaultValue",
+ "type": "System.Object",
+ "typeSimple": "object"
+ },
+ {
+ "name": "ConstraintTypes",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ },
+ {
+ "name": "BindingSourceId",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "DescriptorName",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Http.Modeling.ReturnValueApiDescriptionModel": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Type",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "TypeSimple",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ },
+ "Volo.Abp.Http.Modeling.TypeApiDescriptionModel": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "BaseType",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "IsEnum",
+ "type": "System.Boolean",
+ "typeSimple": "boolean"
+ },
+ {
+ "name": "EnumNames",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ },
+ {
+ "name": "EnumValues",
+ "type": "[System.Object]",
+ "typeSimple": "[object]"
+ },
+ {
+ "name": "GenericArguments",
+ "type": "[System.String]",
+ "typeSimple": "[string]"
+ },
+ {
+ "name": "Properties",
+ "type": "[Volo.Abp.Http.Modeling.PropertyApiDescriptionModel]",
+ "typeSimple": "[Volo.Abp.Http.Modeling.PropertyApiDescriptionModel]"
+ }
+ ]
+ },
+ "Volo.Abp.Http.Modeling.PropertyApiDescriptionModel": {
+ "baseType": null,
+ "isEnum": false,
+ "enumNames": null,
+ "enumValues": null,
+ "genericArguments": null,
+ "properties": [
+ {
+ "name": "Name",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "Type",
+ "type": "System.String",
+ "typeSimple": "string"
+ },
+ {
+ "name": "TypeSimple",
+ "type": "System.String",
+ "typeSimple": "string"
+ }
+ ]
+ }
+ }
+}
From aa38af0a5f5ce956f382b8e24ea1db939f02a370 Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 12:01:37 +0300
Subject: [PATCH 036/345] chore: copy angular internal schematics to utils
---
.../schematics/src/utils/angular/README.md | 5 +
.../schematics/src/utils/angular/ast-utils.ts | 753 ++++++++++++++++++
.../schematics/src/utils/angular/change.ts | 127 +++
.../schematics/src/utils/angular/config.ts | 532 +++++++++++++
.../src/utils/angular/dependencies.ts | 76 ++
.../src/utils/angular/find-module.ts | 151 ++++
.../schematics/src/utils/angular/index.ts | 17 +
.../schematics/src/utils/angular/json-file.ts | 82 ++
.../src/utils/angular/json-utils.ts | 231 ++++++
.../src/utils/angular/latest-versions.ts | 26 +
.../schematics/src/utils/angular/lint-fix.ts | 51 ++
.../src/utils/angular/ng-ast-utils.ts | 87 ++
.../src/utils/angular/parse-name.ts | 25 +
.../schematics/src/utils/angular/paths.ts | 19 +
.../src/utils/angular/project-targets.ts | 13 +
.../schematics/src/utils/angular/tsconfig.ts | 70 ++
.../src/utils/angular/validation.ts | 77 ++
.../src/utils/angular/workspace-models.ts | 171 ++++
.../schematics/src/utils/angular/workspace.ts | 91 +++
.../packages/schematics/src/utils/index.ts | 1 +
20 files changed, 2605 insertions(+)
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/README.md
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/ast-utils.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/change.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/config.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/dependencies.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/find-module.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/index.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/json-file.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/json-utils.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/latest-versions.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/lint-fix.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/ng-ast-utils.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/parse-name.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/paths.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/project-targets.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/tsconfig.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/validation.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/workspace-models.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/angular/workspace.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/index.ts
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/README.md b/npm/ng-packs/packages/schematics/src/utils/angular/README.md
new file mode 100644
index 0000000000..8d98f50e2d
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/README.md
@@ -0,0 +1,5 @@
+**DISCLAIMER**
+
+This directory is a direct copy of https://github.com/angular/angular-cli/tree/master/packages/schematics/angular/utility and is used under terms and permissions by the MIT license granted by Google, Inc.
+
+All credits go to Angular team for building these utilities.
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/ast-utils.ts b/npm/ng-packs/packages/schematics/src/utils/angular/ast-utils.ts
new file mode 100644
index 0000000000..6883e73360
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/ast-utils.ts
@@ -0,0 +1,753 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+import * as ts from 'typescript';
+import { Change, InsertChange, NoopChange } from './change';
+
+
+/**
+ * Add Import `import { symbolName } from fileName` if the import doesn't exit
+ * already. Assumes fileToEdit can be resolved and accessed.
+ * @param fileToEdit (file we want to add import to)
+ * @param symbolName (item to import)
+ * @param fileName (path to the file)
+ * @param isDefault (if true, import follows style for importing default exports)
+ * @return Change
+ */
+export function insertImport(source: ts.SourceFile, fileToEdit: string, symbolName: string,
+ fileName: string, isDefault = false): Change {
+ const rootNode = source;
+ const allImports = findNodes(rootNode, ts.SyntaxKind.ImportDeclaration);
+
+ // get nodes that map to import statements from the file fileName
+ const relevantImports = allImports.filter(node => {
+ // StringLiteral of the ImportDeclaration is the import file (fileName in this case).
+ const importFiles = node.getChildren()
+ .filter(ts.isStringLiteral)
+ .map(n => n.text);
+
+ return importFiles.filter(file => file === fileName).length === 1;
+ });
+
+ if (relevantImports.length > 0) {
+ let importsAsterisk = false;
+ // imports from import file
+ const imports: ts.Node[] = [];
+ relevantImports.forEach(n => {
+ Array.prototype.push.apply(imports, findNodes(n, ts.SyntaxKind.Identifier));
+ if (findNodes(n, ts.SyntaxKind.AsteriskToken).length > 0) {
+ importsAsterisk = true;
+ }
+ });
+
+ // if imports * from fileName, don't add symbolName
+ if (importsAsterisk) {
+ return new NoopChange();
+ }
+
+ const importTextNodes = imports.filter(n => (n as ts.Identifier).text === symbolName);
+
+ // insert import if it's not there
+ if (importTextNodes.length === 0) {
+ const fallbackPos =
+ findNodes(relevantImports[0], ts.SyntaxKind.CloseBraceToken)[0].getStart() ||
+ findNodes(relevantImports[0], ts.SyntaxKind.FromKeyword)[0].getStart();
+
+ return insertAfterLastOccurrence(imports, `, ${symbolName}`, fileToEdit, fallbackPos);
+ }
+
+ return new NoopChange();
+ }
+
+ // no such import declaration exists
+ const useStrict = findNodes(rootNode, ts.isStringLiteral)
+ .filter((n) => n.text === 'use strict');
+ let fallbackPos = 0;
+ if (useStrict.length > 0) {
+ fallbackPos = useStrict[0].end;
+ }
+ const open = isDefault ? '' : '{ ';
+ const close = isDefault ? '' : ' }';
+ // if there are no imports or 'use strict' statement, insert import at beginning of file
+ const insertAtBeginning = allImports.length === 0 && useStrict.length === 0;
+ const separator = insertAtBeginning ? '' : ';\n';
+ const toInsert = `${separator}import ${open}${symbolName}${close}` +
+ ` from '${fileName}'${insertAtBeginning ? ';\n' : ''}`;
+
+ return insertAfterLastOccurrence(
+ allImports,
+ toInsert,
+ fileToEdit,
+ fallbackPos,
+ ts.SyntaxKind.StringLiteral,
+ );
+}
+
+
+/**
+ * Find all nodes from the AST in the subtree of node of SyntaxKind kind.
+ * @param node
+ * @param kind
+ * @param max The maximum number of items to return.
+ * @param recursive Continue looking for nodes of kind recursive until end
+ * the last child even when node of kind has been found.
+ * @return all nodes of kind, or [] if none is found
+ */
+export function findNodes(node: ts.Node, kind: ts.SyntaxKind, max?: number, recursive?: boolean): ts.Node[];
+
+/**
+ * Find all nodes from the AST in the subtree that satisfy a type guard.
+ * @param node
+ * @param guard
+ * @param max The maximum number of items to return.
+ * @param recursive Continue looking for nodes of kind recursive until end
+ * the last child even when node of kind has been found.
+ * @return all nodes that satisfy the type guard, or [] if none is found
+ */
+export function findNodes(node: ts.Node, guard: (node: ts.Node) => node is T, max?: number, recursive?: boolean): T[];
+
+export function findNodes(
+ node: ts.Node,
+ kindOrGuard: ts.SyntaxKind | ((node: ts.Node) => node is T),
+ max = Infinity,
+ recursive = false,
+): T[] {
+ if (!node || max == 0) {
+ return [];
+ }
+
+ const test =
+ typeof kindOrGuard === 'function'
+ ? kindOrGuard
+ : (node: ts.Node): node is T => node.kind === kindOrGuard;
+
+ const arr: T[] = [];
+ if (test(node)) {
+ arr.push(node);
+ max--;
+ }
+ if (max > 0 && (recursive || !test(node))) {
+ for (const child of node.getChildren()) {
+ findNodes(child, test, max).forEach((node) => {
+ if (max > 0) {
+ arr.push(node);
+ }
+ max--;
+ });
+
+ if (max <= 0) {
+ break;
+ }
+ }
+ }
+
+ return arr;
+}
+
+
+/**
+ * Get all the nodes from a source.
+ * @param sourceFile The source file object.
+ * @returns {Array} An array of all the nodes in the source.
+ */
+export function getSourceNodes(sourceFile: ts.SourceFile): ts.Node[] {
+ const nodes: ts.Node[] = [sourceFile];
+ const result = [];
+
+ while (nodes.length > 0) {
+ const node = nodes.shift();
+
+ if (node) {
+ result.push(node);
+ if (node.getChildCount(sourceFile) >= 0) {
+ nodes.unshift(...node.getChildren());
+ }
+ }
+ }
+
+ return result;
+}
+
+export function findNode(node: ts.Node, kind: ts.SyntaxKind, text: string): ts.Node | null {
+ if (node.kind === kind && node.getText() === text) {
+ // throw new Error(node.getText());
+ return node;
+ }
+
+ let foundNode: ts.Node | null = null;
+ ts.forEachChild(node, childNode => {
+ foundNode = foundNode || findNode(childNode, kind, text);
+ });
+
+ return foundNode;
+}
+
+
+/**
+ * Helper for sorting nodes.
+ * @return function to sort nodes in increasing order of position in sourceFile
+ */
+function nodesByPosition(first: ts.Node, second: ts.Node): number {
+ return first.getStart() - second.getStart();
+}
+
+
+/**
+ * Insert `toInsert` after the last occurence of `ts.SyntaxKind[nodes[i].kind]`
+ * or after the last of occurence of `syntaxKind` if the last occurence is a sub child
+ * of ts.SyntaxKind[nodes[i].kind] and save the changes in file.
+ *
+ * @param nodes insert after the last occurence of nodes
+ * @param toInsert string to insert
+ * @param file file to insert changes into
+ * @param fallbackPos position to insert if toInsert happens to be the first occurence
+ * @param syntaxKind the ts.SyntaxKind of the subchildren to insert after
+ * @return Change instance
+ * @throw Error if toInsert is first occurence but fall back is not set
+ */
+export function insertAfterLastOccurrence(nodes: ts.Node[],
+ toInsert: string,
+ file: string,
+ fallbackPos: number,
+ syntaxKind?: ts.SyntaxKind): Change {
+ let lastItem: ts.Node | undefined;
+ for (const node of nodes) {
+ if (!lastItem || lastItem.getStart() < node.getStart()) {
+ lastItem = node;
+ }
+ }
+ if (syntaxKind && lastItem) {
+ lastItem = findNodes(lastItem, syntaxKind).sort(nodesByPosition).pop();
+ }
+ if (!lastItem && fallbackPos == undefined) {
+ throw new Error(`tried to insert ${toInsert} as first occurence with no fallback position`);
+ }
+ const lastItemPosition: number = lastItem ? lastItem.getEnd() : fallbackPos;
+
+ return new InsertChange(file, lastItemPosition, toInsert);
+}
+
+
+export function getContentOfKeyLiteral(_source: ts.SourceFile, node: ts.Node): string | null {
+ if (node.kind == ts.SyntaxKind.Identifier) {
+ return (node as ts.Identifier).text;
+ } else if (node.kind == ts.SyntaxKind.StringLiteral) {
+ return (node as ts.StringLiteral).text;
+ } else {
+ return null;
+ }
+}
+
+
+function _angularImportsFromNode(node: ts.ImportDeclaration,
+ _sourceFile: ts.SourceFile): {[name: string]: string} {
+ const ms = node.moduleSpecifier;
+ let modulePath: string;
+ switch (ms.kind) {
+ case ts.SyntaxKind.StringLiteral:
+ modulePath = (ms as ts.StringLiteral).text;
+ break;
+ default:
+ return {};
+ }
+
+ if (!modulePath.startsWith('@angular/')) {
+ return {};
+ }
+
+ if (node.importClause) {
+ if (node.importClause.name) {
+ // This is of the form `import Name from 'path'`. Ignore.
+ return {};
+ } else if (node.importClause.namedBindings) {
+ const nb = node.importClause.namedBindings;
+ if (nb.kind == ts.SyntaxKind.NamespaceImport) {
+ // This is of the form `import * as name from 'path'`. Return `name.`.
+ return {
+ [(nb as ts.NamespaceImport).name.text + '.']: modulePath,
+ };
+ } else {
+ // This is of the form `import {a,b,c} from 'path'`
+ const namedImports = nb as ts.NamedImports;
+
+ return namedImports.elements
+ .map((is: ts.ImportSpecifier) => is.propertyName ? is.propertyName.text : is.name.text)
+ .reduce((acc: {[name: string]: string}, curr: string) => {
+ acc[curr] = modulePath;
+
+ return acc;
+ }, {});
+ }
+ }
+
+ return {};
+ } else {
+ // This is of the form `import 'path';`. Nothing to do.
+ return {};
+ }
+}
+
+
+export function getDecoratorMetadata(source: ts.SourceFile, identifier: string,
+ module: string): ts.Node[] {
+ const angularImports = findNodes(source, ts.isImportDeclaration)
+ .map((node) => _angularImportsFromNode(node, source))
+ .reduce((acc, current) => {
+ for (const key of Object.keys(current)) {
+ acc[key] = current[key];
+ }
+
+ return acc;
+ }, {});
+
+ return getSourceNodes(source)
+ .filter(node => {
+ return node.kind == ts.SyntaxKind.Decorator
+ && (node as ts.Decorator).expression.kind == ts.SyntaxKind.CallExpression;
+ })
+ .map(node => (node as ts.Decorator).expression as ts.CallExpression)
+ .filter(expr => {
+ if (expr.expression.kind == ts.SyntaxKind.Identifier) {
+ const id = expr.expression as ts.Identifier;
+
+ return id.text == identifier && angularImports[id.text] === module;
+ } else if (expr.expression.kind == ts.SyntaxKind.PropertyAccessExpression) {
+ // This covers foo.NgModule when importing * as foo.
+ const paExpr = expr.expression as ts.PropertyAccessExpression;
+ // If the left expression is not an identifier, just give up at that point.
+ if (paExpr.expression.kind !== ts.SyntaxKind.Identifier) {
+ return false;
+ }
+
+ const id = paExpr.name.text;
+ const moduleId = (paExpr.expression as ts.Identifier).text;
+
+ return id === identifier && (angularImports[moduleId + '.'] === module);
+ }
+
+ return false;
+ })
+ .filter(expr => expr.arguments[0]
+ && expr.arguments[0].kind == ts.SyntaxKind.ObjectLiteralExpression)
+ .map(expr => expr.arguments[0] as ts.ObjectLiteralExpression);
+}
+
+function findClassDeclarationParent(node: ts.Node): ts.ClassDeclaration|undefined {
+ if (ts.isClassDeclaration(node)) {
+ return node;
+ }
+
+ return node.parent && findClassDeclarationParent(node.parent);
+}
+
+/**
+ * Given a source file with @NgModule class(es), find the name of the first @NgModule class.
+ *
+ * @param source source file containing one or more @NgModule
+ * @returns the name of the first @NgModule, or `undefined` if none is found
+ */
+export function getFirstNgModuleName(source: ts.SourceFile): string|undefined {
+ // First, find the @NgModule decorators.
+ const ngModulesMetadata = getDecoratorMetadata(source, 'NgModule', '@angular/core');
+ if (ngModulesMetadata.length === 0) {
+ return undefined;
+ }
+
+ // Then walk parent pointers up the AST, looking for the ClassDeclaration parent of the NgModule
+ // metadata.
+ const moduleClass = findClassDeclarationParent(ngModulesMetadata[0]);
+ if (!moduleClass || !moduleClass.name) {
+ return undefined;
+ }
+
+ // Get the class name of the module ClassDeclaration.
+ return moduleClass.name.text;
+}
+
+export function getMetadataField(
+ node: ts.ObjectLiteralExpression,
+ metadataField: string,
+): ts.ObjectLiteralElement[] {
+ return node.properties
+ .filter(ts.isPropertyAssignment)
+ // Filter out every fields that's not "metadataField". Also handles string literals
+ // (but not expressions).
+ .filter(({ name }) => {
+ return (ts.isIdentifier(name) || ts.isStringLiteral(name))
+ && name.getText() === metadataField;
+ });
+}
+
+export function addSymbolToNgModuleMetadata(
+ source: ts.SourceFile,
+ ngModulePath: string,
+ metadataField: string,
+ symbolName: string,
+ importPath: string | null = null,
+): Change[] {
+ const nodes = getDecoratorMetadata(source, 'NgModule', '@angular/core');
+ let node: any = nodes[0]; // tslint:disable-line:no-any
+
+ // Find the decorator declaration.
+ if (!node) {
+ return [];
+ }
+
+ // Get all the children property assignment of object literals.
+ const matchingProperties = getMetadataField(
+ node as ts.ObjectLiteralExpression,
+ metadataField,
+ );
+
+ // Get the last node of the array literal.
+ if (!matchingProperties) {
+ return [];
+ }
+ if (matchingProperties.length == 0) {
+ // We haven't found the field in the metadata declaration. Insert a new field.
+ const expr = node as ts.ObjectLiteralExpression;
+ let position: number;
+ let toInsert: string;
+ if (expr.properties.length == 0) {
+ position = expr.getEnd() - 1;
+ toInsert = ` ${metadataField}: [${symbolName}]\n`;
+ } else {
+ node = expr.properties[expr.properties.length - 1];
+ position = node.getEnd();
+ // Get the indentation of the last element, if any.
+ const text = node.getFullText(source);
+ const matches = text.match(/^\r?\n\s*/);
+ if (matches && matches.length > 0) {
+ toInsert = `,${matches[0]}${metadataField}: [${symbolName}]`;
+ } else {
+ toInsert = `, ${metadataField}: [${symbolName}]`;
+ }
+ }
+ if (importPath !== null) {
+ return [
+ new InsertChange(ngModulePath, position, toInsert),
+ insertImport(source, ngModulePath, symbolName.replace(/\..*$/, ''), importPath),
+ ];
+ } else {
+ return [new InsertChange(ngModulePath, position, toInsert)];
+ }
+ }
+ const assignment = matchingProperties[0] as ts.PropertyAssignment;
+
+ // If it's not an array, nothing we can do really.
+ if (assignment.initializer.kind !== ts.SyntaxKind.ArrayLiteralExpression) {
+ return [];
+ }
+
+ const arrLiteral = assignment.initializer as ts.ArrayLiteralExpression;
+ if (arrLiteral.elements.length == 0) {
+ // Forward the property.
+ node = arrLiteral;
+ } else {
+ node = arrLiteral.elements;
+ }
+
+ if (!node) {
+ // tslint:disable-next-line: no-console
+ console.error('No app module found. Please add your new class to your component.');
+
+ return [];
+ }
+
+ if (Array.isArray(node)) {
+ const nodeArray = node as {} as Array;
+ const symbolsArray = nodeArray.map(node => node.getText());
+ if (symbolsArray.includes(symbolName)) {
+ return [];
+ }
+
+ node = node[node.length - 1];
+ }
+
+ let toInsert: string;
+ let position = node.getEnd();
+ if (node.kind == ts.SyntaxKind.ObjectLiteralExpression) {
+ // We haven't found the field in the metadata declaration. Insert a new
+ // field.
+ const expr = node as ts.ObjectLiteralExpression;
+ if (expr.properties.length == 0) {
+ position = expr.getEnd() - 1;
+ toInsert = ` ${symbolName}\n`;
+ } else {
+ // Get the indentation of the last element, if any.
+ const text = node.getFullText(source);
+ if (text.match(/^\r?\r?\n/)) {
+ toInsert = `,${text.match(/^\r?\n\s*/)[0]}${symbolName}`;
+ } else {
+ toInsert = `, ${symbolName}`;
+ }
+ }
+ } else if (node.kind == ts.SyntaxKind.ArrayLiteralExpression) {
+ // We found the field but it's empty. Insert it just before the `]`.
+ position--;
+ toInsert = `${symbolName}`;
+ } else {
+ // Get the indentation of the last element, if any.
+ const text = node.getFullText(source);
+ if (text.match(/^\r?\n/)) {
+ toInsert = `,${text.match(/^\r?\n(\r?)\s*/)[0]}${symbolName}`;
+ } else {
+ toInsert = `, ${symbolName}`;
+ }
+ }
+ if (importPath !== null) {
+ return [
+ new InsertChange(ngModulePath, position, toInsert),
+ insertImport(source, ngModulePath, symbolName.replace(/\..*$/, ''), importPath),
+ ];
+ }
+
+ return [new InsertChange(ngModulePath, position, toInsert)];
+}
+
+/**
+ * Custom function to insert a declaration (component, pipe, directive)
+ * into NgModule declarations. It also imports the component.
+ */
+export function addDeclarationToModule(source: ts.SourceFile,
+ modulePath: string, classifiedName: string,
+ importPath: string): Change[] {
+ return addSymbolToNgModuleMetadata(
+ source, modulePath, 'declarations', classifiedName, importPath);
+}
+
+/**
+ * Custom function to insert an NgModule into NgModule imports. It also imports the module.
+ */
+export function addImportToModule(source: ts.SourceFile,
+ modulePath: string, classifiedName: string,
+ importPath: string): Change[] {
+
+ return addSymbolToNgModuleMetadata(source, modulePath, 'imports', classifiedName, importPath);
+}
+
+/**
+ * Custom function to insert a provider into NgModule. It also imports it.
+ */
+export function addProviderToModule(source: ts.SourceFile,
+ modulePath: string, classifiedName: string,
+ importPath: string): Change[] {
+ return addSymbolToNgModuleMetadata(source, modulePath, 'providers', classifiedName, importPath);
+}
+
+/**
+ * Custom function to insert an export into NgModule. It also imports it.
+ */
+export function addExportToModule(source: ts.SourceFile,
+ modulePath: string, classifiedName: string,
+ importPath: string): Change[] {
+ return addSymbolToNgModuleMetadata(source, modulePath, 'exports', classifiedName, importPath);
+}
+
+/**
+ * Custom function to insert an export into NgModule. It also imports it.
+ */
+export function addBootstrapToModule(source: ts.SourceFile,
+ modulePath: string, classifiedName: string,
+ importPath: string): Change[] {
+ return addSymbolToNgModuleMetadata(source, modulePath, 'bootstrap', classifiedName, importPath);
+}
+
+/**
+ * Custom function to insert an entryComponent into NgModule. It also imports it.
+ * @deprecated - Since version 9.0.0 with Ivy, entryComponents is no longer necessary.
+ */
+export function addEntryComponentToModule(source: ts.SourceFile,
+ modulePath: string, classifiedName: string,
+ importPath: string): Change[] {
+ return addSymbolToNgModuleMetadata(
+ source, modulePath,
+ 'entryComponents', classifiedName, importPath,
+ );
+}
+
+/**
+ * Determine if an import already exists.
+ */
+export function isImported(source: ts.SourceFile,
+ classifiedName: string,
+ importPath: string): boolean {
+ const allNodes = getSourceNodes(source);
+ const matchingNodes = allNodes
+ .filter(ts.isImportDeclaration)
+ .filter(
+ (imp) => ts.isStringLiteral(imp.moduleSpecifier) && imp.moduleSpecifier.text === importPath,
+ )
+ .filter((imp) => {
+ if (!imp.importClause) {
+ return false;
+ }
+ const nodes = findNodes(imp.importClause, ts.isImportSpecifier).filter(
+ (n) => n.getText() === classifiedName,
+ );
+
+ return nodes.length > 0;
+ });
+
+ return matchingNodes.length > 0;
+}
+
+/**
+ * This function returns the name of the environment export
+ * whether this export is aliased or not. If the environment file
+ * is not imported, then it will return `null`.
+ */
+export function getEnvironmentExportName(source: ts.SourceFile): string | null {
+ // Initial value is `null` as we don't know yet if the user
+ // has imported `environment` into the root module or not.
+ let environmentExportName: string | null = null;
+
+ const allNodes = getSourceNodes(source);
+
+ allNodes
+ .filter(ts.isImportDeclaration)
+ .filter(
+ (declaration) =>
+ declaration.moduleSpecifier.kind === ts.SyntaxKind.StringLiteral &&
+ declaration.importClause !== undefined,
+ )
+ .map((declaration) =>
+ // If `importClause` property is defined then the first
+ // child will be `NamedImports` object (or `namedBindings`).
+ (declaration.importClause as ts.ImportClause).getChildAt(0),
+ )
+ // Find those `NamedImports` object that contains `environment` keyword
+ // in its text. E.g. `{ environment as env }`.
+ .filter(ts.isNamedImports)
+ .filter((namedImports) => namedImports.getText().includes('environment'))
+ .forEach((namedImports) => {
+ for (const specifier of namedImports.elements) {
+ // `propertyName` is defined if the specifier
+ // has an aliased import.
+ const name = specifier.propertyName || specifier.name;
+
+ // Find specifier that contains `environment` keyword in its text.
+ // Whether it's `environment` or `environment as env`.
+ if (name.text.includes('environment')) {
+ environmentExportName = specifier.name.text;
+ }
+ }
+ });
+
+ return environmentExportName;
+}
+
+/**
+ * Returns the RouterModule declaration from NgModule metadata, if any.
+ */
+export function getRouterModuleDeclaration(source: ts.SourceFile): ts.Expression | undefined {
+ const result = getDecoratorMetadata(source, 'NgModule', '@angular/core') as ts.Node[];
+ const node = result[0] as ts.ObjectLiteralExpression;
+ const matchingProperties = getMetadataField(node, 'imports');
+
+ if (!matchingProperties) {
+ return;
+ }
+
+ const assignment = matchingProperties[0] as ts.PropertyAssignment;
+
+ if (assignment.initializer.kind !== ts.SyntaxKind.ArrayLiteralExpression) {
+ return;
+ }
+
+ const arrLiteral = assignment.initializer as ts.ArrayLiteralExpression;
+
+ return arrLiteral.elements
+ .filter(el => el.kind === ts.SyntaxKind.CallExpression)
+ .find(el => (el as ts.Identifier).getText().startsWith('RouterModule'));
+}
+
+/**
+ * Adds a new route declaration to a router module (i.e. has a RouterModule declaration)
+ */
+export function addRouteDeclarationToModule(
+ source: ts.SourceFile,
+ fileToAdd: string,
+ routeLiteral: string,
+): Change {
+ const routerModuleExpr = getRouterModuleDeclaration(source);
+ if (!routerModuleExpr) {
+ throw new Error(`Couldn't find a route declaration in ${fileToAdd}.`);
+ }
+ const scopeConfigMethodArgs = (routerModuleExpr as ts.CallExpression).arguments;
+ if (!scopeConfigMethodArgs.length) {
+ const { line } = source.getLineAndCharacterOfPosition(routerModuleExpr.getStart());
+ throw new Error(
+ `The router module method doesn't have arguments ` +
+ `at line ${line} in ${fileToAdd}`,
+ );
+ }
+
+ let routesArr: ts.ArrayLiteralExpression | undefined;
+ const routesArg = scopeConfigMethodArgs[0];
+
+ // Check if the route declarations array is
+ // an inlined argument of RouterModule or a standalone variable
+ if (ts.isArrayLiteralExpression(routesArg)) {
+ routesArr = routesArg;
+ } else {
+ const routesVarName = routesArg.getText();
+ let routesVar;
+ if (routesArg.kind === ts.SyntaxKind.Identifier) {
+ routesVar = source.statements
+ .filter(ts.isVariableStatement)
+ .find((v) => {
+ return v.declarationList.declarations[0].name.getText() === routesVarName;
+ });
+ }
+
+ if (!routesVar) {
+ const { line } = source.getLineAndCharacterOfPosition(routesArg.getStart());
+ throw new Error(
+ `No route declaration array was found that corresponds ` +
+ `to router module at line ${line} in ${fileToAdd}`,
+ );
+ }
+
+ routesArr = findNodes(routesVar, ts.SyntaxKind.ArrayLiteralExpression, 1)[0] as ts.ArrayLiteralExpression;
+ }
+
+ const occurrencesCount = routesArr.elements.length;
+ const text = routesArr.getFullText(source);
+
+ let route: string = routeLiteral;
+ let insertPos = routesArr.elements.pos;
+
+ if (occurrencesCount > 0) {
+ const lastRouteLiteral = [...routesArr.elements].pop() as ts.Expression;
+ const lastRouteIsWildcard = ts.isObjectLiteralExpression(lastRouteLiteral)
+ && lastRouteLiteral
+ .properties
+ .some(n => (
+ ts.isPropertyAssignment(n)
+ && ts.isIdentifier(n.name)
+ && n.name.text === 'path'
+ && ts.isStringLiteral(n.initializer)
+ && n.initializer.text === '**'
+ ));
+
+ const indentation = text.match(/\r?\n(\r?)\s*/) || [];
+ const routeText = `${indentation[0] || ' '}${routeLiteral}`;
+
+ // Add the new route before the wildcard route
+ // otherwise we'll always redirect to the wildcard route
+ if (lastRouteIsWildcard) {
+ insertPos = lastRouteLiteral.pos;
+ route = `${routeText},`;
+ } else {
+ insertPos = lastRouteLiteral.end;
+ route = `,${routeText}`;
+ }
+ }
+
+ return new InsertChange(fileToAdd, insertPos, route);
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/change.ts b/npm/ng-packs/packages/schematics/src/utils/angular/change.ts
new file mode 100644
index 0000000000..12556352ab
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/change.ts
@@ -0,0 +1,127 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+export interface Host {
+ write(path: string, content: string): Promise;
+ read(path: string): Promise;
+}
+
+
+export interface Change {
+ apply(host: Host): Promise;
+
+ // The file this change should be applied to. Some changes might not apply to
+ // a file (maybe the config).
+ readonly path: string | null;
+
+ // The order this change should be applied. Normally the position inside the file.
+ // Changes are applied from the bottom of a file to the top.
+ readonly order: number;
+
+ // The description of this change. This will be outputted in a dry or verbose run.
+ readonly description: string;
+}
+
+
+/**
+ * An operation that does nothing.
+ */
+export class NoopChange implements Change {
+ description = 'No operation.';
+ order = Infinity;
+ path = null;
+ apply() { return Promise.resolve(); }
+}
+
+
+/**
+ * Will add text to the source code.
+ */
+export class InsertChange implements Change {
+
+ order: number;
+ description: string;
+
+ constructor(public path: string, public pos: number, public toAdd: string) {
+ if (pos < 0) {
+ throw new Error('Negative positions are invalid');
+ }
+ this.description = `Inserted ${toAdd} into position ${pos} of ${path}`;
+ this.order = pos;
+ }
+
+ /**
+ * This method does not insert spaces if there is none in the original string.
+ */
+ apply(host: Host) {
+ return host.read(this.path).then(content => {
+ const prefix = content.substring(0, this.pos);
+ const suffix = content.substring(this.pos);
+
+ return host.write(this.path, `${prefix}${this.toAdd}${suffix}`);
+ });
+ }
+}
+
+/**
+ * Will remove text from the source code.
+ */
+export class RemoveChange implements Change {
+
+ order: number;
+ description: string;
+
+ constructor(public path: string, private pos: number, private toRemove: string) {
+ if (pos < 0) {
+ throw new Error('Negative positions are invalid');
+ }
+ this.description = `Removed ${toRemove} into position ${pos} of ${path}`;
+ this.order = pos;
+ }
+
+ apply(host: Host): Promise {
+ return host.read(this.path).then(content => {
+ const prefix = content.substring(0, this.pos);
+ const suffix = content.substring(this.pos + this.toRemove.length);
+
+ // TODO: throw error if toRemove doesn't match removed string.
+ return host.write(this.path, `${prefix}${suffix}`);
+ });
+ }
+}
+
+/**
+ * Will replace text from the source code.
+ */
+export class ReplaceChange implements Change {
+ order: number;
+ description: string;
+
+ constructor(public path: string, private pos: number, private oldText: string,
+ private newText: string) {
+ if (pos < 0) {
+ throw new Error('Negative positions are invalid');
+ }
+ this.description = `Replaced ${oldText} into position ${pos} of ${path} with ${newText}`;
+ this.order = pos;
+ }
+
+ apply(host: Host): Promise {
+ return host.read(this.path).then(content => {
+ const prefix = content.substring(0, this.pos);
+ const suffix = content.substring(this.pos + this.oldText.length);
+ const text = content.substring(this.pos, this.pos + this.oldText.length);
+
+ if (text !== this.oldText) {
+ return Promise.reject(new Error(`Invalid replace: "${text}" != "${this.oldText}".`));
+ }
+
+ // TODO: throw error if oldText doesn't match removed string.
+ return host.write(this.path, `${prefix}${this.newText}${suffix}`);
+ });
+ }
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/config.ts b/npm/ng-packs/packages/schematics/src/utils/angular/config.ts
new file mode 100644
index 0000000000..ce0d15320b
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/config.ts
@@ -0,0 +1,532 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+import { JsonParseMode, parseJson } from '@angular-devkit/core';
+import { Rule, SchematicContext, SchematicsException, Tree } from '@angular-devkit/schematics';
+import { ProjectType, WorkspaceProject, WorkspaceSchema } from './workspace-models';
+
+// The interfaces below are generated from the Angular CLI configuration schema
+// https://github.com/angular/angular-cli/blob/master/packages/@angular/cli/lib/config/schema.json
+export interface AppConfig {
+ /**
+ * Name of the app.
+ */
+ name?: string;
+ /**
+ * Directory where app files are placed.
+ */
+ appRoot?: string;
+ /**
+ * The root directory of the app.
+ */
+ root?: string;
+ /**
+ * The output directory for build results.
+ */
+ outDir?: string;
+ /**
+ * List of application assets.
+ */
+ assets?: (string | {
+ /**
+ * The pattern to match.
+ */
+ glob?: string;
+ /**
+ * The dir to search within.
+ */
+ input?: string;
+ /**
+ * The output path (relative to the outDir).
+ */
+ output?: string;
+ })[];
+ /**
+ * URL where files will be deployed.
+ */
+ deployUrl?: string;
+ /**
+ * Base url for the application being built.
+ */
+ baseHref?: string;
+ /**
+ * The runtime platform of the app.
+ */
+ platform?: ('browser' | 'server');
+ /**
+ * The name of the start HTML file.
+ */
+ index?: string;
+ /**
+ * The name of the main entry-point file.
+ */
+ main?: string;
+ /**
+ * The name of the polyfills file.
+ */
+ polyfills?: string;
+ /**
+ * The name of the test entry-point file.
+ */
+ test?: string;
+ /**
+ * The name of the TypeScript configuration file.
+ */
+ tsconfig?: string;
+ /**
+ * The name of the TypeScript configuration file for unit tests.
+ */
+ testTsconfig?: string;
+ /**
+ * The prefix to apply to generated selectors.
+ */
+ prefix?: string;
+ /**
+ * Experimental support for a service worker from @angular/service-worker.
+ */
+ serviceWorker?: boolean;
+ /**
+ * Global styles to be included in the build.
+ */
+ styles?: (string | {
+ input?: string;
+ [name: string]: any; // tslint:disable-line:no-any
+ })[];
+ /**
+ * Options to pass to style preprocessors
+ */
+ stylePreprocessorOptions?: {
+ /**
+ * Paths to include. Paths will be resolved to project root.
+ */
+ includePaths?: string[];
+ };
+ /**
+ * Global scripts to be included in the build.
+ */
+ scripts?: (string | {
+ input: string;
+ [name: string]: any; // tslint:disable-line:no-any
+ })[];
+ /**
+ * Source file for environment config.
+ */
+ environmentSource?: string;
+ /**
+ * Name and corresponding file for environment config.
+ */
+ environments?: {
+ [name: string]: any; // tslint:disable-line:no-any
+ };
+ appShell?: {
+ app: string;
+ route: string;
+ };
+ budgets?: {
+ /**
+ * The type of budget
+ */
+ type?: ('bundle' | 'initial' | 'allScript' | 'all' | 'anyScript' | 'any' | 'anyComponentStyle');
+ /**
+ * The name of the bundle
+ */
+ name?: string;
+ /**
+ * The baseline size for comparison.
+ */
+ baseline?: string;
+ /**
+ * The maximum threshold for warning relative to the baseline.
+ */
+ maximumWarning?: string;
+ /**
+ * The maximum threshold for error relative to the baseline.
+ */
+ maximumError?: string;
+ /**
+ * The minimum threshold for warning relative to the baseline.
+ */
+ minimumWarning?: string;
+ /**
+ * The minimum threshold for error relative to the baseline.
+ */
+ minimumError?: string;
+ /**
+ * The threshold for warning relative to the baseline (min & max).
+ */
+ warning?: string;
+ /**
+ * The threshold for error relative to the baseline (min & max).
+ */
+ error?: string;
+ }[];
+}
+
+export interface CliConfig {
+ $schema?: string;
+ /**
+ * The global configuration of the project.
+ */
+ project?: {
+ /**
+ * The name of the project.
+ */
+ name?: string;
+ /**
+ * Whether or not this project was ejected.
+ */
+ ejected?: boolean;
+ };
+ /**
+ * Properties of the different applications in this project.
+ */
+ apps?: AppConfig[];
+ /**
+ * Configuration for end-to-end tests.
+ */
+ e2e?: {
+ protractor?: {
+ /**
+ * Path to the config file.
+ */
+ config?: string;
+ };
+ };
+ /**
+ * Properties to be passed to TSLint.
+ */
+ lint?: {
+ /**
+ * File glob(s) to lint.
+ */
+ files?: (string | string[]);
+ /**
+ * Location of the tsconfig.json project file.
+ * Will also use as files to lint if 'files' property not present.
+ */
+ project: string;
+ /**
+ * Location of the tslint.json configuration.
+ */
+ tslintConfig?: string;
+ /**
+ * File glob(s) to ignore.
+ */
+ exclude?: (string | string[]);
+ }[];
+ /**
+ * Configuration for unit tests.
+ */
+ test?: {
+ karma?: {
+ /**
+ * Path to the karma config file.
+ */
+ config?: string;
+ };
+ codeCoverage?: {
+ /**
+ * Globs to exclude from code coverage.
+ */
+ exclude?: string[];
+ };
+ };
+ /**
+ * Specify the default values for generating.
+ */
+ defaults?: {
+ /**
+ * The file extension to be used for style files.
+ */
+ styleExt?: string;
+ /**
+ * How often to check for file updates.
+ */
+ poll?: number;
+ /**
+ * Use lint to fix files after generation
+ */
+ lintFix?: boolean;
+ /**
+ * Options for generating a class.
+ */
+ class?: {
+ /**
+ * Specifies if a spec file is generated.
+ */
+ spec?: boolean;
+ };
+ /**
+ * Options for generating a component.
+ */
+ component?: {
+ /**
+ * Flag to indicate if a directory is created.
+ */
+ flat?: boolean;
+ /**
+ * Specifies if a spec file is generated.
+ */
+ spec?: boolean;
+ /**
+ * Specifies if the style will be in the ts file.
+ */
+ inlineStyle?: boolean;
+ /**
+ * Specifies if the template will be in the ts file.
+ */
+ inlineTemplate?: boolean;
+ /**
+ * Specifies the view encapsulation strategy.
+ */
+ viewEncapsulation?: ('Emulated' | 'Native' | 'None');
+ /**
+ * Specifies the change detection strategy.
+ */
+ changeDetection?: ('Default' | 'OnPush');
+ };
+ /**
+ * Options for generating a directive.
+ */
+ directive?: {
+ /**
+ * Flag to indicate if a directory is created.
+ */
+ flat?: boolean;
+ /**
+ * Specifies if a spec file is generated.
+ */
+ spec?: boolean;
+ };
+ /**
+ * Options for generating a guard.
+ */
+ guard?: {
+ /**
+ * Flag to indicate if a directory is created.
+ */
+ flat?: boolean;
+ /**
+ * Specifies if a spec file is generated.
+ */
+ spec?: boolean;
+ };
+ /**
+ * Options for generating an interface.
+ */
+ interface?: {
+ /**
+ * Prefix to apply to interface names. (i.e. I)
+ */
+ prefix?: string;
+ };
+ /**
+ * Options for generating a module.
+ */
+ module?: {
+ /**
+ * Flag to indicate if a directory is created.
+ */
+ flat?: boolean;
+ /**
+ * Specifies if a spec file is generated.
+ */
+ spec?: boolean;
+ };
+ /**
+ * Options for generating a pipe.
+ */
+ pipe?: {
+ /**
+ * Flag to indicate if a directory is created.
+ */
+ flat?: boolean;
+ /**
+ * Specifies if a spec file is generated.
+ */
+ spec?: boolean;
+ };
+ /**
+ * Options for generating a service.
+ */
+ service?: {
+ /**
+ * Flag to indicate if a directory is created.
+ */
+ flat?: boolean;
+ /**
+ * Specifies if a spec file is generated.
+ */
+ spec?: boolean;
+ };
+ /**
+ * Properties to be passed to the build command.
+ */
+ build?: {
+ /**
+ * Output sourcemaps.
+ */
+ sourcemaps?: boolean;
+ /**
+ * Base url for the application being built.
+ */
+ baseHref?: string;
+ /**
+ * The ssl key used by the server.
+ */
+ progress?: boolean;
+ /**
+ * Enable and define the file watching poll time period (milliseconds).
+ */
+ poll?: number;
+ /**
+ * Delete output path before build.
+ */
+ deleteOutputPath?: boolean;
+ /**
+ * Do not use the real path when resolving modules.
+ */
+ preserveSymlinks?: boolean;
+ /**
+ * Show circular dependency warnings on builds.
+ */
+ showCircularDependencies?: boolean;
+ /**
+ * Use a separate bundle containing code used across multiple bundles.
+ */
+ commonChunk?: boolean;
+ /**
+ * Use file name for lazy loaded chunks.
+ */
+ namedChunks?: boolean;
+ };
+ /**
+ * Properties to be passed to the serve command.
+ */
+ serve?: {
+ /**
+ * The port the application will be served on.
+ */
+ port?: number;
+ /**
+ * The host the application will be served on.
+ */
+ host?: string;
+ /**
+ * Enables ssl for the application.
+ */
+ ssl?: boolean;
+ /**
+ * The ssl key used by the server.
+ */
+ sslKey?: string;
+ /**
+ * The ssl certificate used by the server.
+ */
+ sslCert?: string;
+ /**
+ * Proxy configuration file.
+ */
+ proxyConfig?: string;
+ };
+ /**
+ * Properties about schematics.
+ */
+ schematics?: {
+ /**
+ * The schematics collection to use.
+ */
+ collection?: string;
+ /**
+ * The new app schematic.
+ */
+ newApp?: string;
+ };
+ };
+ /**
+ * Specify which package manager tool to use.
+ */
+ packageManager?: ('npm' | 'cnpm' | 'yarn' | 'default');
+ /**
+ * Allow people to disable console warnings.
+ */
+ warnings?: {
+ versionMismatch?: boolean;
+ };
+}
+
+export function getWorkspacePath(host: Tree): string {
+ const possibleFiles = [ '/angular.json', '/.angular.json' ];
+ const path = possibleFiles.filter(path => host.exists(path))[0];
+
+ return path;
+}
+
+export function getWorkspaceSchema(host: Tree): WorkspaceSchema {
+ const path = getWorkspacePath(host);
+ const configBuffer = host.read(path);
+ if (configBuffer === null) {
+ throw new SchematicsException(`Could not find (${path})`);
+ }
+ const content = configBuffer.toString();
+
+ return parseJson(content, JsonParseMode.Loose) as {} as WorkspaceSchema;
+}
+
+export function addProjectToWorkspace(
+ workspace: WorkspaceSchema,
+ name: string,
+ project: WorkspaceProject,
+): Rule {
+ return (_host: Tree, _context: SchematicContext) => {
+
+ if (workspace.projects[name]) {
+ throw new Error(`Project '${name}' already exists in workspace.`);
+ }
+
+ // Add project to workspace.
+ workspace.projects[name] = project;
+
+ if (!workspace.defaultProject && Object.keys(workspace.projects).length === 1) {
+ // Make the new project the default one.
+ workspace.defaultProject = name;
+ }
+
+ return updateWorkspaceSchema(workspace);
+ };
+}
+
+export function updateWorkspaceSchema(workspace: WorkspaceSchema): Rule {
+ return (host: Tree, _context: SchematicContext) => {
+ host.overwrite(getWorkspacePath(host), JSON.stringify(workspace, null, 2));
+ };
+}
+
+export const configPath = '/.angular-cli.json';
+
+export function getConfig(host: Tree): CliConfig {
+ const configBuffer = host.read(configPath);
+ if (configBuffer === null) {
+ throw new SchematicsException('Could not find .angular-cli.json');
+ }
+
+ const config = parseJson(configBuffer.toString(), JsonParseMode.Loose) as {} as CliConfig;
+
+ return config;
+}
+
+export function getAppFromConfig(config: CliConfig, appIndexOrName: string): AppConfig | null {
+ if (!config.apps) {
+ return null;
+ }
+
+ if (parseInt(appIndexOrName) >= 0) {
+ return config.apps[parseInt(appIndexOrName)];
+ }
+
+ return config.apps.filter((app) => app.name === appIndexOrName)[0];
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/dependencies.ts b/npm/ng-packs/packages/schematics/src/utils/angular/dependencies.ts
new file mode 100644
index 0000000000..76a60f53e6
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/dependencies.ts
@@ -0,0 +1,76 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+import { Tree } from '@angular-devkit/schematics';
+import { JSONFile } from './json-file';
+
+const PKG_JSON_PATH = '/package.json';
+export enum NodeDependencyType {
+ Default = 'dependencies',
+ Dev = 'devDependencies',
+ Peer = 'peerDependencies',
+ Optional = 'optionalDependencies',
+}
+
+export interface NodeDependency {
+ type: NodeDependencyType;
+ name: string;
+ version: string;
+ overwrite?: boolean;
+}
+
+const ALL_DEPENDENCY_TYPE = [
+ NodeDependencyType.Default,
+ NodeDependencyType.Dev,
+ NodeDependencyType.Optional,
+ NodeDependencyType.Peer,
+];
+
+export function addPackageJsonDependency(tree: Tree, dependency: NodeDependency, pkgJsonPath = PKG_JSON_PATH): void {
+ const json = new JSONFile(tree, pkgJsonPath);
+ if (json.error) {
+ throw json.error;
+ }
+
+ const { overwrite, type, name, version } = dependency;
+ const path = [type, name];
+ if (overwrite || !json.get(path)) {
+ json.modify(path, version);
+ }
+}
+
+export function removePackageJsonDependency(tree: Tree, name: string, pkgJsonPath = PKG_JSON_PATH): void {
+ const json = new JSONFile(tree, pkgJsonPath);
+ if (json.error) {
+ throw json.error;
+ }
+
+ for (const depType of ALL_DEPENDENCY_TYPE) {
+ json.remove([depType, name]);
+ }
+}
+
+export function getPackageJsonDependency(tree: Tree, name: string, pkgJsonPath = PKG_JSON_PATH): NodeDependency | null {
+ const json = new JSONFile(tree, pkgJsonPath);
+ if (json.error) {
+ throw json.error;
+ }
+
+ for (const depType of ALL_DEPENDENCY_TYPE) {
+ const version = json.get([depType, name]);
+
+ if (typeof version === 'string') {
+ return {
+ type: depType,
+ name: name,
+ version,
+ };
+ }
+ }
+
+ return null;
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/find-module.ts b/npm/ng-packs/packages/schematics/src/utils/angular/find-module.ts
new file mode 100644
index 0000000000..cf2a50379a
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/find-module.ts
@@ -0,0 +1,151 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+import {
+ dirname,
+ join,
+ normalize, NormalizedRoot,
+ Path,
+ relative
+} from '@angular-devkit/core';
+import { DirEntry, Tree } from '@angular-devkit/schematics';
+
+
+export interface ModuleOptions {
+ project?: string; // added this
+ module?: string;
+ name: string;
+ flat?: boolean;
+ path?: string;
+ route?: string; // added this
+ selector?: string; // added this
+ skipImport?: boolean;
+ moduleExt?: string;
+ routingModuleExt?: string;
+}
+
+export const MODULE_EXT = '.module.ts';
+export const ROUTING_MODULE_EXT = '-routing.module.ts';
+
+/**
+ * Find the module referred by a set of options passed to the schematics.
+ */
+export function findModuleFromOptions(host: Tree, options: ModuleOptions): Path | undefined {
+ if (options.hasOwnProperty('skipImport') && options.skipImport) {
+ return undefined;
+ }
+
+ const moduleExt = options.moduleExt || MODULE_EXT;
+ const routingModuleExt = options.routingModuleExt || ROUTING_MODULE_EXT;
+
+ if (!options.module) {
+ const pathToCheck = (options.path || '') + '/' + options.name;
+
+ return normalize(findModule(host, pathToCheck, moduleExt, routingModuleExt));
+ } else {
+ const modulePath = normalize(`/${options.path}/${options.module}`);
+ const componentPath = normalize(`/${options.path}/${options.name}`);
+ const moduleBaseName = normalize(modulePath).split('/').pop();
+
+ const candidateSet = new Set([
+ normalize(options.path || '/'),
+ ]);
+
+ for (let dir = modulePath; dir != NormalizedRoot; dir = dirname(dir)) {
+ candidateSet.add(dir);
+ }
+ for (let dir = componentPath; dir != NormalizedRoot; dir = dirname(dir)) {
+ candidateSet.add(dir);
+ }
+
+ const candidatesDirs = [...candidateSet].sort((a, b) => b.length - a.length);
+ for (const c of candidatesDirs) {
+ const candidateFiles = [
+ '',
+ `${moduleBaseName}.ts`,
+ `${moduleBaseName}${moduleExt}`,
+ ].map(x => join(c, x));
+
+ for (const sc of candidateFiles) {
+ if (host.exists(sc)) {
+ return normalize(sc);
+ }
+ }
+ }
+
+ throw new Error(
+ `Specified module '${options.module}' does not exist.\n`
+ + `Looked in the following directories:\n ${candidatesDirs.join('\n ')}`,
+ );
+ }
+}
+
+/**
+ * Function to find the "closest" module to a generated file's path.
+ */
+export function findModule(host: Tree, generateDir: string,
+ moduleExt = MODULE_EXT, routingModuleExt = ROUTING_MODULE_EXT): Path {
+
+ let dir: DirEntry | null = host.getDir('/' + generateDir);
+ let foundRoutingModule = false;
+
+ while (dir) {
+ const allMatches = dir.subfiles.filter(p => p.endsWith(moduleExt));
+ const filteredMatches = allMatches.filter(p => !p.endsWith(routingModuleExt));
+
+ foundRoutingModule = foundRoutingModule || allMatches.length !== filteredMatches.length;
+
+ if (filteredMatches.length == 1) {
+ return join(dir.path, filteredMatches[0]);
+ } else if (filteredMatches.length > 1) {
+ throw new Error(
+ 'More than one module matches. Use the skip-import option to skip importing ' +
+ 'the component into the closest module or use the module option to specify a module.');
+ }
+
+ dir = dir.parent;
+ }
+
+ const errorMsg = foundRoutingModule ? 'Could not find a non Routing NgModule.'
+ + `\nModules with suffix '${routingModuleExt}' are strictly reserved for routing.`
+ + '\nUse the skip-import option to skip importing in NgModule.'
+ : 'Could not find an NgModule. Use the skip-import option to skip importing in NgModule.';
+
+ throw new Error(errorMsg);
+}
+
+/**
+ * Build a relative path from one file path to another file path.
+ */
+export function buildRelativePath(from: string, to: string): string {
+ from = normalize(from);
+ to = normalize(to);
+
+ // Convert to arrays.
+ const fromParts = from.split('/');
+ const toParts = to.split('/');
+
+ // Remove file names (preserving destination)
+ fromParts.pop();
+ const toFileName = toParts.pop();
+
+ const relativePath = relative(normalize(fromParts.join('/') || '/'),
+ normalize(toParts.join('/') || '/'));
+ let pathPrefix = '';
+
+ // Set the path prefix for same dir or child dir, parent dir starts with `..`
+ if (!relativePath) {
+ pathPrefix = '.';
+ } else if (!relativePath.startsWith('.')) {
+ pathPrefix = `./`;
+ }
+ if (pathPrefix && !pathPrefix.endsWith('/')) {
+ pathPrefix += '/';
+ }
+
+ return pathPrefix + (relativePath ? relativePath + '/' : '') + toFileName;
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/index.ts b/npm/ng-packs/packages/schematics/src/utils/angular/index.ts
new file mode 100644
index 0000000000..fec78af448
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/index.ts
@@ -0,0 +1,17 @@
+export * from './ast-utils';
+export * from './change';
+export * from './config';
+export * from './dependencies';
+export * from './find-module';
+export * from './json-file';
+export * from './json-utils';
+export * from './latest-versions';
+export * from './lint-fix';
+export * from './ng-ast-utils';
+export * from './parse-name';
+export * from './paths';
+export * from './project-targets';
+export * from './tsconfig';
+export * from './validation';
+export * from './workspace';
+export * from './workspace-models';
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/json-file.ts b/npm/ng-packs/packages/schematics/src/utils/angular/json-file.ts
new file mode 100644
index 0000000000..1832f38c5c
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/json-file.ts
@@ -0,0 +1,82 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+import { JsonValue } from '@angular-devkit/core';
+import { Tree } from '@angular-devkit/schematics';
+import { Node, applyEdits, findNodeAtLocation, getNodeValue, modify, parseTree } from 'jsonc-parser';
+
+export type JSONPath = (string | number)[];
+
+/** @internal */
+export class JSONFile {
+ private content: string;
+ error: undefined | Error;
+
+ constructor(
+ private readonly host: Tree,
+ private readonly path: string,
+ ) {
+ const buffer = this.host.read(this.path);
+ if (buffer) {
+ this.content = buffer.toString();
+ } else {
+ this.error = new Error(`Could not read ${path}.`);
+ }
+ }
+
+ private _jsonAst: Node | undefined;
+ private get JsonAst(): Node {
+ if (this._jsonAst) {
+ return this._jsonAst;
+ }
+
+ this._jsonAst = parseTree(this.content);
+
+ return this._jsonAst;
+ }
+
+ get(jsonPath: JSONPath): unknown {
+ if (jsonPath.length === 0) {
+ return getNodeValue(this.JsonAst);
+ }
+
+ const node = findNodeAtLocation(this.JsonAst, jsonPath);
+
+ return node === undefined ? undefined : getNodeValue(node);
+ }
+
+ modify(jsonPath: JSONPath, value: JsonValue | undefined, getInsertionIndex?: (properties: string[]) => number): void {
+ if (!getInsertionIndex) {
+ const property = jsonPath.slice(-1)[0];
+ getInsertionIndex = properties => [...properties, property].sort().findIndex(p => p === property);
+ }
+
+ const edits = modify(
+ this.content,
+ jsonPath,
+ value,
+ {
+ getInsertionIndex,
+ formattingOptions: {
+ insertSpaces: true,
+ tabSize: 2,
+ },
+ },
+ );
+
+ this.content = applyEdits(this.content, edits);
+ this.host.overwrite(this.path, this.content);
+ this._jsonAst = undefined;
+ }
+
+ remove(jsonPath: JSONPath): void {
+ if (this.get(jsonPath) !== undefined) {
+ this.modify(jsonPath, undefined);
+ }
+ }
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/json-utils.ts b/npm/ng-packs/packages/schematics/src/utils/angular/json-utils.ts
new file mode 100644
index 0000000000..cf1754a9a4
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/json-utils.ts
@@ -0,0 +1,231 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+import {
+ JsonAstArray,
+ JsonAstKeyValue,
+ JsonAstNode,
+ JsonAstObject,
+ JsonValue,
+} from '@angular-devkit/core';
+import { UpdateRecorder } from '@angular-devkit/schematics';
+
+export function appendPropertyInAstObject(
+ recorder: UpdateRecorder,
+ node: JsonAstObject,
+ propertyName: string,
+ value: JsonValue,
+ indent: number,
+) {
+ const indentStr = _buildIndent(indent);
+ let index = node.start.offset + 1;
+ if (node.properties.length > 0) {
+ // Insert comma.
+ const last = node.properties[node.properties.length - 1];
+ const { text, end } = last;
+ const commaIndex = text.endsWith('\n') ? end.offset - 1 : end.offset;
+ recorder.insertRight(commaIndex, ',');
+ index = end.offset;
+ }
+ const content = _stringifyContent(value, indentStr);
+ recorder.insertRight(
+ index,
+ (node.properties.length === 0 && indent ? '\n' : '')
+ + ' '.repeat(indent)
+ + `"${propertyName}":${indent ? ' ' : ''}${content}`
+ + indentStr.slice(0, -indent),
+ );
+}
+
+export function insertPropertyInAstObjectInOrder(
+ recorder: UpdateRecorder,
+ node: JsonAstObject,
+ propertyName: string,
+ value: JsonValue,
+ indent: number,
+) {
+
+ if (node.properties.length === 0) {
+ appendPropertyInAstObject(recorder, node, propertyName, value, indent);
+
+ return;
+ }
+
+ // Find insertion info.
+ let insertAfterProp: JsonAstKeyValue | null = null;
+ let prev: JsonAstKeyValue | null = null;
+ let isLastProp = false;
+ const last = node.properties[node.properties.length - 1];
+ for (const prop of node.properties) {
+ if (prop.key.value > propertyName) {
+ if (prev) {
+ insertAfterProp = prev;
+ }
+ break;
+ }
+ if (prop === last) {
+ isLastProp = true;
+ insertAfterProp = last;
+ }
+ prev = prop;
+ }
+
+ if (isLastProp) {
+ appendPropertyInAstObject(recorder, node, propertyName, value, indent);
+
+ return;
+ }
+
+ const indentStr = _buildIndent(indent);
+ const insertIndex = insertAfterProp === null
+ ? node.start.offset + 1
+ : insertAfterProp.end.offset + 1;
+ const content = _stringifyContent(value, indentStr);
+ recorder.insertRight(
+ insertIndex,
+ indentStr
+ + `"${propertyName}":${indent ? ' ' : ''}${content}`
+ + ',',
+ );
+}
+
+export function removePropertyInAstObject(
+ recorder: UpdateRecorder,
+ node: JsonAstObject,
+ propertyName: string,
+) {
+ // Find the property inside the object.
+ const propIdx = node.properties.findIndex(prop => prop.key.value === propertyName);
+
+ if (propIdx === -1) {
+ // There's nothing to remove.
+ return;
+ }
+
+ if (node.properties.length === 1) {
+ // This is a special case. Everything should be removed, including indentation.
+ recorder.remove(node.start.offset, node.end.offset - node.start.offset);
+ recorder.insertRight(node.start.offset, '{}');
+
+ return;
+ }
+
+ // The AST considers commas and indentation to be part of the preceding property.
+ // To get around messy comma and identation management, we can work over the range between
+ // two properties instead.
+ const previousProp = node.properties[propIdx - 1];
+ const targetProp = node.properties[propIdx];
+ const nextProp = node.properties[propIdx + 1];
+
+ let start, end;
+ if (previousProp) {
+ // Given the object below, and intending to remove the `m` property:
+ // "{\n \"a\": \"a\",\n \"m\": \"m\",\n \"z\": \"z\"\n}"
+ // ^---------------^
+ // Removing the range above results in:
+ // "{\n \"a\": \"a\",\n \"z\": \"z\"\n}"
+ start = previousProp.end;
+ end = targetProp.end;
+ } else {
+ // If there's no previousProp there is a nextProp, since we've specialcased the 1 length case.
+ // Given the object below, and intending to remove the `a` property:
+ // "{\n \"a\": \"a\",\n \"m\": \"m\",\n \"z\": \"z\"\n}"
+ // ^---------------^
+ // Removing the range above results in:
+ // "{\n \"m\": \"m\",\n \"z\": \"z\"\n}"
+ start = targetProp.start;
+ end = nextProp.start;
+ }
+
+ recorder.remove(start.offset, end.offset - start.offset);
+ if (!nextProp) {
+ recorder.insertRight(start.offset, '\n');
+ }
+}
+
+
+export function appendValueInAstArray(
+ recorder: UpdateRecorder,
+ node: JsonAstArray,
+ value: JsonValue,
+ indent = 4,
+) {
+ let indentStr = _buildIndent(indent);
+ let index = node.start.offset + 1;
+ // tslint:disable-next-line: no-any
+ let newNodes: any[] | undefined;
+
+ if (node.elements.length > 0) {
+ // Insert comma.
+ const { end } = node.elements[node.elements.length - 1];
+ const isClosingOnSameLine = node.end.offset - end.offset === 1;
+
+ if (isClosingOnSameLine && indent) {
+ // Reformat the entire array
+ recorder.remove(node.start.offset, node.end.offset - node.start.offset);
+ newNodes = [
+ ...node.elements.map(({ value }) => value),
+ value,
+ ];
+ index = node.start.offset;
+ // In case we are generating the entire node we need to reduce the spacing as
+ // otherwise we'd end up having incorrect double spacing
+ indent = indent - 2;
+ indentStr = _buildIndent(indent);
+ } else {
+ recorder.insertRight(end.offset, ',');
+ index = end.offset;
+ }
+ }
+
+ recorder.insertRight(
+ index,
+ (newNodes ? '' : indentStr)
+ + _stringifyContent(newNodes || value, indentStr)
+ + (node.elements.length === 0 && indent ? indentStr.substr(0, -indent) + '\n' : ''),
+ );
+}
+
+
+export function findPropertyInAstObject(
+ node: JsonAstObject,
+ propertyName: string,
+): JsonAstNode | null {
+ let maybeNode: JsonAstNode | null = null;
+ for (const property of node.properties) {
+ if (property.key.value == propertyName) {
+ maybeNode = property.value;
+ }
+ }
+
+ return maybeNode;
+}
+
+function _buildIndent(count: number): string {
+ return count ? '\n' + ' '.repeat(count) : '';
+}
+
+function _stringifyContent(value: JsonValue, indentStr: string): string {
+ // TODO: Add snapshot tests
+
+ // The 'space' value is 2, because we want to add 2 additional
+ // indents from the 'key' node.
+
+ // If we use the indent provided we will have double indents:
+ // "budgets": [
+ // {
+ // "type": "initial",
+ // "maximumWarning": "2mb",
+ // "maximumError": "5mb"
+ // },
+ // {
+ // "type": "anyComponentStyle",
+ // 'maximumWarning": "5kb"
+ // }
+ // ]
+ return JSON.stringify(value, null, 2).replace(/\n/g, indentStr);
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/latest-versions.ts b/npm/ng-packs/packages/schematics/src/utils/angular/latest-versions.ts
new file mode 100644
index 0000000000..bead0e6282
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/latest-versions.ts
@@ -0,0 +1,26 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+export const latestVersions = {
+ // These versions should be kept up to date with latest Angular peer dependencies.
+ Angular: '~10.0.0-rc.0',
+ RxJs: '~6.6.0',
+ ZoneJs: '~0.10.2',
+ TypeScript: '~3.9.5',
+ TsLib: '^2.0.0',
+
+ // The versions below must be manually updated when making a new devkit release.
+ // For our e2e tests, these versions must match the latest tag present on the branch.
+ // During RC periods they will not match the latest RC until there's a new git tag, and
+ // should not be updated.
+ DevkitBuildAngular: '~0.1000.0-rc.0',
+ DevkitBuildNgPackagr: '~0.1000.0-rc.0',
+ DevkitBuildWebpack: '~0.1000.0-rc.0',
+
+ ngPackagr: '^10.0.0',
+};
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/lint-fix.ts b/npm/ng-packs/packages/schematics/src/utils/angular/lint-fix.ts
new file mode 100644
index 0000000000..f794bf681f
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/lint-fix.ts
@@ -0,0 +1,51 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+import {
+ DirEntry,
+ Rule,
+ SchematicContext,
+ SchematicsException,
+ Tree,
+} from '@angular-devkit/schematics';
+import { TslintFixTask } from '@angular-devkit/schematics/tasks';
+
+export function applyLintFix(path = '/'): Rule {
+ return (tree: Tree, context: SchematicContext) => {
+ // Find the closest tslint.json or tslint.yaml
+ let dir: DirEntry | null = tree.getDir(path.substr(0, path.lastIndexOf('/')));
+
+ do {
+ if ((dir.subfiles as string[]).some(f => f === 'tslint.json' || f === 'tslint.yaml')) {
+ break;
+ }
+
+ dir = dir.parent;
+ } while (dir !== null);
+
+ if (dir === null) {
+ throw new SchematicsException(
+ 'Asked to run lint fixes, but could not find a tslint.json or tslint.yaml config file.');
+ }
+
+ // Only include files that have been touched.
+ const files = tree.actions.reduce((acc: Set, action) => {
+ const path = action.path.substr(1); // Remove the starting '/'.
+ if (path.endsWith('.ts') && dir && action.path.startsWith(dir.path)) {
+ acc.add(path);
+ }
+
+ return acc;
+ }, new Set());
+
+ context.addTask(new TslintFixTask({
+ ignoreErrors: true,
+ tsConfigPath: 'tsconfig.json',
+ files: [...files],
+ }));
+ };
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/ng-ast-utils.ts b/npm/ng-packs/packages/schematics/src/utils/angular/ng-ast-utils.ts
new file mode 100644
index 0000000000..2c48c9b8bd
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/ng-ast-utils.ts
@@ -0,0 +1,87 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+import { normalize } from '@angular-devkit/core';
+import { SchematicsException, Tree } from '@angular-devkit/schematics';
+import { dirname } from 'path';
+import * as ts from 'typescript';
+import { findNode, getSourceNodes } from './ast-utils';
+
+export function findBootstrapModuleCall(host: Tree, mainPath: string): ts.CallExpression | null {
+ const mainBuffer = host.read(mainPath);
+ if (!mainBuffer) {
+ throw new SchematicsException(`Main file (${mainPath}) not found`);
+ }
+ const mainText = mainBuffer.toString('utf-8');
+ const source = ts.createSourceFile(mainPath, mainText, ts.ScriptTarget.Latest, true);
+
+ const allNodes = getSourceNodes(source);
+
+ let bootstrapCall: ts.CallExpression | null = null;
+
+ for (const node of allNodes) {
+ let bootstrapCallNode: ts.Node | null = null;
+ bootstrapCallNode = findNode(node, ts.SyntaxKind.Identifier, 'bootstrapModule');
+
+ // Walk up the parent until CallExpression is found.
+ while (
+ bootstrapCallNode &&
+ bootstrapCallNode.parent &&
+ bootstrapCallNode.parent.kind !== ts.SyntaxKind.CallExpression
+ ) {
+ bootstrapCallNode = bootstrapCallNode.parent;
+ }
+
+ if (
+ bootstrapCallNode !== null &&
+ bootstrapCallNode.parent !== undefined &&
+ bootstrapCallNode.parent.kind === ts.SyntaxKind.CallExpression
+ ) {
+ bootstrapCall = bootstrapCallNode.parent as ts.CallExpression;
+ break;
+ }
+ }
+
+ return bootstrapCall;
+}
+
+export function findBootstrapModulePath(host: Tree, mainPath: string): string {
+ const bootstrapCall = findBootstrapModuleCall(host, mainPath);
+ if (!bootstrapCall) {
+ throw new SchematicsException('Bootstrap call not found');
+ }
+
+ const bootstrapModule = bootstrapCall.arguments[0];
+
+ const mainBuffer = host.read(mainPath);
+ if (!mainBuffer) {
+ throw new SchematicsException(`Client app main file (${mainPath}) not found`);
+ }
+ const mainText = mainBuffer.toString('utf-8');
+ const source = ts.createSourceFile(mainPath, mainText, ts.ScriptTarget.Latest, true);
+ const allNodes = getSourceNodes(source);
+ const bootstrapModuleRelativePath = allNodes
+ .filter(node => node.kind === ts.SyntaxKind.ImportDeclaration)
+ .filter(imp => {
+ return findNode(imp, ts.SyntaxKind.Identifier, bootstrapModule.getText());
+ })
+ .map((imp: ts.ImportDeclaration) => {
+ const modulePathStringLiteral = imp.moduleSpecifier as ts.StringLiteral;
+
+ return modulePathStringLiteral.text;
+ })[0];
+
+ return bootstrapModuleRelativePath;
+}
+
+export function getAppModulePath(host: Tree, mainPath: string): string {
+ const moduleRelativePath = findBootstrapModulePath(host, mainPath);
+ const mainDir = dirname(mainPath);
+ const modulePath = normalize(`/${mainDir}/${moduleRelativePath}.ts`);
+
+ return modulePath;
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/parse-name.ts b/npm/ng-packs/packages/schematics/src/utils/angular/parse-name.ts
new file mode 100644
index 0000000000..cac57b0868
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/parse-name.ts
@@ -0,0 +1,25 @@
+
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+// import { relative, Path } from "../../../angular_devkit/core/src/virtual-fs";
+import { Path, basename, dirname, join, normalize } from '@angular-devkit/core';
+
+export interface Location {
+ name: string;
+ path: Path;
+}
+
+export function parseName(path: string, name: string): Location {
+ const nameWithoutPath = basename(normalize(name));
+ const namePath = dirname(join(normalize(path), name) as Path);
+
+ return {
+ name: nameWithoutPath,
+ path: normalize('/' + namePath),
+ };
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/paths.ts b/npm/ng-packs/packages/schematics/src/utils/angular/paths.ts
new file mode 100644
index 0000000000..35729a6417
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/paths.ts
@@ -0,0 +1,19 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+import { normalize, split } from '@angular-devkit/core';
+
+export function relativePathToWorkspaceRoot(projectRoot: string | undefined): string {
+ const normalizedPath = split(normalize(projectRoot || ''));
+
+ if (normalizedPath.length === 0 || !normalizedPath[0]) {
+ return '.';
+ } else {
+ return normalizedPath.map(() => '..').join('/');
+ }
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/project-targets.ts b/npm/ng-packs/packages/schematics/src/utils/angular/project-targets.ts
new file mode 100644
index 0000000000..e99293f10e
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/project-targets.ts
@@ -0,0 +1,13 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+import { SchematicsException } from '@angular-devkit/schematics';
+
+export function targetBuildNotFoundError(): SchematicsException {
+ return new SchematicsException(`Project target "build" not found.`);
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/tsconfig.ts b/npm/ng-packs/packages/schematics/src/utils/angular/tsconfig.ts
new file mode 100644
index 0000000000..4d6679a1d8
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/tsconfig.ts
@@ -0,0 +1,70 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+import { JsonParseMode, parseJsonAst } from '@angular-devkit/core';
+import { Rule, SchematicsException, Tree } from '@angular-devkit/schematics';
+import { appendValueInAstArray, findPropertyInAstObject } from './json-utils';
+
+const SOLUTION_TSCONFIG_PATH = 'tsconfig.json';
+
+/**
+ * Add project references in "Solution Style" tsconfig.
+ */
+export function addTsConfigProjectReferences(paths: string[]): Rule {
+ return (host, context) => {
+ const logger = context.logger;
+
+ // We need to read after each write to avoid missing `,` when appending multiple items.
+ for (const path of paths) {
+ const source = host.read(SOLUTION_TSCONFIG_PATH);
+ if (!source) {
+ // Solution tsconfig doesn't exist.
+ logger.warn(`Cannot add reference '${path}' in '${SOLUTION_TSCONFIG_PATH}'. File doesn't exists.`);
+
+ return;
+ }
+
+ const jsonAst = parseJsonAst(source.toString(), JsonParseMode.Loose);
+ if (jsonAst?.kind !== 'object') {
+ // Invalid JSON
+ throw new SchematicsException(`Invalid JSON AST Object '${SOLUTION_TSCONFIG_PATH}'.`);
+ }
+
+ // Solutions style tsconfig can contain 2 properties:
+ // - 'files' with a value of empty array
+ // - 'references'
+ const filesAst = findPropertyInAstObject(jsonAst, 'files');
+ const referencesAst = findPropertyInAstObject(jsonAst, 'references');
+ if (
+ filesAst?.kind !== 'array' ||
+ filesAst.elements.length !== 0 ||
+ referencesAst?.kind !== 'array'
+ ) {
+ logger.warn(`Cannot add reference '${path}' in '${SOLUTION_TSCONFIG_PATH}'. It appears to be an invalid solution style tsconfig.`);
+
+ return;
+ }
+
+ // Append new paths
+ const recorder = host.beginUpdate(SOLUTION_TSCONFIG_PATH);
+ appendValueInAstArray(recorder, referencesAst, { 'path': `./${path}` }, 4);
+ host.commitUpdate(recorder);
+ }
+ };
+}
+
+/**
+ * Throws an exception when the base tsconfig doesn't exists.
+ */
+export function verifyBaseTsConfigExists(host: Tree): void {
+ if (host.exists('tsconfig.base.json')) {
+ return;
+ }
+
+ throw new SchematicsException(`Cannot find base TypeScript configuration file 'tsconfig.base.json'.`);
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/validation.ts b/npm/ng-packs/packages/schematics/src/utils/angular/validation.ts
new file mode 100644
index 0000000000..923b819df9
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/validation.ts
@@ -0,0 +1,77 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+import { tags } from '@angular-devkit/core';
+import { SchematicsException } from '@angular-devkit/schematics';
+
+export function validateName(name: string): void {
+ if (name && /^\d/.test(name)) {
+ throw new SchematicsException(tags.oneLine`name (${name})
+ can not start with a digit.`);
+ }
+}
+
+// Must start with a letter, and must contain only alphanumeric characters or dashes.
+// When adding a dash the segment after the dash must also start with a letter.
+export const htmlSelectorRe = /^[a-zA-Z][.0-9a-zA-Z]*(:?-[a-zA-Z][.0-9a-zA-Z]*)*$/;
+
+export function validateHtmlSelector(selector: string): void {
+ if (selector && !htmlSelectorRe.test(selector)) {
+ throw new SchematicsException(tags.oneLine`Selector (${selector})
+ is invalid.`);
+ }
+}
+
+
+export function validateProjectName(projectName: string) {
+ const errorIndex = getRegExpFailPosition(projectName);
+ const unsupportedProjectNames: string[] = [];
+ const packageNameRegex = /^(?:@[a-zA-Z0-9_-]+\/)?[a-zA-Z0-9_-]+$/;
+ if (errorIndex !== null) {
+ const firstMessage = tags.oneLine`
+ Project name "${projectName}" is not valid. New project names must
+ start with a letter, and must contain only alphanumeric characters or dashes.
+ When adding a dash the segment after the dash must also start with a letter.
+ `;
+ const msg = tags.stripIndent`
+ ${firstMessage}
+ ${projectName}
+ ${Array(errorIndex + 1).join(' ') + '^'}
+ `;
+ throw new SchematicsException(msg);
+ } else if (unsupportedProjectNames.indexOf(projectName) !== -1) {
+ throw new SchematicsException(
+ `Project name ${JSON.stringify(projectName)} is not a supported name.`);
+ } else if (!packageNameRegex.test(projectName)) {
+ throw new SchematicsException(`Project name ${JSON.stringify(projectName)} is invalid.`);
+ }
+}
+
+function getRegExpFailPosition(str: string): number | null {
+ const isScope = /^@.*\/.*/.test(str);
+ if (isScope) {
+ // Remove starting @
+ str = str.replace(/^@/, '');
+ // Change / to - for validation
+ str = str.replace(/\//g, '-');
+ }
+
+ const parts = str.indexOf('-') >= 0 ? str.split('-') : [str];
+ const matched: string[] = [];
+
+ const projectNameRegexp = /^[a-zA-Z][.0-9a-zA-Z]*(-[.0-9a-zA-Z]*)*$/;
+
+ parts.forEach(part => {
+ if (part.match(projectNameRegexp)) {
+ matched.push(part);
+ }
+ });
+
+ const compare = matched.join('-');
+
+ return (str !== compare) ? compare.length : null;
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/workspace-models.ts b/npm/ng-packs/packages/schematics/src/utils/angular/workspace-models.ts
new file mode 100644
index 0000000000..c03a857d43
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/workspace-models.ts
@@ -0,0 +1,171 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+import { experimental } from '@angular-devkit/core';
+
+export enum ProjectType {
+ Application = 'application',
+ Library = 'library',
+}
+
+export enum Builders {
+ AppShell = '@angular-devkit/build-angular:app-shell',
+ Server = '@angular-devkit/build-angular:server',
+ Browser = '@angular-devkit/build-angular:browser',
+ Karma = '@angular-devkit/build-angular:karma',
+ TsLint = '@angular-devkit/build-angular:tslint',
+ NgPackagr = '@angular-devkit/build-ng-packagr:build',
+ DevServer = '@angular-devkit/build-angular:dev-server',
+ ExtractI18n = '@angular-devkit/build-angular:extract-i18n',
+ Protractor = '@angular-devkit/build-angular:protractor',
+}
+
+export interface FileReplacements {
+ replace: string;
+ with: string;
+}
+
+export interface BrowserBuilderBaseOptions {
+ main: string;
+ tsConfig: string;
+ fileReplacements?: FileReplacements[];
+ outputPath?: string;
+ index?: string;
+ polyfills: string;
+ assets?: (object|string)[];
+ styles?: (object|string)[];
+ scripts?: (object|string)[];
+ sourceMap?: boolean;
+}
+
+export type OutputHashing = 'all' | 'media' | 'none' | 'bundles';
+
+export interface BrowserBuilderOptions extends BrowserBuilderBaseOptions {
+ serviceWorker?: boolean;
+ optimization?: boolean;
+ outputHashing?: OutputHashing;
+ resourcesOutputPath?: string;
+ extractCss?: boolean;
+ namedChunks?: boolean;
+ aot?: boolean;
+ extractLicenses?: boolean;
+ vendorChunk?: boolean;
+ buildOptimizer?: boolean;
+ ngswConfigPath?: string;
+ budgets?: {
+ type: string;
+ maximumWarning?: string;
+ maximumError?: string;
+ }[];
+ webWorkerTsConfig?: string;
+}
+
+export interface ServeBuilderOptions {
+ browserTarget: string;
+}
+export interface LibraryBuilderOptions {
+ tsConfig: string;
+ project: string;
+}
+
+export interface ServerBuilderOptions {
+ outputPath: string;
+ tsConfig: string;
+ main: string;
+ fileReplacements?: FileReplacements[];
+ optimization?: {
+ scripts?: boolean;
+ styles?: boolean;
+ };
+ sourceMap?: boolean | {
+ scripts?: boolean;
+ styles?: boolean;
+ hidden?: boolean;
+ vendor?: boolean;
+ };
+}
+
+export interface AppShellBuilderOptions {
+ browserTarget: string;
+ serverTarget: string;
+ route: string;
+}
+
+export interface TestBuilderOptions extends Partial {
+ karmaConfig: string;
+}
+
+export interface LintBuilderOptions {
+ tsConfig: string[] | string;
+ exclude?: string[];
+}
+
+export interface ExtractI18nOptions {
+ browserTarget: string;
+}
+
+export interface E2EOptions {
+ protractorConfig: string;
+ devServerTarget: string;
+}
+
+export interface BuilderTarget {
+ builder: TBuilder;
+ options: TOptions;
+ configurations?: {
+ production: Partial;
+ [key: string]: Partial;
+ };
+}
+
+export type LibraryBuilderTarget = BuilderTarget;
+export type BrowserBuilderTarget = BuilderTarget;
+export type ServerBuilderTarget = BuilderTarget;
+export type AppShellBuilderTarget = BuilderTarget;
+export type LintBuilderTarget = BuilderTarget;
+export type TestBuilderTarget = BuilderTarget;
+export type ServeBuilderTarget = BuilderTarget;
+export type ExtractI18nBuilderTarget = BuilderTarget;
+export type E2EBuilderTarget = BuilderTarget;
+
+export interface WorkspaceSchema extends experimental.workspace.WorkspaceSchema {
+ projects: {
+ [key: string]: WorkspaceProject;
+ };
+}
+
+export interface WorkspaceProject
+ extends experimental.workspace.WorkspaceProject {
+ /**
+ * Project type.
+ */
+ projectType: ProjectType;
+
+ /**
+ * Tool options.
+ */
+ architect?: WorkspaceTargets;
+ /**
+ * Tool options.
+ */
+ targets?: WorkspaceTargets;
+}
+
+export interface WorkspaceTargets {
+ build?: TProjectType extends ProjectType.Library ? LibraryBuilderTarget : BrowserBuilderTarget;
+ server?: ServerBuilderTarget;
+ lint?: LintBuilderTarget;
+ test?: TestBuilderTarget;
+ serve?: ServeBuilderTarget;
+ e2e?: E2EBuilderTarget;
+ 'app-shell'?: AppShellBuilderTarget;
+ 'extract-i18n'?: ExtractI18nBuilderTarget;
+ // TODO(hans): change this any to unknown when google3 supports TypeScript 3.0.
+ // tslint:disable-next-line:no-any
+ [key: string]: any;
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/angular/workspace.ts b/npm/ng-packs/packages/schematics/src/utils/angular/workspace.ts
new file mode 100644
index 0000000000..79dbfbb6ad
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/angular/workspace.ts
@@ -0,0 +1,91 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+import { virtualFs, workspaces } from '@angular-devkit/core';
+import { Rule, Tree } from '@angular-devkit/schematics';
+import { ProjectType } from './workspace-models';
+
+function createHost(tree: Tree): workspaces.WorkspaceHost {
+ return {
+ async readFile(path: string): Promise {
+ const data = tree.read(path);
+ if (!data) {
+ throw new Error('File not found.');
+ }
+
+ return virtualFs.fileBufferToString(data);
+ },
+ async writeFile(path: string, data: string): Promise {
+ return tree.overwrite(path, data);
+ },
+ async isDirectory(path: string): Promise {
+ // approximate a directory check
+ return !tree.exists(path) && tree.getDir(path).subfiles.length > 0;
+ },
+ async isFile(path: string): Promise {
+ return tree.exists(path);
+ },
+ };
+}
+
+export function updateWorkspace(
+ updater: (workspace: workspaces.WorkspaceDefinition) => void | PromiseLike,
+): Rule;
+export function updateWorkspace(
+ workspace: workspaces.WorkspaceDefinition,
+): Rule;
+export function updateWorkspace(
+ updaterOrWorkspace: workspaces.WorkspaceDefinition
+ | ((workspace: workspaces.WorkspaceDefinition) => void | PromiseLike),
+): Rule {
+ return async (tree: Tree) => {
+ const host = createHost(tree);
+
+ if (typeof updaterOrWorkspace === 'function') {
+
+ const { workspace } = await workspaces.readWorkspace('/', host);
+
+ const result = updaterOrWorkspace(workspace);
+ if (result !== undefined) {
+ await result;
+ }
+
+ await workspaces.writeWorkspace(workspace, host);
+ } else {
+ await workspaces.writeWorkspace(updaterOrWorkspace, host);
+ }
+ };
+}
+
+export async function getWorkspace(tree: Tree, path = '/') {
+ const host = createHost(tree);
+
+ const { workspace } = await workspaces.readWorkspace(path, host);
+
+ return workspace;
+}
+
+/**
+ * Build a default project path for generating.
+ * @param project The project which will have its default path generated.
+ */
+export function buildDefaultPath(project: workspaces.ProjectDefinition): string {
+ const root = project.sourceRoot ? `/${project.sourceRoot}/` : `/${project.root}/src/`;
+ const projectDirName = project.extensions['projectType'] === ProjectType.Application ? 'app' : 'lib';
+
+ return `${root}${projectDirName}`;
+}
+
+export async function createDefaultPath(tree: Tree, projectName: string): Promise {
+ const workspace = await getWorkspace(tree);
+ const project = workspace.projects.get(projectName);
+ if (!project) {
+ throw new Error('Specified project does not exist.');
+ }
+
+ return buildDefaultPath(project);
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/index.ts b/npm/ng-packs/packages/schematics/src/utils/index.ts
new file mode 100644
index 0000000000..f5419fa8d9
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/index.ts
@@ -0,0 +1 @@
+export * from './angular';
From f6e1c4fd2882982bdce4573bbb96fd8cd9145e8a Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 12:02:05 +0300
Subject: [PATCH 037/345] feat: add clearly named text utils
---
npm/ng-packs/packages/schematics/src/utils/index.ts | 1 +
npm/ng-packs/packages/schematics/src/utils/text.ts | 9 +++++++++
2 files changed, 10 insertions(+)
create mode 100644 npm/ng-packs/packages/schematics/src/utils/text.ts
diff --git a/npm/ng-packs/packages/schematics/src/utils/index.ts b/npm/ng-packs/packages/schematics/src/utils/index.ts
index f5419fa8d9..5b84b6c8f1 100644
--- a/npm/ng-packs/packages/schematics/src/utils/index.ts
+++ b/npm/ng-packs/packages/schematics/src/utils/index.ts
@@ -1 +1,2 @@
export * from './angular';
+export * from './text';
diff --git a/npm/ng-packs/packages/schematics/src/utils/text.ts b/npm/ng-packs/packages/schematics/src/utils/text.ts
new file mode 100644
index 0000000000..5d8ed49207
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/text.ts
@@ -0,0 +1,9 @@
+import { strings } from '@angular-devkit/core';
+
+export const camel = strings.camelize;
+export const kebab = strings.dasherize;
+export const lower = (text: string) => text.toLowerCase();
+export const macro = (text: string) => strings.underscore(text).toUpperCase();
+export const pascal = strings.classify;
+export const snake = strings.underscore;
+export const upper = (text: string) => text.toUpperCase();
From caef401064d511ab05ae87381b83df374ce87e4a Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 12:28:48 +0300
Subject: [PATCH 038/345] feat: add exceptions as enum
---
npm/ng-packs/packages/schematics/src/enums/exception.ts | 5 +++++
npm/ng-packs/packages/schematics/src/enums/index.ts | 1 +
2 files changed, 6 insertions(+)
create mode 100644 npm/ng-packs/packages/schematics/src/enums/exception.ts
create mode 100644 npm/ng-packs/packages/schematics/src/enums/index.ts
diff --git a/npm/ng-packs/packages/schematics/src/enums/exception.ts b/npm/ng-packs/packages/schematics/src/enums/exception.ts
new file mode 100644
index 0000000000..8577df7d41
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/enums/exception.ts
@@ -0,0 +1,5 @@
+export const enum Exception {
+ InvalidWorkspace = 'Invalid Workspace: The angular.json should be a valid JSON file.',
+ NoProject = 'Unknown Project: Either define a default project in your workspace or specify the project name in schematics options.',
+ NoWorkspace = 'Workspace Not Found: Make sure you are running schematics at the root directory of your workspace and it has an angular.json file.',
+}
diff --git a/npm/ng-packs/packages/schematics/src/enums/index.ts b/npm/ng-packs/packages/schematics/src/enums/index.ts
new file mode 100644
index 0000000000..3d5b914d2f
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/enums/index.ts
@@ -0,0 +1 @@
+export * from './exception';
From 0b9fb4885fdfff9a09651639f05ea5b9d97b92c0 Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 12:30:07 +0300
Subject: [PATCH 039/345] feat: add utility function to read workspace schema
---
.../packages/schematics/src/utils/index.ts | 1 +
.../packages/schematics/src/utils/workspace.ts | 18 ++++++++++++++++++
2 files changed, 19 insertions(+)
create mode 100644 npm/ng-packs/packages/schematics/src/utils/workspace.ts
diff --git a/npm/ng-packs/packages/schematics/src/utils/index.ts b/npm/ng-packs/packages/schematics/src/utils/index.ts
index 5b84b6c8f1..4ddc9e04c2 100644
--- a/npm/ng-packs/packages/schematics/src/utils/index.ts
+++ b/npm/ng-packs/packages/schematics/src/utils/index.ts
@@ -1,2 +1,3 @@
export * from './angular';
export * from './text';
+export * from './workspace';
diff --git a/npm/ng-packs/packages/schematics/src/utils/workspace.ts b/npm/ng-packs/packages/schematics/src/utils/workspace.ts
new file mode 100644
index 0000000000..69aae2e726
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/workspace.ts
@@ -0,0 +1,18 @@
+import { experimental } from '@angular-devkit/core';
+import { SchematicsException, Tree } from '@angular-devkit/schematics';
+import { Exception } from '../enums';
+
+export function readWorkspaceSchema(tree: Tree) {
+ const workspaceBuffer = tree.read('/angular.json') || tree.read('/workspace.json');
+ if (!workspaceBuffer) throw new SchematicsException(Exception.NoWorkspace);
+
+ let workspaceSchema: experimental.workspace.WorkspaceSchema;
+
+ try {
+ workspaceSchema = JSON.parse(workspaceBuffer.toString());
+ } catch (_) {
+ throw new SchematicsException(Exception.InvalidWorkspace);
+ }
+
+ return workspaceSchema;
+}
From 9d6d7e488c896dcd1c399052168ca429908d9c9f Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 12:30:43 +0300
Subject: [PATCH 040/345] feat: add utility function to resolve project
definition
---
.../packages/schematics/src/utils/index.ts | 1 +
.../packages/schematics/src/utils/project.ts | 22 +++++++++++++++++++
2 files changed, 23 insertions(+)
create mode 100644 npm/ng-packs/packages/schematics/src/utils/project.ts
diff --git a/npm/ng-packs/packages/schematics/src/utils/index.ts b/npm/ng-packs/packages/schematics/src/utils/index.ts
index 4ddc9e04c2..2110caa3d8 100644
--- a/npm/ng-packs/packages/schematics/src/utils/index.ts
+++ b/npm/ng-packs/packages/schematics/src/utils/index.ts
@@ -1,3 +1,4 @@
export * from './angular';
+export * from './project';
export * from './text';
export * from './workspace';
diff --git a/npm/ng-packs/packages/schematics/src/utils/project.ts b/npm/ng-packs/packages/schematics/src/utils/project.ts
new file mode 100644
index 0000000000..79bb79c796
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/project.ts
@@ -0,0 +1,22 @@
+import { ProjectDefinition } from '@angular-devkit/core/src/workspace';
+import { SchematicsException, Tree } from '@angular-devkit/schematics';
+import { Exception } from '../enums';
+import { getWorkspace } from './angular/workspace';
+import { readWorkspaceSchema } from './workspace';
+
+export async function resolveProject(
+ tree: Tree,
+ name: string,
+): Promise<{ name: string; definition: ProjectDefinition }> {
+ const workspace = await getWorkspace(tree);
+ let definition = workspace.projects.get(name);
+
+ if (!definition) {
+ name = readWorkspaceSchema(tree).defaultProject!;
+ definition = workspace.projects.get(name);
+ }
+
+ if (!definition) throw new SchematicsException(Exception.NoProject);
+
+ return { name, definition };
+}
From e00b09b445b73394e41b0a4419b8f808ee6d75da Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 14:11:17 +0300
Subject: [PATCH 041/345] feat: add project parameter to proxy command
---
.../schematics/src/commands/proxy/schema.json | 24 +++++++++++++------
.../schematics/src/commands/proxy/schema.ts | 15 ++++++++----
2 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json
index e61ee25567..72a88ecf59 100644
--- a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json
+++ b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json
@@ -10,22 +10,32 @@
"type": "string",
"$default": {
"$source": "argv",
- "index": 1
+ "index": 0
},
"x-prompt": "Please enter name of the module you wish to generate proxies for. (default: app)"
},
- "apiUrl": {
- "alias": "a",
+ "source": {
+ "alias": "s",
"description": "The URL to get API configuration from",
"type": "string",
- "x-prompt": "Plese enter URL to get API config from. Leave blank to use environment variables."
+ "$default": {
+ "$source": "argv",
+ "index": 1
+ },
+ "x-prompt": "Plese enter URL to get API config from. (default: environment.apis.default.url)"
+ },
+ "project": {
+ "alias": "p",
+ "description": "The project to place the generated code in",
+ "type": "string",
+ "x-prompt": "Please enter the project to place proxies in. (default: default app in workspace)"
},
- "out": {
- "alias": "o",
+ "path": {
"description": "The path to place the generated code at",
"type": "string",
"format": "path",
- "x-prompt": "Plese enter a custom output path. Leave blank if you do not need one."
+ "default": "",
+ "visible": false
}
},
"required": []
diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts
index 1acf932886..4e41904a46 100644
--- a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts
+++ b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.ts
@@ -1,16 +1,21 @@
export interface Schema {
/**
- * The URL to get API configuration from
+ * The name of the module to generate code for
*/
- apiUrl?: string;
+ module?: string;
/**
- * The name of the module to generate code for
+ * The project to place the generated code in
*/
- module?: string;
+ project?: string;
/**
* The path to place the generated code at
*/
- out?: string;
+ path?: string;
+
+ /**
+ * The URL to get API configuration from
+ */
+ source?: string;
}
From a9a48f49ad2a779a4c3ebb3b66c8100011a7bc3a Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 15:06:41 +0300
Subject: [PATCH 042/345] build: add got as dependency of schematics
---
npm/ng-packs/package.json | 1 +
npm/ng-packs/packages/schematics/package.json | 1 +
npm/ng-packs/yarn.lock | 135 ++++++++++++++++++
3 files changed, 137 insertions(+)
diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json
index 082cfce422..4aff547480 100644
--- a/npm/ng-packs/package.json
+++ b/npm/ng-packs/package.json
@@ -70,6 +70,7 @@
"conventional-changelog-cli": "^2.0.31",
"cz-conventional-changelog": "3.0.2",
"font-awesome": "^4.7.0",
+ "got": "^11.5.2",
"jest": "^25.0.0",
"jest-canvas-mock": "^2.2.0",
"jest-preset-angular": "^8.2.0",
diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json
index adde31639e..526a20f900 100644
--- a/npm/ng-packs/packages/schematics/package.json
+++ b/npm/ng-packs/packages/schematics/package.json
@@ -11,6 +11,7 @@
"dependencies": {
"@angular-devkit/core": "~10.0.3",
"@angular-devkit/schematics": "~10.0.3",
+ "got": "^11.5.2",
"typescript": "~3.9.2"
},
"devDependencies": {
diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock
index af7083c75f..af54b9730b 100644
--- a/npm/ng-packs/yarn.lock
+++ b/npm/ng-packs/yarn.lock
@@ -2595,6 +2595,11 @@
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+"@sindresorhus/is@^3.0.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-3.1.0.tgz#d8735532635bea69ad39119df5f0f10099bd09dc"
+ integrity sha512-n4J+zu52VdY43kdi/XdI9DzuMr1Mur8zFL5ZRG2opCans9aiFwkPxHYFEb5Xgy7n1Z4K6WfI4FpqUqsh3E8BPQ==
+
"@sinonjs/commons@^1.7.0":
version "1.8.1"
resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217"
@@ -2614,6 +2619,13 @@
dependencies:
defer-to-connect "^1.0.1"
+"@szmarczak/http-timer@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152"
+ integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==
+ dependencies:
+ defer-to-connect "^2.0.0"
+
"@testing-library/dom@6.1.0":
version "6.1.0"
resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-6.1.0.tgz#8d5a954158e81ecd7c994907f4ec240296ed823b"
@@ -2659,6 +2671,16 @@
dependencies:
"@babel/types" "^7.3.0"
+"@types/cacheable-request@^6.0.1":
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976"
+ integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==
+ dependencies:
+ "@types/http-cache-semantics" "*"
+ "@types/keyv" "*"
+ "@types/node" "*"
+ "@types/responselike" "*"
+
"@types/color-name@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
@@ -2689,6 +2711,11 @@
dependencies:
"@types/node" "*"
+"@types/http-cache-semantics@*":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a"
+ integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==
+
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762"
@@ -2727,6 +2754,13 @@
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd"
integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==
+"@types/keyv@*":
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7"
+ integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==
+ dependencies:
+ "@types/node" "*"
+
"@types/minimatch@*":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
@@ -2784,6 +2818,13 @@
dependencies:
"@types/node" "*"
+"@types/responselike@*", "@types/responselike@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29"
+ integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==
+ dependencies:
+ "@types/node" "*"
+
"@types/selenium-webdriver@^3.0.0":
version "3.0.17"
resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz#50bea0c3c2acc31c959c5b1e747798b3b3d06d4b"
@@ -4001,6 +4042,11 @@ cache-base@^1.0.1:
union-value "^1.0.0"
unset-value "^1.0.0"
+cacheable-lookup@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz#049fdc59dffdd4fc285e8f4f82936591bd59fec3"
+ integrity sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w==
+
cacheable-request@^6.0.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
@@ -4014,6 +4060,19 @@ cacheable-request@^6.0.0:
normalize-url "^4.1.0"
responselike "^1.0.2"
+cacheable-request@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58"
+ integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^4.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^4.1.0"
+ responselike "^2.0.0"
+
cachedir@2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.2.0.tgz#19afa4305e05d79e417566882e0c8f960f62ff0e"
@@ -5351,6 +5410,13 @@ decompress-response@^3.3.0:
dependencies:
mimic-response "^1.0.0"
+decompress-response@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
+ integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
+ dependencies:
+ mimic-response "^3.1.0"
+
dedent@0.7.0, dedent@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
@@ -5408,6 +5474,11 @@ defer-to-connect@^1.0.1:
resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+defer-to-connect@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1"
+ integrity sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==
+
define-properties@^1.1.2, define-properties@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
@@ -6790,6 +6861,23 @@ globby@^9.2.0:
pify "^4.0.1"
slash "^2.0.0"
+got@^11.5.2:
+ version "11.5.2"
+ resolved "https://registry.yarnpkg.com/got/-/got-11.5.2.tgz#772e3f3a06d9c7589c7c94dc3c83cdb31ddbf742"
+ integrity sha512-yUhpEDLeuGiGJjRSzEq3kvt4zJtAcjKmhIiwNp/eUs75tRlXfWcHo5tcBaMQtnjHWC7nQYT5HkY/l0QOQTkVww==
+ dependencies:
+ "@sindresorhus/is" "^3.0.0"
+ "@szmarczak/http-timer" "^4.0.5"
+ "@types/cacheable-request" "^6.0.1"
+ "@types/responselike" "^1.0.0"
+ cacheable-lookup "^5.0.3"
+ cacheable-request "^7.0.1"
+ decompress-response "^6.0.0"
+ http2-wrapper "^1.0.0-beta.5.0"
+ lowercase-keys "^2.0.0"
+ p-cancelable "^2.0.0"
+ responselike "^2.0.0"
+
got@^9.6.0:
version "9.6.0"
resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
@@ -7102,6 +7190,14 @@ http-signature@~1.2.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
+http2-wrapper@^1.0.0-beta.5.0:
+ version "1.0.0-beta.5.2"
+ resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz#8b923deb90144aea65cf834b016a340fc98556f3"
+ integrity sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==
+ dependencies:
+ quick-lru "^5.1.1"
+ resolve-alpn "^1.0.0"
+
https-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
@@ -8393,6 +8489,11 @@ json-buffer@3.0.0:
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
@@ -8502,6 +8603,13 @@ keyv@^3.0.0:
dependencies:
json-buffer "3.0.0"
+keyv@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.1.tgz#9fe703cb4a94d6d11729d320af033307efd02ee6"
+ integrity sha512-xz6Jv6oNkbhrFCvCP7HQa8AaII8y8LRpoSm661NOKLr4uHuBwhX4epXrPQgF3+xdJnN4Esm5X0xwY4bOlALOtw==
+ dependencies:
+ json-buffer "3.0.1"
+
killable@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
@@ -9150,6 +9258,11 @@ mimic-response@^1.0.0, mimic-response@^1.0.1:
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+mimic-response@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
+ integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
+
min-indent@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
@@ -10012,6 +10125,11 @@ p-cancelable@^1.0.0:
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+p-cancelable@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e"
+ integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==
+
p-each-series@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48"
@@ -11096,6 +11214,11 @@ quick-lru@^4.0.1:
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
+quick-lru@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
+ integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
+
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@@ -11522,6 +11645,11 @@ resize-observer-polyfill@^1.5.1:
resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
+resolve-alpn@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.0.0.tgz#745ad60b3d6aff4b4a48e01b8c0bdc70959e0e8c"
+ integrity sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==
+
resolve-cwd@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
@@ -11606,6 +11734,13 @@ responselike@^1.0.2:
dependencies:
lowercase-keys "^1.0.0"
+responselike@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723"
+ integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==
+ dependencies:
+ lowercase-keys "^2.0.0"
+
restore-cursor@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
From a961d5d1941413e9a732fab141b697b6627a9848 Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 16:09:43 +0300
Subject: [PATCH 043/345] chore: add a generic ignore pattern
---
npm/ng-packs/.gitignore | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/npm/ng-packs/.gitignore b/npm/ng-packs/.gitignore
index aae6beb3b9..c2dcd7778e 100644
--- a/npm/ng-packs/.gitignore
+++ b/npm/ng-packs/.gitignore
@@ -1,5 +1,8 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.
+# generic ignore files
+*.gitignore.*
+
# compiled output
/tmp
/out-tsc
@@ -46,4 +49,4 @@ testem.log
Thumbs.db
!**/[Pp]ackages/*
-*.internal.*
\ No newline at end of file
+*.internal.*
From d529c16af6378d1daedeaa7b3f2c93c6f91e5f4d Mon Sep 17 00:00:00 2001
From: Alper Ebicoglu
Date: Wed, 12 Aug 2020 16:39:34 +0300
Subject: [PATCH 044/345] add Chrome login issue article
---
.../POST.md | 209 ++++++++++++++++++
1 file changed, 209 insertions(+)
create mode 100644 docs/en/Community-Articles/2020-08-12-Patch-Chrome-Login-Issue-For-IdentityServer4/POST.md
diff --git a/docs/en/Community-Articles/2020-08-12-Patch-Chrome-Login-Issue-For-IdentityServer4/POST.md b/docs/en/Community-Articles/2020-08-12-Patch-Chrome-Login-Issue-For-IdentityServer4/POST.md
new file mode 100644
index 0000000000..a4c40196f2
--- /dev/null
+++ b/docs/en/Community-Articles/2020-08-12-Patch-Chrome-Login-Issue-For-IdentityServer4/POST.md
@@ -0,0 +1,209 @@
+# How to fix the Chrome login issue for the IdentityServer4
+
+## Introduction
+
+When you use HTTP on your Identity Server 4 enabled website, users may not login because of the changes made by Chrome in the version 8x. This occurs when you use HTTP schema in your website. The issue is explained here https://docs.microsoft.com/en-gb/dotnet/core/compatibility/3.0-3.1#http-browser-samesite-changes-impact-authentication
+
+## How to solve it?
+
+### Step-1
+
+Create the below extension in your ***.Web** project.
+
+```csharp
+using System;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.Extensions.DependencyInjection
+{
+ public static class SameSiteCookiesServiceCollectionExtensions
+ {
+ ///
+ /// -1 defines the unspecified value, which tells ASPNET Core to NOT
+ /// send the SameSite attribute. With ASPNET Core 3.1 the
+ /// enum will have a definition for
+ /// Unspecified.
+ ///
+ private const SameSiteMode Unspecified = (SameSiteMode)(-1);
+
+ ///
+ /// Configures a cookie policy to properly set the SameSite attribute
+ /// for Browsers that handle unknown values as Strict. Ensure that you
+ /// add the
+ /// into the pipeline before sending any cookies!
+ ///
+ ///
+ /// Minimum ASPNET Core Version required for this code:
+ /// - 2.1.14
+ /// - 2.2.8
+ /// - 3.0.1
+ /// - 3.1.0-preview1
+ /// Starting with version 80 of Chrome (to be released in February 2020)
+ /// cookies with NO SameSite attribute are treated as SameSite=Lax.
+ /// In order to always get the cookies send they need to be set to
+ /// SameSite=None. But since the current standard only defines Lax and
+ /// Strict as valid values there are some browsers that treat invalid
+ /// values as SameSite=Strict. We therefore need to check the browser
+ /// and either send SameSite=None or prevent the sending of SameSite=None.
+ /// Relevant links:
+ /// - https://tools.ietf.org/html/draft-west-first-party-cookies-07#section-4.1
+ /// - https://tools.ietf.org/html/draft-west-cookie-incrementalism-00
+ /// - https://www.chromium.org/updates/same-site
+ /// - https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/
+ /// - https://bugs.webkit.org/show_bug.cgi?id=198181
+ ///
+ /// The service collection to register into.
+ /// The modified .
+ public static IServiceCollection ConfigureNonBreakingSameSiteCookies(this IServiceCollection services)
+ {
+ services.Configure(options =>
+ {
+ options.MinimumSameSitePolicy = Unspecified;
+ options.OnAppendCookie = cookieContext =>
+ CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
+ options.OnDeleteCookie = cookieContext =>
+ CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
+ });
+
+ return services;
+ }
+
+ private static void CheckSameSite(HttpContext httpContext, CookieOptions options)
+ {
+ if (options.SameSite == SameSiteMode.None)
+ {
+ var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
+
+ if (DisallowsSameSiteNone(userAgent))
+ {
+ options.SameSite = Unspecified;
+ }
+ }
+ }
+
+ ///
+ /// Checks if the UserAgent is known to interpret an unknown value as Strict.
+ /// For those the property should be
+ /// set to .
+ ///
+ ///
+ /// This code is taken from Microsoft:
+ /// https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/
+ ///
+ /// The user agent string to check.
+ /// Whether the specified user agent (browser) accepts SameSite=None or not.
+ private static bool DisallowsSameSiteNone(string userAgent)
+ {
+ // Cover all iOS based browsers here. This includes:
+ // - Safari on iOS 12 for iPhone, iPod Touch, iPad
+ // - WkWebview on iOS 12 for iPhone, iPod Touch, iPad
+ // - Chrome on iOS 12 for iPhone, iPod Touch, iPad
+ // All of which are broken by SameSite=None, because they use the
+ // iOS networking stack.
+ // Notes from Thinktecture:
+ // Regarding https://caniuse.com/#search=samesite iOS versions lower
+ // than 12 are not supporting SameSite at all. Starting with version 13
+ // unknown values are NOT treated as strict anymore. Therefore we only
+ // need to check version 12.
+ if (userAgent.Contains("CPU iPhone OS 12")
+ || userAgent.Contains("iPad; CPU OS 12"))
+ {
+ return true;
+ }
+
+ // Cover Mac OS X based browsers that use the Mac OS networking stack.
+ // This includes:
+ // - Safari on Mac OS X.
+ // This does not include:
+ // - Chrome on Mac OS X
+ // because they do not use the Mac OS networking stack.
+ // Notes from Thinktecture:
+ // Regarding https://caniuse.com/#search=samesite MacOS X versions lower
+ // than 10.14 are not supporting SameSite at all. Starting with version
+ // 10.15 unknown values are NOT treated as strict anymore. Therefore we
+ // only need to check version 10.14.
+ if (userAgent.Contains("Safari")
+ && userAgent.Contains("Macintosh; Intel Mac OS X 10_14")
+ && userAgent.Contains("Version/"))
+ {
+ return true;
+ }
+
+ // Cover Chrome 50-69, because some versions are broken by SameSite=None
+ // and none in this range require it.
+ // Note: this covers some pre-Chromium Edge versions,
+ // but pre-Chromium Edge does not require SameSite=None.
+ // Notes from Thinktecture:
+ // We can not validate this assumption, but we trust Microsofts
+ // evaluation. And overall not sending a SameSite value equals to the same
+ // behavior as SameSite=None for these old versions anyways.
+ if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6"))
+ {
+ return true;
+ }
+
+ if (GetChromeVersion(userAgent) >= 80)
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ private static int GetChromeVersion(string userAgent)
+ {
+ try
+ {
+ return Convert.ToInt32(userAgent.Split("Chrome/")[1].Split('.')[0]);
+ }
+ catch (Exception)
+ {
+ return 0;
+ }
+ }
+ }
+}
+```
+
+### Step-2
+
+Assume that your project name is *Acme.BookStore*. Then open `AcmeBookStoreWebModule.cs` class.
+
+Add the following line to `ConfigureServices()` method.
+
+```csharp
+ context.Services.ConfigureNonBreakingSameSiteCookies();
+```
+### Step-3
+
+Go to`OnApplicationInitialization()` method in `AcmeBookStoreWebModule.cs` add `app.UseCookiePolicy();`
+
+```csharp
+public override void OnApplicationInitialization(ApplicationInitializationContext context)
+{
+ var app = context.GetApplicationBuilder();
+ var env = context.GetEnvironment();
+
+ if (env.IsDevelopment())
+ {
+ app.UseDeveloperExceptionPage();
+ }
+ else
+ {
+ app.UseErrorPage();
+ app.UseHsts();
+ }
+
+ app.UseCookiePolicy(); //<--- added this --->
+```
+
+
+
+It's all! You are ready to go!
+
+
+
+---
+
+Referenced from https://www.thinktecture.com/en/identity/samesite/prepare-your-identityserver/
\ No newline at end of file
From 9adab77257b31d40e4e4b1ae826a813d075efe4e Mon Sep 17 00:00:00 2001
From: Alper Ebicoglu
Date: Wed, 12 Aug 2020 16:44:29 +0300
Subject: [PATCH 045/345] Update POST.md
---
.../POST.md | 33 ++++++++++---------
1 file changed, 18 insertions(+), 15 deletions(-)
diff --git a/docs/en/Community-Articles/2020-08-12-Patch-Chrome-Login-Issue-For-IdentityServer4/POST.md b/docs/en/Community-Articles/2020-08-12-Patch-Chrome-Login-Issue-For-IdentityServer4/POST.md
index a4c40196f2..718a949f3a 100644
--- a/docs/en/Community-Articles/2020-08-12-Patch-Chrome-Login-Issue-For-IdentityServer4/POST.md
+++ b/docs/en/Community-Articles/2020-08-12-Patch-Chrome-Login-Issue-For-IdentityServer4/POST.md
@@ -182,20 +182,23 @@ Go to`OnApplicationInitialization()` method in `AcmeBookStoreWebModule.cs` add `
```csharp
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
- var app = context.GetApplicationBuilder();
- var env = context.GetEnvironment();
-
- if (env.IsDevelopment())
- {
- app.UseDeveloperExceptionPage();
- }
- else
- {
- app.UseErrorPage();
- app.UseHsts();
- }
-
- app.UseCookiePolicy(); //<--- added this --->
+ var app = context.GetApplicationBuilder();
+ var env = context.GetEnvironment();
+
+ if (env.IsDevelopment())
+ {
+ app.UseDeveloperExceptionPage();
+ }
+ else
+ {
+ app.UseErrorPage();
+ app.UseHsts();
+ }
+
+ app.UseCookiePolicy(); //<--- added this --->
+
+ //....
+}
```
@@ -206,4 +209,4 @@ It's all! You are ready to go!
---
-Referenced from https://www.thinktecture.com/en/identity/samesite/prepare-your-identityserver/
\ No newline at end of file
+Referenced from https://www.thinktecture.com/en/identity/samesite/prepare-your-identityserver/
From 523542301194e17be1cc495fa5301f3259b4dcad Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 22:30:50 +0300
Subject: [PATCH 046/345] feat: add common utils to schematics
---
.../packages/schematics/src/utils/common.ts | 25 +++++++++++++++++++
.../packages/schematics/src/utils/index.ts | 1 +
2 files changed, 26 insertions(+)
create mode 100644 npm/ng-packs/packages/schematics/src/utils/common.ts
diff --git a/npm/ng-packs/packages/schematics/src/utils/common.ts b/npm/ng-packs/packages/schematics/src/utils/common.ts
new file mode 100644
index 0000000000..8a5aa5fd93
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/common.ts
@@ -0,0 +1,25 @@
+import { SchematicsException, Tree } from '@angular-devkit/schematics';
+import * as ts from 'typescript';
+import { Exception } from '../enums';
+
+export function interpolate(text: string, ...params: (string | number | boolean)[]) {
+ params.forEach((param, i) => {
+ const pattern = new RegExp('{\\s*' + i + '\\s*}');
+ text = text.replace(pattern, String(param));
+ });
+
+ return text;
+}
+
+export function isNullOrUndefined(value: any): value is null | undefined {
+ return value === null || value === undefined;
+}
+
+export function readFileInTree(tree: Tree, filePath: string): ts.SourceFile {
+ const buffer = tree.read(filePath);
+ if (isNullOrUndefined(buffer))
+ throw new SchematicsException(interpolate(Exception.FileNotFound, filePath));
+
+ const text = buffer.toString('utf-8');
+ return ts.createSourceFile(filePath, text, ts.ScriptTarget.Latest, true);
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/index.ts b/npm/ng-packs/packages/schematics/src/utils/index.ts
index 2110caa3d8..f489303b89 100644
--- a/npm/ng-packs/packages/schematics/src/utils/index.ts
+++ b/npm/ng-packs/packages/schematics/src/utils/index.ts
@@ -1,4 +1,5 @@
export * from './angular';
+export * from './common';
export * from './project';
export * from './text';
export * from './workspace';
From 949e73284e9421315a9d40247561350e789cefdb Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 22:31:15 +0300
Subject: [PATCH 047/345] feat: update schematics exceptions
---
npm/ng-packs/packages/schematics/src/enums/exception.ts | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/npm/ng-packs/packages/schematics/src/enums/exception.ts b/npm/ng-packs/packages/schematics/src/enums/exception.ts
index 8577df7d41..234457f037 100644
--- a/npm/ng-packs/packages/schematics/src/enums/exception.ts
+++ b/npm/ng-packs/packages/schematics/src/enums/exception.ts
@@ -1,5 +1,8 @@
export const enum Exception {
- InvalidWorkspace = 'Invalid Workspace: The angular.json should be a valid JSON file.',
- NoProject = 'Unknown Project: Either define a default project in your workspace or specify the project name in schematics options.',
- NoWorkspace = 'Workspace Not Found: Make sure you are running schematics at the root directory of your workspace and it has an angular.json file.',
+ FileNotFound = '[File Not Found] There is no file at "{0}" path.',
+ InvalidWorkspace = '[Invalid Workspace] The angular.json should be a valid JSON file.',
+ NoApi = '[API Not Available] Please double-check the source url and make sure your application is up and running.',
+ NoProject = '[Project Not Found] Either define a default project in your workspace or specify the project name in schematics options.',
+ NoWorkspace = '[Workspace Not Found] Make sure you are running schematics at the root directory of your workspace and it has an angular.json file.',
+ RequiredApiUrl = '[API URL Required] API URL cannot be resolved. Please re-run the schematics and enter the URL to get API definitions from.',
}
From cd2bddaeef710f2a0c405b46f0e5b4e727688dc1 Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 22:36:23 +0300
Subject: [PATCH 048/345] feat: add functions to resolve environment and source
url
---
.../packages/schematics/src/utils/ast.ts | 37 ++++++++++++++++++
.../packages/schematics/src/utils/index.ts | 3 +-
.../packages/schematics/src/utils/project.ts | 22 -----------
.../packages/schematics/src/utils/source.ts | 34 +++++++++++++++++
.../schematics/src/utils/workspace.ts | 38 ++++++++++++++++++-
5 files changed, 109 insertions(+), 25 deletions(-)
create mode 100644 npm/ng-packs/packages/schematics/src/utils/ast.ts
delete mode 100644 npm/ng-packs/packages/schematics/src/utils/project.ts
create mode 100644 npm/ng-packs/packages/schematics/src/utils/source.ts
diff --git a/npm/ng-packs/packages/schematics/src/utils/ast.ts b/npm/ng-packs/packages/schematics/src/utils/ast.ts
new file mode 100644
index 0000000000..a1ffe5a319
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/ast.ts
@@ -0,0 +1,37 @@
+import * as ts from 'typescript';
+import { findNodes } from './angular/ast-utils';
+
+export function findEnvironmentExpression(source: ts.SourceFile) {
+ const expressions = findNodes(source, ts.isObjectLiteralExpression);
+ return expressions.find(expr => expr.getText().includes('production'));
+}
+
+export function getAssignedPropertyFromObjectliteral(
+ expression: ts.ObjectLiteralExpression,
+ variableSelector: string[],
+) {
+ const expressions = findNodes(expression, isBooleanStringOrNumberLiteral);
+
+ const literal = expressions.find(node =>
+ Boolean(
+ variableSelector.reduceRight(
+ (acc: ts.PropertyAssignment, key) =>
+ acc?.name?.getText() === key ? acc.parent.parent : undefined,
+ node.parent,
+ ),
+ ),
+ );
+
+ return literal ? literal.getText() : undefined;
+}
+
+export function isBooleanStringOrNumberLiteral(
+ node: ts.Node,
+): node is ts.StringLiteral | ts.NumericLiteral | ts.BooleanLiteral {
+ return (
+ ts.isStringLiteral(node) ||
+ ts.isNumericLiteral(node) ||
+ node.kind === ts.SyntaxKind.TrueKeyword ||
+ node.kind === ts.SyntaxKind.FalseKeyword
+ );
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/index.ts b/npm/ng-packs/packages/schematics/src/utils/index.ts
index f489303b89..c2acec4d47 100644
--- a/npm/ng-packs/packages/schematics/src/utils/index.ts
+++ b/npm/ng-packs/packages/schematics/src/utils/index.ts
@@ -1,5 +1,6 @@
export * from './angular';
+export * from './ast';
export * from './common';
-export * from './project';
+export * from './source';
export * from './text';
export * from './workspace';
diff --git a/npm/ng-packs/packages/schematics/src/utils/project.ts b/npm/ng-packs/packages/schematics/src/utils/project.ts
deleted file mode 100644
index 79bb79c796..0000000000
--- a/npm/ng-packs/packages/schematics/src/utils/project.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { ProjectDefinition } from '@angular-devkit/core/src/workspace';
-import { SchematicsException, Tree } from '@angular-devkit/schematics';
-import { Exception } from '../enums';
-import { getWorkspace } from './angular/workspace';
-import { readWorkspaceSchema } from './workspace';
-
-export async function resolveProject(
- tree: Tree,
- name: string,
-): Promise<{ name: string; definition: ProjectDefinition }> {
- const workspace = await getWorkspace(tree);
- let definition = workspace.projects.get(name);
-
- if (!definition) {
- name = readWorkspaceSchema(tree).defaultProject!;
- definition = workspace.projects.get(name);
- }
-
- if (!definition) throw new SchematicsException(Exception.NoProject);
-
- return { name, definition };
-}
diff --git a/npm/ng-packs/packages/schematics/src/utils/source.ts b/npm/ng-packs/packages/schematics/src/utils/source.ts
new file mode 100644
index 0000000000..45de5b00c9
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/utils/source.ts
@@ -0,0 +1,34 @@
+import type { workspaces } from '@angular-devkit/core';
+import { SchematicsException, Tree } from '@angular-devkit/schematics';
+import got from 'got';
+import { Exception } from '../enums';
+import { getAssignedPropertyFromObjectliteral } from './ast';
+import { readEnvironment } from './workspace';
+
+export async function getSourceJson(url: string) {
+ let body: any;
+
+ try {
+ ({ body } = await got(url, {
+ responseType: 'json',
+ https: { rejectUnauthorized: false },
+ }));
+ } catch (e) {
+ throw new SchematicsException(Exception.NoApi);
+ }
+
+ return body;
+}
+
+export function getSourceUrl(tree: Tree, projectDefinition: workspaces.ProjectDefinition) {
+ const environmentExpr = readEnvironment(tree, projectDefinition);
+ let assignment: string | undefined;
+
+ if (environmentExpr) {
+ assignment = getAssignedPropertyFromObjectliteral(environmentExpr, ['apis', 'default', 'url']);
+ }
+
+ if (!assignment) throw new SchematicsException(Exception.RequiredApiUrl);
+
+ return assignment.replace(/[`'"]/g, '');
+}
diff --git a/npm/ng-packs/packages/schematics/src/utils/workspace.ts b/npm/ng-packs/packages/schematics/src/utils/workspace.ts
index 69aae2e726..ccae346835 100644
--- a/npm/ng-packs/packages/schematics/src/utils/workspace.ts
+++ b/npm/ng-packs/packages/schematics/src/utils/workspace.ts
@@ -1,6 +1,23 @@
-import { experimental } from '@angular-devkit/core';
-import { SchematicsException, Tree } from '@angular-devkit/schematics';
+import type { experimental, workspaces } from '@angular-devkit/core';
+import { SchematicsException } from '@angular-devkit/schematics';
+import type { Tree } from '@angular-devkit/schematics';
import { Exception } from '../enums';
+import { getWorkspace, ProjectType } from './angular';
+import { findEnvironmentExpression } from './ast';
+import { readFileInTree } from './common';
+
+export function isLibrary(project: workspaces.ProjectDefinition): boolean {
+ return project.extensions['projectType'] === ProjectType.Library;
+}
+
+export function readEnvironment(tree: Tree, project: workspaces.ProjectDefinition) {
+ if (isLibrary(project)) return undefined;
+
+ const srcPath = project.sourceRoot || `${project.root}/src`;
+ const envPath = srcPath + '/environments/environment.ts';
+ const source = readFileInTree(tree, envPath);
+ return findEnvironmentExpression(source);
+}
export function readWorkspaceSchema(tree: Tree) {
const workspaceBuffer = tree.read('/angular.json') || tree.read('/workspace.json');
@@ -16,3 +33,20 @@ export function readWorkspaceSchema(tree: Tree) {
return workspaceSchema;
}
+
+export async function resolveProject(
+ tree: Tree,
+ name: string,
+): Promise<{ name: string; definition: workspaces.ProjectDefinition }> {
+ const workspace = await getWorkspace(tree);
+ let definition = workspace.projects.get(name);
+
+ if (!definition) {
+ name = readWorkspaceSchema(tree).defaultProject!;
+ definition = workspace.projects.get(name);
+ }
+
+ if (!definition) throw new SchematicsException(Exception.NoProject);
+
+ return { name, definition };
+}
From e8d5afb3bc3952676a32f31b2e2150638bc58854 Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 22:38:28 +0300
Subject: [PATCH 049/345] feat: get source json for proxy generation
---
.../packages/schematics/src/commands/proxy/index.ts | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts b/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts
index 6c232805c3..06d6736215 100644
--- a/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts
+++ b/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts
@@ -1,9 +1,15 @@
import { chain, SchematicContext, Tree } from '@angular-devkit/schematics';
-import { Schema as GenerateProxySchema } from './schema';
+import { getSourceJson, getSourceUrl, resolveProject } from '../../utils';
+import type { Schema as GenerateProxySchema } from './schema';
-export default function(_params: GenerateProxySchema) {
+export default function(params: GenerateProxySchema) {
return chain([
- async (_tree: Tree, _context: SchematicContext) => {
+ async (tree: Tree, _context: SchematicContext) => {
+ const project = await resolveProject(tree, params.module!);
+ const url = params.source || getSourceUrl(tree, project.definition);
+ const data = await getSourceJson(url);
+
+ console.log(Object.keys(data.types));
return chain([]);
},
]);
From 91bf43201132185d86839a134ac4abce20c4ae4f Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Wed, 12 Aug 2020 22:38:50 +0300
Subject: [PATCH 050/345] feat: update proxy schema
---
.../packages/schematics/src/commands/proxy/schema.json | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json
index 72a88ecf59..492b52dad7 100644
--- a/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json
+++ b/npm/ng-packs/packages/schematics/src/commands/proxy/schema.json
@@ -12,23 +12,23 @@
"$source": "argv",
"index": 0
},
- "x-prompt": "Please enter name of the module you wish to generate proxies for. (default: app)"
+ "x-prompt": "Please enter name of the module you wish to generate proxies for. (default: \"app\")"
},
"source": {
"alias": "s",
- "description": "The URL to get API configuration from",
+ "description": "The URL to get API definitions from",
"type": "string",
"$default": {
"$source": "argv",
"index": 1
},
- "x-prompt": "Plese enter URL to get API config from. (default: environment.apis.default.url)"
+ "x-prompt": "Plese enter URL to get API definitions from. (default: resolved from environment)"
},
"project": {
"alias": "p",
"description": "The project to place the generated code in",
"type": "string",
- "x-prompt": "Please enter the project to place proxies in. (default: default app in workspace)"
+ "x-prompt": "Please enter the project to place proxies in. (default: workspace \"defaultProject\")"
},
"path": {
"description": "The path to place the generated code at",
From f72f7379b3bf084a7aaab36e92d999db2a69ec63 Mon Sep 17 00:00:00 2001
From: maliming <6908465+maliming@users.noreply.github.com>
Date: Thu, 13 Aug 2020 08:57:56 +0800
Subject: [PATCH 051/345] Upgrade Swashbuckle.AspNetCore to 5.5.1
---
.../app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj | 2 +-
.../Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj | 2 +-
.../Volo.CmsKit.IdentityServer.csproj | 2 +-
.../host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj | 2 +-
.../host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.csproj | 2 +-
modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj | 2 +-
.../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 2 +-
.../MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj | 2 +-
.../MyCompanyName.MyProjectName.Web.Host.csproj | 2 +-
.../MyCompanyName.MyProjectName.Web.csproj | 2 +-
.../MyCompanyName.MyProjectName.HttpApi.Host.csproj | 2 +-
.../MyCompanyName.MyProjectName.IdentityServer.csproj | 2 +-
.../MyCompanyName.MyProjectName.Web.Host.csproj | 2 +-
.../MyCompanyName.MyProjectName.Web.Unified.csproj | 2 +-
14 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj b/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj
index 4fb4e461af..5d56d83ec9 100644
--- a/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj
+++ b/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj
@@ -17,7 +17,7 @@
-
+
diff --git a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj
index 2a0c5e57c1..9fa7c4be20 100644
--- a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj
+++ b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj
@@ -12,7 +12,7 @@
-
+
diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj
index da90915bf2..b26c2bbe06 100644
--- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj
+++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj
@@ -10,7 +10,7 @@
-
+
diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj b/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj
index 46b83d5180..e58aa309c6 100644
--- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj
+++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj
@@ -12,7 +12,7 @@
-
+
diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.csproj b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.csproj
index d500cbce2d..e3436aaa93 100644
--- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.csproj
+++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.csproj
@@ -12,7 +12,7 @@
-
+
diff --git a/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj
index 2e06315603..d2f04bb1f5 100644
--- a/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj
+++ b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj
@@ -19,7 +19,7 @@
-
+
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj
index 2776d2ed85..71b248c32e 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj
@@ -13,7 +13,7 @@
-
+
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj
index c7faed9653..373d19dcfb 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj
@@ -13,7 +13,7 @@
-
+
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj
index 469d83804c..777288a513 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj
@@ -19,7 +19,7 @@
-
+
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj
index de399f2ef5..eb374cb80e 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj
@@ -35,7 +35,7 @@
-
+
diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj
index 589ec5df65..35e73d4868 100644
--- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj
+++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj
@@ -12,7 +12,7 @@
-
+
diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj
index 17f9cdb076..c70808deed 100644
--- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj
+++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj
@@ -10,7 +10,7 @@
-
+
diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj
index 3923a71691..f9e00d53d3 100644
--- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj
+++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj
@@ -12,7 +12,7 @@
-
+
diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj
index 3cd14d2086..8f278d0a03 100644
--- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj
+++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj
@@ -12,7 +12,7 @@
-
+
From 429bf596a1c59340987a675b56c87b26b371a447 Mon Sep 17 00:00:00 2001
From: maliming <6908465+maliming@users.noreply.github.com>
Date: Thu, 13 Aug 2020 10:19:23 +0800
Subject: [PATCH 052/345] Add Identity service error page to account module.
---
.../AbpAccountWebIdentityServerModule.cs | 9 ++++-
.../Pages/Account/Error.cshtml | 24 ++++++++++++
.../Pages/Account/Error.cshtml.cs | 37 +++++++++++++++++++
3 files changed, 69 insertions(+), 1 deletion(-)
create mode 100644 modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/Error.cshtml
create mode 100644 modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/Error.cshtml.cs
diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/AbpAccountWebIdentityServerModule.cs b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/AbpAccountWebIdentityServerModule.cs
index 273659fd69..bf76e1dbe3 100644
--- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/AbpAccountWebIdentityServerModule.cs
+++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/AbpAccountWebIdentityServerModule.cs
@@ -1,4 +1,5 @@
-using Microsoft.AspNetCore.Identity;
+using IdentityServer4.Configuration;
+using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Identity.AspNetCore;
using Volo.Abp.IdentityServer;
@@ -33,6 +34,12 @@ namespace Volo.Abp.Account.Web
options.FileSets.AddEmbedded();
});
+ Configure(options =>
+ {
+ options.UserInteraction.ConsentUrl = "/Consent";
+ options.UserInteraction.ErrorUrl = "/Account/Error";
+ });
+
//TODO: Try to reuse from AbpIdentityAspNetCoreModule
context.Services
.AddAuthentication(o =>
diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/Error.cshtml b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/Error.cshtml
new file mode 100644
index 0000000000..2b43f1527c
--- /dev/null
+++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/Error.cshtml
@@ -0,0 +1,24 @@
+@page
+@using Localization.Resources.AbpUi
+@using Microsoft.AspNetCore.Mvc.Localization
+@model Volo.Abp.Account.Web.Pages.Account.ErrorModel
+@inject IHtmlLocalizer L
+@{
+ var errorMessage = Model.ErrorMessage.Error;
+ var errorDetails = Model.ErrorMessage.ErrorDescription;
+ if (errorDetails.IsNullOrEmpty())
+ {
+ errorDetails = errorMessage;
+ errorMessage = L["Error"].Value + "!";
+ }
+}
+
+
+ @errorMessage
+
+
+
diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/Error.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/Error.cshtml.cs
new file mode 100644
index 0000000000..bae4eb380e
--- /dev/null
+++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/Error.cshtml.cs
@@ -0,0 +1,37 @@
+using System.Threading.Tasks;
+using IdentityServer4.Models;
+using IdentityServer4.Services;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Hosting;
+using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
+
+namespace Volo.Abp.Account.Web.Pages.Account
+{
+ public class ErrorModel : AbpPageModel
+ {
+ public ErrorMessage ErrorMessage { get; set; }
+
+ private readonly IIdentityServerInteractionService _interaction;
+ private readonly IWebHostEnvironment _environment;
+
+ public ErrorModel(IIdentityServerInteractionService interaction, IWebHostEnvironment environment)
+ {
+ _interaction = interaction;
+ _environment = environment;
+ }
+
+ public async Task OnGet(string errorId)
+ {
+ ErrorMessage = await _interaction.GetErrorContextAsync(errorId);
+
+ if (ErrorMessage != null)
+ {
+ if (!_environment.IsDevelopment())
+ {
+ // Only show in development
+ ErrorMessage.ErrorDescription = null;
+ }
+ }
+ }
+ }
+}
From daf7febe7c87ff8ec81927b6d5bb18778afe0ee4 Mon Sep 17 00:00:00 2001
From: maliming <6908465+maliming@users.noreply.github.com>
Date: Thu, 13 Aug 2020 10:30:44 +0800
Subject: [PATCH 053/345] Handle ErrorMessage is null.
---
.../Pages/Account/Error.cshtml.cs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/Error.cshtml.cs b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/Error.cshtml.cs
index bae4eb380e..90622f7dc3 100644
--- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/Error.cshtml.cs
+++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Pages/Account/Error.cshtml.cs
@@ -22,7 +22,10 @@ namespace Volo.Abp.Account.Web.Pages.Account
public async Task OnGet(string errorId)
{
- ErrorMessage = await _interaction.GetErrorContextAsync(errorId);
+ ErrorMessage = await _interaction.GetErrorContextAsync(errorId) ?? new ErrorMessage
+ {
+ Error = L["Error"]
+ };
if (ErrorMessage != null)
{
From b8991e1bc72ef0fa96c34752c3229b4c0adb5ee4 Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Thu, 13 Aug 2020 09:35:17 +0300
Subject: [PATCH 054/345] feat: add includeTypes query param to api definition
request
---
npm/ng-packs/packages/schematics/src/utils/source.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/npm/ng-packs/packages/schematics/src/utils/source.ts b/npm/ng-packs/packages/schematics/src/utils/source.ts
index 45de5b00c9..81d0b287fe 100644
--- a/npm/ng-packs/packages/schematics/src/utils/source.ts
+++ b/npm/ng-packs/packages/schematics/src/utils/source.ts
@@ -11,6 +11,7 @@ export async function getSourceJson(url: string) {
try {
({ body } = await got(url, {
responseType: 'json',
+ searchParams: { includeTypes: true },
https: { rejectUnauthorized: false },
}));
} catch (e) {
From 586f0b6f5045affd22271c68a5330fe2a418f35e Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Thu, 13 Aug 2020 09:35:59 +0300
Subject: [PATCH 055/345] feat: add models for api definition
---
.../schematics/src/models/api-definition.ts | 73 +++++++++++++++++++
.../packages/schematics/src/models/index.ts | 1 +
2 files changed, 74 insertions(+)
create mode 100644 npm/ng-packs/packages/schematics/src/models/api-definition.ts
create mode 100644 npm/ng-packs/packages/schematics/src/models/index.ts
diff --git a/npm/ng-packs/packages/schematics/src/models/api-definition.ts b/npm/ng-packs/packages/schematics/src/models/api-definition.ts
new file mode 100644
index 0000000000..88542ecd08
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/models/api-definition.ts
@@ -0,0 +1,73 @@
+export interface ApiDefinition {
+ modules: Record;
+ types: Record;
+}
+
+export interface Type {
+ baseType?: string;
+ isEnum: boolean;
+ enumNames?: string[];
+ enumValues?: number[];
+ genericArguments?: string[];
+ properties?: Property[];
+}
+
+export interface Property {
+ name: string;
+ type: string;
+ typeSimple: string;
+}
+
+export interface Module {
+ rootPath: string;
+ remoteServiceName: string;
+ controllers: Record;
+}
+
+export interface Controller {
+ controllerName: string;
+ type: string;
+ interfaces: Interface[];
+ actions: Record;
+}
+
+export interface Interface {
+ type: string;
+}
+
+export interface Action {
+ uniqueName: string;
+ name: string;
+ httpMethod: string;
+ url: string;
+ supportedVersions: string[];
+ parametersOnMethod: ParameterOnMethod[];
+ parameters: Parameter[];
+ returnValue: ReturnValue;
+}
+
+export interface ParameterOnMethod {
+ name: string;
+ typeAsString: string;
+ type: string;
+ typeSimple: string;
+ isOptional: boolean;
+ defaultValue: any;
+}
+
+export interface Parameter {
+ nameOnMethod: string;
+ name: string;
+ type: string;
+ typeSimple: string;
+ isOptional: boolean;
+ defaultValue: any;
+ constraintTypes?: string[];
+ bindingSourceId: string;
+ descriptorName: string;
+}
+
+export interface ReturnValue {
+ type: string;
+ typeSimple: string;
+}
diff --git a/npm/ng-packs/packages/schematics/src/models/index.ts b/npm/ng-packs/packages/schematics/src/models/index.ts
new file mode 100644
index 0000000000..a4e9855273
--- /dev/null
+++ b/npm/ng-packs/packages/schematics/src/models/index.ts
@@ -0,0 +1 @@
+export * from './api-definition';
From 596e7175c7cd2fd4393a1c28c03ada5d191e6210 Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Thu, 13 Aug 2020 09:55:56 +0300
Subject: [PATCH 056/345] fix: add endpoint to resolved source url in
schematics
---
npm/ng-packs/packages/schematics/src/commands/proxy/index.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts b/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts
index 06d6736215..675b268d10 100644
--- a/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts
+++ b/npm/ng-packs/packages/schematics/src/commands/proxy/index.ts
@@ -6,7 +6,7 @@ export default function(params: GenerateProxySchema) {
return chain([
async (tree: Tree, _context: SchematicContext) => {
const project = await resolveProject(tree, params.module!);
- const url = params.source || getSourceUrl(tree, project.definition);
+ const url = params.source || getSourceUrl(tree, project.definition) + '/api/abp/api-definition';
const data = await getSourceJson(url);
console.log(Object.keys(data.types));
From 483210edb23e61b26bd691cbf0e28083b4659d51 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?=
Date: Thu, 13 Aug 2020 10:09:03 +0300
Subject: [PATCH 057/345] Add authorization code grant to the App client (the
angular client).
---
.../appsettings.json | 3 ++-
.../IdentityServerDataSeedContributor.cs | 23 +++++++++++++------
2 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json
index d45a2093e7..17ce15c462 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/appsettings.json
@@ -11,7 +11,8 @@
},
"MyProjectName_App": {
"ClientId": "MyProjectName_App",
- "ClientSecret": "1q2w3e*"
+ "ClientSecret": "1q2w3e*",
+ "RootUrl": "http://localhost:4200"
}
}
}
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs
index 2bce06c77d..805bc0e424 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs
@@ -126,15 +126,20 @@ namespace MyCompanyName.MyProjectName.IdentityServer
);
}
- //Console Test Client
- var consoleClientId = configurationSection["MyProjectName_App:ClientId"];
- if (!consoleClientId.IsNullOrWhiteSpace())
+ //Console Test / Angular Client
+ var consoleAndAngularClientId = configurationSection["MyProjectName_App:ClientId"];
+ if (!consoleAndAngularClientId.IsNullOrWhiteSpace())
{
+ var webClientRootUrl = configurationSection["MyProjectName_App:RootUrl"]?.TrimEnd('/');
+
await CreateClientAsync(
- name: consoleClientId,
+ name: consoleAndAngularClientId,
scopes: commonScopes,
- grantTypes: new[] {"password", "client_credentials"},
- secret: (configurationSection["MyProjectName_App:ClientSecret"] ?? "1q2w3e*").Sha256()
+ grantTypes: new[] {"password", "client_credentials", "authorization_code"},
+ secret: (configurationSection["MyProjectName_App:ClientSecret"] ?? "1q2w3e*").Sha256(),
+ requireClientSecret: false,
+ redirectUri: webClientRootUrl,
+ postLogoutRedirectUri: webClientRootUrl
);
}
}
@@ -147,6 +152,8 @@ namespace MyCompanyName.MyProjectName.IdentityServer
string redirectUri = null,
string postLogoutRedirectUri = null,
string frontChannelLogoutUri = null,
+ bool requireClientSecret = true,
+ bool requirePkce = false,
IEnumerable permissions = null)
{
var client = await _clientRepository.FindByCliendIdAsync(name);
@@ -168,7 +175,9 @@ namespace MyCompanyName.MyProjectName.IdentityServer
AuthorizationCodeLifetime = 300,
IdentityTokenLifetime = 300,
RequireConsent = false,
- FrontChannelLogoutUri = frontChannelLogoutUri
+ FrontChannelLogoutUri = frontChannelLogoutUri,
+ RequireClientSecret = requireClientSecret,
+ RequirePkce = requirePkce
},
autoSave: true
);
From 19f272ca92e2a2c3d1e99eb5e7c3a3f0ef04175d Mon Sep 17 00:00:00 2001
From: Arman Ozak
Date: Thu, 13 Aug 2020 11:01:47 +0300
Subject: [PATCH 058/345] feat: handle redirects in api definition request
---
npm/ng-packs/packages/schematics/src/utils/source.ts | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/npm/ng-packs/packages/schematics/src/utils/source.ts b/npm/ng-packs/packages/schematics/src/utils/source.ts
index 81d0b287fe..b1411b6bca 100644
--- a/npm/ng-packs/packages/schematics/src/utils/source.ts
+++ b/npm/ng-packs/packages/schematics/src/utils/source.ts
@@ -14,8 +14,14 @@ export async function getSourceJson(url: string) {
searchParams: { includeTypes: true },
https: { rejectUnauthorized: false },
}));
- } catch (e) {
- throw new SchematicsException(Exception.NoApi);
+ } catch (err) {
+ // handle redirects
+ try {
+ ({ response: { body } } = err);
+ if (!body.types) throw Error('');
+ } catch (_) {
+ throw new SchematicsException(Exception.NoApi);
+ }
}
return body;
From 1b352cef4d707b4eae6cb336d21afe7ea5a5b5fa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?=
Date: Thu, 13 Aug 2020 11:15:17 +0300
Subject: [PATCH 059/345] Double check _requestLocalizationOptions
---
...ltAbpRequestLocalizationOptionsProvider.cs | 51 ++++++++++---------
1 file changed, 27 insertions(+), 24 deletions(-)
diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs
index 64f339ffce..263d0532d0 100644
--- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs
+++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs
@@ -50,35 +50,38 @@ namespace Microsoft.AspNetCore.RequestLocalization
{
using (await _syncSemaphore.LockAsync())
{
- using (var serviceScope = _serviceProviderFactory.CreateScope())
+ if (_requestLocalizationOptions == null)
{
- var languageProvider = serviceScope.ServiceProvider.GetRequiredService();
- var settingProvider = serviceScope.ServiceProvider.GetRequiredService();
+ using (var serviceScope = _serviceProviderFactory.CreateScope())
+ {
+ var languageProvider = serviceScope.ServiceProvider.GetRequiredService();
+ var settingProvider = serviceScope.ServiceProvider.GetRequiredService();
- var languages = await languageProvider.GetLanguagesAsync();
- var defaultLanguage = await settingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage);
+ var languages = await languageProvider.GetLanguagesAsync();
+ var defaultLanguage = await settingProvider.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage);
- var options = !languages.Any()
- ? new RequestLocalizationOptions()
- : new RequestLocalizationOptions
- {
- DefaultRequestCulture = DefaultGetRequestCulture(defaultLanguage, languages),
+ var options = !languages.Any()
+ ? new RequestLocalizationOptions()
+ : new RequestLocalizationOptions
+ {
+ DefaultRequestCulture = DefaultGetRequestCulture(defaultLanguage, languages),
- SupportedCultures = languages
- .Select(l => l.CultureName)
- .Distinct()
- .Select(c => new CultureInfo(c))
- .ToArray(),
+ SupportedCultures = languages
+ .Select(l => l.CultureName)
+ .Distinct()
+ .Select(c => new CultureInfo(c))
+ .ToArray(),
- SupportedUICultures = languages
- .Select(l => l.UiCultureName)
- .Distinct()
- .Select(c => new CultureInfo(c))
- .ToArray()
- };
+ SupportedUICultures = languages
+ .Select(l => l.UiCultureName)
+ .Distinct()
+ .Select(c => new CultureInfo(c))
+ .ToArray()
+ };
- _optionsAction?.Invoke(options);
- _requestLocalizationOptions = options;
+ _optionsAction?.Invoke(options);
+ _requestLocalizationOptions = options;
+ }
}
}
}
@@ -98,4 +101,4 @@ namespace Microsoft.AspNetCore.RequestLocalization
return new RequestCulture(cultureName, uiCultureName);
}
}
-}
\ No newline at end of file
+}
From c4727896f7d9d7bf7927839f267b701ce8183740 Mon Sep 17 00:00:00 2001
From: Yunus Emre Kalkan
Date: Thu, 13 Aug 2020 11:19:42 +0300
Subject: [PATCH 060/345] update Identity Localization
---
.../Volo/Abp/Identity/Localization/en.json | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json
index bcc2108fe5..6d8a5c58c5 100644
--- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json
+++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json
@@ -84,10 +84,10 @@
"DisplayName:Abp.Identity.Lockout.LockoutDuration": "Lockout duration(seconds)",
"DisplayName:Abp.Identity.Lockout.MaxFailedAccessAttempts": "Max failed access attempts",
"DisplayName:Abp.Identity.SignIn.RequireConfirmedEmail": "Require confirmed email",
- "DisplayName:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "Enable phone number confirmation",
- "DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "Require confirmed phoneNumber",
- "DisplayName:Abp.Identity.User.IsUserNameUpdateEnabled": "Is username update enabled",
- "DisplayName:Abp.Identity.User.IsEmailUpdateEnabled": "Is email update enabled",
+ "DisplayName:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "Allow users to confirm their phone number",
+ "DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "Require confirmed phone number",
+ "DisplayName:Abp.Identity.User.IsUserNameUpdateEnabled": "Allow users to change their usernames",
+ "DisplayName:Abp.Identity.User.IsEmailUpdateEnabled": "Allow users to change their email addresses",
"Description:Abp.Identity.Password.RequiredLength": "The minimum length a password must be.",
"Description:Abp.Identity.Password.RequiredUniqueChars": "The minimum number of unique characters which a password must contain.",
"Description:Abp.Identity.Password.RequireNonAlphanumeric": "If passwords must contain a non-alphanumeric character.",
From 31fcfbb4ffd9050d07fb7e1e03bf7f857dfb6bfd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?=
Date: Thu, 13 Aug 2020 12:30:38 +0300
Subject: [PATCH 061/345] Resolved #5043: Move AbpRequestLocalization
middleware on top of all in the startup template
---
.../MyProjectNameHttpApiHostModule.cs | 6 ++++--
.../MyProjectNameHttpApiHostModule.cs | 6 ++++--
.../MyProjectNameIdentityServerModule.cs | 6 ++++--
.../MyProjectNameWebModule.cs | 6 ++++--
.../MyProjectNameWebModule.cs | 6 ++++--
5 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
index 7e7817ae87..3771a1874d 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
@@ -167,7 +167,10 @@ namespace MyCompanyName.MyProjectName
{
app.UseDeveloperExceptionPage();
}
- else
+
+ app.UseAbpRequestLocalization();
+
+ if (!env.IsDevelopment())
{
app.UseErrorPage();
}
@@ -183,7 +186,6 @@ namespace MyCompanyName.MyProjectName
app.UseMultiTenancy();
}
- app.UseAbpRequestLocalization();
app.UseAuthorization();
app.UseSwagger();
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs
index c671d0f223..95a26d9084 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs
@@ -160,7 +160,10 @@ namespace MyCompanyName.MyProjectName
{
app.UseDeveloperExceptionPage();
}
- else
+
+ app.UseAbpRequestLocalization();
+
+ if (!env.IsDevelopment())
{
app.UseErrorPage();
}
@@ -177,7 +180,6 @@ namespace MyCompanyName.MyProjectName
app.UseMultiTenancy();
}
- app.UseAbpRequestLocalization();
app.UseIdentityServer();
app.UseAuthorization();
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
index df28fe0ccd..8a4e919161 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
@@ -143,7 +143,10 @@ namespace MyCompanyName.MyProjectName
{
app.UseDeveloperExceptionPage();
}
- else
+
+ app.UseAbpRequestLocalization();
+
+ if (!env.IsDevelopment())
{
app.UseErrorPage();
}
@@ -159,7 +162,6 @@ namespace MyCompanyName.MyProjectName
app.UseMultiTenancy();
}
- app.UseAbpRequestLocalization();
app.UseIdentityServer();
app.UseAuthorization();
app.UseAuditing();
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs
index 689fe33eca..699db2cec0 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs
@@ -215,7 +215,10 @@ namespace MyCompanyName.MyProjectName.Web
{
app.UseDeveloperExceptionPage();
}
- else
+
+ app.UseAbpRequestLocalization();
+
+ if (!env.IsDevelopment())
{
app.UseErrorPage();
}
@@ -230,7 +233,6 @@ namespace MyCompanyName.MyProjectName.Web
app.UseMultiTenancy();
}
- app.UseAbpRequestLocalization();
app.UseAuthorization();
app.UseSwagger();
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs
index 1bafd38d5a..cf201f90cc 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs
@@ -191,7 +191,10 @@ namespace MyCompanyName.MyProjectName.Web
{
app.UseDeveloperExceptionPage();
}
- else
+
+ app.UseAbpRequestLocalization();
+
+ if (!env.IsDevelopment())
{
app.UseErrorPage();
}
@@ -207,7 +210,6 @@ namespace MyCompanyName.MyProjectName.Web
app.UseMultiTenancy();
}
- app.UseAbpRequestLocalization();
app.UseIdentityServer();
app.UseAuthorization();
app.UseSwagger();
From fc2cd29f2e58a87f7d64e8076f167cbe23ee0914 Mon Sep 17 00:00:00 2001
From: maliming <6908465+maliming@users.noreply.github.com>
Date: Thu, 13 Aug 2020 17:44:46 +0800
Subject: [PATCH 062/345] Add PredicateBuilder class.
Resolve #5039
---
.../System/Linq/PredicateOperator.cs | 284 ++++++++++++++++++
.../System/Linq/PredicateBuilder_Tests.cs | 72 +++++
2 files changed, 356 insertions(+)
create mode 100644 framework/src/Volo.Abp.Core/System/Linq/PredicateOperator.cs
create mode 100644 framework/test/Volo.Abp.Core.Tests/System/Linq/PredicateBuilder_Tests.cs
diff --git a/framework/src/Volo.Abp.Core/System/Linq/PredicateOperator.cs b/framework/src/Volo.Abp.Core/System/Linq/PredicateOperator.cs
new file mode 100644
index 0000000000..a2dd9c3bee
--- /dev/null
+++ b/framework/src/Volo.Abp.Core/System/Linq/PredicateOperator.cs
@@ -0,0 +1,284 @@
+using System.Collections.ObjectModel;
+using System.Linq.Expressions;
+using JetBrains.Annotations;
+
+namespace System.Linq
+{
+ // Codes below are taken from https://github.com/scottksmith95/LINQKit project.
+
+ /// The Predicate Operator
+ public enum PredicateOperator
+ {
+ /// The "Or"
+ Or,
+
+ /// The "And"
+ And
+ }
+
+ ///
+ /// See http://www.albahari.com/expressions for information and examples.
+ ///
+ public static class PredicateBuilder
+ {
+ private class RebindParameterVisitor : ExpressionVisitor
+ {
+ private readonly ParameterExpression _oldParameter;
+ private readonly ParameterExpression _newParameter;
+
+ public RebindParameterVisitor(ParameterExpression oldParameter, ParameterExpression newParameter)
+ {
+ _oldParameter = oldParameter;
+ _newParameter = newParameter;
+ }
+
+ protected override Expression VisitParameter(ParameterExpression node)
+ {
+ if (node == _oldParameter)
+ {
+ return _newParameter;
+ }
+
+ return base.VisitParameter(node);
+ }
+ }
+
+ /// Start an expression
+ public static ExpressionStarter New