Files: used file-scoped namespaces

This commit is contained in:
Maksim Chegulov 2022-02-16 11:46:31 +03:00
parent 7a610d5ad2
commit 26fdc40f84
11 changed files with 1233 additions and 1244 deletions

View File

@ -23,43 +23,42 @@
*
*/
namespace ASC.MessagingSystem.DbSender
namespace ASC.MessagingSystem.DbSender;
[Singletone]
public class DbMessageSender : IMessageSender
{
[Singletone]
public class DbMessageSender : IMessageSender
private readonly ILog _logger;
private readonly MessagesRepository _messagesRepository;
private bool _messagingEnabled;
public DbMessageSender(IConfiguration configuration, MessagesRepository messagesRepository, IOptionsMonitor<ILog> options)
{
private readonly ILog _logger;
private readonly MessagesRepository _messagesRepository;
private bool _messagingEnabled;
var setting = configuration["messaging:enabled"];
_messagingEnabled = !string.IsNullOrEmpty(setting) && setting == "true";
_messagesRepository = messagesRepository;
_logger = options.Get("ASC.Messaging");
}
public DbMessageSender(IConfiguration configuration, MessagesRepository messagesRepository, IOptionsMonitor<ILog> options)
public void Send(EventMessage message)
{
try
{
var setting = configuration["messaging:enabled"];
_messagingEnabled = !string.IsNullOrEmpty(setting) && setting == "true";
_messagesRepository = messagesRepository;
_logger = options.Get("ASC.Messaging");
if (!_messagingEnabled)
{
return;
}
if (message == null)
{
return;
}
_messagesRepository.Add(message);
}
public void Send(EventMessage message)
catch (Exception ex)
{
try
{
if (!_messagingEnabled)
{
return;
}
if (message == null)
{
return;
}
_messagesRepository.Add(message);
}
catch (Exception ex)
{
_logger.Error("Failed to send a message", ex);
}
_logger.Error("Failed to send a message", ex);
}
}
}
}

View File

