public virtual async Task <Data> SeedAsync(
            string name,
            string code,
            string displayName,
            string description = "",
            Guid?parentId      = null,
            Guid?tenantId      = null,
            CancellationToken cancellationToken = default)
        {
            using (CurrentTenant.Change(tenantId))
            {
                var data = await DataRepository.FindByNameAsync(name, cancellationToken : cancellationToken);

                if (data == null)
                {
                    data = new Data(
                        GuidGenerator.Create(),
                        name,
                        code,
                        displayName,
                        description,
                        parentId,
                        tenantId);

                    data = await DataRepository.InsertAsync(data);
                }

                return(data);
            }
        }
Beispiel #2
0
        public async Task <WalletAction> RechargeAsync(
            Guid?tenantId,
            Guid userId,
            Guid rechargeProductId,
            int productQuantity,
            string orderId,
            int creditAmount,
            decimal paidAmount,
            string title,
            string description
            )
        {
            using (CurrentTenant.Change(tenantId))
            {
                var coinPurchased = new WalletAction(GuidGenerator.Create(), tenantId, userId, rechargeProductId, productQuantity, orderId, creditAmount, paidAmount);

                await _repository.InsertAsync(coinPurchased);

                // 修改销售数量
                var product = await _productRepository.GetAsync(rechargeProductId);

                product.SetSoldQuantity(product.SoldQuantity + productQuantity);

                // 钱包
                var wallet = await _walletRepository.GetByUserIdAsync(userId);

                wallet.IncBalance(creditAmount);

                // 写日志
                var log = new WalletLog(GuidGenerator.Create(), tenantId, userId, "Recharge", false, creditAmount, wallet.Balance, title, description);
                await _walletLogRepository.InsertAsync(log);

                return(coinPurchased);
            }
        }
Beispiel #3
0
 public override Task <PermissionValueProviderGrantInfo> CheckAsync(string name, string providerName, string providerKey)
 {
     using (CurrentTenant.Change(null))
     {
         return(base.CheckAsync(name, providerName, providerKey));
     }
 }
 public async Task <List <UserGroup> > GetGroupUsersAsync(Guid?tenantId, long groupId, string filter = "", string sorting = "UserId", int skipCount = 1, int maxResultCount = 10)
 {
     using (CurrentTenant.Change(tenantId))
     {
         return(await UserChatGroupRepository.GetGroupUsersAsync(groupId, filter, sorting, skipCount, maxResultCount));
     }
 }
