using AyCode.Core.Extensions; using MessagePack; using Newtonsoft.Json.Linq; using System.Text.RegularExpressions; using AyCode.Core.Interfaces; namespace AyCode.Services.SignalRs; public class IdMessage : IId { public Guid Id { get; set; } public IdMessage() {} public IdMessage(Guid id) : this() { Id = id; } } public class SignalPostJsonMessage { [Key(0)] public string PostDataJson { get; set; } public SignalPostJsonMessage() {} protected SignalPostJsonMessage(string postDataJson) => PostDataJson = postDataJson; } [MessagePackObject] public class SignalPostJsonDataMessage : SignalPostJsonMessage, ISignalPostMessage where TPostDataType : class { [IgnoreMember] private TPostDataType? _postData; [IgnoreMember] public TPostDataType PostData { get { return _postData ??= PostDataJson.JsonTo()!; } private init { _postData = value; PostDataJson = _postData.ToJson(); } } public SignalPostJsonDataMessage() : base() {} public SignalPostJsonDataMessage(TPostDataType postData) => PostData = postData; public SignalPostJsonDataMessage(string postDataJson) : base(postDataJson) {} } [MessagePackObject] public class SignalPostMessage(TPostData postData) : ISignalPostMessage { [Key(0)] public TPostData? PostData { get; set; } = postData; } public interface ISignalPostMessage : ISignalRMessage { TPostData? PostData { get; } } [MessagePackObject] public class SignalRequestByIdMessage(Guid id) : ISignalRequestMessage, IId { [Key(0)] public Guid Id { get; set; } = id; } public interface ISignalRequestMessage : ISignalRMessage { TRequestId Id { get; set; } } public interface ISignalRMessage { } [MessagePackObject] public sealed class SignalResponseJsonMessage : ISignalResponseMessage { [Key(0)] public SignalResponseStatus Status { get; set; } [Key(1)] public string? ResponseData { get; set; } = null; public SignalResponseJsonMessage(){} public SignalResponseJsonMessage(SignalResponseStatus status) { Status = status; } public SignalResponseJsonMessage(SignalResponseStatus status, object? responseData) : this(status) { if (responseData is string) ResponseData = responseData as string; else ResponseData = responseData.ToJson(); } public SignalResponseJsonMessage(SignalResponseStatus status, string? responseDataJson) : this(status) { ResponseData = responseDataJson; } } [MessagePackObject] public sealed class SignalResponseMessage(SignalResponseStatus status, TResponseData? responseData) : ISignalResponseMessage { [Key(0)] public SignalResponseStatus Status { get; set; } = status; [Key(1)] public TResponseData? ResponseData { get; set; } = responseData; } public sealed class SignalResponseStatusMessage(SignalResponseStatus status) : ISignalRMessage { public SignalResponseStatus Status { get; set; } = status; } //[MessagePackObject] //public sealed class SignalResponseMessage(SignalResponseStatus status) : ISignalResponseMessage //{ // [Key(0)] // public SignalResponseStatus Status { get; set; } = status; //} public interface ISignalResponseMessage : ISignalResponseMessage { TResponseData? ResponseData { get; set; } } public interface ISignalResponseMessage : ISignalRMessage { SignalResponseStatus Status { get; set; } } public enum SignalResponseStatus : byte { Error = 0, Success = 5 } public interface IAcSignalRHubClient : IAcSignalRHubBase { Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, int? requestId ); //Task SendRequestToServerAsync(int messageTag, int requestId); }