diff --git a/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/ReplicationMessage.cs b/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/ReplicationMessage.cs
index 5cffa012..8696b29e 100644
--- a/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/ReplicationMessage.cs
+++ b/extra/admin-api/Interop/Spacebar.Interop.Replication.Abstractions/ReplicationMessage.cs
@@ -1,7 +1,12 @@
+using System.Reflection;
+using System.Text.Json;
+using System.Text.Json.Nodes;
using System.Text.Json.Serialization;
+using System.Transactions;
namespace Spacebar.Interop.Replication.Abstractions;
+[JsonConverter(typeof(ReplicationMessageJsonConverter))]
public class ContentlessReplicationMessage {
[JsonPropertyName("channel_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
public long? ChannelId { get; set; }
@@ -12,8 +17,8 @@ public class ContentlessReplicationMessage {
[JsonPropertyName("user_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
public long? UserId { get; set; }
- [JsonPropertyName("session_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
- public long? SessionId { get; set; }
+ [JsonPropertyName("session_id")]
+ public string? SessionId { get; set; }
[JsonPropertyName("created_at")]
public DateTime? CreatedAt { get; set; }
@@ -31,4 +36,37 @@ public class ContentlessReplicationMessage {
public class ReplicationMessage<TPayload> : ContentlessReplicationMessage {
[JsonPropertyName("data")]
public TPayload Payload { get; set; } = default!;
+}
+
+public class ReplicationMessageJsonConverter : JsonConverter<ContentlessReplicationMessage> {
+ public override ContentlessReplicationMessage? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
+ // return JsonSerializer.Deserialize(ref reader, typeToConvert, options) as ContentlessReplicationMessage;
+ Console.WriteLine("TODO: write ReplicationMessage deserialization"); //TODO
+ return null;
+ }
+
+ public override void Write(Utf8JsonWriter writer, ContentlessReplicationMessage value, JsonSerializerOptions options) {
+ writer.WriteStartObject();
+ writer.WriteString("event", value.Event);
+ if (value.ChannelId.HasValue) writer.WriteString("channel_id", value.ChannelId.ToString());
+ if (value.GuildId.HasValue) writer.WriteString("guild_id", value.GuildId.ToString());
+ if (value.UserId.HasValue) writer.WriteString("user_id", value.UserId.ToString());
+ if (value.SessionId != null) writer.WriteString("session_id", value.SessionId);
+
+ if (value.CreatedAt.HasValue) writer.WriteString("created_at", value.CreatedAt.Value.ToString("O"));
+ if (value.Origin != null) writer.WriteString("origin", value.Origin);
+ if (value.ReconnectDelay.HasValue) writer.WriteNumber("reconnect_delay", value.ReconnectDelay.Value);
+
+ if (value.GetType().IsGenericType && value.GetType().GetGenericTypeDefinition() == typeof(ReplicationMessage<>)) {
+ var dataType = value.GetType().GenericTypeArguments[0];
+
+ var dataProperty = value.GetType().GetProperty("Payload", BindingFlags.Public | BindingFlags.Instance);
+ var dataValue = dataProperty!.GetValue(value);
+
+ writer.WritePropertyName("data");
+ JsonSerializer.Serialize(writer, dataValue, dataType, options);
+ }
+
+ writer.WriteEndObject();
+ }
}
\ No newline at end of file
|