private Task OnPartyUpdate(PartyUpdateContract contract) { var party = new Party(contract.Party); var memberIDs = party.Members .Select(m => m.ID) .ToImmutableList(); var users = GetUsers() .Where(u => u.FieldUser != null) .Select(u => u.FieldUser) .Where(u => u.Party?.ID == party.ID || memberIDs.Contains(u.ID)) .ToImmutableList(); users.ForEach(u => u.Party = memberIDs.Contains(u.ID) ? party : null); return(Task.CompletedTask); }
public PartyService( ICacheClient cache, IMessageBus messenger, IDataStore store, IDispatchService dispatcher ) { _messenger = messenger; _locker = new ScopedLockProvider(new CacheLockProvider(cache, messenger), PartyLockScope); _dispatcher = dispatcher; _repository = new PartyRepository(cache, store); _channels = new List <ChannelWriter <PartyUpdateContract> >(); _ = _messenger.SubscribeAsync <PartyUpdateEvent>(async e => { var contract = new PartyUpdateContract { Party = e.Party.ToContract() }; await Task.WhenAll(_channels.Select(async d => await d.WriteAsync(contract))); }); }