@ -26,247 +26,246 @@
using IsolationLevel = System.Data.IsolationLevel;
namespace ASC.MessagingSystem.DbSender
namespace ASC.MessagingSystem.DbSender;
[Singletone(Additional = typeof(MessagesRepositoryExtension))]
public class MessagesRepository : IDisposable
{
[Singletone(Additional = typeof(MessagesRepositoryExtension))]
public class MessagesRepository : IDisposable
private DateTime _lastSave = DateTime.UtcNow;
private readonly TimeSpan _cacheTime;
private readonly IDictionary<string, EventMessage> _cache;
private Parser _parser;
private readonly Timer _timer;
private bool _timerStarted;
public ILog Logger { get; set; }
private readonly IServiceProvider _serviceProvider;
public MessagesRepository(IServiceProvider serviceProvider, IOptionsMonitor<ILog> options)
{
private DateTime _lastSave = DateTime.UtcNow;
private readonly TimeSpan _cacheTime;
private readonly IDictionary<string, EventMessage> _cache;
private Parser _parser;
_cacheTime = TimeSpan.FromMinutes(1);
_cache = new Dictionary<string, EventMessage>();
_timerStarted = false;
private readonly Timer _timer;
private bool _timerStarted;
Logger = options.CurrentValue;
_serviceProvider = serviceProvider;
public ILog Logger { get; set; }
private readonly IServiceProvider _serviceProvider;
_timer = new Timer(FlushCache);
}
public MessagesRepository(IServiceProvider serviceProvider, IOptionsMonitor<ILog> options)
public void Add(EventMessage message)
{
// messages with action code < 2000 are related to login-history
if ((int)message.Action < 2000)
{
_cacheTime = TimeSpan.FromMinutes(1);
_cache = new Dictionary<string, EventMessage>();
_timerStarted = false;
using var scope = _serviceProvider.CreateScope();
using var ef = scope.ServiceProvider.GetService<DbContextManager<MessagesContext>>().Get("messages");
Logger = options.CurrentValue;
_serviceProvider = serviceProvider;
AddLoginEvent(message, ef);
_timer = new Timer(FlushCache);
return;
}
public void Add(EventMessage message)
var now = DateTime.UtcNow;
var key = string.Format("{0}|{1}|{2}|{3}", message.TenantId, message.UserId, message.Id, now.Ticks);
lock (_cache)
{
// messages with action code < 2000 are related to login-history
if ((int)message.Action < 2000)
_cache[key] = message;
if (!_timerStarted)
{
using var scope = _serviceProvider.CreateScope();
using var ef = scope.ServiceProvider.GetService<DbContextManager<MessagesContext>>().Get("messages");
AddLoginEvent(message, ef);
return;
_timer.Change(0, 100);
_timerStarted = true;
}
}
var now = DateTime.UtcNow;
var key = string.Format("{0}|{1}|{2}|{3}", message.TenantId, message.UserId, message.Id, now.Ticks);
}
private void FlushCache(object state)
{
List<EventMessage> events = null;
if (_cacheTime < DateTime.UtcNow - _lastSave || _cache.Count > 100)
{
lock (_cache)
{
_cache[key] = message;
_timer.Change(-1, -1);
_timerStarted = false;
if (!_timerStarted)
{
_timer.Change(0, 100);
_timerStarted = true;
}
events = new List<EventMessage>(_cache.Values);
_cache.Clear();
_lastSave = DateTime.UtcNow;
}
}
private void FlushCache(object state)
if (events == null)
{
List<EventMessage> events = null;
return;
}
if (_cacheTime < DateTime.UtcNow - _lastSave || _cache.Count > 100)
using var scope = _serviceProvider.CreateScope();
using var ef = scope.ServiceProvider.GetService<DbContextManager<Messages>>().Get("messages");
using var tx = ef.Database.BeginTransaction(IsolationLevel.ReadUncommitted);
var dict = new Dictionary<string, ClientInfo>();
foreach (var message in events)
{
if (!string.IsNullOrEmpty(message.UAHeader))
{
lock (_cache)
try
{
_timer.Change(-1, -1);
_timerStarted = false;
events = new List<EventMessage>(_cache.Values);
_cache.Clear();
_lastSave = DateTime.UtcNow;
}
}
ClientInfo clientInfo;
if (events == null)
{
return;
}
using var scope = _serviceProvider.CreateScope();
using var ef = scope.ServiceProvider.GetService<DbContextManager<Messages>>().Get("messages");
using var tx = ef.Database.BeginTransaction(IsolationLevel.ReadUncommitted);
var dict = new Dictionary<string, ClientInfo>();
foreach (var message in events)
{
if (!string.IsNullOrEmpty(message.UAHeader))
{
try
if (dict.TryGetValue(message.UAHeader, out clientInfo))
{
ClientInfo clientInfo;
if (dict.TryGetValue(message.UAHeader, out clientInfo))
{
}
else
{
_parser = _parser ?? Parser.GetDefault();
clientInfo = _parser.Parse(message.UAHeader);
dict.Add(message.UAHeader, clientInfo);
}
if (clientInfo != null)
{
message.Browser = GetBrowser(clientInfo);
message.Platform = GetPlatform(clientInfo);
}
}
catch (Exception e)
else
{
Logger.Error("FlushCache " + message.Id, e);
_parser = _parser ?? Parser.GetDefault();
clientInfo = _parser.Parse(message.UAHeader);
dict.Add(message.UAHeader, clientInfo);
}
if (clientInfo != null)
{
message.Browser = GetBrowser(clientInfo);
message.Platform = GetPlatform(clientInfo);
}
}
// messages with action code < 2000 are related to login-history
if ((int)message.Action >= 2000)
catch (Exception e)
{
AddAuditEvent(message, ef);
Logger.Error("FlushCache " + message.Id, e);
}
}
tx.Commit();
}
private static void AddLoginEvent(EventMessage message, MessagesContext dbContext)
{
var le = new LoginEvent
// messages with action code < 2000 are related to login-history
if ((int)message.Action >= 2000)
{
Ip = message.IP,
Login = message.Initiator,
Browser = message.Browser,
Platform = message.Platform,
Date = message.Date,
TenantId = message.TenantId,
UserId = message.UserId,
Page = message.Page,
Action = (int)message.Action
};
if (message.Description != null && message.Description.Count > 0)
{
le.DescriptionRaw =
JsonConvert.SerializeObject(message.Description, new JsonSerializerSettings
{
DateTimeZoneHandling = DateTimeZoneHandling.Utc
});
}
dbContext.LoginEvents.Add(le);
dbContext.SaveChanges();
}
private static void AddAuditEvent(EventMessage message, Messages dbContext)
{
var ae = new AuditEvent
{
Ip = message.IP,
Initiator = message.Initiator,
Browser = message.Browser,
Platform = message.Platform,
Date = message.Date,
TenantId = message.TenantId,
UserId = message.UserId,
Page = message.Page,
Action = (int)message.Action,
Target = message.Target?.ToString()
};
if (message.Description != null && message.Description.Count > 0)
{
ae.DescriptionRaw =
JsonConvert.SerializeObject(GetSafeDescription(message.Description), new JsonSerializerSettings
{
DateTimeZoneHandling = DateTimeZoneHandling.Utc
});
}
dbContext.AuditEvents.Add(ae);
dbContext.SaveChanges();
}
private static IList<string> GetSafeDescription(IEnumerable<string> description)
{
const int maxLength = 15000;
var currentLength = 0;
var safe = new List<string>();
foreach (var d in description.Where(r => r != null))
{
if (currentLength + d.Length <= maxLength)
{
currentLength += d.Length;
safe.Add(d);
}
else
{
safe.Add(d.Substring(0, maxLength - currentLength - 3) + "...");
break;
}
}
return safe;
}
private static string GetBrowser(ClientInfo clientInfo)
{
return clientInfo == null
? null
: $"{clientInfo.UA.Family} {clientInfo.UA.Major}";
}
private static string GetPlatform(ClientInfo clientInfo)
{
return clientInfo == null
? null
: $"{clientInfo.OS.Family} {clientInfo.OS.Major}";
}
public void Dispose()
{
if (_timer != null)
{
_timer.Dispose();
AddAuditEvent(message, ef);
}
}
tx.Commit();
}
public class Messages : MessagesContext
private static void AddLoginEvent(EventMessage message, MessagesContext dbContext)
{
public DbSet<DbTenant> Tenants { get; set; }
public DbSet<DbWebstudioSettings> WebstudioSettings { get; set; }
var le = new LoginEvent
{
Ip = message.IP,
Login = message.Initiator,
Browser = message.Browser,
Platform = message.Platform,
Date = message.Date,
TenantId = message.TenantId,
UserId = message.UserId,
Page = message.Page,
Action = (int)message.Action
};
if (message.Description != null && message.Description.Count > 0)
{
le.DescriptionRaw =
JsonConvert.SerializeObject(message.Description, new JsonSerializerSettings
{
DateTimeZoneHandling = DateTimeZoneHandling.Utc
});
}
dbContext.LoginEvents.Add(le);
dbContext.SaveChanges();
}
public static class MessagesRepositoryExtension
private static void AddAuditEvent(EventMessage message, Messages dbContext)
{
public static void Register(DIHelper services)
var ae = new AuditEvent
{
services.TryAdd<DbContextManager<MessagesContext>>();
Ip = message.IP,
Initiator = message.Initiator,
Browser = message.Browser,
Platform = message.Platform,
Date = message.Date,
TenantId = message.TenantId,
UserId = message.UserId,
Page = message.Page,
Action = (int)message.Action,
Target = message.Target?.ToString()
};
if (message.Description != null && message.Description.Count > 0)
{
ae.DescriptionRaw =
JsonConvert.SerializeObject(GetSafeDescription(message.Description), new JsonSerializerSettings
{
DateTimeZoneHandling = DateTimeZoneHandling.Utc
});
}
dbContext.AuditEvents.Add(ae);
dbContext.SaveChanges();
}
private static IList<string> GetSafeDescription(IEnumerable<string> description)
{
const int maxLength = 15000;
var currentLength = 0;
var safe = new List<string>();
foreach (var d in description.Where(r => r != null))
{
if (currentLength + d.Length <= maxLength)
{
currentLength += d.Length;
safe.Add(d);
}
else
{
safe.Add(d.Substring(0, maxLength - currentLength - 3) + "...");
break;
}
}
return safe;
}
private static string GetBrowser(ClientInfo clientInfo)
{
return clientInfo == null
? null
: $"{clientInfo.UA.Family} {clientInfo.UA.Major}";
}
private static string GetPlatform(ClientInfo clientInfo)
{
return clientInfo == null
? null
: $"{clientInfo.OS.Family} {clientInfo.OS.Major}";
}
public void Dispose()
{
if (_timer != null)
{
_timer.Dispose();
}
}
}
}
public class Messages : MessagesContext
{
public DbSet<DbTenant> Tenants { get; set; }
public DbSet<DbWebstudioSettings> WebstudioSettings { get; set; }
}
public static class MessagesRepositoryExtension
{
public static void Register(DIHelper services)
{
services.TryAdd<DbContextManager<MessagesContext>>();
}
}