Beispiel #5
0
    protected virtual async Task TriggerHandlerAsync(IEventHandlerFactory asyncHandlerFactory, Type eventType,
                                                     object eventData, List <Exception> exceptions, InboxConfig inboxConfig = null)
    {
        using (var eventHandlerWrapper = asyncHandlerFactory.GetHandler())
        {
            try
            {
                var handlerType = eventHandlerWrapper.EventHandler.GetType();

                if (inboxConfig?.HandlerSelector != null &&
                    !inboxConfig.HandlerSelector(handlerType))
                {
                    return;
                }

                using (CurrentTenant.Change(GetEventDataTenantId(eventData)))
                {
                    await EventHandlerInvoker.InvokeAsync(eventHandlerWrapper.EventHandler, eventData, eventType);
                }
            }
            catch (TargetInvocationException ex)
            {
                exceptions.Add(ex.InnerException);
            }
            catch (Exception ex)
            {
                exceptions.Add(ex);
            }
        }
    }
        public async Task SetMemberMenusAsync_Test()
        {
            var adminMenu = await MenuRepository.FindByNameAsync("admin");

            var saasMenu = await MenuRepository.FindByNameAsync("saas");

            await MenuManager.SetUserMenusAsync(PlatformTestsConsts.User1Id, new Guid[] { adminMenu.Id });

            await MenuManager.SetUserMenusAsync(PlatformTestsConsts.User2Id, new Guid[] { adminMenu.Id, saasMenu.Id });

            (await Repository.UserHasInMenuAsync(PlatformTestsConsts.User1Id, "admin")).ShouldBeTrue();
            (await Repository.UserHasInMenuAsync(PlatformTestsConsts.User2Id, "admin")).ShouldBeTrue();
            (await Repository.UserHasInMenuAsync(PlatformTestsConsts.User2Id, "saas")).ShouldBeTrue();

            using (CurrentTenant.Change(PlatformTestsConsts.TenantId))
            {
                // 在租户范围不能查询到宿主数据
                (await Repository.UserHasInMenuAsync(PlatformTestsConsts.User1Id, "admin")).ShouldBeFalse();
                (await Repository.UserHasInMenuAsync(PlatformTestsConsts.User2Id, "saas")).ShouldBeFalse();

                var tenantSaasMenu = await MenuRepository.FindByNameAsync("saas");

                await MenuManager.SetUserMenusAsync(PlatformTestsConsts.User2Id, new Guid[] { tenantSaasMenu.Id });

                (await Repository.UserHasInMenuAsync(PlatformTestsConsts.User2Id, "admin")).ShouldBeFalse();
                (await Repository.UserHasInMenuAsync(PlatformTestsConsts.User2Id, "saas")).ShouldBeTrue();
            }
            // 在租户范围内处理了菜单数据不应该影响到宿主
            (await Repository.UserHasInMenuAsync(PlatformTestsConsts.User2Id, "admin")).ShouldBeTrue();
        }
        public async Task InsertNotificationAsync(NotificationInfo notification)
        {
            using (var unitOfWork = _unitOfWorkManager.Begin())
            {
                using (CurrentTenant.Change(notification.TenantId))
                {
                    var notifyId = SnowflakeIdGenerator.Create();
                    // 保存主键,防止前端js long类型溢出
                    notification.Data["id"] = notifyId.ToString();

                    var notify = new Notification(notifyId, notification.Name,
                                                  notification.Data.GetType().AssemblyQualifiedName,
                                                  JsonSerializer.Serialize(notification.Data), notification.NotificationSeverity)
                    {
                        CreationTime   = Clock.Now,
                        Type           = notification.NotificationType,
                        ExpirationTime = Clock.Now.AddDays(60)
                    };
                    notify.SetTenantId(notification.TenantId);

                    await NotificationRepository.InsertAsync(notify);

                    notification.Id = notify.NotificationId;

                    await unitOfWork.SaveChangesAsync();
                }
            }
        }
Beispiel #8
0
    protected virtual async Task <TenantCacheItem> GetCacheItemAsync(Guid?id, string name)
    {
        var cacheKey = CalculateCacheKey(id, name);

        var cacheItem = await Cache.GetAsync(cacheKey, considerUow : true);

        if (cacheItem != null)
        {
            return(cacheItem);
        }

        if (id.HasValue)
        {
            using (CurrentTenant.Change(null)) //TODO: No need this if we can implement to define host side (or tenant-independent) entities!
            {
                var tenant = await TenantRepository.FindAsync(id.Value);

                return(await SetCacheAsync(cacheKey, tenant));
            }
        }

        if (!name.IsNullOrWhiteSpace())
        {
            using (CurrentTenant.Change(null)) //TODO: No need this if we can implement to define host side (or tenant-independent) entities!
            {
                var tenant = await TenantRepository.FindByNameAsync(name);

                return(await SetCacheAsync(cacheKey, tenant));
            }
        }

        throw new AbpException("Both id and name can't be invalid.");
    }
Beispiel #9
0
        public virtual async Task BindAsync(LoginInput input)
        {
            await CheckBindPolicyAsync();

            var loginResult = await GetLoginResultAsync(input);

            using var tenantChange = CurrentTenant.Change(loginResult.MiniProgram.TenantId);

            await _identityOptions.SetAsync();

            if (await _identityUserManager.FindByLoginAsync(loginResult.LoginProvider, loginResult.ProviderKey) != null)
            {
                throw new WechatAccountHasBeenBoundException();
            }

            var identityUser = await _identityUserManager.GetByIdAsync(CurrentUser.GetId());

            (await _identityUserManager.AddLoginAsync(identityUser,
                                                      new UserLoginInfo(loginResult.LoginProvider, loginResult.ProviderKey,
                                                                        WeChatManagementCommonConsts.WeChatUserLoginInfoDisplayName))).CheckErrors();

            await UpdateMiniProgramUserAsync(identityUser, loginResult.MiniProgram, loginResult.UnionId,
                                             loginResult.Code2SessionResponse.OpenId, loginResult.Code2SessionResponse.SessionKey);

            await UpdateUserInfoAsync(identityUser, input.UserInfo);
        }
