Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .openapi-generator/FILES
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,15 @@ docs/models/BotResult.md
docs/models/BrowserDetails.md
docs/models/Canvas.md
docs/models/DecryptionKey.md
docs/models/EdgeRequest.md
docs/models/EdgeRequestHeadersInner.md
docs/models/Emoji.md
docs/models/Error.md
docs/models/ErrorCode.md
docs/models/ErrorResponse.md
docs/models/Event.md
docs/models/EventDevice.md
docs/models/EventEdge.md
docs/models/EventRuleAction.md
docs/models/EventRuleActionAllow.md
docs/models/EventRuleActionBlock.md
Expand Down Expand Up @@ -96,11 +100,15 @@ src/Fingerprint.ServerSdk/Model/BotInfoIdentity.cs
src/Fingerprint.ServerSdk/Model/BotResult.cs
src/Fingerprint.ServerSdk/Model/BrowserDetails.cs
src/Fingerprint.ServerSdk/Model/Canvas.cs
src/Fingerprint.ServerSdk/Model/EdgeRequest.cs
src/Fingerprint.ServerSdk/Model/EdgeRequestHeadersInner.cs
src/Fingerprint.ServerSdk/Model/Emoji.cs
src/Fingerprint.ServerSdk/Model/Error.cs
src/Fingerprint.ServerSdk/Model/ErrorCode.cs
src/Fingerprint.ServerSdk/Model/ErrorResponse.cs
src/Fingerprint.ServerSdk/Model/Event.cs
src/Fingerprint.ServerSdk/Model/EventDevice.cs
src/Fingerprint.ServerSdk/Model/EventEdge.cs
src/Fingerprint.ServerSdk/Model/EventRuleAction.cs
src/Fingerprint.ServerSdk/Model/EventRuleActionAllow.cs
src/Fingerprint.ServerSdk/Model/EventRuleActionBlock.cs
Expand Down
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,7 @@ All URIs are relative to *https://api.fpjs.io/v4*

Class | Method | HTTP request | Description
------------ | ------------- | ------------- | -------------
*FingerprintApi* | [**AnalyzeRequestForAutomationIntelligenceAsync**](docs/FingerprintApi.md#analyzerequestforautomationintelligence) | **POST** /edge | Collect Automation Intelligence.
*FingerprintApi* | [**DeleteVisitorDataAsync**](docs/FingerprintApi.md#deletevisitordata) | **DELETE** /visitors/{visitor_id} | Delete a visitor ID
*FingerprintApi* | [**GetEventAsync**](docs/FingerprintApi.md#getevent) | **GET** /events/{event_id} | Get an event by event ID
*FingerprintApi* | [**SearchEventsAsync**](docs/FingerprintApi.md#searchevents) | **GET** /events | Search events
Expand All @@ -315,11 +316,15 @@ Class | Method | HTTP request | Description
- [Model.BotResult](docs/models/BotResult.md)
- [Model.BrowserDetails](docs/models/BrowserDetails.md)
- [Model.Canvas](docs/models/Canvas.md)
- [Model.EdgeRequest](docs/models/EdgeRequest.md)
- [Model.EdgeRequestHeadersInner](docs/models/EdgeRequestHeadersInner.md)
- [Model.Emoji](docs/models/Emoji.md)
- [Model.Error](docs/models/Error.md)
- [Model.ErrorCode](docs/models/ErrorCode.md)
- [Model.ErrorResponse](docs/models/ErrorResponse.md)
- [Model.Event](docs/models/Event.md)
- [Model.EventDevice](docs/models/EventDevice.md)
- [Model.EventEdge](docs/models/EventEdge.md)
- [Model.EventRuleAction](docs/models/EventRuleAction.md)
- [Model.EventRuleActionAllow](docs/models/EventRuleActionAllow.md)
- [Model.EventRuleActionBlock](docs/models/EventRuleActionBlock.md)
Expand Down
33 changes: 33 additions & 0 deletions custom/EventHydratingJsonConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System;

namespace Fingerprint.ServerSdk.Model;

/// <summary>
/// Wraps generated <see cref="EventJsonConverter"/> so omit/empty source
/// hydrates to device before oneOf lookup. Survives generate via generate.sh.
/// </summary>
public sealed class EventHydratingJsonConverter : JsonConverter<Event>
{
private static readonly EventJsonConverter Inner = new();

public override Event Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
using var doc = JsonDocument.ParseValue(ref reader);
var hydrated = EventSourceHydration.HydrateMissing(doc.RootElement);
var hydratedReader = new Utf8JsonReader(Encoding.UTF8.GetBytes(hydrated));
if (!hydratedReader.Read())
{
throw new JsonException("event JSON must be an object");
}

return Inner.Read(ref hydratedReader, typeToConvert, options);
}

public override void Write(Utf8JsonWriter writer, Event value, JsonSerializerOptions options)
{
Inner.Write(writer, value, options);
}
}
45 changes: 45 additions & 0 deletions custom/EventSourceHydration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using System.Text.Json;
using System.Text.Json.Nodes;

namespace Fingerprint.ServerSdk.Model;

/// <summary>
/// Treats a missing, null, or empty Event <c>source</c> as <c>device</c>.
/// Unknown non-empty values fail. Never rewrites <c>edge</c>.
/// </summary>
public static class EventSourceHydration
{
public static string HydrateMissing(JsonElement root)
{
if (root.ValueKind != JsonValueKind.Object)
{
throw new JsonException("event JSON must be an object");
}

var node = JsonNode.Parse(root.GetRawText()) as JsonObject
?? throw new JsonException("event JSON must be an object");

if (!node.TryGetPropertyValue("source", out var sourceNode)
|| sourceNode is null
|| sourceNode.GetValueKind() == JsonValueKind.Null
|| (sourceNode.GetValueKind() == JsonValueKind.String
&& string.IsNullOrEmpty(sourceNode.GetValue<string>())))
{
node["source"] = "device";
return node.ToJsonString();
}

if (sourceNode.GetValueKind() != JsonValueKind.String)
{
throw new JsonException($"unknown Event source: {sourceNode}");
}

var value = sourceNode.GetValue<string>();
if (value is not "device" and not "edge")
{
throw new JsonException($"unknown Event source: {value}");
}

return root.GetRawText();
}
}
Loading
Loading