PipeRequest.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. using InABox.Clients;
  2. using InABox.Core;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Net.NetworkInformation;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace InABox.IPC.Shared
  10. {
  11. public enum RequestError
  12. {
  13. NONE,
  14. DISCONNECTED,
  15. UNKNOWN,
  16. TIMEOUT
  17. }
  18. public enum Method
  19. {
  20. None,
  21. Query,
  22. Save,
  23. MultiSave,
  24. Delete,
  25. MultiDelete,
  26. QueryMultiple,
  27. Validate,
  28. Check2FA,
  29. Ping,
  30. Info,
  31. Notification
  32. }
  33. [Serializable]
  34. public class PipeRequest
  35. {
  36. public Guid RequestID;
  37. public Method Method;
  38. public string? Type;
  39. public string Data;
  40. [NonSerialized]
  41. public RequestError ErrorCode;
  42. private PipeRequest(Guid requestID, Method method, string? type, string data, RequestError error = RequestError.NONE)
  43. {
  44. RequestID = requestID;
  45. Method = method;
  46. Type = type;
  47. Data = data;
  48. ErrorCode = error;
  49. }
  50. public PipeRequest Respond<TResponse>(TResponse response) where TResponse : Response
  51. {
  52. return new PipeRequest(RequestID, Method.None, Type, Serialization.Serialize(response));
  53. }
  54. public TRequest GetRequest<TRequest>()
  55. {
  56. return Serialization.Deserialize<TRequest>(Data);
  57. }
  58. public TResponse GetResponse<TResponse>() where TResponse : Response, new()
  59. {
  60. var start = DateTime.Now;
  61. var response = Serialization.Deserialize<TResponse>(Data);
  62. if (response == null) response = new TResponse();
  63. switch (ErrorCode)
  64. {
  65. case RequestError.NONE:
  66. break;
  67. case RequestError.DISCONNECTED:
  68. response.Status = StatusCode.Error;
  69. response.Messages.Add("Server disconnected");
  70. break;
  71. case RequestError.UNKNOWN:
  72. response.Status = StatusCode.Error;
  73. response.Messages.Add("Unknown Error");
  74. break;
  75. case RequestError.TIMEOUT:
  76. response.Status = StatusCode.Error;
  77. response.Messages.Add("Timeout");
  78. break;
  79. }
  80. return response;
  81. }
  82. public static PipeRequest Query<T>(QueryRequest<T> request) where T : Entity, new()
  83. {
  84. return new PipeRequest(Guid.NewGuid(), Method.Query, typeof(T).Name, Serialization.Serialize(request));
  85. }
  86. public static PipeRequest Save<T>(SaveRequest<T> request) where T : Entity, new()
  87. {
  88. return new PipeRequest(Guid.NewGuid(), Method.Save, typeof(T).Name, Serialization.Serialize(request));
  89. }
  90. public static PipeRequest MultiSave<T>(MultiSaveRequest<T> request) where T : Entity, new()
  91. {
  92. return new PipeRequest(Guid.NewGuid(), Method.MultiSave, typeof(T).Name, Serialization.Serialize(request));
  93. }
  94. public static PipeRequest Delete<T>(DeleteRequest<T> request) where T : Entity, new()
  95. {
  96. return new PipeRequest(Guid.NewGuid(), Method.Delete, typeof(T).Name, Serialization.Serialize(request));
  97. }
  98. public static PipeRequest MultiDelete<T>(MultiDeleteRequest<T> request) where T : Entity, new()
  99. {
  100. return new PipeRequest(Guid.NewGuid(), Method.MultiDelete, typeof(T).Name, Serialization.Serialize(request));
  101. }
  102. public static PipeRequest QueryMultiple(MultiQueryRequest request)
  103. {
  104. return new PipeRequest(Guid.NewGuid(), Method.QueryMultiple, null, Serialization.Serialize(request));
  105. }
  106. public static PipeRequest Validate(ValidateRequest request)
  107. {
  108. return new PipeRequest(Guid.NewGuid(), Method.Validate, null, Serialization.Serialize(request));
  109. }
  110. public static PipeRequest Check2FA(Check2FARequest request)
  111. {
  112. return new PipeRequest(Guid.NewGuid(), Method.Check2FA, null, Serialization.Serialize(request));
  113. }
  114. public static PipeRequest Error(RequestError error)
  115. {
  116. return new PipeRequest(Guid.NewGuid(), Method.None, null, "", error);
  117. }
  118. public static PipeRequest Ping(PingRequest request)
  119. {
  120. return new PipeRequest(Guid.NewGuid(), Method.Ping, null, Serialization.Serialize(request));
  121. }
  122. public static PipeRequest Info(InfoRequest request)
  123. {
  124. return new PipeRequest(Guid.NewGuid(), Method.Info, null, Serialization.Serialize(request));
  125. }
  126. public static PipeRequest Notification<TNotification>(TNotification notification) where TNotification : BaseObject
  127. => Notification(typeof(TNotification), notification);
  128. public static PipeRequest Notification(Type TNotification, BaseObject notification)
  129. {
  130. return new PipeRequest(Guid.NewGuid(), Method.Notification, TNotification.EntityName(), Serialization.Serialize(notification));
  131. }
  132. }
  133. }