Make IAppUrlProvider methods async

pull/952/head
Halil ibrahim Kalkan 7 years ago
parent 56e49c30c3
commit 9a9420cb51

@ -1,6 +1,4 @@
using Volo.Abp.Ui.Navigation.Urls;
namespace Volo.Abp.Ui.Navigation.Urls
namespace Volo.Abp.Ui.Navigation.Urls
{
public class AppUrlOptions
{

@ -1,20 +1,42 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Ui.Navigation.Urls
{
public class AppUrlProvider : IAppUrlProvider, ITransientDependency
{
public const string TenantIdPlaceHolder = "{{tenantId}}";
public const string TenantNamePlaceHolder = "{{tenantName}}";
protected AppUrlOptions Options { get; }
protected ICurrentTenant CurrentTenant { get; }
protected ITenantStore TenantStore { get; }
public AppUrlProvider(IOptions<AppUrlOptions> options)
public AppUrlProvider(
IOptions<AppUrlOptions> options,
ICurrentTenant currentTenant,
ITenantStore tenantStore)
{
CurrentTenant = currentTenant;
TenantStore = tenantStore;
Options = options.Value;
}
public virtual string GetUrl(string appName, string urlName = null)
public virtual async Task<string> GetUrlAsync(string appName, string urlName = null)
{
return await ReplacePlaceHoldersAsync(
await GetConfiguredUrl(
appName,
urlName
)
);
}
protected virtual Task<string> GetConfiguredUrl(string appName, string urlName)
{
var app = Options.Applications[appName];
@ -22,24 +44,70 @@ namespace Volo.Abp.Ui.Navigation.Urls
{
if (app.RootUrl.IsNullOrEmpty())
{
throw new AbpException($"RootUrl for the application '{appName}' was not configured. Use {nameof(AppUrlOptions)} to configure it!");
throw new AbpException(
$"RootUrl for the application '{appName}' was not configured. Use {nameof(AppUrlOptions)} to configure it!"
);
}
return app.RootUrl;
return Task.FromResult(app.RootUrl);
}
var url = app.Urls.GetOrDefault(urlName);
if (url.IsNullOrEmpty())
{
throw new AbpException($"Url, named '{urlName}', for the application '{appName}' was not configured. Use {nameof(AppUrlOptions)} to configure it!");
throw new AbpException(
$"Url, named '{urlName}', for the application '{appName}' was not configured. Use {nameof(AppUrlOptions)} to configure it!"
);
}
if (app.RootUrl == null)
{
return Task.FromResult(url);
}
return Task.FromResult(app.RootUrl.EnsureEndsWith('/') + url);
}
protected virtual async Task<string> ReplacePlaceHoldersAsync(string url)
{
url = url.Replace(
TenantIdPlaceHolder,
CurrentTenant.Id.HasValue ? CurrentTenant.Id.Value.ToString() : ""
);
if (!url.Contains(TenantNamePlaceHolder))
{
return url;
}
return app.RootUrl.EnsureEndsWith('/') + url;
var tenantNamePlaceHolder = TenantNamePlaceHolder;
if (url.Contains(TenantNamePlaceHolder + '.'))
{
tenantNamePlaceHolder = TenantNamePlaceHolder + '.';
}
if (CurrentTenant.Id.HasValue)
{
url = url.Replace(tenantNamePlaceHolder, await GetCurrentTenantNameAsync());
}
else
{
url = url.Replace(tenantNamePlaceHolder, "");
}
return url;
}
private async Task<string> GetCurrentTenantNameAsync()
{
if (CurrentTenant.Id.HasValue && CurrentTenant.Name.IsNullOrEmpty())
{
var tenantConfiguration = await TenantStore.FindAsync(CurrentTenant.Id.Value);
return tenantConfiguration.Name;
}
return CurrentTenant.Name;
}
}
}

@ -1,9 +1,10 @@
using JetBrains.Annotations;
using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Volo.Abp.Ui.Navigation.Urls
{
public interface IAppUrlProvider
{
string GetUrl([NotNull] string appName, [CanBeNull] string urlName = null);
Task<string> GetUrlAsync([NotNull] string appName, [CanBeNull] string urlName = null);
}
}

Loading…
Cancel
Save