View File

@ -23,22 +23,21 @@
*
*/
namespace ASC.MessagingSystem
namespace ASC.MessagingSystem;
public class EventMessage
{
public class EventMessage
{
public int Id { get; set; }
public string IP { get; set; }
public string Initiator { get; set; }
public string Browser { get; set; }
public string Platform { get; set; }
public DateTime Date { get; set; }
public int TenantId { get; set; }
public Guid UserId { get; set; }
public string Page { get; set; }
public MessageAction Action { get; set; }
public IList<string> Description { get; set; }
public MessageTarget Target { get; set; }
public string UAHeader { get; set; }
}
}
public int Id { get; set; }
public string IP { get; set; }
public string Initiator { get; set; }
public string Browser { get; set; }
public string Platform { get; set; }
public DateTime Date { get; set; }
public int TenantId { get; set; }
public Guid UserId { get; set; }
public string Page { get; set; }
public MessageAction Action { get; set; }
public IList<string> Description { get; set; }
public MessageTarget Target { get; set; }
public string UAHeader { get; set; }
}

View File

@ -24,10 +24,9 @@
*/
namespace ASC.MessagingSystem
namespace ASC.MessagingSystem;
public interface IMessageSender
{
public interface IMessageSender
{
void Send(EventMessage message);
}
}
void Send(EventMessage message);
}

File diff suppressed because it is too large Load Diff

View File

