SourceDbServerMessageService.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. using Dapper;
  2. using EVCB_OCPP.DBAPI.Services.DbService;
  3. using EVCB_OCPP.Domain;
  4. using EVCB_OCPP.Domain.ConnectionFactory;
  5. using EVCB_OCPP.Domain.Models.MainDb;
  6. using Microsoft.EntityFrameworkCore;
  7. namespace EVCB_OCPP.DBAPI.Services.ServerMessageServices
  8. {
  9. public class SourceDbServerMessageService : IServerMessageService
  10. {
  11. private readonly IMainDbService mainDbService;
  12. private readonly ISqlConnectionFactory<MainDBContext> sqlConnectionFactory;
  13. public SourceDbServerMessageService(
  14. IMainDbService mainDbService,
  15. ISqlConnectionFactory<MainDBContext> sqlConnectionFactory)
  16. {
  17. this.mainDbService = mainDbService;
  18. this.sqlConnectionFactory = sqlConnectionFactory;
  19. }
  20. public async Task<string> AddServerMessage(
  21. string ChargeBoxId,
  22. string OutAction,
  23. string OutRequest,
  24. string CreatedBy,
  25. DateTime? CreatedOn = null,
  26. string SerialNo = "",
  27. string InMessage = "",
  28. CancellationToken token = default)
  29. {
  30. if (string.IsNullOrEmpty(SerialNo))
  31. {
  32. SerialNo = Guid.NewGuid().ToString();
  33. }
  34. var _CreatedOn = CreatedOn ?? DateTime.UtcNow;
  35. string _OutRequest = OutRequest is not null ? OutRequest : "";
  36. var data = new ServerMessage()
  37. {
  38. ChargeBoxId = ChargeBoxId,
  39. CreatedBy = CreatedBy,
  40. CreatedOn = _CreatedOn,
  41. OutAction = OutAction,
  42. OutRequest = _OutRequest,
  43. SerialNo = SerialNo,
  44. InMessage = InMessage
  45. };
  46. await StoreIntoRTTable(data);
  47. return SerialNo;
  48. }
  49. public async Task<List<ServerMessage>> GetNeedSendToClientServerMessages()
  50. {
  51. var allServerMessage = await GetServerMessages();
  52. DateTime startDt = DateTime.UtcNow.AddSeconds(-30);
  53. var seperatedServerMessage = allServerMessage.GroupBy(x => x.CreatedOn < startDt).ToDictionary(x => x.Key, x => x?.ToList());
  54. var deprecatedServerMessage = seperatedServerMessage.GetValueOrDefault(true, null);
  55. if (deprecatedServerMessage is not null)
  56. {
  57. foreach (var servermessage in deprecatedServerMessage)
  58. {
  59. _ = RemoveFromRTTable(servermessage.Id);
  60. _ = AddServerMessageToDbAsync(servermessage);
  61. }
  62. }
  63. return seperatedServerMessage.GetValueOrDefault(false, new List<ServerMessage>())!;
  64. }
  65. public Task<List<ServerMessage>> GetServerMessages()
  66. {
  67. return GetServerMessagesFromRTTable();
  68. }
  69. public Task SaveCompletedMessageToDb()
  70. {
  71. return Task.CompletedTask;
  72. }
  73. public async Task<bool> SetServerMessageResponseReceived(int id, string InMessage = "", DateTime ReceivedOn = default)
  74. {
  75. DateTime _ReceivedOn = ReceivedOn == default ? DateTime.UtcNow : ReceivedOn;
  76. ServerMessage msg = await GetServerMessageFromRTTable(id);
  77. if (msg is null)
  78. {
  79. return false;
  80. }
  81. await RemoveFromRTTable(id);
  82. msg.Id = 0;
  83. msg.InMessage = InMessage;
  84. msg.ReceivedOn = _ReceivedOn;
  85. var sn = await mainDbService.AddServerMessage(msg);
  86. return string.IsNullOrEmpty(sn);
  87. }
  88. public Task<bool> SetServerMessageServerHandling(int id, DateTime UpdatedOn = default)
  89. {
  90. DateTime _UpdatedOn = UpdatedOn == default ? DateTime.UtcNow : UpdatedOn;
  91. return SetServerMessageServerHandlingInRTTable(id, _UpdatedOn);
  92. }
  93. private async Task<int> AddServerMessageToDbAsync(ServerMessage message)
  94. {
  95. var memMessageId = message.Id;
  96. var addServerMessageResult = await mainDbService.AddServerMessage(message);
  97. if (!string.IsNullOrEmpty(addServerMessageResult))
  98. {
  99. return memMessageId;
  100. }
  101. return -1;
  102. }
  103. private async Task<bool> StoreIntoRTTable(ServerMessage data)
  104. {
  105. var cmd = """
  106. INSERT INTO RTServerMessage ([SerialNo],[OutAction],[OutRequest],[InMessage],[CreatedOn],[CreatedBy],[ReceivedOn],[ChargeBoxId],[UpdatedOn])
  107. VALUES (@SerialNo,@OutAction,@OutRequest,@InMessage,@CreatedOn,@CreatedBy,@ReceivedOn,@ChargeBoxId,@UpdatedOn)
  108. """;
  109. var pams = new DynamicParameters();
  110. pams.Add("SerialNo", data.SerialNo, System.Data.DbType.String, size: 36);
  111. pams.Add("OutAction", data.OutAction, System.Data.DbType.String, size:30);
  112. pams.Add("OutRequest", data.OutRequest, System.Data.DbType.String);
  113. pams.Add("InMessage", data.InMessage, System.Data.DbType.String);
  114. pams.Add("CreatedOn", data.CreatedOn, System.Data.DbType.DateTime);
  115. pams.Add("CreatedBy", data.CreatedBy, System.Data.DbType.String,size:36);
  116. pams.Add("ReceivedOn", data.ReceivedOn, System.Data.DbType.DateTime);
  117. pams.Add("ChargeBoxId", data.ChargeBoxId, System.Data.DbType.String, size:50);
  118. pams.Add("UpdatedOn", data.UpdatedOn, System.Data.DbType.DateTime, size:50);
  119. using var con = await sqlConnectionFactory.CreateAsync();
  120. var cnts = await con.ExecuteAsync(cmd, pams);
  121. return cnts > 0;
  122. }
  123. private async Task<List<ServerMessage>> GetServerMessagesFromRTTable()
  124. {
  125. var cmd = """
  126. SELECT * FROM RTServerMessage
  127. """;
  128. using var con = await sqlConnectionFactory.CreateAsync();
  129. var datas = await con.QueryAsync<ServerMessage>(cmd);
  130. return datas?.ToList();
  131. }
  132. private async Task<ServerMessage> GetServerMessageFromRTTable(int id)
  133. {
  134. var cmd = """
  135. SELECT *
  136. FROM RTServerMessage
  137. WHERE [Id] = @Id
  138. """;
  139. var pams = new DynamicParameters();
  140. pams.Add("Id", id, System.Data.DbType.Int32);
  141. using var con = await sqlConnectionFactory.CreateAsync();
  142. var data = await con.QueryFirstOrDefaultAsync<ServerMessage>(cmd, pams);
  143. return data;
  144. }
  145. private async Task<bool> RemoveFromRTTable(int id)
  146. {
  147. var cmd = """
  148. DELETE FROM RTServerMessage
  149. WHERE [Id] = @Id
  150. """;
  151. var pams = new DynamicParameters();
  152. pams.Add("Id", id, System.Data.DbType.Int32);
  153. using var con = await sqlConnectionFactory.CreateAsync();
  154. var cnts = await con.ExecuteAsync(cmd, pams);
  155. return cnts > 0;
  156. }
  157. private async Task<bool> SetServerMessageServerHandlingInRTTable(int id, DateTime updatedOn)
  158. {
  159. var cmd = """
  160. UPDATE RTServerMessage
  161. SET [UpdatedOn] = @UpdatedOn
  162. WHERE [Id] = @Id
  163. """;
  164. var pams = new DynamicParameters();
  165. pams.Add("Id", id, System.Data.DbType.Int32);
  166. pams.Add("UpdatedOn", updatedOn, System.Data.DbType.DateTime);
  167. using var con = await sqlConnectionFactory.CreateAsync();
  168. var cnts = await con.ExecuteAsync(cmd, pams);
  169. return cnts > 0;
  170. }
  171. }
  172. }