@@ -125,7 +129,12 @@ else
@foreach (var device in session.Devices)
{
- @device.Id (@device.IpAddress)
+ var info = uaParser.Parse(device.UserAgent);
+
+ @info.Device.Family on @info.OS
+ @device.IpAddress
+ @(string.IsNullOrWhiteSpace(device.Location) ? "" : $"({device.Location})")
+
}
|
diff --git a/OryAdmin/Components/_Imports.razor b/OryAdmin/Components/_Imports.razor
index fc457af..5aa604e 100644
--- a/OryAdmin/Components/_Imports.razor
+++ b/OryAdmin/Components/_Imports.razor
@@ -10,5 +10,4 @@
@using OryAdmin.Components
@using OryAdmin.Extensions
@using OryAdmin.Components.Elements
-@using OryAdmin.Models;
@using OryAdmin.Services;
\ No newline at end of file
diff --git a/OryAdmin/Extensions/JObjectExt.cs b/OryAdmin/Extensions/JObjectExt.cs
index df5ff2e..56e5ec8 100644
--- a/OryAdmin/Extensions/JObjectExt.cs
+++ b/OryAdmin/Extensions/JObjectExt.cs
@@ -1,15 +1,16 @@
using Newtonsoft.Json.Linq;
-using OryAdmin.Models;
+using Newtonsoft.Json.Schema;
namespace OryAdmin.Extensions;
public static class JObjectExt
{
- public static void UpdateValueWithSchema(this JObject json, TraitsSchemaData schema, object? value)
+ public static void UpdateValueWithSchema(this JObject json, JSchema schema, List schemaPathSections,
+ object? value)
{
JObject? innerJson = null;
JObject obj; // prevents variable name shadowing
- foreach (var path in schema.Path[..^1])
+ foreach (var path in schemaPathSections[..^1])
{
obj = innerJson ?? json;
if (!obj.ContainsKey(path)) obj.Add(path, new JObject());
@@ -17,7 +18,7 @@ public static void UpdateValueWithSchema(this JObject json, TraitsSchemaData sch
}
// handle last path
- var lastPath = schema.Path.Last();
+ var lastPath = schemaPathSections.Last();
obj = innerJson ?? json;
obj[lastPath] = new JValue(value);
}
diff --git a/OryAdmin/Models/TraitsSchemaData.cs b/OryAdmin/Models/TraitsSchemaData.cs
deleted file mode 100644
index 9894f00..0000000
--- a/OryAdmin/Models/TraitsSchemaData.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using Newtonsoft.Json.Schema;
-
-namespace OryAdmin.Models;
-
-public class TraitsSchemaData(JSchema schema, List path)
-{
- public readonly JSchema Schema = schema;
- public List Path = path;
-
- public override string ToString()
- {
- return Schema.ToString();
- }
-}
\ No newline at end of file
diff --git a/OryAdmin/OryAdmin.csproj b/OryAdmin/OryAdmin.csproj
index 26e8b1e..c4b4f29 100644
--- a/OryAdmin/OryAdmin.csproj
+++ b/OryAdmin/OryAdmin.csproj
@@ -21,6 +21,7 @@
+
diff --git a/OryAdmin/Services/IdentitySchemaService.cs b/OryAdmin/Services/IdentitySchemaService.cs
index bd80c58..ad487fc 100644
--- a/OryAdmin/Services/IdentitySchemaService.cs
+++ b/OryAdmin/Services/IdentitySchemaService.cs
@@ -1,62 +1,64 @@
-using Newtonsoft.Json.Linq;
-using Newtonsoft.Json.Schema;
-using OryAdmin.Models;
+using Newtonsoft.Json.Schema;
namespace OryAdmin.Services;
public class IdentitySchemaService(ApiService apiService)
{
- private readonly Dictionary _schemaCache = new();
+ private readonly Dictionary _schemaCache = new();
- public async Task GetById(string schemaId)
+ public async Task FetchById(string schemaId)
{
// check if schema object is cached
if (_schemaCache.TryGetValue(schemaId, out var schema))
return schema;
// request and cache new schema object
var newSchema = await apiService.KratosIdentity.GetIdentitySchemaAsync(schemaId);
- _schemaCache[schemaId] = (JObject)newSchema;
+ _schemaCache[schemaId] = JSchema.Parse(newSchema.ToString()!);
return _schemaCache[schemaId];
}
public async Task> ListIds()
{
var schemas = await apiService.KratosIdentity.ListIdentitySchemasAsync();
- foreach (var container in schemas) _schemaCache[container.Id] = (JObject)container.Schema;
+ foreach (var container in schemas) _schemaCache[container.Id] = JSchema.Parse(container.Schema.ToString()!);
return schemas.Select(container => container.Id).ToList();
}
- public async Task> GetTraitSchemas(string schemaId)
+ public async Task, JSchema>> GetTraits(string schemaId)
+ {
+ var schema = await FetchById(schemaId);
+ return GetTraits(schema);
+ }
+
+
+ public static Dictionary, JSchema> GetTraits(JSchema schema)
{
- var schemaObject = await GetById(schemaId);
- var schema = JSchema.Parse(schemaObject.ToString());
var traits = schema.Properties["traits"].Properties;
return FlattenTraits(traits, []);
}
- private static List FlattenTraits(IDictionary traits, List path)
+ private static Dictionary, JSchema> FlattenTraits(IDictionary traits,
+ IReadOnlyCollection pathSections)
{
- var list = new List();
+ var map = new Dictionary, JSchema>();
foreach (var (traitKey, trait) in traits)
{
- var newPath = new List(path) { traitKey };
+ var newPathSections = new List(pathSections) { traitKey };
switch (trait.Type)
{
- case JSchemaType.String:
- list.Add(new TraitsSchemaData(trait, newPath));
- break;
case JSchemaType.Object:
- list.AddRange(FlattenTraits(trait.Properties, newPath));
+ foreach (var entry in FlattenTraits(trait.Properties, newPathSections))
+ map[entry.Key] = entry.Value;
break;
case JSchemaType.Array:
// TODO support arrays
break;
- default:
- list.Add(new TraitsSchemaData(trait, newPath));
+ default: // string, etc.
+ map[newPathSections] = trait;
break;
}
}
- return list;
+ return map;
}
}
\ No newline at end of file
diff --git a/OryUI.sln.DotSettings b/OryUI.sln.DotSettings
new file mode 100644
index 0000000..90f6839
--- /dev/null
+++ b/OryUI.sln.DotSettings
@@ -0,0 +1,2 @@
+
+ True
\ No newline at end of file
|