@ -23,109 +23,108 @@
*
*/
namespace ASC.MessagingSystem
namespace ASC.MessagingSystem;
[Scope]
public class MessageFactory
{
[Scope]
public class MessageFactory
private readonly ILog _logger;
private const string UserAgentHeader = "User-Agent";
private const string ForwardedHeader = "X-Forwarded-For";
private const string HostHeader = "Host";
private const string RefererHeader = "Referer";
private readonly AuthContext _authContext;
private readonly TenantManager _tenantManager;
public MessageFactory(AuthContext authContext, TenantManager tenantManager, IOptionsMonitor<ILog> options)
{
private readonly ILog _logger;
private const string UserAgentHeader = "User-Agent";
private const string ForwardedHeader = "X-Forwarded-For";
private const string HostHeader = "Host";
private const string RefererHeader = "Referer";
_authContext = authContext;
_tenantManager = tenantManager;
_logger = options.CurrentValue;
}
private readonly AuthContext _authContext;
private readonly TenantManager _tenantManager;
public MessageFactory(AuthContext authContext, TenantManager tenantManager, IOptionsMonitor<ILog> options)
public EventMessage Create(HttpRequest request, string initiator, MessageAction action, MessageTarget target, params string[] description)
{
try
{
_authContext = authContext;
_tenantManager = tenantManager;
_logger = options.CurrentValue;
return new EventMessage
{
IP = request != null ? request.Headers[ForwardedHeader].ToString() ?? request.GetUserHostAddress() : null,
Initiator = initiator,
Date = DateTime.UtcNow,
TenantId = _tenantManager.GetCurrentTenant().TenantId,
UserId = _authContext.CurrentAccount.ID,
Page = request?.GetTypedHeaders().Referer?.ToString(),
Action = action,
Description = description,
Target = target,
UAHeader = request?.Headers[UserAgentHeader].FirstOrDefault()
};
}
public EventMessage Create(HttpRequest request, string initiator, MessageAction action, MessageTarget target, params string[] description)
catch (Exception ex)
{
try
{
return new EventMessage
{
IP = request != null ? request.Headers[ForwardedHeader].ToString() ?? request.GetUserHostAddress() : null,
Initiator = initiator,
Date = DateTime.UtcNow,
TenantId = _tenantManager.GetCurrentTenant().TenantId,
UserId = _authContext.CurrentAccount.ID,
Page = request?.GetTypedHeaders().Referer?.ToString(),
Action = action,
Description = description,
Target = target,
UAHeader = request?.Headers[UserAgentHeader].FirstOrDefault()
};
}
catch (Exception ex)
{
_logger.ErrorFormat("Error while parse Http Request for {0} type of event: {1}", action, ex);
_logger.ErrorFormat("Error while parse Http Request for {0} type of event: {1}", action, ex);
return null;
}
}
public EventMessage Create(MessageUserData userData, IDictionary<string, StringValues> headers, MessageAction action, MessageTarget target, params string[] description)
{
try
{
var message = new EventMessage
{
Date = DateTime.UtcNow,
TenantId = userData == null ? _tenantManager.GetCurrentTenant().TenantId : userData.TenantId,
UserId = userData == null ? _authContext.CurrentAccount.ID : userData.UserId,
Action = action,
Description = description,
Target = target
};
if (headers != null)
{
var userAgent = headers.ContainsKey(UserAgentHeader) ? headers[UserAgentHeader].ToString() : null;
var forwarded = headers.ContainsKey(ForwardedHeader) ? headers[ForwardedHeader].ToString() : null;
var host = headers.ContainsKey(HostHeader) ? headers[HostHeader].ToString() : null;
var referer = headers.ContainsKey(RefererHeader) ? headers[RefererHeader].ToString() : null;
message.IP = forwarded ?? host;
message.UAHeader = userAgent;
message.Page = referer;
}
return message;
}
catch (Exception ex)
{
_logger.Error(string.Format("Error while parse Http Message for \"{0}\" type of event: {1}", action, ex));
return null;
}
}
public EventMessage Create(string initiator, MessageAction action, MessageTarget target, params string[] description)
{
try
{
return new EventMessage
{
Initiator = initiator,
Date = DateTime.UtcNow,
TenantId = _tenantManager.GetCurrentTenant().TenantId,
Action = action,
Description = description,
Target = target
};
}
catch (Exception ex)
{
_logger.Error(string.Format("Error while parse Initiator Message for \"{0}\" type of event: {1}", action, ex));
return null;
}
return null;
}
}
}
public EventMessage Create(MessageUserData userData, IDictionary<string, StringValues> headers, MessageAction action, MessageTarget target, params string[] description)
{
try
{
var message = new EventMessage
{
Date = DateTime.UtcNow,
TenantId = userData == null ? _tenantManager.GetCurrentTenant().TenantId : userData.TenantId,
UserId = userData == null ? _authContext.CurrentAccount.ID : userData.UserId,
Action = action,
Description = description,
Target = target
};
if (headers != null)
{
var userAgent = headers.ContainsKey(UserAgentHeader) ? headers[UserAgentHeader].ToString() : null;
var forwarded = headers.ContainsKey(ForwardedHeader) ? headers[ForwardedHeader].ToString() : null;
var host = headers.ContainsKey(HostHeader) ? headers[HostHeader].ToString() : null;
var referer = headers.ContainsKey(RefererHeader) ? headers[RefererHeader].ToString() : null;
message.IP = forwarded ?? host;
message.UAHeader = userAgent;
message.Page = referer;
}
return message;
}
catch (Exception ex)
{
_logger.Error(string.Format("Error while parse Http Message for \"{0}\" type of event: {1}", action, ex));
return null;
}
}
public EventMessage Create(string initiator, MessageAction action, MessageTarget target, params string[] description)
{
try
{
return new EventMessage
{
Initiator = initiator,
Date = DateTime.UtcNow,
TenantId = _tenantManager.GetCurrentTenant().TenantId,
Action = action,
Description = description,
Target = target
};
}
catch (Exception ex)
{
_logger.Error(string.Format("Error while parse Initiator Message for \"{0}\" type of event: {1}", action, ex));
return null;
}
}
}

