Пример #1
0
        /// <summary>
        /// 保存配置实例。
        /// </summary>
        /// <param name="site">当前配置实例。</param>
        /// <returns>返回数据结果。</returns>
        public virtual async Task <DataResult> SaveAsync(SiteBase site)
        {
            var adapter = site.ToStore();

            if (adapter.SiteId > 0)
            {
                return(DataResult.FromResult(await _sdb.UpdateAsync(adapter), DataAction.Updated));
            }
            if (await IsDuplicatedAsync(site))
            {
                return(DataResult.FromResult(await _sdb.UpdateAsync(x => x.SiteKey == adapter.SiteKey, new { adapter.SiteName, adapter.UpdatedDate, adapter.SettingValue }), DataAction.Updated));
            }
            return(DataResult.FromResult(await _sdb.BeginTransactionAsync(async db =>
            {
                if (!await db.CreateAsync(adapter))
                {
                    return false;
                }
                site.SiteId = adapter.SiteId;
                foreach (var handler in _handlers)
                {
                    if (!await handler.OnCreateAsync(db, site))
                    {
                        return false;
                    }
                }
                return true;
            }), DataAction.Created));
        }
Пример #2
0
 /// <summary>
 /// 设置默认。
 /// </summary>
 /// <param name="siteId">网站Id。</param>
 /// <param name="domain">域名。</param>
 /// <returns>返回设置结果。</returns>
 public virtual async Task <bool> SetDefaultAsync(int siteId, string domain)
 {
     if (await _sddb.BeginTransactionAsync(async db =>
     {
         await db.UpdateAsync(x => x.SiteId == siteId, new { IsDefault = false });
         await db.UpdateAsync(x => x.SiteId == siteId && x.Domain == domain, new { IsDefault = true });
         return(true);
     }))
     {
         _cache.Remove(_cacheKey);
         return(true);
     }
     return(false);
 }
Пример #3
0
        /// <summary>
        /// 更新管理员权限配置。
        /// </summary>
        /// <returns>返回更新结果。</returns>
        public async Task <bool> RefreshOwnersAsync()
        {
            var roleId = await GetOwnerIdAsync();

            if (roleId == 0)
            {
                return(false);
            }

            var permissions = await EnsuredProviderPermissionsAsync();

            if (await _prdb.BeginTransactionAsync(async db =>
            {
                foreach (var permission in permissions)
                {
                    if (await db.AnyAsync(x => x.PermissionId == permission.Id && x.RoleId == roleId))
                    {
                        continue;
                    }

                    await db.CreateAsync(new PermissionInRole {
                        PermissionId = permission.Id, RoleId = roleId, Value = PermissionValue.Allow
                    });
                }

                return(true);
            }))
            {
                RemoveCache();
                return(true);
            }
            return(false);
        }
Пример #4
0
        public async Task <TResponse> Handle(TRequest request, CancellationToken cancellationToken,
                                             RequestHandlerDelegate <TResponse> next)
        {
            TResponse response = default;

            try
            {
                await _dbContext.RetryOnExceptionAsync(async() =>
                {
                    _logger.LogInformation($"Begin transaction {typeof(TRequest).Name}");

                    await _dbContext.BeginTransactionAsync();

                    response = await next();

                    await _dbContext.CommitTransactionAsync();

                    _logger.LogInformation($"Committed transaction {typeof(TRequest).Name}");
                });

                return(response);
            }
            catch (Exception e)
            {
                _logger.LogInformation($"Rollback transaction executed {typeof(TRequest).Name}");

                _dbContext.RollbackTransaction();

                _logger.LogError(e.Message, e.StackTrace);

                throw e;
            }
        }
Пример #5
0
        /// <summary>
        /// 添加默认网站。
        /// </summary>
        /// <param name="siteKey">唯一键。</param>
        /// <param name="siteName">网站名称。</param>
        /// <param name="shortName">网站简称。</param>
        /// <param name="description">描述。</param>
        /// <param name="domains">域名列表。</param>
        /// <returns>返回添加结果。</returns>
        public virtual async Task <bool> CreateDefaultSiteAsync(string siteKey, string siteName, string shortName, string description, IEnumerable <string> domains)
        {
            if (await _context.BeginTransactionAsync(async db =>
            {
                var site = new SiteAdapter
                {
                    SiteKey = siteKey,
                    SiteName = siteName,
                    ShortName = shortName ?? siteName,
                    Description = description
                };
                if (await db.As <SiteAdapter>().CreateAsync(site))
                {
                    foreach (var domain in domains)
                    {
                        var siteDomain = new SiteDomain
                        {
                            Domain = domain,
                            SiteId = site.Id
                        };
                        await db.CreateAsync(siteDomain);
                    }

                    return(true);
                }

                return(false);
            }))
            {
                Refresh();
                return(true);
            }

            return(false);
        }
Пример #6
0
 /// <summary>
 /// 添加对象对比实例。
 /// </summary>
 /// <param name="differ">对象对比实例。</param>
 /// <returns>返回添加结果。</returns>
 public virtual Task <bool> CreateAsync(IObjectDiffer differ)
 {
     return(_db.BeginTransactionAsync(async db =>
     {
         foreach (var item in differ)
         {
             await db.CreateAsync(item);
         }
         return true;
     }, 300));
 }
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            using (var transaction = await _dbContext.BeginTransactionAsync())
            {
                await next();

                await _dbContext.SaveChangesAsync();

                transaction.Commit();
            }
        }
