The next generation of the Teknik Services. Written in ASP.NET. https://www.teknik.io/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
3.6 KiB

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.IO;
using System.Linq;
namespace Teknik.Utilities.Routing
{
public static class EndpointHelper
{
public static void BuildEndpoints(this IEndpointRouteBuilder endpoints, string fullHost, string shortHost)
{
// Get the endpoint mappings
var mappings = GetEndpointMappings();
// Create a subdomain endpoint for each mapping
foreach (var mapping in mappings)
{
var domains = GetDomainsFromHostTypes(fullHost, shortHost, mapping.HostTypes);
var defaultObj = new ExpandoObject();
if (mapping.Defaults != null)
{
var defaults = mapping.Defaults as JObject;
foreach (var defaultVal in defaults)
{
defaultObj.TryAdd(defaultVal.Key, defaultVal.Value.ToObject<object>());
}
}
defaultObj.TryAdd("area", mapping.Area);
endpoints.MapSubdomainEndpoint(
name: mapping.Name,
domains: domains,
subDomains: mapping.SubDomains,
pattern: mapping.Pattern,
area: mapping.Area,
defaults: defaultObj,
adjustPattern: mapping.AdjustPattern ?? true
);
}
}
public static EndpointMapping GetEndpointMapping(string name)
{
var mappings = GetEndpointMappings();
return mappings.FirstOrDefault(m => m.Name == name);
}
public static List<EndpointMapping> GetEndpointMappings()
{
string dataDir = (string)AppDomain.CurrentDomain.GetData("DataDirectory");
string file = Path.Combine(dataDir, Constants.ENDPOINT_MAPPING_PATH);
if (File.Exists(file))
{
JsonSerializer serializer = new JsonSerializer();
using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
using (var sr = new StreamReader(fs))
using (var jsonTextReader = new JsonTextReader(sr))
{
return (List<EndpointMapping>)serializer.Deserialize(jsonTextReader, typeof(List<EndpointMapping>));
}
}
return new List<EndpointMapping>();
}
private static List<string> GetDomainsFromHostTypes(string fullHost, string shortHost, List<HostType> hostTypes)
{
var domains = new List<string>();
if (hostTypes != null)
{
foreach (var hostType in hostTypes)
{
switch (hostType)
{
case HostType.Full:
if (!string.IsNullOrEmpty(fullHost) &&
!domains.Contains(fullHost))
domains.Add(fullHost);
break;
case HostType.Short:
if (!string.IsNullOrEmpty(shortHost) &&
!domains.Contains(shortHost))
domains.Add(shortHost);
break;
}
}
}
return domains;
}
}
}