public async Task <ProviderDisplayModel> Get(string slug, string languageCode = null)
        {
            var entity = await _repositoryProvider.GetFirst(x => x.Slug == slug.ToLowerInvariant() && x.State == MREntityState.Active);

            if (entity == null)
            {
                throw new MRException <ProviderDisplayModel>((int)ExceptionCode.NOT_FOUND, "Provider not found");
            }

            var result = _mapper.Map <ProviderDisplayModel>(entity);

            result.Categories  = new List <CategoryDisplayModel>();
            result.Name        = entity.Name.SelectTranslation(languageCode)?.Value;
            result.Description = entity.Description.SelectTranslation(languageCode)?.Value;

            var categoryIds = entity.Categories?.Select(x => x.Id).ToList() ?? new List <string>();

            if (categoryIds != null && categoryIds.Any())
            {
                var categories = (await _repositoryCategory.GetIn(x => x.Id, categoryIds))
                                 .Where(x => x.State == MREntityState.Active);

                foreach (var cat in categories)
                {
                    var cName = cat.Name.SelectTranslation(languageCode)?.Value;
                    result.Categories.Add(new CategoryDisplayModel
                    {
                        CreateTime   = cat.CreateTime,
                        Id           = cat.Id,
                        LanguageCode = languageCode,
                        Name         = cName
                    });
                }
            }

            return(result);
        }
        public async Task <UserStatusModel> SignIn(UserSignInModel model)
        {
            var user = await _managerUser.FindByEmailAsync(model.Email);

            if (user == null || !await _managerUser.CheckPasswordAsync(user, model.Password))
            {
                _eNotFound <UserStatusModel>("User not found");
            }

            var userRoles = await _managerUser.GetRolesAsync(user);

            var token = _serviceToken.GenerateToken(user.Id, user.Email, userRoles);

            UserLoginInfo li            = null;
            string        callbackToken = null;

            if (!string.IsNullOrWhiteSpace(model.ProviderSlug))
            {
                var provider = await _repositoryProvider.GetFirst(x => x.Slug == model.ProviderSlug && x.State == MREntityState.Active);

                if (provider != null && provider.Options.IsEnabled)
                {
                    li = new UserLoginInfo(provider.Id, token, provider.Slug);

                    _serviceToken.GenerateToken("SOME_SECRET_KEY", "MR_IDENTITY", "SOME_PROVIDER", 60, new List <Tuple <string, string> >
                    {
                        new Tuple <string, string>("provider.id", provider.Id),
                        new Tuple <string, string>("user.id", user.Id)
                    }, "name", "password");

                    callbackToken = ProviderTokenGenerator.Generate(provider.Id, user.Id);
                }
            }

            if (li == null)
            {
                li = new UserLoginInfo(_tokenOptions.Issuer, token, _tokenOptions.Issuer);
            }

            if (await _managerUser.FindByLoginAsync(li.LoginProvider, li.ProviderKey) != null)
            {
                await _managerUser.RemoveLoginAsync(user, li.LoginProvider, li.ProviderKey);
            }

            await _managerUser.AddLoginAsync(user, li);

            var isEmailOnChange = await _repositoryEmailChangeUnit.Any(x => x.State == MREntityState.Active && x.UserId == user.Id && x.Status == Infrastructure.Entity.Enum.EmailChangeResult.NEW);

            _logger.LogInformation($"User login");

            return(new UserStatusModel
            {
                FirstName = user.FirstName,
                LastName = user.LastName,
                Roles = userRoles.ToList(),
                AccessToken = token,
                LanguageCode = user.LanguageCode,
                Email = user.Email,
                Sex = user.Sex,
                IsEmailConfirmed = user.IsEmailConfirmed,
                IsEmailOnChange = isEmailOnChange,
                CallbackUrl = model.CallbackUrl,
                CallbackToken = callbackToken
            });
        }