View File

@ -24,12 +24,11 @@
*/
namespace ASC.MessagingSystem
namespace ASC.MessagingSystem;
public enum MessageInitiator
{
public enum MessageInitiator
{
System,
DocsService,
ThirdPartyProvider,
}
}
System,
DocsService,
ThirdPartyProvider,
}

View File

@ -23,48 +23,47 @@
*
*/
namespace ASC.MessagingSystem
namespace ASC.MessagingSystem;
[Singletone]
public class MessagePolicy
{
[Singletone]
public class MessagePolicy
private readonly IEnumerable<string> _secretIps;
public MessagePolicy(IConfiguration configuration)
{
private readonly IEnumerable<string> _secretIps;
public MessagePolicy(IConfiguration configuration)
{
_secretIps =
configuration["messaging.secret-ips"] == null
? Array.Empty<string>()
: configuration["messaging.secret-ips"].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
}
public bool Check(EventMessage message)
{
if (message == null)
{
return false;
}
if (string.IsNullOrEmpty(message.IP))
{
return true;
}
var ip = GetIpWithoutPort(message.IP);
return _secretIps.All(x => x != ip);
}
private static string GetIpWithoutPort(string ip)
{
if (ip == null)
{
return null;
}
var portIdx = ip.IndexOf(':');
return portIdx > -1 ? ip.Substring(0, portIdx) : ip;
}
_secretIps =
configuration["messaging.secret-ips"] == null
? Array.Empty<string>()
: configuration["messaging.secret-ips"].Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
}
}
public bool Check(EventMessage message)
{
if (message == null)
{
return false;
}
if (string.IsNullOrEmpty(message.IP))
{
return true;
}
var ip = GetIpWithoutPort(message.IP);
return _secretIps.All(x => x != ip);
}
private static string GetIpWithoutPort(string ip)
{
if (ip == null)
{
return null;
}
var portIdx = ip.IndexOf(':');
return portIdx > -1 ? ip.Substring(0, portIdx) : ip;
}
}

View File