Beispiel #10
0
        protected virtual async Task <IdentityUser> FindUserAsync(string uniqueUserNameOrEmailAddress)
        {
            IdentityUser user = null;

            using (CurrentTenant.Change(null))
            {
                user = await UserManager.FindByNameAsync(LoginInput.UserNameOrEmailAddress) ??
                       await UserManager.FindByEmailAsync(LoginInput.UserNameOrEmailAddress);

                if (user != null)
                {
                    return(user);
                }
            }

            foreach (var tenant in await _tenantRepository.GetListAsync())
            {
                using (CurrentTenant.Change(tenant.Id))
                {
                    user = await UserManager.FindByNameAsync(LoginInput.UserNameOrEmailAddress) ??
                           await UserManager.FindByEmailAsync(LoginInput.UserNameOrEmailAddress);

                    if (user != null)
                    {
                        return(user);
                    }
                }
            }

            return(null);
        }
Beispiel #11
0
 public async Task <ArticleSale> GetAsync(Guid id, Guid?tenantId, bool includeDetails = true)
 {
     using (CurrentTenant.Change(tenantId))
     {
         return(await _repository.GetAsync(id, includeDetails));
     }
 }
        public async Task HandleEventAsync(EntityDeletedEto <TenantEto> eventData)
        {
            using var unitOfWork = UnitOfWorkManager.Begin();
            // 订阅租户删除事件,删除管理员角色所有权限
            // TODO: 租户貌似不存在了,删除应该会失败
            // 有缓存存在的话,可以获取到租户连接字符串
            using (CurrentTenant.Change(eventData.Entity.Id))
            {
                // var grantPermissions = await PermissionGrantRepository.GetListAsync("R", "admin");

                // EfCore MySql 批量删除还是一条一条的语句?
                // PermissionGrantRepository.GetDbSet().RemoveRange(grantPermissions);
                var dbContext = await PermissionGrantRepository.GetDbContextAsync();

                var permissionEntityType    = dbContext.Model.FindEntityType(typeof(PermissionGrant));
                var permissionTableName     = permissionEntityType.GetTableName();
                var batchRmovePermissionSql = string.Empty;
                if (dbContext.Database.IsMySql())
                {
                    batchRmovePermissionSql = BuildMySqlBatchDeleteScript(permissionTableName, eventData.Entity.Id);
                }
                else
                {
                    batchRmovePermissionSql = BuildSqlServerBatchDeleteScript(permissionTableName, eventData.Entity.Id);
                }

                await dbContext.Database.ExecuteSqlRawAsync(batchRmovePermissionSql);

                await unitOfWork.SaveChangesAsync();
            }
        }
Beispiel #13
0
        public virtual async Task <LoginOutput> LoginAsync(LoginInput input)
        {
            var loginResult = await GetLoginResultAsync(input);

            using var tenantChange = CurrentTenant.Change(loginResult.MiniProgram.TenantId);

            await _identityOptions.SetAsync();

            using (var uow = UnitOfWorkManager.Begin(new AbpUnitOfWorkOptions(true), true))
            {
                var identityUser =
                    await _identityUserManager.FindByLoginAsync(loginResult.LoginProvider, loginResult.ProviderKey) ??
                    await _miniProgramLoginNewUserCreator.CreateAsync(input.UserInfo, loginResult.LoginProvider,
                                                                      loginResult.ProviderKey);

                await UpdateMiniProgramUserAsync(identityUser, loginResult.MiniProgram, loginResult.UnionId,
                                                 loginResult.Code2SessionResponse.OpenId, loginResult.Code2SessionResponse.SessionKey);

                await UpdateUserInfoAsync(identityUser, input.UserInfo);

                await uow.CompleteAsync();
            }

            return(new LoginOutput
            {
                TenantId = loginResult.MiniProgram.TenantId,
                RawData = (await RequestIds4LoginAsync(input.AppId, loginResult.UnionId,
                                                       loginResult.Code2SessionResponse.OpenId))?.Raw
            });
        }
        public virtual async Task SeedAsync(DataSeedContext context)
        {
            using (CurrentTenant.Change(context.TenantId))
            {
                var data = await SeedDefaultDataDictionaryAsync(context.TenantId);

                // 预置
                var layout = await SeedDefaultLayoutAsync(data);

                // 首页
                await SeedHomeMenuAsync(layout, data);

                // 管理菜单预置菜单数据
                await SeedAdminMenuAsync(layout, data);

                // saas菜单数据
                await SeedSaasMenuAsync(layout, data);

                // 身份资源菜单数据
                await SeedIdentityServerMenuAsync(layout, data);

                // 审计日志菜单数据
                await SeedAuditingMenuAsync(layout, data);

                // 布局容器预置菜单数据
                await SeedContainerMenuAsync(layout, data);

                // 网关管理菜单数据
                await SeedApiGatewayMenuAsync(layout, data);

                // Oss对象管理菜单数据
                await SeedOssManagementMenuAsync(layout, data);
            }
        }
 public async Task <int> GetGroupUsersCountAsync(Guid?tenantId, long groupId, string filter = "")
 {
     using (CurrentTenant.Change(tenantId))
     {
         return(await UserChatGroupRepository.GetGroupUsersCountAsync(groupId, filter));
     }
 }
