public static void Start(SchemaBuilder sb) { if (sb.NotDefined(MethodInfo.GetCurrentMethod())) { sb.Include <OrderEntity>() .WithQuery(() => o => new { Entity = o, o.Id, o.State, o.Customer, o.Employee, o.OrderDate, o.RequiredDate, o.ShipAddress, o.ShipVia, }); QueryLogic.Queries.Register(OrderQuery.OrderLines, () => from o in Database.Query <OrderEntity>() from od in o.Details select new { Entity = o, o.Id, od.Product, od.Quantity, od.UnitPrice, od.Discount, od.SubTotalPrice, }); OrderGraph.Register(); ProcessLogic.Register(OrderProcess.CancelOrders, new CancelOrderAlgorithm()); SimpleTaskLogic.Register(OrderTask.CancelOldOrdersWithProcess, ctx => { var package = new PackageEntity().CreateLines(Database.Query <OrderEntity>().Where(a => a.OrderDate < DateTime.Now.AddDays(-7) && a.State != OrderState.Canceled)); var process = ProcessLogic.Create(OrderProcess.CancelOrders, package); process.Execute(ProcessOperation.Execute); return(process.ToLite()); }); SimpleTaskLogic.Register(OrderTask.CancelOldOrders, ctx => { Database.Query <OrderEntity>() .Where(a => a.OrderDate < DateTime.Now.AddDays(-7)) .UnsafeUpdate() .Set(o => o.CancelationDate, o => DateTime.Now) .Set(o => o.State, o => OrderState.Canceled) .Execute(); return(null); });//CancelOldOrdersProcess } }
private static ProcessEntity?UpdateMessages(List <SMSMessageEntity> messages) { if (!messages.Any()) { return(null); } SMSUpdatePackageEntity package = new SMSUpdatePackageEntity().Save(); var packLite = package.ToLite(); if (messages.Any(m => m.State != SMSMessageState.Sent)) { throw new ApplicationException("SMS messages must be sent prior to update the status"); } messages.ForEach(ms => ms.UpdatePackage = packLite); messages.SaveList(); var process = ProcessLogic.Create(SMSMessageProcess.UpdateStatus, package); process.Execute(ProcessOperation.Execute); return(process); }
public static void Start(SchemaBuilder sb) { if (sb.NotDefined(MethodInfo.GetCurrentMethod())) { sb.Schema.Settings.AssertImplementedBy((ProcessEntity p) => p.Data, typeof(EmailPackageEntity)); sb.Include <EmailPackageEntity>() .WithQuery(() => e => new { Entity = e, e.Id, e.Name, }); QueryLogic.Expressions.Register((EmailPackageEntity ep) => ep.Messages(), () => EmailMessageMessage.Messages.NiceToString()); QueryLogic.Expressions.Register((EmailPackageEntity ep) => ep.RemainingMessages(), () => EmailMessageMessage.RemainingMessages.NiceToString()); QueryLogic.Expressions.Register((EmailPackageEntity ep) => ep.ExceptionMessages(), () => EmailMessageMessage.ExceptionMessages.NiceToString()); ProcessLogic.AssertStarted(sb); ProcessLogic.Register(EmailMessageProcess.CreateEmailsSendAsync, new CreateEmailsSendAsyncProcessAlgorithm()); ProcessLogic.Register(EmailMessageProcess.SendEmails, new SendEmailProcessAlgorithm()); new Graph <ProcessEntity> .ConstructFromMany <EmailMessageEntity>(EmailMessageOperation.ReSendEmails) { Construct = (messages, args) => { if (!messages.Any()) { return(null); } EmailPackageEntity emailPackage = new EmailPackageEntity() { Name = args.TryGetArgC <string>() }.Save(); foreach (var m in messages.Select(m => m.RetrieveAndForget())) { new EmailMessageEntity() { Package = emailPackage.ToLite(), From = m.From, Recipients = m.Recipients.ToMList(), Target = m.Target, Body = new BigStringEmbedded(m.Body.Text), IsBodyHtml = m.IsBodyHtml, Subject = m.Subject, Template = m.Template, EditableMessage = m.EditableMessage, State = EmailMessageState.RecruitedForSending, Attachments = m.Attachments.Select(a => a.Clone()).ToMList() }.Save(); } return(ProcessLogic.Create(EmailMessageProcess.SendEmails, emailPackage)); } } .Register(); } }
public static ProcessEntity?CreateProcess(FileTypeSymbol?fileType = null) { using (Transaction tr = new Transaction()) { var query = Database.Query <PrintLineEntity>() .Where(a => a.State == PrintLineState.ReadyToPrint); if (fileType != null) { query = query.Where(a => a.File.FileType == fileType); } if (query.Count() == 0) { return(null); } var package = new PrintPackageEntity() { Name = fileType?.ToString() + " (" + query.Count() + ")" }.Save(); query.UnsafeUpdate() .Set(a => a.Package, a => package.ToLite()) .Set(a => a.State, a => PrintLineState.Enqueued) .Execute(); var result = ProcessLogic.Create(PrintPackageProcess.PrintPackage, package).Save(); return(tr.Commit(result)); } }
public static void Start(SchemaBuilder sb, FileTypeSymbol?testFileType = null) { if (sb.NotDefined(MethodInfo.GetCurrentMethod())) { TestFileType = testFileType; sb.Include <PrintLineEntity>() .WithQuery(() => p => new { Entity = p, p.CreationDate, p.File, p.State, p.Package, p.PrintedOn, p.Referred, }); sb.Include <PrintPackageEntity>() .WithQuery(() => e => new { Entity = e, e.Id, e.Name }); ProcessLogic.AssertStarted(sb); ProcessLogic.Register(PrintPackageProcess.PrintPackage, new PrintPackageAlgorithm()); PermissionAuthLogic.RegisterPermissions(PrintPermission.ViewPrintPanel); PrintLineGraph.Register(); SimpleTaskLogic.Register(PrintTask.RemoveOldFiles, (ScheduledTaskContext ctx) => { var lines = Database.Query <PrintLineEntity>().Where(a => a.State == PrintLineState.Printed).Where(b => b.CreationDate <= DateTime.Now.AddMinutes(-DeleteFilesAfter)); foreach (var line in lines) { try { using (Transaction tr = new Transaction()) { line.File.DeleteFileOnCommit(); line.State = PrintLineState.PrintedAndDeleted; using (OperationLogic.AllowSave <PackageLineEntity>()) line.Save(); tr.Commit(); } } catch (Exception e) { e.LogException(); } } return(null); }); } }
public static void RegisterSMSOwnerData <T>(Expression <Func <T, SMSOwnerData> > phoneExpression) where T : Entity { new Graph <ProcessEntity> .ConstructFromMany <T>(SMSMessageOperation.SendMultipleSMSMessages) { Construct = (providers, args) => { var sMSOwnerDatas = Database.Query <T>().Where(p => providers.Contains(p.ToLite())) .Select(pr => phoneExpression.Evaluate(pr)) .AsEnumerable().NotNull().Distinct().ToList(); MultipleSMSModel model = args.GetArg <MultipleSMSModel>(); IntegrityCheck?ic = model.IntegrityCheck(); if (!model.Message.HasText()) { throw new ApplicationException("The text for the SMS message has not been set"); } var owners = (from od in sMSOwnerDatas from n in od.TelephoneNumber.SplitNoEmpty(",") select new { TelephoneNumber = n, SMSOwnerData = od }); if (!owners.Any()) { return(null); } SMSSendPackageEntity package = new SMSSendPackageEntity().Save(); var packLite = package.ToLite(); using (OperationLogic.AllowSave <SMSMessageEntity>()) { owners.Select(o => new SMSMessageEntity { DestinationNumber = o.TelephoneNumber, SendPackage = packLite, Referred = o.SMSOwnerData.Owner, Message = model.Message, From = model.From, Certified = model.Certified, State = SMSMessageState.Created, }).SaveList(); } var process = ProcessLogic.Create(SMSMessageProcess.Send, package); process.Execute(ProcessOperation.Execute); return(process); } } .Register(); }
public static ProcessEntity SendMultipleEmailsAsync(Lite <EmailTemplateEntity> template, List <Lite <Entity> > targets, ModelConverterSymbol?converter) { if (converter == null) { return(ProcessLogic.Create(EmailMessageProcess.CreateEmailsSendAsync, new PackageEntity().SetOperationArgs(new object[] { template }).CreateLines(targets))); } return(ProcessLogic.Create(EmailMessageProcess.CreateEmailsSendAsync, new PackageEntity().SetOperationArgs(new object[] { template, converter }).CreateLines(targets))); }
public void Execute() { var user = ExecutionMode.Global().Using(_ => CurrentProcess.User.RetrieveAndRemember()); using (UserHolder.UserSession(user)) { using (ProcessLogic.OnApplySession(CurrentProcess)) { if (UserEntity.Current == null) { UserEntity.Current = AuthLogic.SystemUser !; } try { Algorithm.Execute(this); CurrentProcess.ExecutionEnd = Clock.Now; CurrentProcess.State = ProcessState.Finished; CurrentProcess.Progress = null; CurrentProcess.User.ClearEntity(); using (OperationLogic.AllowSave <ProcessEntity>()) CurrentProcess.Save(); } catch (OperationCanceledException e) { if (!e.CancellationToken.Equals(this.CancellationToken)) { throw; } CurrentProcess.SuspendDate = Clock.Now; CurrentProcess.State = ProcessState.Suspended; using (OperationLogic.AllowSave <ProcessEntity>()) CurrentProcess.Save(); } catch (Exception e) { if (Transaction.InTestTransaction) { throw; } CurrentProcess.State = ProcessState.Error; CurrentProcess.ExceptionDate = Clock.Now; CurrentProcess.Exception = e.LogException(el => el.ActionName = CurrentProcess.Algorithm.ToString()).ToLite(); using (OperationLogic.AllowSave <ProcessEntity>()) CurrentProcess.Save(); } finally { ProcessRunnerLogic.OnFinally?.Invoke(this); } } } }
public static void RegisterPhoneNumberProvider <T>(Expression <Func <T, string> > phoneExpression, Expression <Func <T, CultureInfo> > cultureExpression) where T : Entity { phoneNumberProviders[typeof(T)] = phoneExpression; cultureProviders[typeof(T)] = cultureExpression; new Graph <ProcessEntity> .ConstructFromMany <T>(SMSMessageOperation.SendSMSMessages) { Construct = (providers, args) => { var numbers = Database.Query <T>().Where(p => providers.Contains(p.ToLite())) .Select(pr => new { Exp = phoneExpression.Evaluate(pr), Referred = pr.ToLite() }).AsEnumerable().NotNull().Distinct().ToList(); var splitNumbers = (from p in numbers.Where(p => p.Exp.Contains(',')) from n in p.Exp.Split('n') select new { Exp = n.Trim(), p.Referred }).Concat(numbers.Where(p => !p.Exp.Contains(','))).Distinct().ToList(); numbers = splitNumbers; MultipleSMSModel model = args.GetArg <MultipleSMSModel>(); IntegrityCheck ic = model.IntegrityCheck(); if (!model.Message.HasText()) { throw new ApplicationException("The text for the SMS message has not been set"); } SMSSendPackageEntity package = new SMSSendPackageEntity().Save(); var packLite = package.ToLite(); using (OperationLogic.AllowSave <SMSMessageEntity>()) numbers.Select(n => new SMSMessageEntity { DestinationNumber = n.Exp, SendPackage = packLite, Referred = n.Referred, Message = model.Message, From = model.From, Certified = model.Certified, State = SMSMessageState.Created, }).SaveList(); var process = ProcessLogic.Create(SMSMessageProcess.Send, package); process.Execute(ProcessOperation.Execute); return(process); } } .Register(); }
public static void Start(SchemaBuilder sb, Func <NewsletterEntity, EmailSenderConfigurationEntity> getEmailSenderConfiguration) { if (sb.NotDefined(MethodInfo.GetCurrentMethod())) { sb.Include <NewsletterEntity>(); sb.Include <NewsletterDeliveryEntity>(); NewsletterLogic.GetEmailSenderConfiguration = getEmailSenderConfiguration; ProcessLogic.AssertStarted(sb); ProcessLogic.Register(NewsletterProcess.SendNewsletter, new NewsletterProcessAlgorithm()); QueryLogic.Queries.Register(typeof(NewsletterEntity), () => from n in Database.Query <NewsletterEntity>() let p = n.LastProcess() select new { Entity = n, n.Id, n.Name, n.Subject, Text = n.Text.Try(a => a.Etc(100)), n.State, NumDeliveries = n.Deliveries().Count(), LastProcess = p, NumErrors = n.Deliveries().Count(d => d.Exception(p) != null) }); QueryLogic.Queries.Register(typeof(NewsletterDeliveryEntity), () => from e in Database.Query <NewsletterDeliveryEntity>() let p = e.Newsletter.Entity.LastProcess() select new { Entity = e, e.Id, e.Newsletter, e.Recipient, e.Sent, e.SendDate, LastProcess = p, Exception = e.Exception(p) }); NewsletterGraph.Register(); sb.AddUniqueIndex <NewsletterDeliveryEntity>(nd => new { nd.Newsletter, nd.Recipient }); Validator.PropertyValidator((NewsletterEntity news) => news.Text).StaticPropertyValidation += (sender, pi) => ValidateTokens(sender, sender.Text); Validator.PropertyValidator((NewsletterEntity news) => news.Subject).StaticPropertyValidation += (sender, pi) => ValidateTokens(sender, sender.Subject); sb.Schema.EntityEvents <NewsletterEntity>().PreSaving += Newsletter_PreSaving; } }
public static void Start(SchemaBuilder sb, DynamicQueryManager dqm) { if (sb.NotDefined(MethodInfo.GetCurrentMethod())) { sb.Include <EmailPackageEntity>() .WithQuery(dqm, () => e => new { Entity = e, e.Id, e.Name, }); dqm.RegisterExpression((EmailPackageEntity ep) => ep.Messages(), () => EmailMessageMessage.Messages.NiceToString()); dqm.RegisterExpression((EmailPackageEntity ep) => ep.RemainingMessages(), () => EmailMessageMessage.RemainingMessages.NiceToString()); dqm.RegisterExpression((EmailPackageEntity ep) => ep.ExceptionMessages(), () => EmailMessageMessage.ExceptionMessages.NiceToString()); ProcessLogic.AssertStarted(sb); ProcessLogic.Register(EmailMessageProcess.CreateEmailsSendAsync, new CreateEmailsSendAsyncProcessAlgorithm()); ProcessLogic.Register(EmailMessageProcess.SendEmails, new SendEmailProcessAlgorithm()); new Graph <ProcessEntity> .ConstructFromMany <EmailMessageEntity>(EmailMessageOperation.ReSendEmails) { Construct = (messages, args) => { EmailPackageEntity emailPackage = new EmailPackageEntity() { Name = args.TryGetArgC <string>() }.Save(); foreach (var m in messages.Select(m => m.RetrieveAndForget())) { new EmailMessageEntity() { Package = emailPackage.ToLite(), From = m.From, Recipients = m.Recipients.ToMList(), Target = m.Target, Body = m.Body, IsBodyHtml = m.IsBodyHtml, Subject = m.Subject, Template = m.Template, EditableMessage = m.EditableMessage, State = EmailMessageState.RecruitedForSending }.Save(); } return(ProcessLogic.Create(EmailMessageProcess.SendEmails, emailPackage)); } } .Register(); } }
void MainForm_Load(object sender, EventArgs e) { _lblPID.Text = string.Format("PID:{0}", Process.GetCurrentProcess().Id); Configuration = new ClientConfiguration(); var localIp4Address = Dns.GetHostAddresses(string.Empty).FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork); Configuration.OutboundProxyIpEndPoint = localIp4Address + ":33333"; Configuration.BindIpEndPoint = localIp4Address + ":" + (22220 + ProcessLogic.CountProcessesByName(Process.GetCurrentProcess().ProcessName)); ExecuteActionHelper.ExecuteAction(delegate() { FormsManager.Configure(this, _toolStripOpenedForms); }); }
public static void Start(SchemaBuilder sb) { if (sb.NotDefined(MethodInfo.GetCurrentMethod())) { sb.Include <SMSSendPackageEntity>(); sb.Include <SMSUpdatePackageEntity>(); SMSLogic.AssertStarted(sb); ProcessLogic.AssertStarted(sb); ProcessLogic.Register(SMSMessageProcess.Send, new SMSMessageSendProcessAlgortihm()); ProcessLogic.Register(SMSMessageProcess.UpdateStatus, new SMSMessageUpdateStatusProcessAlgorithm()); SimpleTaskLogic.Register(SMSMessageTask.UpdateSMSStatus, ctx => UpdateAllSentSMS()?.ToLite()); new Graph <ProcessEntity> .ConstructFromMany <SMSMessageEntity>(SMSMessageOperation.CreateUpdateStatusPackage) { Construct = (messages, _) => UpdateMessages(messages.RetrieveFromListOfLite()) } .Register(); QueryLogic.Queries.Register(typeof(SMSSendPackageEntity), () => from e in Database.Query <SMSSendPackageEntity>() let p = e.LastProcess() select new { Entity = e, e.Id, e.Name, NumLines = e.SMSMessages().Count(), LastProcess = p, NumErrors = e.SMSMessages().Count(s => s.Exception(p) != null), }); QueryLogic.Queries.Register(typeof(SMSUpdatePackageEntity), () => from e in Database.Query <SMSUpdatePackageEntity>() let p = e.LastProcess() select new { Entity = e, e.Id, e.Name, NumLines = e.SMSMessages().Count(), LastProcess = p, NumErrors = e.SMSMessages().Count(s => s.Exception(p) != null), }); } }
public static void Start(string connectionString) { using (HeavyProfiler.Log("Start")) using (var initial = HeavyProfiler.Log("Initial")) { StartParameters.IgnoredDatabaseMismatches = new List <Exception>(); StartParameters.IgnoredCodeErrors = new List <Exception>(); string?logDatabase = Connector.TryExtractDatabaseNameWithPostfix(ref connectionString, "_Log"); SchemaBuilder sb = new CustomSchemaBuilder { LogDatabaseName = logDatabase, Tracer = initial }; sb.Schema.Version = typeof(Starter).Assembly.GetName().Version; sb.Schema.ForceCultureInfo = CultureInfo.GetCultureInfo("en-US"); MixinDeclarations.Register <OperationLogEntity, DiffLogMixin>(); MixinDeclarations.Register <UserEntity, UserEmployeeMixin>(); OverrideAttributes(sb); var detector = SqlServerVersionDetector.Detect(connectionString); Connector.Default = new SqlConnector(connectionString, sb.Schema, detector !.Value); CacheLogic.Start(sb); DynamicLogicStarter.Start(sb); DynamicLogic.CompileDynamicCode(); DynamicLogic.RegisterMixins(); DynamicLogic.BeforeSchema(sb); TypeLogic.Start(sb); OperationLogic.Start(sb); ExceptionLogic.Start(sb); MigrationLogic.Start(sb); CultureInfoLogic.Start(sb); FilePathEmbeddedLogic.Start(sb); SmtpConfigurationLogic.Start(sb); EmailLogic.Start(sb, () => Configuration.Value.Email, (et, target) => Configuration.Value.SmtpConfiguration); AuthLogic.Start(sb, "System", null); AuthLogic.StartAllModules(sb); ResetPasswordRequestLogic.Start(sb); UserTicketLogic.Start(sb); SessionLogLogic.Start(sb); ProcessLogic.Start(sb); PackageLogic.Start(sb, packages: true, packageOperations: true); SchedulerLogic.Start(sb); QueryLogic.Start(sb); UserQueryLogic.Start(sb); UserQueryLogic.RegisterUserTypeCondition(sb, SouthwindGroup.UserEntities); UserQueryLogic.RegisterRoleTypeCondition(sb, SouthwindGroup.RoleEntities); ChartLogic.Start(sb); UserChartLogic.RegisterUserTypeCondition(sb, SouthwindGroup.UserEntities); UserChartLogic.RegisterRoleTypeCondition(sb, SouthwindGroup.RoleEntities); DashboardLogic.Start(sb); DashboardLogic.RegisterUserTypeCondition(sb, SouthwindGroup.UserEntities); DashboardLogic.RegisterRoleTypeCondition(sb, SouthwindGroup.RoleEntities); ViewLogLogic.Start(sb, new HashSet <Type> { typeof(UserQueryEntity), typeof(UserChartEntity), typeof(DashboardEntity) }); DiffLogLogic.Start(sb, registerAll: true); ExcelLogic.Start(sb, excelReport: true); ToolbarLogic.Start(sb); SMSLogic.Start(sb, null, () => Configuration.Value.Sms); SMSLogic.RegisterPhoneNumberProvider <PersonEntity>(p => p.Phone, p => null); SMSLogic.RegisterDataObjectProvider((PersonEntity p) => new { p.FirstName, p.LastName, p.Title, p.DateOfBirth }); SMSLogic.RegisterPhoneNumberProvider <CompanyEntity>(p => p.Phone, p => null); NoteLogic.Start(sb, typeof(UserEntity), /*Note*/ typeof(OrderEntity)); AlertLogic.Start(sb, typeof(UserEntity), /*Alert*/ typeof(OrderEntity)); FileLogic.Start(sb); TranslationLogic.Start(sb, countLocalizationHits: false); TranslatedInstanceLogic.Start(sb, () => CultureInfo.GetCultureInfo("en")); HelpLogic.Start(sb); WordTemplateLogic.Start(sb); MapLogic.Start(sb); PredictorLogic.Start(sb, () => new FileTypeAlgorithm(f => new PrefixPair(Starter.Configuration.Value.Folders.PredictorModelFolder))); PredictorLogic.RegisterAlgorithm(CNTKPredictorAlgorithm.NeuralNetwork, new CNTKNeuralNetworkPredictorAlgorithm()); PredictorLogic.RegisterPublication(ProductPredictorPublication.MonthlySales, new PublicationSettings(typeof(OrderEntity))); RestLogLogic.Start(sb); RestApiKeyLogic.Start(sb); WorkflowLogicStarter.Start(sb, () => Starter.Configuration.Value.Workflow); EmployeeLogic.Start(sb); ProductLogic.Start(sb); CustomerLogic.Start(sb); OrderLogic.Start(sb); ShipperLogic.Start(sb); StartSouthwindConfiguration(sb); TypeConditionLogic.Register <OrderEntity>(SouthwindGroup.UserEntities, o => o.Employee == EmployeeEntity.Current); TypeConditionLogic.Register <EmployeeEntity>(SouthwindGroup.UserEntities, e => EmployeeEntity.Current.Is(e)); TypeConditionLogic.Register <OrderEntity>(SouthwindGroup.CurrentCustomer, o => o.Customer == CustomerEntity.Current); TypeConditionLogic.Register <PersonEntity>(SouthwindGroup.CurrentCustomer, o => o == CustomerEntity.Current); TypeConditionLogic.Register <CompanyEntity>(SouthwindGroup.CurrentCustomer, o => o == CustomerEntity.Current); ProfilerLogic.Start(sb, timeTracker: true, heavyProfiler: true, overrideSessionTimeout: true); DynamicLogic.StartDynamicModules(sb); DynamicLogic.RegisterExceptionIfAny(); SetupCache(sb); Schema.Current.OnSchemaCompleted(); } }
public static void Start(string connectionString, bool isPostgres, bool includeDynamic = true, bool detectSqlVersion = true) { using (HeavyProfiler.Log("Start")) using (var initial = HeavyProfiler.Log("Initial")) { StartParameters.IgnoredDatabaseMismatches = new List <Exception>(); StartParameters.IgnoredCodeErrors = new List <Exception>(); string?logDatabase = Connector.TryExtractDatabaseNameWithPostfix(ref connectionString, "_Log"); SchemaBuilder sb = new CustomSchemaBuilder { LogDatabaseName = logDatabase, Tracer = initial }; sb.Schema.Version = typeof(Starter).Assembly.GetName().Version !; sb.Schema.ForceCultureInfo = CultureInfo.GetCultureInfo("en-US"); MixinDeclarations.Register <OperationLogEntity, DiffLogMixin>(); MixinDeclarations.Register <UserEntity, UserEmployeeMixin>(); MixinDeclarations.Register <OrderDetailEmbedded, OrderDetailMixin>(); MixinDeclarations.Register <BigStringEmbedded, BigStringMixin>(); ConfigureBigString(sb); OverrideAttributes(sb); if (!isPostgres) { var sqlVersion = detectSqlVersion ? SqlServerVersionDetector.Detect(connectionString) : SqlServerVersion.AzureSQL; Connector.Default = new SqlServerConnector(connectionString, sb.Schema, sqlVersion !.Value); } else { var postgreeVersion = detectSqlVersion ? PostgresVersionDetector.Detect(connectionString) : null; Connector.Default = new PostgreSqlConnector(connectionString, sb.Schema, postgreeVersion); } CacheLogic.Start(sb, cacheInvalidator: sb.Settings.IsPostgres ? new PostgresCacheInvalidation() : null); DynamicLogicStarter.Start(sb); if (includeDynamic)//Dynamic { DynamicLogic.CompileDynamicCode(); DynamicLogic.RegisterMixins(); DynamicLogic.BeforeSchema(sb); }//Dynamic // Framework modules TypeLogic.Start(sb); OperationLogic.Start(sb); ExceptionLogic.Start(sb); QueryLogic.Start(sb); // Extensions modules MigrationLogic.Start(sb); CultureInfoLogic.Start(sb); FilePathEmbeddedLogic.Start(sb); BigStringLogic.Start(sb); EmailLogic.Start(sb, () => Configuration.Value.Email, (template, target, message) => Configuration.Value.EmailSender); AuthLogic.Start(sb, "System", "Anonymous"); /* null); anonymous*/ AuthLogic.StartAllModules(sb); ResetPasswordRequestLogic.Start(sb); UserTicketLogic.Start(sb); SessionLogLogic.Start(sb); WebAuthnLogic.Start(sb, () => Configuration.Value.WebAuthn); ProcessLogic.Start(sb); PackageLogic.Start(sb, packages: true, packageOperations: true); SchedulerLogic.Start(sb); OmniboxLogic.Start(sb); UserQueryLogic.Start(sb); UserQueryLogic.RegisterUserTypeCondition(sb, RG2Group.UserEntities); UserQueryLogic.RegisterRoleTypeCondition(sb, RG2Group.RoleEntities); UserQueryLogic.RegisterTranslatableRoutes(); ChartLogic.Start(sb, googleMapsChartScripts: false /*requires Google Maps API key in ChartClient */); UserChartLogic.RegisterUserTypeCondition(sb, RG2Group.UserEntities); UserChartLogic.RegisterRoleTypeCondition(sb, RG2Group.RoleEntities); UserChartLogic.RegisterTranslatableRoutes(); DashboardLogic.Start(sb); DashboardLogic.RegisterUserTypeCondition(sb, RG2Group.UserEntities); DashboardLogic.RegisterRoleTypeCondition(sb, RG2Group.RoleEntities); DashboardLogic.RegisterTranslatableRoutes(); ViewLogLogic.Start(sb, new HashSet <Type> { typeof(UserQueryEntity), typeof(UserChartEntity), typeof(DashboardEntity) }); DiffLogLogic.Start(sb, registerAll: true); ExcelLogic.Start(sb, excelReport: true); ToolbarLogic.Start(sb); ToolbarLogic.RegisterTranslatableRoutes(); FileLogic.Start(sb); TranslationLogic.Start(sb, countLocalizationHits: false); TranslatedInstanceLogic.Start(sb, () => CultureInfo.GetCultureInfo("en")); HelpLogic.Start(sb); WordTemplateLogic.Start(sb); MapLogic.Start(sb); RestLogLogic.Start(sb); RestApiKeyLogic.Start(sb); WorkflowLogicStarter.Start(sb, () => Starter.Configuration.Value.Workflow); ProfilerLogic.Start(sb, timeTracker: true, heavyProfiler: true, overrideSessionTimeout: true); // RG2 modules EmployeeLogic.Start(sb); ProductLogic.Start(sb); CustomerLogic.Start(sb); OrderLogic.Start(sb); ShipperLogic.Start(sb); ItemLogic.Start(sb); ItemCategoryLogic.Start(sb); StartRG2Configuration(sb); TypeConditionLogic.Register <OrderEntity>(RG2Group.UserEntities, o => o.Employee == EmployeeEntity.Current); TypeConditionLogic.Register <EmployeeEntity>(RG2Group.UserEntities, e => EmployeeEntity.Current.Is(e)); TypeConditionLogic.Register <OrderEntity>(RG2Group.CurrentCustomer, o => o.Customer == CustomerEntity.Current); TypeConditionLogic.Register <PersonEntity>(RG2Group.CurrentCustomer, o => o == CustomerEntity.Current); TypeConditionLogic.Register <CompanyEntity>(RG2Group.CurrentCustomer, o => o == CustomerEntity.Current); if (includeDynamic)//2 { DynamicLogic.StartDynamicModules(sb); }//2 SetupCache(sb); Schema.Current.OnSchemaCompleted(); if (includeDynamic)//3 { DynamicLogic.RegisterExceptionIfAny(); }//3 } }
public static void Start(string connectionString, bool isPostgres, string?azureStorageConnectionString, string?broadcastSecret, string?broadcastUrls, bool includeDynamic = true, bool detectSqlVersion = true) { AzureStorageConnectionString = azureStorageConnectionString; using (HeavyProfiler.Log("Start")) using (var initial = HeavyProfiler.Log("Initial")) { StartParameters.IgnoredDatabaseMismatches = new List <Exception>(); StartParameters.IgnoredCodeErrors = new List <Exception>(); string?logDatabase = Connector.TryExtractDatabaseNameWithPostfix(ref connectionString, "_Log"); SchemaBuilder sb = new CustomSchemaBuilder { LogDatabaseName = logDatabase, Tracer = initial }; sb.Schema.Version = typeof(Starter).Assembly.GetName().Version !; sb.Schema.ForceCultureInfo = CultureInfo.GetCultureInfo("en-US"); MixinDeclarations.Register <OperationLogEntity, DiffLogMixin>(); MixinDeclarations.Register <UserEntity, UserEmployeeMixin>(); MixinDeclarations.Register <OrderDetailEmbedded, OrderDetailMixin>(); MixinDeclarations.Register <BigStringEmbedded, BigStringMixin>(); ConfigureBigString(sb); OverrideAttributes(sb); if (!isPostgres) { var sqlVersion = detectSqlVersion ? SqlServerVersionDetector.Detect(connectionString) : SqlServerVersion.AzureSQL; Connector.Default = new SqlServerConnector(connectionString, sb.Schema, sqlVersion !.Value); } else { var postgreeVersion = detectSqlVersion ? PostgresVersionDetector.Detect(connectionString) : null; Connector.Default = new PostgreSqlConnector(connectionString, sb.Schema, postgreeVersion); } CacheLogic.Start(sb, serverBroadcast: sb.Settings.IsPostgres ? new PostgresBroadcast() : broadcastSecret != null && broadcastUrls != null ? new SimpleHttpBroadcast(broadcastSecret, broadcastUrls) : null);/*Cache*/ /* LightDynamic * DynamicLogic.Start(sb, withCodeGen: false); * LightDynamic */ DynamicLogicStarter.Start(sb); if (includeDynamic)//Dynamic { DynamicLogic.CompileDynamicCode(); DynamicLogic.RegisterMixins(); DynamicLogic.BeforeSchema(sb); }//Dynamic // Framework modules TypeLogic.Start(sb); OperationLogic.Start(sb); ExceptionLogic.Start(sb); QueryLogic.Start(sb); // Extensions modules MigrationLogic.Start(sb); CultureInfoLogic.Start(sb); FilePathEmbeddedLogic.Start(sb); BigStringLogic.Start(sb); EmailLogic.Start(sb, () => Configuration.Value.Email, (template, target, message) => Configuration.Value.EmailSender); AuthLogic.Start(sb, "System", "Anonymous"); /* null); anonymous*/ AuthLogic.Authorizer = new SouthwindAuthorizer(() => Configuration.Value.ActiveDirectory); AuthLogic.StartAllModules(sb, activeDirectoryIntegration: true); AzureADLogic.Start(sb, adGroups: true, deactivateUsersTask: true); ResetPasswordRequestLogic.Start(sb); UserTicketLogic.Start(sb); SessionLogLogic.Start(sb); TypeConditionLogic.RegisterCompile <UserEntity>(SouthwindTypeCondition.UserEntities, u => u.Is(UserEntity.Current)); ProcessLogic.Start(sb); PackageLogic.Start(sb, packages: true, packageOperations: true); SchedulerLogic.Start(sb); OmniboxLogic.Start(sb); UserQueryLogic.Start(sb); UserQueryLogic.RegisterUserTypeCondition(sb, SouthwindTypeCondition.UserEntities); UserQueryLogic.RegisterRoleTypeCondition(sb, SouthwindTypeCondition.RoleEntities); UserQueryLogic.RegisterTranslatableRoutes(); ChartLogic.Start(sb, googleMapsChartScripts: false /*requires Google Maps API key in ChartClient */); UserChartLogic.RegisterUserTypeCondition(sb, SouthwindTypeCondition.UserEntities); UserChartLogic.RegisterRoleTypeCondition(sb, SouthwindTypeCondition.RoleEntities); UserChartLogic.RegisterTranslatableRoutes(); DashboardLogic.Start(sb, GetFileTypeAlgorithm(p => p.CachedQueryFolder)); DashboardLogic.RegisterUserTypeCondition(sb, SouthwindTypeCondition.UserEntities); DashboardLogic.RegisterRoleTypeCondition(sb, SouthwindTypeCondition.RoleEntities); DashboardLogic.RegisterTranslatableRoutes(); ViewLogLogic.Start(sb, new HashSet <Type> { typeof(UserQueryEntity), typeof(UserChartEntity), typeof(DashboardEntity) }); SystemEventLogLogic.Start(sb); DiffLogLogic.Start(sb, registerAll: true); ExcelLogic.Start(sb, excelReport: true); ToolbarLogic.Start(sb); ToolbarLogic.RegisterTranslatableRoutes(); SMSLogic.Start(sb, null, () => Configuration.Value.Sms); NoteLogic.Start(sb, typeof(UserEntity), /*Note*/ typeof(OrderEntity)); AlertLogic.Start(sb, typeof(UserEntity), /*Alert*/ typeof(OrderEntity)); FileLogic.Start(sb); TranslationLogic.Start(sb, countLocalizationHits: false); TranslatedInstanceLogic.Start(sb, () => CultureInfo.GetCultureInfo("en")); HelpLogic.Start(sb); WordTemplateLogic.Start(sb); MapLogic.Start(sb); PredictorLogic.Start(sb, GetFileTypeAlgorithm(p => p.PredictorModelFolder)); PredictorLogic.RegisterAlgorithm(TensorFlowPredictorAlgorithm.NeuralNetworkGraph, new TensorFlowNeuralNetworkPredictor()); PredictorLogic.RegisterPublication(ProductPredictorPublication.MonthlySales, new PublicationSettings(typeof(OrderEntity))); RestLogLogic.Start(sb); RestApiKeyLogic.Start(sb); WorkflowLogicStarter.Start(sb, () => Starter.Configuration.Value.Workflow); ProfilerLogic.Start(sb, timeTracker: true, heavyProfiler: true, overrideSessionTimeout: true); // Southwind modules EmployeeLogic.Start(sb); ProductLogic.Start(sb); CustomerLogic.Start(sb); OrderLogic.Start(sb); ShipperLogic.Start(sb); StartSouthwindConfiguration(sb); TypeConditionLogic.Register <OrderEntity>(SouthwindTypeCondition.CurrentEmployee, o => o.Employee.Is(EmployeeEntity.Current)); if (includeDynamic)//2 { DynamicLogic.StartDynamicModules(sb); }//2 SetupCache(sb); Schema.Current.OnSchemaCompleted(); if (includeDynamic)//3 { DynamicLogic.RegisterExceptionIfAny(); }//3 } }
public static void Start(SchemaBuilder sb, IFileTypeAlgorithm predictorFileAlgorithm) { if (sb.NotDefined(MethodInfo.GetCurrentMethod())) { sb.Settings.AssertIgnored((PredictorEntity p) => p.MainQuery.Filters.Single().Pinned, "use PredictorLogic", "by calling PredictorLogic.IgnorePinned in Starter.OverrideAttributes"); sb.Settings.AssertIgnored((PredictorSubQueryEntity p) => p.Filters.Single().Pinned, "use PredictorLogic", "by calling PredictorLogic.IgnorePinned in Starter.OverrideAttributes"); sb.Include <PredictorEntity>() .WithVirtualMList(p => p.SubQueries, mc => mc.Predictor) .WithQuery(() => e => new { Entity = e, e.Id, e.Name, e.MainQuery.Query, e.Algorithm, e.State, e.TrainingException, }); PredictorGraph.Register(); sb.Include <PredictorSubQueryEntity>() .WithQuery(() => e => new { Entity = e, e.Id, e.Name, e.Query, e.Predictor }); sb.Include <PredictorCodificationEntity>() .WithUniqueIndex(pc => new { pc.Predictor, pc.Index, pc.Usage }) .WithExpressionFrom((PredictorEntity e) => e.Codifications()) .WithQuery(() => e => new { Entity = e, e.Id, e.Predictor, e.Index, e.Usage, e.OriginalColumnIndex, e.SubQueryIndex, e.SplitKey0, e.SplitKey1, e.SplitKey2, e.IsValue, e.Min, e.Max, e.Average, e.StdDev, }); sb.Include <PredictorEpochProgressEntity>() .WithExpressionFrom((PredictorEntity e) => e.EpochProgresses()) .WithQuery(() => e => new { Entity = e, e.Predictor, e.Id, e.Epoch, e.Ellapsed, e.LossTraining, e.AccuracyTraining, e.LossValidation, e.AccuracyValidation, }); FileTypeLogic.Register(PredictorFileType.PredictorFile, predictorFileAlgorithm); SymbolLogic <PredictorAlgorithmSymbol> .Start(sb, () => Algorithms.Keys); SymbolLogic <PredictorColumnEncodingSymbol> .Start(sb, () => Algorithms.Values.SelectMany(a => a.GetRegisteredEncodingSymbols()).Distinct()); SymbolLogic <PredictorResultSaverSymbol> .Start(sb, () => ResultSavers.Keys); SymbolLogic <PredictorPublicationSymbol> .Start(sb, () => Publications.Keys); sb.Schema.EntityEvents <PredictorEntity>().Retrieved += PredictorEntity_Retrieved; sb.Schema.EntityEvents <PredictorSubQueryEntity>().Retrieved += PredictorMultiColumnEntity_Retrieved; Validator.PropertyValidator((PredictorColumnEmbedded c) => c.Encoding).StaticPropertyValidation += Column_StaticPropertyValidation; Validator.PropertyValidator((PredictorSubQueryColumnEmbedded c) => c.Token).StaticPropertyValidation += GroupKey_StaticPropertyValidation; Validator.PropertyValidator((PredictorSubQueryEntity c) => c.Columns).StaticPropertyValidation += SubQueryColumns_StaticPropertyValidation; sb.Include <PredictSimpleResultEntity>() .WithQuery(() => e => new { Entity = e, e.Id, e.Predictor, e.Target, e.Type, e.OriginalValue, e.PredictedValue, e.OriginalCategory, e.PredictedCategory, }); RegisterResultSaver(PredictorSimpleResultSaver.StatisticsOnly, new PredictorSimpleSaver { SaveAllResults = false }); RegisterResultSaver(PredictorSimpleResultSaver.Full, new PredictorSimpleSaver { SaveAllResults = true }); sb.Schema.EntityEvents <PredictorEntity>().PreUnsafeDelete += query => { Database.Query <PredictSimpleResultEntity>().Where(a => query.Contains(a.Predictor.Entity)).UnsafeDelete(); return(null); }; sb.Schema.WhenIncluded <ProcessEntity>(() => { sb.Schema.Settings.AssertImplementedBy((ProcessEntity p) => p.Data, typeof(PredictorEntity)); sb.Schema.Settings.AssertImplementedBy((ProcessEntity p) => p.Data, typeof(AutoconfigureNeuralNetworkEntity)); ProcessLogic.Register(PredictorProcessAlgorithm.AutoconfigureNeuralNetwork, new AutoconfigureNeuralNetworkAlgorithm()); new Graph <ProcessEntity> .ConstructFrom <PredictorEntity>(PredictorOperation.AutoconfigureNetwork) { CanConstruct = p => p.AlgorithmSettings is NeuralNetworkSettingsEntity ? null : ValidationMessage._0ShouldBeOfType1.NiceToString(p.NicePropertyName(_ => _.AlgorithmSettings), typeof(NeuralNetworkSettingsEntity).NiceName()), Construct = (p, _) => { return(ProcessLogic.Create(PredictorProcessAlgorithm.AutoconfigureNeuralNetwork, new AutoconfigureNeuralNetworkEntity { InitialPredictor = p.ToLite() })); } }.Register(); }); } }
public static void Start(string connectionString) { string logDatabase = Connector.TryExtractDatabaseNameWithPostfix(ref connectionString, "_Log"); SchemaBuilder sb = new SchemaBuilder(); sb.Schema.Version = typeof(Starter).Assembly.GetName().Version; sb.Schema.ForceCultureInfo = CultureInfo.GetCultureInfo("en-US"); MixinDeclarations.Register <OperationLogEntity, DiffLogMixin>(); MixinDeclarations.Register <UserEntity, UserEmployeeMixin>(); OverrideAttributes(sb); SetupDisconnectedStrategies(sb); DynamicQueryManager dqm = new DynamicQueryManager(); Connector.Default = new SqlConnector(connectionString, sb.Schema, dqm, SqlServerVersion.SqlServer2012); CacheLogic.Start(sb); TypeLogic.Start(sb, dqm); OperationLogic.Start(sb, dqm); MigrationLogic.Start(sb, dqm); CultureInfoLogic.Start(sb, dqm); EmbeddedFilePathLogic.Start(sb, dqm); SmtpConfigurationLogic.Start(sb, dqm); EmailLogic.Start(sb, dqm, () => Configuration.Value.Email, et => Configuration.Value.SmtpConfiguration); AuthLogic.Start(sb, dqm, "System", null); AuthLogic.StartAllModules(sb, dqm); ResetPasswordRequestLogic.Start(sb, dqm); UserTicketLogic.Start(sb, dqm); SessionLogLogic.Start(sb, dqm); ProcessLogic.Start(sb, dqm); PackageLogic.Start(sb, dqm, packages: true, packageOperations: true); MapLogic.Start(sb, dqm); SchedulerLogic.Start(sb, dqm); QueryLogic.Start(sb); UserQueryLogic.Start(sb, dqm); UserQueryLogic.RegisterUserTypeCondition(sb, SouthwindGroup.UserEntities); UserQueryLogic.RegisterRoleTypeCondition(sb, SouthwindGroup.RoleEntities); ChartLogic.Start(sb, dqm); UserChartLogic.RegisterUserTypeCondition(sb, SouthwindGroup.UserEntities); UserChartLogic.RegisterRoleTypeCondition(sb, SouthwindGroup.RoleEntities); DashboardLogic.Start(sb, dqm); DashboardLogic.RegisterUserTypeCondition(sb, SouthwindGroup.UserEntities); DashboardLogic.RegisterRoleTypeCondition(sb, SouthwindGroup.RoleEntities); ViewLogLogic.Start(sb, dqm, new HashSet <Type> { typeof(UserQueryEntity), typeof(UserChartEntity), typeof(DashboardEntity) }); DiffLogLogic.Start(sb, dqm); ExceptionLogic.Start(sb, dqm); SMSLogic.Start(sb, dqm, null, () => Configuration.Value.Sms); SMSLogic.RegisterPhoneNumberProvider <PersonEntity>(p => p.Phone, p => null); SMSLogic.RegisterDataObjectProvider((PersonEntity p) => new { p.FirstName, p.LastName, p.Title, p.DateOfBirth }); SMSLogic.RegisterPhoneNumberProvider <CompanyEntity>(p => p.Phone, p => null); NoteLogic.Start(sb, dqm, typeof(UserEntity), /*Note*/ typeof(OrderEntity)); AlertLogic.Start(sb, dqm, typeof(UserEntity), /*Alert*/ typeof(OrderEntity)); FileLogic.Start(sb, dqm); TranslationLogic.Start(sb, dqm); TranslatedInstanceLogic.Start(sb, dqm, () => CultureInfo.GetCultureInfo("en")); HelpLogic.Start(sb, dqm); WordTemplateLogic.Start(sb, dqm); EmployeeLogic.Start(sb, dqm); ProductLogic.Start(sb, dqm); CustomerLogic.Start(sb, dqm); OrderLogic.Start(sb, dqm); ShipperLogic.Start(sb, dqm); StartSouthwindConfiguration(sb, dqm); TypeConditionLogic.Register <OrderEntity>(SouthwindGroup.UserEntities, o => o.Employee.RefersTo(EmployeeEntity.Current)); TypeConditionLogic.Register <EmployeeEntity>(SouthwindGroup.UserEntities, e => e == EmployeeEntity.Current); TypeConditionLogic.Register <OrderEntity>(SouthwindGroup.CurrentCustomer, o => o.Customer == CustomerEntity.Current); TypeConditionLogic.Register <PersonEntity>(SouthwindGroup.CurrentCustomer, o => o == CustomerEntity.Current); TypeConditionLogic.Register <CompanyEntity>(SouthwindGroup.CurrentCustomer, o => o == CustomerEntity.Current); DisconnectedLogic.Start(sb, dqm); DisconnectedLogic.BackupFolder = @"D:\SouthwindTemp\Backups"; DisconnectedLogic.BackupNetworkFolder = @"D:\SouthwindTemp\Backups"; DisconnectedLogic.DatabaseFolder = @"D:\SouthwindTemp\Database"; ProfilerLogic.Start(sb, dqm, timeTracker: true, heavyProfiler: true, overrideSessionTimeout: true); SetupCache(sb); SetSchemaNames(Schema.Current); if (logDatabase.HasText()) { SetLogDatabase(sb.Schema, new DatabaseName(null, logDatabase)); } Schema.Current.OnSchemaCompleted(); }
public static void StartRunningProcesses() { if (running) { throw new InvalidOperationException("ProcessLogic is running"); } using (ExecutionContext.SuppressFlow()) Task.Factory.StartNew(() => { var database = Schema.Current.Table(typeof(ProcessEntity)).Name.Schema?.Database; SystemEventLogLogic.Log("Start ProcessRunner"); ExceptionEntity?exception = null; using (AuthLogic.Disable()) { try { running = true; (from p in Database.Query <ProcessEntity>() where p.IsMine() && (p.State == ProcessState.Executing || p.State == ProcessState.Suspending || p.State == ProcessState.Suspended) || p.IsShared() && p.State == ProcessState.Suspended select p).SetAsQueued(); CancelNewProcesses = new CancellationTokenSource(); autoResetEvent.Set(); timerNextExecution = new Timer(ob => WakeUp("TimerNextExecution", null), // main timer null, Timeout.Infinite, Timeout.Infinite); if (!CacheLogic.WithSqlDependency) { timerPeriodic = new Timer(ob => WakeUp("TimerPeriodic", null), null, PoolingPeriodMilliseconds, PoolingPeriodMilliseconds); } while (autoResetEvent.WaitOne()) { if (CancelNewProcesses.IsCancellationRequested) { return; } using (HeavyProfiler.Log("PWL", () => "Process Runner")) { (from p in Database.Query <ProcessEntity>() where p.State == ProcessState.Planned && p.PlannedDate <= Clock.Now select p).SetAsQueued(); var list = Database.Query <ProcessEntity>() .Where(p => p.IsMine() || p.IsShared()) .Where(p => p.State == ProcessState.Planned) .Select(p => p.PlannedDate) .ToListWakeup("Planned dependency"); SetNextPannedExecution(list.Min()); lock (executing) { int remaining = MaxDegreeOfParallelism - executing.Count; if (remaining > 0) { retry: var queued = Database.Query <ProcessEntity>() .Where(p => p.State == ProcessState.Queued) .Where(p => p.IsMine() || p.IsShared()) .Select(a => new { Process = a.ToLite(), a.QueuedDate, a.MachineName }) .ToListWakeup("Planned dependency"); var afordable = queued .OrderByDescending(p => p.MachineName == Environment.MachineName) .OrderBy(a => a.QueuedDate) .Take(remaining).ToList(); var taken = afordable.Where(p => p.MachineName == ProcessEntity.None).Select(a => a.Process).ToList(); if (taken.Any()) { using (var tr = Transaction.ForceNew()) { Database.Query <ProcessEntity>() .Where(p => taken.Contains(p.ToLite()) && p.MachineName == ProcessEntity.None) .UnsafeUpdate() .Set(p => p.MachineName, p => Environment.MachineName) .Set(p => p.ApplicationName, p => Schema.Current.ApplicationName) .Execute(); tr.Commit(); } goto retry; } foreach (var pair in afordable) { ProcessEntity pro = pair.Process !.RetrieveAndRemember(); IProcessAlgorithm algorithm = ProcessLogic.GetProcessAlgorithm(pro.Algorithm); ExecutingProcess executingProcess = new ExecutingProcess(algorithm, pro); executing.Add(pro.ToLite(), executingProcess); executingProcess.TakeForThisMachine(); using (ExecutionContext.SuppressFlow()) Task.Run(() => { try { executingProcess.Execute(); } catch (Exception ex) { try { ex.LogException(edn => { edn.ControllerName = "ProcessWorker"; edn.ActionName = executingProcess.CurrentProcess.ToLite().Key(); }); } catch { } } finally { lock (executing) { executing.Remove(pro.ToLite()); WakeUp("Process ended", null); } } }); } var suspending = Database.Query <ProcessEntity>() .Where(p => p.State == ProcessState.Suspending) .Where(p => p.IsMine()) .Select(a => a.ToLite()) .ToListWakeup("Suspending dependency"); foreach (var s in suspending) { ExecutingProcess execProc = executing.GetOrThrow(s); if (execProc.CurrentProcess.State != ProcessState.Finished) { execProc.CurrentProcess = s.RetrieveAndRemember(); execProc.CancelationSource.Cancel(); } } } } } } } catch (ThreadAbortException) { //Ignore } catch (Exception e) { try { exception = e.LogException(edn => { edn.ControllerName = "ProcessWorker"; edn.ActionName = "MainLoop"; }); } catch { } } finally { lock (executing) executing.Clear(); SystemEventLogLogic.Log("Stop ProcessRunner", exception); running = false; } } }, TaskCreationOptions.LongRunning); }
public static void Register() { GetState = o => o.State; new Construct(OrderOperation.Create) { ToStates = { OrderState.New }, Construct = (args) => { var customer = args.TryGetArgC <Lite <CustomerEntity> >()?.Retrieve(); return(new OrderEntity { Customer = customer, ShipAddress = customer?.Address.Clone(), State = OrderState.New, Employee = EmployeeEntity.Current, RequiredDate = DateTime.Now.AddDays(3), }); } }.Register(); new ConstructFrom <CustomerEntity>(OrderOperation.CreateOrderFromCustomer) { ToStates = { OrderState.New }, Construct = (c, _) => new OrderEntity { State = OrderState.New, Customer = c, Employee = EmployeeEntity.Current, ShipAddress = c.Address, RequiredDate = DateTime.Now.AddDays(3), } }.Register(); new ConstructFromMany <ProductEntity>(OrderOperation.CreateOrderFromProducts) { ToStates = { OrderState.New }, Construct = (prods, args) => { var dic = Database.Query <ProductEntity>() .Where(p => prods.Contains(p.ToLite())) .Select(p => new KeyValuePair <Lite <ProductEntity>, decimal>(p.ToLite(), p.UnitPrice)).ToDictionary(); var customer = args.TryGetArgC <Lite <CustomerEntity> >()?.Retrieve(); return(new OrderEntity { Customer = customer, ShipAddress = customer?.Address.Clone(), State = OrderState.New, Employee = EmployeeEntity.Current, RequiredDate = DateTime.Now.AddDays(3), Details = prods.Select(p => new OrderDetailEmbedded { Product = p, UnitPrice = dic[p], Quantity = 1, }).ToMList() }); } }.Register(); new Graph <ProcessEntity> .ConstructFromMany <OrderEntity>(OrderOperation.CancelWithProcess) { Construct = (orders, _) => { return(ProcessLogic.Create(OrderProcess.CancelOrders, new PackageEntity().CreateLines(orders))); } } .Register(); new Execute(OrderOperation.SaveNew) { FromStates = { OrderState.New }, ToStates = { OrderState.Ordered }, CanBeNew = true, CanBeModified = true, Execute = (o, args) => { o.OrderDate = DateTime.Now; o.State = OrderState.Ordered; } }.Register(); new Execute(OrderOperation.Save) { FromStates = { OrderState.Ordered }, ToStates = { OrderState.Ordered }, CanBeModified = true, Execute = (o, _) => { } }.Register(); new Execute(OrderOperation.Ship) { CanExecute = o => o.Details.IsEmpty() ? "No order lines" : null, FromStates = { OrderState.Ordered }, ToStates = { OrderState.Shipped }, CanBeModified = true, Execute = (o, args) => { o.ShippedDate = args.TryGetArgS <DateTime>() ?? DateTime.Now; o.State = OrderState.Shipped; } }.Register(); new Execute(OrderOperation.Cancel) { FromStates = { OrderState.Ordered, OrderState.Shipped }, ToStates = { OrderState.Canceled }, Execute = (o, args) => { o.CancelationDate = DateTime.Now; o.State = OrderState.Canceled; } }.Register(); new Delete(OrderOperation.Delete) { FromStates = { OrderState.Ordered }, Delete = (o, args) => { o.Delete(); } }.Register(); }
public static void RegisterDataObjectProvider <T, A>(Expression <Func <T, A> > func) where T : Entity { dataObjectProviders[typeof(T)] = func; new Graph <ProcessEntity> .ConstructFromMany <T>(SMSMessageOperation.SendSMSMessagesFromTemplate) { Construct = (providers, args) => { var template = args.GetArg <SMSTemplateEntity>(); if (TypeLogic.EntityToType[template.AssociatedType] != typeof(T)) { throw new ArgumentException("The SMS template is associated with the type {0} instead of {1}" .FormatWith(template.AssociatedType.FullClassName, typeof(T).FullName)); } var phoneFunc = (Expression <Func <T, string> >)phoneNumberProviders .GetOrThrow(typeof(T), "{0} is not registered as PhoneNumberProvider".FormatWith(typeof(T).NiceName())); var cultureFunc = (Expression <Func <T, CultureInfo> >)cultureProviders .GetOrThrow(typeof(T), "{0} is not registered as CultureProvider".FormatWith(typeof(T).NiceName())); var numbers = Database.Query <T>().Where(p => providers.Contains(p.ToLite())) .Select(p => new { Phone = phoneFunc.Evaluate(p), Data = func.Evaluate(p), Referred = p.ToLite(), Culture = cultureFunc.Evaluate(p) }).Where(n => n.Phone.HasText()).AsEnumerable().ToList(); var splitdNumbers = (from p in numbers.Where(p => p.Phone.Contains(',')) from n in p.Phone.Split(',') select new { Phone = n.Trim(), p.Data, p.Referred, p.Culture }).Concat(numbers.Where(p => !p.Phone.Contains(','))).Distinct().ToList(); numbers = splitdNumbers; SMSSendPackageEntity package = new SMSSendPackageEntity().Save(); var packLite = package.ToLite(); using (OperationLogic.AllowSave <SMSMessageEntity>()) { numbers.Select(n => new SMSMessageEntity { Message = template.ComposeMessage(n.Data, n.Culture), EditableMessage = template.EditableMessage, From = template.From, DestinationNumber = n.Phone, SendPackage = packLite, State = SMSMessageState.Created, Referred = n.Referred }).SaveList(); } var process = ProcessLogic.Create(SMSMessageProcess.Send, package); process.Execute(ProcessOperation.Execute); return(process); } } .Register(); new Graph <SMSMessageEntity> .ConstructFrom <T>(SMSMessageOperation.CreateSMSWithTemplateFromEntity) { Construct = (provider, args) => { var template = args.GetArg <SMSTemplateEntity>(); if (template.AssociatedType != null && TypeLogic.EntityToType[template.AssociatedType] != typeof(T)) { throw new ArgumentException("The SMS template is associated with the type {0} instead of {1}" .FormatWith(template.AssociatedType.FullClassName, typeof(T).FullName)); } return(new SMSMessageEntity { Message = template.ComposeMessage(func.Evaluate(provider), GetCulture(provider)), EditableMessage = template.EditableMessage, From = template.From, DestinationNumber = GetPhoneNumber(provider), State = SMSMessageState.Created, Referred = provider.ToLite(), Certified = template.Certified }); } } .Register(); }
public static void Register() { GetState = n => n.State; new ConstructFrom <NewsletterEntity>(NewsletterOperation.Clone) { ToStates = { NewsletterState.Created }, Construct = (n, _) => new NewsletterEntity { Name = n.Name, From = n.From, DisplayFrom = n.DisplayFrom, Query = n.Query, Subject = n.Subject, Text = n.Text, } }.Register(); new Execute(NewsletterOperation.Save) { CanBeNew = true, CanBeModified = true, FromStates = { NewsletterState.Created, NewsletterState.Saved }, ToStates = { NewsletterState.Saved }, Execute = (n, _) => n.State = NewsletterState.Saved }.Register(); new Execute(NewsletterOperation.AddRecipients) { FromStates = { NewsletterState.Saved }, ToStates = { NewsletterState.Saved }, Execute = (n, args) => { var p = args.GetArg <List <Lite <IEmailOwnerEntity> > >(); var existent = Database.Query <NewsletterDeliveryEntity>().Where(d => d.Newsletter.Is(n)).Select(d => d.Recipient).ToList(); p.Except(existent).Select(ie => new NewsletterDeliveryEntity { Recipient = ie, Newsletter = n.ToLite() }).ToList().SaveList(); n.State = NewsletterState.Saved; } }.Register(); new Execute(NewsletterOperation.RemoveRecipients) { FromStates = { NewsletterState.Saved }, ToStates = { NewsletterState.Saved }, Execute = (n, args) => { var p = args.GetArg <List <Lite <NewsletterDeliveryEntity> > >(); foreach (var nd in p.GroupsOf(20)) { Database.DeleteList(nd); } n.State = NewsletterState.Saved; } }.Register(); new Graph <ProcessEntity> .ConstructFrom <NewsletterEntity>(NewsletterOperation.Send) { CanConstruct = n => { if (n.Subject.IsNullOrEmpty()) { return("Subject must be set"); } if (n.Text.IsNullOrEmpty()) { return("Text must be set"); } if (!Database.Query <NewsletterDeliveryEntity>().Any(d => d.Newsletter.Is(n))) { return("There is not any delivery for this newsletter"); } return(null); }, Construct = (n, _) => ProcessLogic.Create(NewsletterProcess.SendNewsletter, n) } .Register(); }
public static void Start(string connectionString, bool includeDynamic = true) { using (HeavyProfiler.Log("Start")) using (var initial = HeavyProfiler.Log("Initial")) { string? logDatabase = Connector.TryExtractDatabaseNameWithPostfix(ref connectionString, "_Log"); SchemaBuilder sb = new CustomSchemaBuilder { LogDatabaseName = logDatabase, Tracer = initial }; sb.Schema.Version = typeof(Starter).Assembly.GetName().Version!; sb.Schema.ForceCultureInfo = CultureInfo.GetCultureInfo("en-US"); MixinDeclarations.Register<OperationLogEntity, DiffLogMixin>(); MixinDeclarations.Register<UserEntity, UserEmployeeMixin>(); OverrideAttributes(sb); var detector = SqlServerVersionDetector.Detect(connectionString); Connector.Default = new SqlConnector(connectionString, sb.Schema, detector!.Value); CacheLogic.Start(sb); } TypeLogic.Start(sb); OperationLogic.Start(sb); ExceptionLogic.Start(sb); MigrationLogic.Start(sb); CultureInfoLogic.Start(sb); FilePathEmbeddedLogic.Start(sb); EmailLogic.Start(sb, () => Configuration.Value.Email, (et, target) => Configuration.Value.EmailSender); AuthLogic.Start(sb, "System", null); AuthLogic.StartAllModules(sb); ResetPasswordRequestLogic.Start(sb); UserTicketLogic.Start(sb); ProcessLogic.Start(sb); PackageLogic.Start(sb, packages: true, packageOperations: true); SchedulerLogic.Start(sb); QueryLogic.Start(sb); UserQueryLogic.Start(sb); UserQueryLogic.RegisterUserTypeCondition(sb, AtTestGroup.UserEntities); UserQueryLogic.RegisterRoleTypeCondition(sb, AtTestGroup.RoleEntities); ChartLogic.Start(sb); UserChartLogic.RegisterUserTypeCondition(sb, AtTestGroup.UserEntities); UserChartLogic.RegisterRoleTypeCondition(sb, AtTestGroup.RoleEntities); DashboardLogic.Start(sb); DashboardLogic.RegisterUserTypeCondition(sb, AtTestGroup.UserEntities); DashboardLogic.RegisterRoleTypeCondition(sb, AtTestGroup.RoleEntities); ViewLogLogic.Start(sb, new HashSet<Type> { typeof(UserQueryEntity), typeof(UserChartEntity), typeof(DashboardEntity) }); DiffLogLogic.Start(sb, registerAll: true); ExcelLogic.Start(sb, excelReport: true); ToolbarLogic.Start(sb); FileLogic.Start(sb); TranslationLogic.Start(sb, countLocalizationHits: false); TranslatedInstanceLogic.Start(sb, () => CultureInfo.GetCultureInfo("en")); WordTemplateLogic.Start(sb); MapLogic.Start(sb); PredictorLogic.Start(sb, () => new FileTypeAlgorithm(f => new PrefixPair(Starter.Configuration.Value.Folders.PredictorModelFolder))); PredictorLogic.RegisterAlgorithm(CNTKPredictorAlgorithm.NeuralNetwork, new CNTKNeuralNetworkPredictorAlgorithm()); PredictorLogic.RegisterPublication(ProductPredictorPublication.MonthlySales, new PublicationSettings(typeof(OrderEntity))); EmployeeLogic.Start(sb); ProductLogic.Start(sb); CustomerLogic.Start(sb); OrderLogic.Start(sb); ShipperLogic.Start(sb); StartAtTestConfiguration(sb); TypeConditionLogic.Register<OrderEntity>(AtTestGroup.UserEntities, o => o.Employee == EmployeeEntity.Current); TypeConditionLogic.Register<EmployeeEntity>(AtTestGroup.UserEntities, e => EmployeeEntity.Current.Is(e)); TypeConditionLogic.Register<OrderEntity>(AtTestGroup.CurrentCustomer, o => o.Customer == CustomerEntity.Current); TypeConditionLogic.Register<PersonEntity>(AtTestGroup.CurrentCustomer, o => o == CustomerEntity.Current); TypeConditionLogic.Register<CompanyEntity>(AtTestGroup.CurrentCustomer, o => o == CustomerEntity.Current); ProfilerLogic.Start(sb, timeTracker: true, heavyProfiler: true, overrideSessionTimeout: true); if (includeDynamic) { } SetupCache(sb); Schema.Current.OnSchemaCompleted(); }
/// <summary> /// Public constructor of render person controller class /// </summary> public RenderPersonController() { processLogic = new ProcessLogic(); }
public static void Start(SchemaBuilder sb, bool packages, bool packageOperations) { if (sb.NotDefined(MethodInfo.GetCurrentMethod())) { ProcessLogic.AssertStarted(sb); sb.Settings.AssertImplementedBy((ProcessExceptionLineEntity pel) => pel.Line, typeof(PackageLineEntity)); sb.Include <PackageLineEntity>() .WithQuery(() => pl => new { Entity = pl, pl.Package, pl.Id, pl.Target, pl.Result, pl.FinishTime, }); QueryLogic.Queries.Register(PackageQuery.PackageLineLastProcess, () => from pl in Database.Query <PackageLineEntity>() let p = pl.Package.Entity.LastProcess() select new { Entity = pl, pl.Package, pl.Id, pl.Target, pl.Result, pl.FinishTime, LastProcess = p, Exception = pl.Exception(p), }); QueryLogic.Expressions.Register((PackageEntity p) => p.Lines(), ProcessMessage.Lines); if (packages) { sb.Settings.AssertImplementedBy((PackageLineEntity pl) => pl.Package, typeof(PackageEntity)); sb.Settings.AssertImplementedBy((ProcessEntity pe) => pe.Data, typeof(PackageEntity)); sb.Include <PackageEntity>() .WithQuery(() => pk => new { Entity = pk, pk.Id, pk.Name, }); QueryLogic.Queries.Register(PackageQuery.PackageLastProcess, () => from pk in Database.Query <PackageEntity>() let pe = pk.LastProcess() select new { Entity = pk, pk.Id, pk.Name, NumLines = pk.Lines().Count(), LastProcess = pe, NumErrors = pk.Lines().Count(l => l.Exception(pe) != null), }); ExceptionLogic.DeleteLogs += ExceptionLogic_DeletePackages <PackageEntity>; } if (packageOperations) { sb.Settings.AssertImplementedBy((PackageLineEntity pl) => pl.Package, typeof(PackageOperationEntity)); sb.Settings.AssertImplementedBy((ProcessEntity pe) => pe.Data, typeof(PackageOperationEntity)); sb.Include <PackageOperationEntity>() .WithQuery(() => pk => new { Entity = pk, pk.Id, pk.Name, pk.Operation, }); QueryLogic.Queries.Register(PackageQuery.PackageOperationLastProcess, () => from p in Database.Query <PackageOperationEntity>() let pe = p.LastProcess() select new { Entity = p, p.Id, p.Name, p.Operation, NumLines = p.Lines().Count(), LastProcess = pe, NumErrors = p.Lines().Count(l => l.Exception(pe) != null), }); ProcessLogic.Register(PackageOperationProcess.PackageOperation, new PackageOperationAlgorithm()); ExceptionLogic.DeleteLogs += ExceptionLogic_DeletePackages <PackageOperationEntity>; } } }