/// <summary>
        /// Returns <see cref="ApplicationUser"/> instance after successful registration
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task <OperationResult <ApplicationUserProfileViewModel> > RegisterAsync(RegisterViewModel model)
        {
            var operation = OperationResult.CreateResult <ApplicationUserProfileViewModel>();
            var user      = _mapper.Map <ApplicationUser>(model);

            using (var transaction = await _unitOfWork.BeginTransactionAsync())
            {
                var userManager = _unitOfWork.GetUserManager();
                var result      = await userManager.CreateAsync(user, model.Password);

                var role = AppData.CompanyRoleName;

                if (result.Succeeded)
                {
                    var roleManager = _unitOfWork.GetRoleManager();
                    if (await roleManager.FindByNameAsync(role) == null)
                    {
                        operation.Error = new MicroserviceUserNotFoundException();
                        operation.AddError(AppData.Exceptions.UserNotFoundException);
                        return(await Task.FromResult(operation));
                    }
                    await userManager.AddToRoleAsync(user, role);
                    await AddClaimsToUser(userManager, user, role);

                    var profile           = _mapper.Map <ApplicationUserProfile>(model);
                    var profileRepository = _unitOfWork.GetRepository <ApplicationUserProfile>();
                    profile.ApplicationUserId = user.Id;
                    await profileRepository.InsertAsync(profile);

                    await _unitOfWork.SaveChangesAsync();

                    if (_unitOfWork.LastSaveChangesResult.IsOk)
                    {
                        var principal = await _claimsFactory.CreateAsync(user);

                        operation.Result = _mapper.Map <ApplicationUserProfileViewModel>(principal.Identity);
                        operation.AddSuccess(AppData.Messages.UserSuccessfullyRegistered);
                        _logger.LogInformation(operation.GetMetadataMessages());
                        transaction.Commit();
                        return(await Task.FromResult(operation));
                    }
                }
                var errors = result.Errors.Select(x => $"{x.Code}: {x.Description}");
                if (result.Errors.Select(x => x.Code).Contains("DuplicateEmail"))
                {
                    operation.AddError(result.Errors.SingleOrDefault(x => x.Code == "DuplicateEmail"));
                    operation.Error = _unitOfWork.LastSaveChangesResult.Exception;
                }
                else
                {
                    operation.AddError(string.Join(", ", errors));
                    operation.Error = _unitOfWork.LastSaveChangesResult.Exception;
                }
                transaction.Rollback();
                return(await Task.FromResult(operation));
            }
        }
        /// <summary>
        /// Returns <see cref="ApplicationUser"/> instance after successful registration
        /// </summary>
        /// <param name="model"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task <OperationResult <UserProfileViewModel> > RegisterAsync(RegisterViewModel model, CancellationToken cancellationToken)
        {
            var operation = OperationResult.CreateResult <UserProfileViewModel>();
            var user      = _mapper.Map <ApplicationUser>(model);

            await using var transaction = await _unitOfWork.BeginTransactionAsync();

            var result = await _userManager.CreateAsync(user, model.Password);

            const string role = AppData.ManagerRoleName;

            if (result.Succeeded)
            {
                if (await _roleManager.FindByNameAsync(role) == null)
                {
                    operation.Exception = new MicroserviceUserNotFoundException();
                    operation.AddError(AppData.Exceptions.UserNotFoundException);
                    return(await Task.FromResult(operation));
                }
                await _userManager.AddToRoleAsync(user, role);
                await AddClaimsToUser(_userManager, user, role);

                var profile           = _mapper.Map <ApplicationUserProfile>(model);
                var profileRepository = _unitOfWork.GetRepository <ApplicationUserProfile>();

                await profileRepository.InsertAsync(profile, cancellationToken);

                await _unitOfWork.SaveChangesAsync();

                if (_unitOfWork.LastSaveChangesResult.IsOk)
                {
                    var principal = await _claimsFactory.CreateAsync(user);

                    operation.Result = _mapper.Map <UserProfileViewModel>(principal.Identity);
                    operation.AddSuccess(AppData.Messages.UserSuccessfullyRegistered);
                    _logger.LogInformation(operation.GetMetadataMessages());
                    await transaction.CommitAsync(cancellationToken);

                    _logger.MicroserviceUserRegistration(model.Email);
                    return(await Task.FromResult(operation));
                }
            }
            var errors = result.Errors.Select(x => $"{x.Code}: {x.Description}");

            operation.AddError(string.Join(", ", errors));
            operation.Exception = _unitOfWork.LastSaveChangesResult.Exception;
            await transaction.RollbackAsync(cancellationToken);

            _logger.MicroserviceUserRegistration(model.Email, operation.Exception);
            return(await Task.FromResult(operation));
        }
        public async Task <ClaimsPrincipal> Handle(GetUserClaimsByIdRequest request, CancellationToken cancellationToken)
        {
            if (string.IsNullOrEmpty(request.UserId))
            {
                throw new MicroserviceException();
            }
            var user = await _userManager.FindByIdAsync(request.UserId);

            if (user == null)
            {
                throw new MicroserviceUserNotFoundException();
            }

            var defaultClaims = await _claimsFactory.CreateAsync(user);

            return(defaultClaims);
        }