Files: used file-scoped namespaces
This commit is contained in:
parent
7a610d5ad2
commit
26fdc40f84
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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>>();
|
||||
}
|
||||
}
|
||||
|
@ -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; }
|
||||
}
|
||||
|
@ -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
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,12 +24,11 @@
|
||||
*/
|
||||
|
||||
|
||||
namespace ASC.MessagingSystem
|
||||
namespace ASC.MessagingSystem;
|
||||
|
||||
public enum MessageInitiator
|
||||
{
|
||||
public enum MessageInitiator
|
||||
{
|
||||
System,
|
||||
DocsService,
|
||||
ThirdPartyProvider,
|
||||
}
|
||||
}
|
||||
System,
|
||||
DocsService,
|
||||
ThirdPartyProvider,
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user