diff --git a/AyCode.Core/Extensions/SerializeObjectExtensions.cs b/AyCode.Core/Extensions/SerializeObjectExtensions.cs index 4e54585..1e8fe56 100644 --- a/AyCode.Core/Extensions/SerializeObjectExtensions.cs +++ b/AyCode.Core/Extensions/SerializeObjectExtensions.cs @@ -2,6 +2,8 @@ using MessagePack.Resolvers; using MessagePack; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System.Text.RegularExpressions; namespace AyCode.Core.Extensions; @@ -18,7 +20,12 @@ public static class SerializeObjectExtensions public static string ToJson(this IQueryable source) where T : class, IAcSerializableToJson => JsonConvert.SerializeObject(source, Options); public static string ToJson(this IEnumerable source) where T : class, IAcSerializableToJson => JsonConvert.SerializeObject(source, Options); - public static T? JsonTo(this string json) => JsonConvert.DeserializeObject(json, Options); + public static T? JsonTo(this string json) + { + if (json.StartsWith("\"") && json.EndsWith("\"")) json = Regex.Unescape(json).TrimStart('"').TrimEnd('"'); + + return JsonConvert.DeserializeObject(json, Options); + } public static byte[] ToMessagePack(this object message) => MessagePackSerializer.Serialize(message); diff --git a/AyCode.Entities/Users/AcUserToCompany.cs b/AyCode.Entities/Users/AcUserToCompany.cs index a6c87f9..f2ed722 100644 --- a/AyCode.Entities/Users/AcUserToCompany.cs +++ b/AyCode.Entities/Users/AcUserToCompany.cs @@ -16,6 +16,8 @@ public abstract class AcUserToCompany : IAcUserToCompany +public class SignalPostJsonDataMessage : ISignalPostMessage where TPostDataType : class { [IgnoreMember] - private string _postData; + private TPostDataType? _postData; - [Key(0)] - public string PostData + [IgnoreMember] + public TPostDataType PostData { - get => _postData; - set => _postData = Regex.Unescape(value).TrimStart('"').TrimEnd('"'); + get + { + return _postData ??= PostDataJson.JsonTo()!; + } + private init + { + _postData = value; + PostDataJson = _postData.ToJson(); + } } - public SignalPostJsonDataMessage(object postData) => PostData = postData.ToJson(); + [Key(0)] + public string PostDataJson { get; set; } + + public SignalPostJsonDataMessage(){} + public SignalPostJsonDataMessage(TPostDataType postData) => PostData = postData; + public SignalPostJsonDataMessage(string postDataJson) => PostDataJson = postDataJson; } [MessagePackObject] @@ -28,7 +40,7 @@ public class SignalPostMessage(TPostData postData) : ISignalPostMessa public TPostData? PostData { get; set; } = postData; } -public interface ISignalPostMessage : ISignalRMessage +public interface ISignalPostMessage : ISignalRMessage { TPostData? PostData { get; } } @@ -49,6 +61,27 @@ public interface ISignalRMessage { } +[MessagePackObject] +public sealed class SignalResponseJsonMessage : ISignalResponseMessage +{ + [Key(0)] + public SignalResponseStatus Status { get; set; } + + [Key(1)] + public string? ResponseData { get; set; } + + public SignalResponseJsonMessage(){} + + public SignalResponseJsonMessage(SignalResponseStatus status, object responseData) : this(status, responseData.ToJson()) + { } + + public SignalResponseJsonMessage(SignalResponseStatus status, string responseDataJson) + { + Status = status; + ResponseData = responseDataJson; + } +} + [MessagePackObject] public sealed class SignalResponseMessage(SignalResponseStatus status, TResponseData? responseData) : ISignalResponseMessage { diff --git a/AyCode.Services/SignalRs/SignalMessageTagAttribute.cs b/AyCode.Services/SignalRs/SignalMessageTagAttribute.cs new file mode 100644 index 0000000..065db8a --- /dev/null +++ b/AyCode.Services/SignalRs/SignalMessageTagAttribute.cs @@ -0,0 +1,10 @@ +namespace AyCode.Services.SignalRs; + +public class SignalMessageTagAttribute(Type requestMessageType, Type responseMessageType, Type controllerType, params Type[] parameters) : Attribute +{ + public Type RequestMessageType { get; } = requestMessageType; + public Type ResponseMessageType { get; } = responseMessageType; + + public Type ControllerType { get; } = controllerType; + public Type[] Parameters { get; } = parameters; +} \ No newline at end of file