public async Task <UserDto> CreateOrUpdateUserAsync(UserDto user)
        {
            using (MessengerDbContext context = contextFactory.Create())
            {
                User userInfo = await context.Users
                                .Include(opt => opt.UserPublicKeys)
                                .Include(opt => opt.Phones)
                                .Include(opt => opt.Emails)
                                .Include(opt => opt.BlackList)
                                .Include(opt => opt.Tokens)
                                .FirstOrDefaultAsync(opt => opt.Id == user.Id)
                                .ConfigureAwait(false);

                if (userInfo != null)
                {
                    userInfo = UserConverter.GetUser(userInfo, user);
                    context.Update(userInfo);
                }
                else
                {
                    userInfo = UserConverter.GetUser(user);
                    await context.AddAsync(userInfo).ConfigureAwait(false);
                }
                await context.SaveChangesAsync().ConfigureAwait(false);

                return(UserConverter.GetUserDto(userInfo, null, null));
            }
        }
        private async Task HandleEditUserBlockSegmentAsync(BlockSegmentVm segment)
        {
            using (MessengerDbContext _context = CreateContext())
            {
                using (var transaction = await _context.Database.BeginTransactionAsync().ConfigureAwait(false))
                {
                    try
                    {
                        var user = await _context.Users.FirstOrDefaultAsync(_user => _user.Id == segment.SegmentHeader.ObjectId).ConfigureAwait(false);

                        if (user != null)
                        {
                            if (TryDecryptPrivateData <UserVm>(segment, out var userData))
                            {
                                user           = UserConverter.GetUser(UserConverter.GetUserDto(userData));
                                user.Confirmed = true;
                                _context.Users.Update(user);
                            }
                        }
                        else
                        {
                            if (TryDecryptPrivateData <UserVm>(segment, out var userData))
                            {
                                user = UserConverter.GetUser(UserConverter.GetUserDto(userData));
                            }
                            else
                            {
                                user = new User
                                {
                                    Id        = segment.SegmentHeader.ObjectId,
                                    NodeId    = segment.NodeId,
                                    Confirmed = true
                                };
                            }
                            await _context.Users.AddAsync(user).ConfigureAwait(false);
                        }
                        await _context.SaveChangesAsync().ConfigureAwait(false);

                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        AddErrorMessage(nameof(HandleNewUserBlockSegmentAsync), ex.ToString());
                        transaction.Rollback();
                    }
                }
            }
        }
        public async Task <UserVm> EditUserAsync(EditUserVm editableUser, long userId)
        {
            using (MessengerDbContext context = contextFactory.Create())
            {
                User editedUser = await context.Users
                                  .Include(user => user.Phones)
                                  .Include(user => user.Emails)
                                  .FirstOrDefaultAsync(user => user.Id == userId && user.Deleted == false)
                                  .ConfigureAwait(false);

                editedUser = UserConverter.GetUser(editedUser, editableUser);
                context.Update(editedUser);
                await context.SaveChangesAsync().ConfigureAwait(false);

                return(UserConverter.GetUserVm(editedUser));
            }
        }