@ -23,284 +23,283 @@
*
*/
namespace ASC.MessagingSystem
namespace ASC.MessagingSystem;
[Scope]
public class MessageService
{
[Scope]
public class MessageService
private readonly ILog _logger;
private readonly IMessageSender _sender;
private readonly HttpRequest _request;
private readonly MessageFactory _messageFactory;
private readonly MessagePolicy _messagePolicy;
public MessageService(
IConfiguration configuration,
MessageFactory messageFactory,
DbMessageSender sender,
MessagePolicy messagePolicy,
IOptionsMonitor<ILog> options)
{
private readonly ILog _logger;
private readonly IMessageSender _sender;
private readonly HttpRequest _request;
private readonly MessageFactory _messageFactory;
private readonly MessagePolicy _messagePolicy;
public MessageService(
IConfiguration configuration,
MessageFactory messageFactory,
DbMessageSender sender,
MessagePolicy messagePolicy,
IOptionsMonitor<ILog> options)
if (configuration["messaging:enabled"] != "true")
{
if (configuration["messaging:enabled"] != "true")
{
return;
}
_sender = sender;
_messagePolicy = messagePolicy;
_messageFactory = messageFactory;
_logger = options.CurrentValue;
return;
}
public MessageService(
IConfiguration configuration,
IHttpContextAccessor httpContextAccessor,
MessageFactory messageFactory,
DbMessageSender sender,
MessagePolicy messagePolicy,
IOptionsMonitor<ILog> options)
: this(configuration, messageFactory, sender, messagePolicy, options)
{
_request = httpContextAccessor?.HttpContext?.Request;
}
#region HttpRequest
public void Send(MessageAction action)
{
SendRequestMessage(null, action, null);
}
public void Send(MessageAction action, string d1)
{
SendRequestMessage(null, action, null, d1);
}
public void Send(MessageAction action, string d1, string d2)
{
SendRequestMessage(null, action, null, d1, d2);
}
public void Send(MessageAction action, string d1, string d2, string d3)
{
SendRequestMessage(null, action, null, d1, d2, d3);
}
public void Send(MessageAction action, string d1, string d2, string d3, string d4)
{
SendRequestMessage(null, action, null, d1, d2, d3, d4);
}
public void Send(MessageAction action, IEnumerable<string> d1, string d2)
{
SendRequestMessage(null, action, null, string.Join(", ", d1), d2);
}
public void Send(MessageAction action, string d1, IEnumerable<string> d2)
{
SendRequestMessage(null, action, null, d1, string.Join(", ", d2));
}
public void Send(MessageAction action, string d1, string d2, IEnumerable<string> d3)
{
SendRequestMessage(null, action, null, d1, d2, string.Join(", ", d3));
}
public void Send(MessageAction action, IEnumerable<string> d1)
{
SendRequestMessage(null, action, null, string.Join(", ", d1));
}
public void Send(string loginName, MessageAction action)
{
SendRequestMessage(loginName, action, null);
}
public void Send(string loginName, MessageAction action, string d1)
{
SendRequestMessage(loginName, action, null, d1);
}
#endregion
#region HttpRequest & Target
public void Send(MessageAction action, MessageTarget target)
{
SendRequestMessage(null, action, target);
}
public void Send(MessageAction action, MessageTarget target, string d1)
{
SendRequestMessage(null, action, target, d1);
}
public void Send(MessageAction action, MessageTarget target, string d1, string d2)
{
SendRequestMessage(null, action, target, d1, d2);
}
public void Send(MessageAction action, MessageTarget target, string d1, string d2, string d3)
{
SendRequestMessage(null, action, target, d1, d2, d3);
}
public void Send(MessageAction action, MessageTarget target, string d1, string d2, string d3, string d4)
{
SendRequestMessage(null, action, target, d1, d2, d3, d4);
}
public void Send(MessageAction action, MessageTarget target, IEnumerable<string> d1, string d2)
{
SendRequestMessage(null, action, target, string.Join(", ", d1), d2);
}
public void Send(MessageAction action, MessageTarget target, string d1, IEnumerable<string> d2)
{
SendRequestMessage(null, action, target, d1, string.Join(", ", d2));
}
public void Send(MessageAction action, MessageTarget target, string d1, string d2, IEnumerable<string> d3)
{
SendRequestMessage(null, action, target, d1, d2, string.Join(", ", d3));
}
public void Send(MessageAction action, MessageTarget target, IEnumerable<string> d1)
{
SendRequestMessage(null, action, target, string.Join(", ", d1));
}
public void Send(string loginName, MessageAction action, MessageTarget target)
{
SendRequestMessage(loginName, action, target);
}
public void Send(string loginName, MessageAction action, MessageTarget target, string d1)
{
SendRequestMessage(loginName, action, target, d1);
}
#endregion
private void SendRequestMessage(string loginName, MessageAction action, MessageTarget target, params string[] description)
{
if (_sender == null)
{
return;
}
if (_request == null)
{
_logger.Debug(string.Format("Empty Http Request for \"{0}\" type of event", action));
return;
}
var message = _messageFactory.Create(_request, loginName, action, target, description);
if (!_messagePolicy.Check(message))
{
return;
}
_sender.Send(message);
}
#region HttpHeaders
public void Send(MessageUserData userData, IDictionary<string, StringValues> httpHeaders, MessageAction action)
{
SendHeadersMessage(userData, httpHeaders, action, null);
}
public void Send(IDictionary<string, StringValues> httpHeaders, MessageAction action)
{
SendHeadersMessage(null, httpHeaders, action, null);
}
public void Send(IDictionary<string, StringValues> httpHeaders, MessageAction action, string d1)
{
SendHeadersMessage(null, httpHeaders, action, null, d1);
}
public void Send(IDictionary<string, StringValues> httpHeaders, MessageAction action, IEnumerable<string> d1)
{
SendHeadersMessage(null, httpHeaders, action, null, d1?.ToArray());
}
public void Send(MessageUserData userData, IDictionary<string, StringValues> httpHeaders, MessageAction action, MessageTarget target)
{
SendHeadersMessage(userData, httpHeaders, action, target);
}
#endregion
#region HttpHeaders & Target
public void Send(IDictionary<string, StringValues> httpHeaders, MessageAction action, MessageTarget target)
{
SendHeadersMessage(null, httpHeaders, action, target);
}
public void Send(IDictionary<string, StringValues> httpHeaders, MessageAction action, MessageTarget target, string d1)
{
SendHeadersMessage(null, httpHeaders, action, target, d1);
}
public void Send(IDictionary<string, StringValues> httpHeaders, MessageAction action, MessageTarget target, IEnumerable<string> d1)
{
SendHeadersMessage(null, httpHeaders, action, target, d1?.ToArray());
}
#endregion
private void SendHeadersMessage(MessageUserData userData, IDictionary<string, StringValues> httpHeaders, MessageAction action, MessageTarget target, params string[] description)
{
if (_sender == null)
{
return;
}
var message = _messageFactory.Create(userData, httpHeaders, action, target, description);
if (!_messagePolicy.Check(message))
{
return;
}
_sender.Send(message);
}
#region Initiator
public void Send(MessageInitiator initiator, MessageAction action, params string[] description)
{
SendInitiatorMessage(initiator.ToString(), action, null, description);
}
#endregion
#region Initiator & Target
public void Send(MessageInitiator initiator, MessageAction action, MessageTarget target, params string[] description)
{
SendInitiatorMessage(initiator.ToString(), action, target, description);
}
#endregion
private void SendInitiatorMessage(string initiator, MessageAction action, MessageTarget target, params string[] description)
{
if (_sender == null)
{
return;
}
var message = _messageFactory.Create(_request, initiator, action, target, description);
if (!_messagePolicy.Check(message))
{
return;
}
_sender.Send(message);
}
_sender = sender;
_messagePolicy = messagePolicy;
_messageFactory = messageFactory;
_logger = options.CurrentValue;
}
}
public MessageService(
IConfiguration configuration,
IHttpContextAccessor httpContextAccessor,
MessageFactory messageFactory,
DbMessageSender sender,
MessagePolicy messagePolicy,
IOptionsMonitor<ILog> options)
: this(configuration, messageFactory, sender, messagePolicy, options)
{
_request = httpContextAccessor?.HttpContext?.Request;
}
#region HttpRequest
public void Send(MessageAction action)
{
SendRequestMessage(null, action, null);
}
public void Send(MessageAction action, string d1)
{
SendRequestMessage(null, action, null, d1);
}
public void Send(MessageAction action, string d1, string d2)
{
SendRequestMessage(null, action, null, d1, d2);
}
public void Send(MessageAction action, string d1, string d2, string d3)
{
SendRequestMessage(null, action, null, d1, d2, d3);
}
public void Send(MessageAction action, string d1, string d2, string d3, string d4)
{
SendRequestMessage(null, action, null, d1, d2, d3, d4);
}
public void Send(MessageAction action, IEnumerable<string> d1, string d2)
{
SendRequestMessage(null, action, null, string.Join(", ", d1), d2);
}
public void Send(MessageAction action, string d1, IEnumerable<string> d2)
{
SendRequestMessage(null, action, null, d1, string.Join(", ", d2));
}
public void Send(MessageAction action, string d1, string d2, IEnumerable<string> d3)
{
SendRequestMessage(null, action, null, d1, d2, string.Join(", ", d3));
}
public void Send(MessageAction action, IEnumerable<string> d1)
{
SendRequestMessage(null, action, null, string.Join(", ", d1));
}
public void Send(string loginName, MessageAction action)
{
SendRequestMessage(loginName, action, null);
}
public void Send(string loginName, MessageAction action, string d1)
{
SendRequestMessage(loginName, action, null, d1);
}
#endregion
#region HttpRequest & Target
public void Send(MessageAction action, MessageTarget target)
{
SendRequestMessage(null, action, target);
}
public void Send(MessageAction action, MessageTarget target, string d1)
{
SendRequestMessage(null, action, target, d1);
}
public void Send(MessageAction action, MessageTarget target, string d1, string d2)
{
SendRequestMessage(null, action, target, d1, d2);
}
public void Send(MessageAction action, MessageTarget target, string d1, string d2, string d3)
{
SendRequestMessage(null, action, target, d1, d2, d3);
}
public void Send(MessageAction action, MessageTarget target, string d1, string d2, string d3, string d4)
{
SendRequestMessage(null, action, target, d1, d2, d3, d4);
}
public void Send(MessageAction action, MessageTarget target, IEnumerable<string> d1, string d2)
{
SendRequestMessage(null, action, target, string.Join(", ", d1), d2);
}
public void Send(MessageAction action, MessageTarget target, string d1, IEnumerable<string> d2)
{
SendRequestMessage(null, action, target, d1, string.Join(", ", d2));
}
public void Send(MessageAction action, MessageTarget target, string d1, string d2, IEnumerable<string> d3)
{
SendRequestMessage(null, action, target, d1, d2, string.Join(", ", d3));
}
public void Send(MessageAction action, MessageTarget target, IEnumerable<string> d1)
{
SendRequestMessage(null, action, target, string.Join(", ", d1));
}
public void Send(string loginName, MessageAction action, MessageTarget target)
{
SendRequestMessage(loginName, action, target);
}
public void Send(string loginName, MessageAction action, MessageTarget target, string d1)
{
SendRequestMessage(loginName, action, target, d1);
}
#endregion
private void SendRequestMessage(string loginName, MessageAction action, MessageTarget target, params string[] description)
{
if (_sender == null)
{
return;
}
if (_request == null)
{
_logger.Debug(string.Format("Empty Http Request for \"{0}\" type of event", action));
return;
}
var message = _messageFactory.Create(_request, loginName, action, target, description);
if (!_messagePolicy.Check(message))
{
return;
}
_sender.Send(message);
}
#region HttpHeaders
public void Send(MessageUserData userData, IDictionary<string, StringValues> httpHeaders, MessageAction action)
{
SendHeadersMessage(userData, httpHeaders, action, null);
}
public void Send(IDictionary<string, StringValues> httpHeaders, MessageAction action)
{
SendHeadersMessage(null, httpHeaders, action, null);
}
public void Send(IDictionary<string, StringValues> httpHeaders, MessageAction action, string d1)
{
SendHeadersMessage(null, httpHeaders, action, null, d1);
}
public void Send(IDictionary<string, StringValues> httpHeaders, MessageAction action, IEnumerable<string> d1)
{
SendHeadersMessage(null, httpHeaders, action, null, d1?.ToArray());
}
public void Send(MessageUserData userData, IDictionary<string, StringValues> httpHeaders, MessageAction action, MessageTarget target)
{
SendHeadersMessage(userData, httpHeaders, action, target);
}
#endregion
#region HttpHeaders & Target
public void Send(IDictionary<string, StringValues> httpHeaders, MessageAction action, MessageTarget target)
{
SendHeadersMessage(null, httpHeaders, action, target);
}
public void Send(IDictionary<string, StringValues> httpHeaders, MessageAction action, MessageTarget target, string d1)
{
SendHeadersMessage(null, httpHeaders, action, target, d1);
}
public void Send(IDictionary<string, StringValues> httpHeaders, MessageAction action, MessageTarget target, IEnumerable<string> d1)
{
SendHeadersMessage(null, httpHeaders, action, target, d1?.ToArray());
}
#endregion
private void SendHeadersMessage(MessageUserData userData, IDictionary<string, StringValues> httpHeaders, MessageAction action, MessageTarget target, params string[] description)
{
if (_sender == null)
{
return;
}
var message = _messageFactory.Create(userData, httpHeaders, action, target, description);
if (!_messagePolicy.Check(message))
{
return;
}
_sender.Send(message);
}
#region Initiator
public void Send(MessageInitiator initiator, MessageAction action, params string[] description)
{
SendInitiatorMessage(initiator.ToString(), action, null, description);
}
#endregion
#region Initiator & Target
public void Send(MessageInitiator initiator, MessageAction action, MessageTarget target, params string[] description)
{
SendInitiatorMessage(initiator.ToString(), action, target, description);
}
#endregion
private void SendInitiatorMessage(string initiator, MessageAction action, MessageTarget target, params string[] description)
{
if (_sender == null)
{
return;
}
var message = _messageFactory.Create(_request, initiator, action, target, description);
if (!_messagePolicy.Check(message))
{
return;
}
_sender.Send(message);
}
}

