using MessengerApi.Db; using MessengerBroker.Db; using Microsoft.EntityFrameworkCore; namespace MessengerBroker.Handlers { public class DataHandler { private readonly Settings _settings; public Task> GetLocalUsersAndRoutes() { var foreignUserIds = (Guid[])null; using(var broCtx = new BrokerDbContext(this._settings.MessengerBrokerDbConnectionString)) { foreignUserIds = broCtx.Users.Select(x => x.Id).ToArray(); } using (var apiCtx = new MessengerDbContext(this._settings.MessengerApiDbConnectionString)) { var localUsers = apiCtx.Users .Where(x => !foreignUserIds.Any(f => f == x.Id)) .ToArray(); var localRoutes = apiCtx.UserRoutes .Include(x => x.From) .Include(x => x.To) .Where(x => localUsers.Any(l => l.Id == x.From.Id) && localUsers.Any(l => l.Id == x.To.Id)) .ToArray(); return Task.FromResult(new Tuple( localUsers, localRoutes)); } } private Task GetForeignUsers(Guid brokerId) { var foreignUserIds = (Guid[])null; using (var broCtx = new BrokerDbContext(this._settings.MessengerBrokerDbConnectionString)) { foreignUserIds = broCtx.Users.Where(x=>x.BrokerId == brokerId).Select(x => x.Id).ToArray(); } using (var apiCtx = new MessengerDbContext(this._settings.MessengerApiDbConnectionString)) { var localUsers = apiCtx.Users .Where(x => !foreignUserIds.Any(f => f == x.Id)) .ToArray(); return Task.FromResult(localUsers); } } public async Task GetMessages(Guid brokerId, DateTime sinceUtc) { var userIds = (Guid[])null; if(brokerId == this._settings.BrokerId) { // Our messages. var users = await this.GetLocalUsersAndRoutes(); userIds = users.Item1.Select(x => x.Id).ToArray(); } else { var users = await this.GetForeignUsers(brokerId); userIds = users.Select(x => x.Id).ToArray(); } using (var apiCtx = new MessengerDbContext(this._settings.MessengerApiDbConnectionString)) { var messages = apiCtx.Messages .Include(x => x.From).Include(x => x.To) .Where(x => x.CreatedUtc >= sinceUtc && userIds.Contains(x.From.Id)) .ToArray(); return messages; } } } }