public async Task <ActionResult <MessageModel> > PostMessage(Guid conversationId,
                                                                     [FromBody] MessageCreateModel messageCreateModel)
        {
            //TODO: check that user is authorized for the conversation
            var conversation = await _context.Conversations.FindAsync(conversationId);

            var message = new Persistence.Models.Message
            {
                AuthorId     = Guid.Parse(User.Identity.GetSubjectId()),
                Text         = messageCreateModel.Text,
                Created      = _systemClock.UtcNow,
                Conversation = conversation
            };

            _context.Messages.Add(message);
            await _context.SaveChangesAsync(); //TODO: error handling

            var messageModel = new MessageModel
            {
                Id             = message.Id,
                ConversationId = message.Conversation.Id,
                UserId         = message.AuthorId,
                Text           = message.Text,
                Created        = message.Created
            };
            var toBeNotifiedUserIds = await _context.ConversationUsers.Where(x => x.ConversationId == conversationId)
                                      .Select(x => x.UserId.ToString().ToLowerInvariant()).ToListAsync();

            //toBeNotifiedUserIds.Remove(User.Identity.GetSubjectId());

            await _conversationHubContext.Clients.Users(toBeNotifiedUserIds).NewMessage(messageModel);

            return(messageModel);
        }
Exemple #2
0
        public async Task <ActionResult <InvitationModel> > CreateInvitation(Guid conversationId, [FromBody] InvitationCreateModel model)
        {
            Guid identityUserId = Guid.Parse(User.Identity.GetSubjectId());

            var dbInvitation = await _context.Invitations.AddAsync(
                new Invitation(
                    Guid.NewGuid(),
                    conversationId,
                    identityUserId,
                    Guid.NewGuid().ToString()
                    )
            {
                IsPermanent = model.IsPermanent
            });

            await _context.SaveChangesAsync();

            return(await RetrieveInvitationModel(dbInvitation.Entity.Id));
        }
Exemple #3
0
        public async Task <ActionResult <ConversationModel> > PutConversation(Guid id, Conversation conversation)
        {
            if (id != conversation.Id)
            {
                return(BadRequest());
            }

            _context.Entry(conversation).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ConversationExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            // notify conversation users
            var userIds = await _context.ConversationUsers
                          .Where(x => x.ConversationId == conversation.Id)
                          .Select(x => x.UserId.ToString().ToLowerInvariant())
                          .ToListAsync();

            var updatedConversationModel = new ConversationModelFactory().Create(conversation);
            await _conversationHubContext.Clients.Users(userIds).ConversationUpdated(updatedConversationModel);

            return(updatedConversationModel);
        }