View File

@ -23,91 +23,90 @@
*
*/
namespace ASC.MessagingSystem
namespace ASC.MessagingSystem;
[Singletone]
public class MessageTarget
{
[Singletone]
public class MessageTarget
{
private IEnumerable<string> _items;
public ILog Log { get; set; }
private readonly IOptionsMonitor<ILog> _option;
public MessageTarget(IOptionsMonitor<ILog> option)
{
Log = option.Get("ASC.Messaging");
_option = option;
}
public MessageTarget Create<T>(T value)
{
try
{
var res = new List<string>();
if (value is System.Collections.IEnumerable ids)
{
res.AddRange(from object id in ids select id.ToString());
}
else
{
res.Add(value.ToString());
}
return new MessageTarget(_option)
{
_items = res.Distinct()
};
}
catch (Exception e)
{
Log.Error("EventMessageTarget exception", e);
return null;
}
}
public MessageTarget Create(IEnumerable<string> value)
{
try
{
return new MessageTarget(_option)
{
_items = value.Distinct()
};
}
catch (Exception e)
{
Log.Error("EventMessageTarget exception", e);
return null;
}
}
public MessageTarget Parse(string value)
{
if (string.IsNullOrEmpty(value))
private IEnumerable<string> _items;
public ILog Log { get; set; }
private readonly IOptionsMonitor<ILog> _option;
public MessageTarget(IOptionsMonitor<ILog> option)
{
Log = option.Get("ASC.Messaging");
_option = option;
}
public MessageTarget Create<T>(T value)
{
try
{
var res = new List<string>();
if (value is System.Collections.IEnumerable ids)
{
return null;
res.AddRange(from object id in ids select id.ToString());
}
else
{
res.Add(value.ToString());
}
var items = value.Split(',');
if (items.Length == 0)
return new MessageTarget(_option)
{
return null;
}
_items = res.Distinct()
};
}
catch (Exception e)
{
Log.Error("EventMessageTarget exception", e);
return new MessageTarget(_option)
{
_items = items
};
}
public override string ToString()
{
return string.Join(",", _items);
}
}
}
return null;
}
}
public MessageTarget Create(IEnumerable<string> value)
{
try
{
return new MessageTarget(_option)
{
_items = value.Distinct()
};
}
catch (Exception e)
{
Log.Error("EventMessageTarget exception", e);
return null;
}
}
public MessageTarget Parse(string value)
{
if (string.IsNullOrEmpty(value))
{
return null;
}
var items = value.Split(',');
if (items.Length == 0)
{
return null;
}
return new MessageTarget(_option)
{
_items = items
};
}
public override string ToString()
{
return string.Join(",", _items);
}
}

View File

@ -23,17 +23,16 @@
*
*/
namespace ASC.MessagingSystem
{
public class MessageUserData
{
public int TenantId { get; private set; }
public Guid UserId { get; private set; }
namespace ASC.MessagingSystem;
public MessageUserData(int tenentId, Guid userId)
{
TenantId = tenentId;
UserId = userId;
}
public class MessageUserData
{
public int TenantId { get; private set; }
public Guid UserId { get; private set; }
public MessageUserData(int tenentId, Guid userId)
{
TenantId = tenentId;
UserId = userId;
}
}
}