Beispiel #16
0
 public async Task <WalletAction> GetAsync(Guid id, Guid?tenantId)
 {
     using (CurrentTenant.Change(tenantId))
     {
         return(await _repository.GetAsync(id));
     }
 }
Beispiel #17
0
 protected override Task RevokeAsync(string name, string providerKey)
 {
     using (CurrentTenant.Change(null))
     {
         return(base.RevokeAsync(name, providerKey));
     }
 }
Beispiel #18
0
        public virtual async Task UnbindAsync(LoginInput input)
        {
            await CheckUnbindPolicyAsync();

            var loginResult = await GetLoginResultAsync(input);

            using var tenantChange = CurrentTenant.Change(loginResult.MiniProgram.TenantId);

            await _identityOptions.SetAsync();

            if (await _identityUserManager.FindByLoginAsync(loginResult.LoginProvider, loginResult.ProviderKey) == null)
            {
                throw new WechatAccountHasNotBeenBoundException();
            }

            var identityUser = await _identityUserManager.GetByIdAsync(CurrentUser.GetId());

            (await _identityUserManager.RemoveLoginAsync(identityUser, loginResult.LoginProvider, loginResult.ProviderKey)).CheckErrors();

            await RemoveMiniProgramUserAsync(identityUser, loginResult.MiniProgram);

            if (!await _miniProgramUserRepository.AnyAsync(x => x.UserId == identityUser.Id))
            {
                await RemoveUserInfoAsync(identityUser);
            }
        }
Beispiel #19
0
 public override Task SetAsync(string name, string providerKey, bool isGranted)
 {
     using (CurrentTenant.Change(null))
     {
         return(base.SetAsync(name, providerKey, isGranted));
     }
 }
Beispiel #20
0
        public virtual async Task <TenantDto> CreateAsync(TenantCreateDto input)
        {
            var tenant = await TenantManager.CreateAsync(input.Name);

            input.MapExtraPropertiesTo(tenant);

            await TenantRepository.InsertAsync(tenant);

            await CurrentUnitOfWork.SaveChangesAsync();

            await DistributedEventBus.PublishAsync(
                new TenantCreatedEto
            {
                Id         = tenant.Id,
                Name       = tenant.Name,
                Properties =
                {
                    { "AdminEmail",    input.AdminEmailAddress },
                    { "AdminPassword", input.AdminPassword     }
                }
            });

            using (CurrentTenant.Change(tenant.Id, tenant.Name))
            {
                //TODO: Handle database creation?
                // TODO: Seeder might be triggered via event handler.
                await DataSeeder.SeedAsync(
                    new DataSeedContext(tenant.Id)
                    .WithProperty("AdminEmail", input.AdminEmailAddress)
                    .WithProperty("AdminPassword", input.AdminPassword)
                    );
            }

            return(ObjectMapper.Map <Tenant, TenantDto>(tenant));
        }
