Exemplo n.º 1
0
        private async Task CreateDefaultTenantsAsync(DbTransaction sqlTransaction, CustomerEntity customer, IEnumerable <TenantViewModel> tenants)
        {
            await facade.TurnOffIdentityIncrementAsync(nameof(IApplicationWriteDbContext.Tenants), sqlTransaction);

            foreach (var tenant in tenants.Select(t => tenantViewModelToDbEntityMapper.Map(t)))
            {
                tenant.CustomerId = customer.Id;
                await context.Tenants.AddAsync(tenant);

                await context.TenantAspNetUsers.AddAsync(new TenantAspNetUserEntity { AspNetUsersId = customer.AspNetUsersId, TenantId = tenant.Id });
            }
            await context.SaveChangesAsync();

            await facade.TurnOnIdentityIncrementAsync(nameof(IApplicationWriteDbContext.Tenants), sqlTransaction);
        }
            public async Task <TenantViewModel> Handle(AddOrUpdateTenantCommand request, CancellationToken cancellationToken)
            {
                var isNew = false;

                // PRESENTATION/APPLICATION LAYER
                var tenantViewModel = request.Tenant;

                // PERSISTENCE LAYER
                using (var transaction = await context.Database.BeginTransactionAsync())
                {
                    var sqlTransaction = transaction.GetDbTransaction();

                    TenantEntity tenantEntity = null;

                    // Check for existing slug/key on a different tenant.
                    var slug = tenantViewModel.Slug.Sluggify();
                    var id   = await facade.QueryFirstOrDefaultAsync <int?>(
                        @"SELECT TOP 1 Id FROM Tenants WITH(NOLOCK) WHERE Slug = @slug AND (@Id IS NULL OR Id <> @Id)",
                        new { slug, tenantViewModel.Id }, sqlTransaction);

                    if (id != null)
                    {
                        throw new ApplicationLayerException("Tenant slug already in use by another tenant.");
                    }
                    else
                    {
                        tenantViewModel.Slug = slug;
                    }

                    // Update.
                    if (tenantViewModel.Id != null)
                    {
                        var tenantId = (int)tenantViewModel.Id;
                        tenantEntity = context.Tenants.Find(tenantId);
                        if (tenantEntity == null)
                        {
                            throw new ApplicationLayerException($"Tenant with ID {tenantId} is in the customer's access list, but does not seem to exist.");
                        }
                        mapper.Map(tenantViewModel, tenantEntity);
                    }
                    else
                    {
                        // Add.
                        var customerId = await facade.QueryFirstOrDefaultAsync <int>("SELECT TOP 1 Id FROM Customers WHERE AspNetUsersId = @AspNetUsersId", request, sqlTransaction);

                        tenantEntity            = mapper.Map(tenantViewModel);
                        tenantEntity.CustomerId = customerId;
                        await context.Tenants.AddAsync(tenantEntity);

                        isNew = true;
                    }
                    await context.SaveChangesAsync();

                    tenantViewModel.Id = tenantEntity.Id;
                    if (isNew)
                    {
                        await context.TenantAspNetUsers.AddAsync(new TenantAspNetUserEntity { AspNetUsersId = request.AspNetUsersId, TenantId = tenantEntity.Id });

                        await context.SaveChangesAsync();
                    }
                    await transaction.CommitAsync();
                }
                return(tenantViewModel);
            }