Пример #8
0
        /// <summary>
        /// 将API设置到应用中。
        /// </summary>
        /// <param name="appid">应用程序Id。</param>
        /// <param name="apis">API的Id列表。</param>
        /// <returns>返回保存结果。</returns>
        public virtual async Task <DataResult> AddApisAsync(int appid, int[] apis)
        {
            return(Result(await _context.BeginTransactionAsync(async db =>
            {
                var asdb = db.As <ApplicationService>();
                await asdb.DeleteAsync(x => x.AppicationId == appid);
                if (apis?.Length > 0)
                {
                    foreach (var api in apis)
                    {
                        await asdb.CreateAsync(new ApplicationService {
                            AppicationId = appid, ServiceId = api
                        });
                    }
                }

                return true;
            }), DataAction.Updated));
        }
Пример #9
0
        /// <summary>
        /// 将服务添加到应用程序中。
        /// </summary>
        /// <param name="appid">应用程序Id。</param>
        /// <param name="ids">服务Id列表。</param>
        /// <returns>返回添加结果。</returns>
        public async Task <bool> AddApplicationServicesAsync(Guid appid, int[] ids)
        {
            if (await _asdb.BeginTransactionAsync(async db =>
            {
                await db.DeleteAsync(x => x.AppId == appid);
                foreach (var id in ids)
                {
                    await db.CreateAsync(new ApplicationService {
                        AppId = appid, ServiceId = id
                    });
                }

                return(true);
            }))
            {
                _cache.Remove(GetCacheKey(appid));
                return(true);
            }

            return(false);
        }
Пример #10
0
        public async Task <TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate <TResponse> next)
        {
            var response = default(TResponse);
            var typeName = request.GetGenericTypeName();

            try
            {
                if (dbContext.HasActiveTransaction)
                {
                    return(await next());
                }

                await dbContext.Execute(async() =>
                {
                    using var transaction = await dbContext.BeginTransactionAsync();
                    var transactionId     = dbContext.CurrentTransactionId;

                    using (LogContext.PushProperty("TransactionContext", transactionId))
                    {
                        logger.LogInformation("----- Begin transaction {TransactionId} for {CommandName} ({@Command})", transactionId, typeName, request);

                        response = await next();

                        logger.LogInformation("----- Commit transaction {TransactionId} for {CommandName}", transactionId, typeName);

                        await dbContext.CommitTransactionAsync(transaction);

                        await salesOrderIntegrationEventService.PublishEventsThroughEventBusAsync(transactionId);
                    }
                });

                return(response);
            }
            catch (Exception ex)
            {
                logger.LogError(ex, "ERROR Handling transaction for {CommandName} ({@Command})", typeName, request);

                throw;
            }
        }
Пример #11
0
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            try
            {
                await _dbContext.BeginTransactionAsync();

                var actionExecuted = await next();

                if (actionExecuted.Exception != null && !actionExecuted.ExceptionHandled)
                {
                    _dbContext.RollbackTransaction();
                }
                else
                {
                    await _dbContext.CommitTransactionAsync();
                }
            }
            catch (Exception)
            {
                _dbContext.RollbackTransaction();
                throw;
            }
        }
Пример #12
0
        /// <summary>
        /// 保存索引。
        /// </summary>
        /// <param name="entityType">模型实例对象。</param>
        /// <param name="search">搜索实例对象。</param>
        /// <param name="indexes">索引分词。</param>
        /// <returns>返回保存结果。</returns>
        public virtual async Task <bool> SaveAsync(IEntityType entityType, SearchDescriptor search, IEnumerable <string> indexes)
        {
            //防止重复,空值等等
            indexes = indexes.Where(x => !string.IsNullOrWhiteSpace(x))
                      .Select(x => x.Trim())
                      .Distinct(StringComparer.OrdinalIgnoreCase)
                      .ToList();
            return(await _searches.BeginTransactionAsync(async db =>
            {
                var dbSearch = await db.FindAsync(s => s.ProviderName == search.ProviderName && s.TargetId == search.TargetId);
                if (dbSearch != null)
                {
                    //重新生成的索引描述信息
                    if (!await db.UpdateAsync(s => s.Id == dbSearch.Id, new { search.IndexedDate, search.Summary }))
                    {
                        return false;
                    }
                    search.Id = dbSearch.Id;
                }
                else if (!await db.CreateAsync(search))
                {
                    return false;
                }

                //删除关联表
                var indb = db.As <SearchInIndex>();
                if (dbSearch != null)
                {
                    await indb.DeleteAsync(si => si.SearchId == dbSearch.Id);
                }

                //添加关键词和关联表
                var indexdb = db.As <SearchIndex>();
                foreach (var index in indexes)
                {
                    if (string.IsNullOrWhiteSpace(index))
                    {
                        continue;
                    }
                    //添加关键词
                    var entry = await indexdb.FindAsync(x => x.Name == index);
                    if (entry == null)
                    {
                        entry = new SearchIndex {
                            Name = index
                        };
                        if (!await indexdb.CreateAsync(entry))
                        {
                            return false;
                        }
                    }
                    //添加关联表
                    if (!await indb.CreateAsync(new SearchInIndex {
                        IndexId = entry.Id, SearchId = search.Id
                    }))
                    {
                        return false;
                    }
                }

                //更新到实体表
                if (await db.ExecuteNonQueryAsync($"UPDATE {entityType.Table} SET SearchIndexed = {(int)IndexedType.Completed} WHRE Id = { search.TargetId};"))
                {
                    return true;
                }
                return false;
            }, 300));
        }