Beispiel #21
0
 /// <summary>
 /// 获取当前租户产品总数
 /// </summary>
 /// <param name="tenantId">指定租户</param>
 /// <returns></returns>
 public async Task <long> GetProductCountAsync(Guid?tenantId)
 {
     // 使用using 可以在代码块结束后恢复原本租户值
     using (CurrentTenant.Change(tenantId))
     {
         return(await ProductRepository.GetCountAsync());
     }
 }
        public async override Task <IActionResult> OnGetAsync()
        {
            LoginInput = new LoginInputModel();

            var context = await Interaction.GetAuthorizationContextAsync(ReturnUrl);

            if (context != null)
            {
                ShowCancelButton = true;

                LoginInput.UserNameOrEmailAddress = context.LoginHint;

                //TODO: Reference AspNetCore MultiTenancy module and use options to get the tenant key!
                var tenant = context.Parameters[TenantResolverConsts.DefaultTenantKey];
                if (!string.IsNullOrEmpty(tenant))
                {
                    CurrentTenant.Change(Guid.Parse(tenant));
                    Response.Cookies.Append(TenantResolverConsts.DefaultTenantKey, tenant);
                }
            }

            if (context?.IdP != null)
            {
                LoginInput.UserNameOrEmailAddress = context.LoginHint;
                ExternalProviders = new[] { new ExternalProviderModel {
                                                AuthenticationScheme = context.IdP
                                            } };
                return(Page());
            }

            var providers = await GetExternalProviders();

            ExternalProviders = providers.ToList();

            EnableLocalLogin = await SettingProvider.IsTrueAsync(AccountSettingNames.EnableLocalLogin);

            if (context?.Client?.ClientId != null)
            {
                var client = await ClientStore.FindEnabledClientByIdAsync(context?.Client?.ClientId);

                if (client != null)
                {
                    EnableLocalLogin = client.EnableLocalLogin;

                    if (client.IdentityProviderRestrictions != null && client.IdentityProviderRestrictions.Any())
                    {
                        providers = providers.Where(provider => client.IdentityProviderRestrictions.Contains(provider.AuthenticationScheme)).ToList();
                    }
                }
            }

            if (IsExternalLoginOnly)
            {
                return(await base.OnPostExternalLogin(providers.First().AuthenticationScheme));
            }

            return(Page());
        }
        public async Task <GroupUserCard> GetUserGroupCardAsync(Guid?tenantId, long groupId, Guid userId)
        {
            using (CurrentTenant.Change(tenantId))
            {
                var groupUserCard = await UserChatGroupRepository.GetGroupUserCardAsync(groupId, userId);

                return(groupUserCard);
            }
        }
        public async Task <IEnumerable <Group> > GetUserGroupsAsync(Guid?tenantId, Guid userId)
        {
            using (CurrentTenant.Change(tenantId))
            {
                var groups = await UserChatGroupRepository.GetUserGroupsAsync(userId);

                return(groups);
            }
        }
Beispiel #25
0
        public override async Task <IActionResult> OnPostAsync(string action)
        {
            var user = await FindUserAsync(LoginInput.UserNameOrEmailAddress);

            using (CurrentTenant.Change(user?.TenantId))
            {
                return(await base.OnPostAsync(action));
            }
        }
Beispiel #26
0
        public override async Task <IActionResult> OnGetExternalLoginCallbackAsync(string returnUrl = "", string returnUrlHash = "", string remoteError = null)
        {
            var user = await FindUserAsync(LoginInput.UserNameOrEmailAddress);

            using (CurrentTenant.Change(user?.TenantId))
            {
                return(await base.OnGetExternalLoginCallbackAsync(returnUrl, returnUrlHash, remoteError));
            }
        }
        public async Task <NotificationInfo> GetNotificationOrNullAsync(Guid?tenantId, long notificationId)
        {
            using (CurrentTenant.Change(tenantId))
            {
                var notification = await NotificationRepository.GetByIdAsync(notificationId);

                return(_objectMapper.Map <Notification, NotificationInfo>(notification));
            }
        }
        public async Task <List <NotificationSubscriptionInfo> > GetSubscriptionsAsync(Guid?tenantId, string notificationName)
        {
            using (CurrentTenant.Change(tenantId))
            {
                var userSubscriptions = await UserSubscribeRepository.GetSubscribesAsync(notificationName);

                return(_objectMapper.Map <List <UserSubscribe>, List <NotificationSubscriptionInfo> >(userSubscriptions));
            }
        }
        public async Task <List <NotificationInfo> > GetUserNotificationsAsync(Guid?tenantId, Guid userId, NotificationReadState readState = NotificationReadState.UnRead, int maxResultCount = 10)
        {
            using (CurrentTenant.Change(tenantId))
            {
                var notifications = await UserNotificationRepository.GetNotificationsAsync(userId, readState, maxResultCount);

                return(_objectMapper.Map <List <Notification>, List <NotificationInfo> >(notifications));
            }
        }
        public async Task <IEnumerable <UserGroup> > GetGroupUsersAsync(Guid?tenantId, long groupId)
        {
            using (CurrentTenant.Change(tenantId))
            {
                var userGroups = await UserChatGroupRepository.GetGroupUsersAsync(groupId);

                return(userGroups);
            }
        }