RedisServerMessageService.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using EVCB_OCPP.DBAPI.Services.DbService;
  2. using EVCB_OCPP.Domain.Models.MainDb;
  3. using ServiceStack;
  4. using ServiceStack.Redis;
  5. namespace EVCB_OCPP.DBAPI.Services.ServerMessageServices;
  6. public class RedisServerMessageService : IServerMessageService
  7. {
  8. private readonly IMainDbService mainDbService;
  9. private readonly IRedisClientsManager redisClientsManager;
  10. public RedisServerMessageService(
  11. IMainDbService mainDbService,
  12. IRedisClientsManager redisClientsManager
  13. )
  14. {
  15. this.mainDbService = mainDbService;
  16. this.redisClientsManager = redisClientsManager;
  17. }
  18. public async Task<string> AddServerMessage(
  19. string ChargeBoxId,
  20. string OutAction,
  21. string OutRequest,
  22. string CreatedBy,
  23. DateTime? CreatedOn = null,
  24. string SerialNo = "",
  25. string InMessage = "",
  26. CancellationToken token = default)
  27. {
  28. if (string.IsNullOrEmpty(SerialNo))
  29. {
  30. SerialNo = Guid.NewGuid().ToString();
  31. }
  32. var _CreatedOn = CreatedOn ?? DateTime.UtcNow;
  33. string _OutRequest = OutRequest is not null ? OutRequest : "";
  34. var data = new ServerMessage()
  35. {
  36. ChargeBoxId = ChargeBoxId,
  37. CreatedBy = CreatedBy,
  38. CreatedOn = _CreatedOn,
  39. OutAction = OutAction,
  40. OutRequest = _OutRequest,
  41. SerialNo = SerialNo,
  42. InMessage = InMessage
  43. };
  44. await StoreIntoRedis(data);
  45. return SerialNo;
  46. }
  47. public async Task<List<ServerMessage>> GetNeedSendToClientServerMessages()
  48. {
  49. var allServerMessage = await GetServerMessages();
  50. DateTime startDt = DateTime.UtcNow.AddSeconds(-30);
  51. var seperatedServerMessage = allServerMessage.GroupBy(x => x.CreatedOn < startDt).ToDictionary(x => x.Key, x => x?.ToList());
  52. var deprecatedServerMessage = seperatedServerMessage.GetValueOrDefault(true, null);
  53. if (deprecatedServerMessage is not null)
  54. {
  55. var deprecatedServerMessageIds = deprecatedServerMessage.Select(x => x.Id);
  56. await RemoveFromRedis(deprecatedServerMessageIds);
  57. foreach (var servermessage in deprecatedServerMessage)
  58. {
  59. _ = AddServerMessageToDbAsync(servermessage);
  60. }
  61. }
  62. return seperatedServerMessage.GetValueOrDefault(false, new List<ServerMessage>())!;
  63. }
  64. public async Task<bool> SetServerMessageResponseReceived(int id, string InMessage = "", DateTime ReceivedOn = default)
  65. {
  66. DateTime _ReceivedOn = ReceivedOn == default ? DateTime.UtcNow : ReceivedOn;
  67. IRedisClientAsync redisClient = await redisClientsManager.GetClientAsync();
  68. var redisServerMessage = redisClient.As<ServerMessage>();
  69. var msg = await redisServerMessage.GetByIdAsync(id);
  70. await redisServerMessage.DeleteByIdAsync(id);
  71. await redisClient.DisposeAsync();
  72. msg.Id = 0;
  73. msg.InMessage = InMessage;
  74. msg.ReceivedOn = _ReceivedOn;
  75. var addServerMessageResult = await mainDbService.AddServerMessage(msg);
  76. return !string.IsNullOrEmpty(addServerMessageResult);
  77. }
  78. public async Task<bool> SetServerMessageServerHandling(int id, DateTime UpdatedOn = default)
  79. {
  80. DateTime _UpdatedOn = UpdatedOn == default ? DateTime.UtcNow : UpdatedOn;
  81. IRedisClientAsync redisClient = await redisClientsManager.GetClientAsync();
  82. var redisServerMessage = redisClient.As<ServerMessage>();
  83. var msg = await redisServerMessage.GetByIdAsync(id);
  84. msg.UpdatedOn = _UpdatedOn;
  85. await redisServerMessage.StoreAsync(msg);
  86. await redisClient.DisposeAsync();
  87. return true;
  88. }
  89. public async Task<List<ServerMessage>> GetServerMessages()
  90. {
  91. IRedisClientAsync redisClient = await redisClientsManager.GetClientAsync();
  92. var allMessages = await redisClient.As<ServerMessage>().GetAllAsync();
  93. await redisClient.DisposeAsync();
  94. return allMessages?.ToList();
  95. }
  96. public Task SaveCompletedMessageToDb()
  97. {
  98. return Task.CompletedTask;
  99. }
  100. private async Task<int> AddServerMessageToDbAsync(ServerMessage message)
  101. {
  102. var memMessageId = message.Id;
  103. var addServerMessageResult = await mainDbService.AddServerMessage(message);
  104. if (!string.IsNullOrEmpty(addServerMessageResult))
  105. {
  106. return memMessageId;
  107. }
  108. return -1;
  109. }
  110. private async Task StoreIntoRedis(ServerMessage data)
  111. {
  112. await using IRedisClientAsync redisClient = await redisClientsManager.GetClientAsync();
  113. var redisServerMessage = redisClient.As<ServerMessage>();
  114. data.Id = (int)await redisServerMessage.GetNextSequenceAsync();
  115. await redisServerMessage.StoreAsync(data);
  116. }
  117. private async Task RemoveFromRedis(int id)
  118. {
  119. await using IRedisClientAsync redisClient = await redisClientsManager.GetClientAsync();
  120. var redisServerMessage = redisClient.As<ServerMessage>();
  121. await redisServerMessage.DeleteByIdAsync(id);
  122. }
  123. private async Task RemoveFromRedis(IEnumerable<int> ids)
  124. {
  125. await using IRedisClientAsync redisClient = await redisClientsManager.GetClientAsync();
  126. var redisServerMessage = redisClient.As<ServerMessage>();
  127. await redisServerMessage.DeleteByIdsAsync(ids);
  128. }
  129. }