123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- using Dapper;
- using EVCB_OCPP.DBAPI.ConnectionFactory;
- using EVCB_OCPP.DBAPI.Models.DBContext;
- using EVCB_OCPP.DBAPI.Services.DbService;
- using EVCB_OCPP.Domain.Models.MainDb;
- using Microsoft.Data.Sqlite;
- using Newtonsoft.Json;
- using System.Data;
- namespace EVCB_OCPP.DBAPI.Services.ServerMessageServices;
- public class MemDbServerMessageService : IServerMessageService
- {
- public MemDbServerMessageService(
- ISqliteConnectionConnectionFactory<MemDBContext> memDbConnectionFactory,
- IMainDbService mainDbService,
- ILogger<MemDbServerMessageService> logger)
- {
- this.memDbConnectionFactory = memDbConnectionFactory;
- this.mainDbService = mainDbService;
- this.logger = logger;
- }
- private readonly ISqliteConnectionConnectionFactory<MemDBContext> memDbConnectionFactory;
- private readonly IMainDbService mainDbService;
- private readonly ILogger<MemDbServerMessageService> logger;
- public async Task<string> AddServerMessage(
- string ChargeBoxId,
- string OutAction,
- string OutRequest,
- string CreatedBy,
- DateTime? CreatedOn = null,
- string SerialNo = "",
- string InMessage = "",
- CancellationToken token = default)
- {
- if (string.IsNullOrEmpty(SerialNo))
- {
- SerialNo = Guid.NewGuid().ToString();
- }
- var _CreatedOn = CreatedOn ?? DateTime.UtcNow;
- string _OutRequest = OutRequest is not null ? OutRequest : "";
- var data = new ServerMessage()
- {
- ChargeBoxId = ChargeBoxId,
- CreatedBy = CreatedBy,
- CreatedOn = _CreatedOn,
- OutAction = OutAction,
- OutRequest = _OutRequest,
- SerialNo = SerialNo,
- InMessage = InMessage
- };
- await AddServerMessage(data, token: token);
- return SerialNo;
- }
- public async Task<List<ServerMessage>> GetNeedSendToClientServerMessages()
- {
- DateTime dt = new DateTime(1991, 1, 1);
- DateTime dateTimeNow = DateTime.UtcNow;
- DateTime startDt = dateTimeNow.AddSeconds(-30);
- var parms = new DynamicParameters();
- parms.Add("ReceivedOn", dt);
- parms.Add("UpdatedOn", dt);
- parms.Add("CreatedOnStart", startDt);
- parms.Add("CreatedOnEnd", dateTimeNow);
- var cmd = """
- SELECT * FROM ServerMessage
- WHERE
- ReceivedOn = @ReceivedOn and
- UpdatedOn = @UpdatedOn and
- CreatedOn >= @CreatedOnStart and
- CreatedOn <= @CreatedOnEnd
- """;
- using var connection = await memDbConnectionFactory.CreateAsync();
- var datas = await connection.QueryAsync<ServerMessage>(cmd, parms);
- return datas.ToList();
- }
- public async Task<bool> SetServerMessageResponseReceived(int id, string InMessage = "", DateTime ReceivedOn = default)
- {
- DateTime _ReceivedOn = ReceivedOn == default ? DateTime.UtcNow : ReceivedOn;
- var parms = new DynamicParameters();
- parms.Add("Id", id);
- parms.Add("InMessage", InMessage);
- parms.Add("ReceivedOn", _ReceivedOn);
- var cmd = """
- UPDATE ServerMessage
- SET InMessage = @InMessage , ReceivedOn = @ReceivedOn
- WHERE Id = @Id
- """;
- using var connection = await memDbConnectionFactory.CreateAsync();
- var cnts = await connection.ExecuteAsync(cmd, parms);
- var success = cnts > 0;
- if (!success)
- {
- logger.LogError("SetServerMessageResponseReceived failed {msg}", InMessage);
- }
- return success;
- }
- public async Task<bool> SetServerMessageServerHandling(int id, DateTime UpdatedOn = default)
- {
- DateTime _UpdatedOn = UpdatedOn == default ? DateTime.UtcNow : UpdatedOn;
- var parms = new DynamicParameters();
- parms.Add("Id", id);
- parms.Add("UpdatedOn", _UpdatedOn);
- var cmd = """
- UPDATE ServerMessage
- SET UpdatedOn = @UpdatedOn
- WHERE Id = @Id
- """;
- using var connection = await memDbConnectionFactory.CreateAsync();
- var cnts = await connection.ExecuteAsync(cmd, parms);
- var success = cnts > 0;
- if (!success)
- {
- logger.LogError("SetServerMessageServerHandling failed {msgid}", id);
- }
- return success;
- }
- public async Task<List<ServerMessage>> GetServerMessages()
- {
- string cmd = """
- SELECT * FROM ServerMessage
- """;
- using var connection = await memDbConnectionFactory.CreateAsync();
- var datas = await connection.QueryAsync<ServerMessage>(cmd);
- return datas.ToList();
- }
- public static async Task IinitMemDbAsync(SqliteConnection connection)
- {
- var createTableResult = await connection.ExecuteAsync("""
- CREATE TABLE IF NOT EXISTS ServerMessage (
- Id INTEGER PRIMARY KEY NOT NULL,
- SerialNo VARCHAR(36),
- OutAction VARCHAR(30),
- OutRequest TEXT,
- InMessage TEXT,
- CreatedOn DATE TIME NOT NULL,
- CreatedBy VARCHAR(36),
- ReceivedOn DATE TIME NOT NULL,
- ChargeBoxId VARCHAR(50),
- UpdatedOn DATE TIME NOT NULL
- )
- """);
- }
- public async Task SaveCompletedMessageToDb()
- {
- List<ServerMessage> completedMessages = await GetCompletedServerMessageFromMemDb();
- List<Task<int>> addServerMessageTasks = new List<Task<int>>();
- foreach (var msg in completedMessages)
- {
- addServerMessageTasks.Add(AsyncAddServerMessage(msg));
- }
- await Task.WhenAll(addServerMessageTasks);
- var addedServerMessageId = addServerMessageTasks.Select(x => x.Result).Where(x => x > 0).ToList();
- var removeResult = await RmoveSavedServerMessageFromMemDb(addedServerMessageId);
- }
- private async Task<int> AsyncAddServerMessage(ServerMessage message)
- {
- var memMessageId = message.Id;
- var addServerMessageResult = await mainDbService.AddServerMessage(message);
- if (!string.IsNullOrEmpty(addServerMessageResult))
- {
- return memMessageId;
- }
- return -1;
- }
- private Task<string> AddServerMessage(ServerMessage message, CancellationToken token = default)
- {
- return AddServerMessageDapper(message);
- }
- private async Task<string> AddServerMessageDapper(ServerMessage message)
- {
- var parameters = new DynamicParameters();
- parameters.Add("@SerialNo", message.SerialNo, DbType.String, ParameterDirection.Input, 36);
- parameters.Add("@OutAction", message.OutAction, DbType.String, ParameterDirection.Input, 30);
- parameters.Add("@OutRequest", message.OutRequest, DbType.String, ParameterDirection.Input);
- parameters.Add("@InMessage", message.InMessage, DbType.String, ParameterDirection.Input);
- parameters.Add("@CreatedOn", message.CreatedOn, DbType.DateTime, ParameterDirection.Input);
- parameters.Add("@CreatedBy", message.CreatedBy, DbType.String, ParameterDirection.Input, 36);
- parameters.Add("@ReceivedOn", message.ReceivedOn, DbType.DateTime, ParameterDirection.Input);
- parameters.Add("@ChargeBoxId", message.ChargeBoxId, DbType.String, ParameterDirection.Input, 30);
- parameters.Add("@UpdatedOn", message.UpdatedOn, DbType.DateTime, ParameterDirection.Input);
- using var conn = await memDbConnectionFactory.CreateAsync();
- var resultCnt = await conn.ExecuteAsync("""
- INSERT INTO ServerMessage
- (SerialNo, OutAction, OutRequest, InMessage, CreatedOn, CreatedBy, ReceivedOn, ChargeBoxId, UpdatedOn)
- VALUES (@SerialNo, @OutAction, @OutRequest, @InMessage, @CreatedOn, @CreatedBy, @ReceivedOn, @ChargeBoxId, @UpdatedOn)
- """, parameters);
- if (resultCnt != 1)
- {
- logger.LogError("AddServerMessageDapper failed msg:{msg}", JsonConvert.SerializeObject(message));
- return string.Empty;
- }
- return message.SerialNo;
- }
- private async Task<List<ServerMessage>> GetCompletedServerMessageFromMemDb()
- {
- DateTime dateTimeNow = DateTime.UtcNow;
- DateTime startDt = dateTimeNow.AddSeconds(-30);
- DateTime dt = new DateTime(1991, 1, 1);
- var cmd = """
- SELECT * FROM ServerMessage
- WHERE ReceivedOn != @NullDateTime or CreatedOn < @CreatedOnStart
- """;
- var parm = new DynamicParameters();
- parm.Add("NullDateTime", dt);
- parm.Add("CreatedOnStart", startDt);
- using var connection = await memDbConnectionFactory.CreateAsync();
- var datas = await connection.QueryAsync<ServerMessage>(cmd, parm);
- return datas.ToList();
- }
- private async Task<bool> RmoveSavedServerMessageFromMemDb(List<int> ids)
- {
- var cmd = """
- DELETE FROM ServerMessage
- WHERE Id in @Ids
- """;
- var parm = new DynamicParameters();
- parm.Add("Ids", ids);
- using var connection = await memDbConnectionFactory.CreateAsync();
- var datasCnt = await connection.ExecuteAsync(cmd, parm);
- var success = datasCnt == ids.Count;
- if (!success)
- {
- logger.LogError("RmoveSavedServerMessageFromMemDb failed {ids}", JsonConvert.SerializeObject(ids));
- }
- return datasCnt == ids.Count;
- }
- }
|