示例#1
0
        public async Task AddMessage(IRceMessage message)
        {
            var database = _mongoClient.GetDatabase(DatabaseName);

            if (message is IHasWorkerId hasWorkerId)
            {
                if (await IsDisconnected(hasWorkerId.WorkerId))
                {
                    throw new Exception("Worker disconnected");
                }

                if (await IsRegistered(hasWorkerId.WorkerId) == false &&
                    message is WorkerAddedMessage == false)
                {
                    throw new Exception("Specified worker does not exist");
                }

                if (message is WorkerAddedMessage workerAddedMessage)
                {
                    var ownersCollection = database.GetCollection <BsonDocument>(OwnersCollectionName);
                    await ownersCollection.InsertManyAsync(workerAddedMessage.Owners.Select(e =>
                                                                                            new BsonDocument
                    {
                        { OwnerFieldName, e },
                        { WorkerIdFieldName, workerAddedMessage.WorkerId.ToString() }
                    }));
                }

                var owners = await GetOwners(hasWorkerId.WorkerId) ?? new List <string>();

                await _rceHubContext.Clients.Users(owners).MessageReceived(message);
            }

            var messagesCollection = database.GetCollection <dynamic>(MessagesCollectionName);
            await messagesCollection.InsertOneAsync(message.ToExpandoObject());
        }
        public static ExpandoObject ToExpandoObject(this IRceMessage rceMessage)
        {
            var data = JsonConvert.SerializeObject(rceMessage);

            return(JsonConvert.DeserializeObject <ExpandoObject>(data, new ExpandoObjectConverter()));
        }