Пример #1
0
        public static void Start(
            SchemaBuilder sb,
            Func <EmailConfigurationEmbedded> getConfiguration,
            Func <EmailTemplateEntity?, Lite <Entity>?, SmtpConfigurationEntity> getSmtpConfiguration,
            Func <EmailMessageEntity, SmtpClient>?getSmtpClient = null,
            IFileTypeAlgorithm?attachment = null)
        {
            if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
            {
                if (getSmtpClient == null && getSmtpConfiguration != null)
                {
                    getSmtpClient = message => getSmtpConfiguration(message.Template?.Let(a => EmailTemplateLogic.EmailTemplatesLazy.Value.GetOrThrow(a)), message.Target).GenerateSmtpClient();
                }

                FilePathEmbeddedLogic.AssertStarted(sb);
                CultureInfoLogic.AssertStarted(sb);
                EmailLogic.getConfiguration = getConfiguration;
                EmailLogic.GetSmtpClient    = getSmtpClient ?? throw new ArgumentNullException(nameof(getSmtpClient));
                EmailTemplateLogic.Start(sb, getSmtpConfiguration);
                if (attachment != null)
                {
                    FileTypeLogic.Register(EmailFileType.Attachment, attachment);
                }

                Schema.Current.WhenIncluded <ProcessEntity>(() => EmailPackageLogic.Start(sb));

                sb.Include <EmailMessageEntity>()
                .WithQuery(() => e => new
                {
                    Entity = e,
                    e.Id,
                    e.State,
                    e.Subject,
                    e.Template,
                    e.Sent,
                    e.Target,
                    e.Package,
                    e.Exception,
                });

                PermissionAuthLogic.RegisterPermissions(AsyncEmailSenderPermission.ViewAsyncEmailSenderPanel);

                SenderManager = new EmailSenderManager();

                EmailGraph.Register();
            }
        }
Пример #2
0
        public static void Start(
            SchemaBuilder sb,
            Func <EmailConfigurationEmbedded> getConfiguration,
            Func <EmailTemplateEntity?, Lite <Entity>?, EmailMessageEntity?, EmailSenderConfigurationEntity> getEmailSenderConfiguration,
            IFileTypeAlgorithm?attachment = null)
        {
            if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
            {
                FilePathEmbeddedLogic.AssertStarted(sb);
                CultureInfoLogic.AssertStarted(sb);
                EmailLogic.getConfiguration = getConfiguration;
                EmailTemplateLogic.Start(sb, getEmailSenderConfiguration);
                EmailSenderConfigurationLogic.Start(sb);
                if (attachment != null)
                {
                    FileTypeLogic.Register(EmailFileType.Attachment, attachment);
                }

                Schema.Current.WhenIncluded <ProcessEntity>(() => EmailPackageLogic.Start(sb));

                sb.Include <EmailMessageEntity>()
                .WithQuery(() => e => new
                {
                    Entity = e,
                    e.Id,
                    e.State,
                    e.Subject,
                    e.Template,
                    e.Sent,
                    e.Target,
                    e.Package,
                    e.Exception,
                });

                PermissionAuthLogic.RegisterPermissions(AsyncEmailSenderPermission.ViewAsyncEmailSenderPanel);

                SenderManager = new EmailSenderManager(getEmailSenderConfiguration);

                EmailGraph.Register();

                QueryLogic.Expressions.Register((EmailPackageEntity a) => a.EmailMessages(), () => typeof(EmailMessageEntity).NicePluralName());

                ExceptionLogic.DeleteLogs += ExceptionLogic_DeleteLogs;
                ExceptionLogic.DeleteLogs += ExceptionLogic_DeletePackages;
            }
        }
Пример #3
0
        public static void Start(SchemaBuilder sb)
        {
            if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
            {
                sb.Include <SendEmailTaskEntity>()
                .WithQuery(() => e => new
                {
                    Entity = e,
                    e.Id,
                    e.Name,
                    e.EmailTemplate,
                    e.UniqueTarget,
                });

                Validator.PropertyValidator((SendEmailTaskEntity er) => er.UniqueTarget).StaticPropertyValidation += (er, pi) =>
                {
                    if (er.UniqueTarget != null && er.TargetsFromUserQuery != null)
                    {
                        return(ValidationMessage._0And1CanNotBeSetAtTheSameTime.NiceToString(pi.NiceName(), ReflectionTools.GetPropertyInfo(() => er.TargetsFromUserQuery).NiceName()));
                    }

                    Implementations?implementations = er.EmailTemplate == null ? null : GetImplementations(er.EmailTemplate.InDB(a => a.Query));
                    if (implementations != null && er.UniqueTarget == null && er.TargetsFromUserQuery == null)
                    {
                        return(ValidationMessage._0IsNotSet.NiceToString(pi.NiceName()));
                    }

                    if (er.UniqueTarget != null)
                    {
                        if (!implementations.Value.Types.Contains(er.UniqueTarget.EntityType))
                        {
                            return(ValidationMessage._0ShouldBeOfType1.NiceToString(pi.NiceName(), implementations.Value.Types.CommaOr(t => t.NiceName())));
                        }
                    }

                    return(null);
                };

                Validator.PropertyValidator((SendEmailTaskEntity er) => er.TargetsFromUserQuery).StaticPropertyValidation += (SendEmailTaskEntity er, PropertyInfo pi) =>
                {
                    Implementations?implementations = er.EmailTemplate == null ? null : GetImplementations(er.EmailTemplate.InDB(a => a.Query));
                    if (implementations != null && er.TargetsFromUserQuery == null && er.UniqueTarget == null)
                    {
                        return(ValidationMessage._0IsNotSet.NiceToString(pi.NiceName()));
                    }

                    if (er.TargetsFromUserQuery != null)
                    {
                        var uqImplementations = GetImplementations(er.TargetsFromUserQuery.InDB(a => a.Query));
                        if (!implementations.Value.Types.Intersect(uqImplementations.Value.Types).Any())
                        {
                            return(ValidationMessage._0ShouldBeOfType1.NiceToString(pi.NiceName(), implementations.Value.Types.CommaOr(t => t.NiceName())));
                        }
                    }

                    return(null);
                };

                new Graph <SendEmailTaskEntity> .Execute(SendEmailTaskOperation.Save)
                {
                    CanBeNew      = true,
                    CanBeModified = true,
                    Execute       = (e, _) => { }
                }

                .Register();

                SchedulerLogic.ExecuteTask.Register((SendEmailTaskEntity er, ScheduledTaskContext ctx) =>
                {
                    if (er.UniqueTarget != null)
                    {
                        ModifiableEntity entity = er.UniqueTarget.RetrieveAndRemember();

                        if (er.ModelConverter != null)
                        {
                            entity = er.ModelConverter.Convert(entity);
                        }

                        Lite <EmailMessageEntity>?last = null;
                        foreach (var email in er.EmailTemplate.CreateEmailMessage(entity))
                        {
                            email.SendMailAsync();
                            last = email.ToLite();
                        }
                        return(last);
                    }
                    else
                    {
                        var qr = er.TargetsFromUserQuery !.RetrieveAndRemember().ToQueryRequest();
                        qr.Columns.Clear();
                        var result = QueryLogic.Queries.ExecuteQuery(qr);

                        var entities = result.Rows.Select(a => a.Entity).ToList();
                        if (entities.IsEmpty())
                        {
                            return(null);
                        }

                        return(EmailPackageLogic.SendMultipleEmailsAsync(er.EmailTemplate, entities, er.ModelConverter).Execute(ProcessOperation.Execute).ToLite());
                    }
                });
            }
        }
Пример #4
0
        public static void Start(SchemaBuilder sb)
        {
            if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
            {
                sb.Include <SendEmailTaskEntity>()
                .WithQuery(() => e => new
                {
                    Entity = e,
                    e.Id,
                    e.Name,
                    e.EmailTemplate,
                    e.UniqueTarget,
                });

                Validator.PropertyValidator((SendEmailTaskEntity er) => er.UniqueTarget).StaticPropertyValidation += (er, pi) =>
                {
                    if (er.UniqueTarget != null && er.EmailTemplate != null)
                    {
                        Implementations?implementations = GetImplementations(er.EmailTemplate.InDB(a => a.Query));
                        if (!implementations !.Value.Types.Contains(er.UniqueTarget.EntityType))
                        {
                            return(ValidationMessage._0ShouldBeOfType1.NiceToString(pi.NiceName(), implementations.Value.Types.CommaOr(t => t.NiceName())));
                        }
                    }

                    return(null);
                };

                Validator.PropertyValidator((SendEmailTaskEntity er) => er.TargetsFromUserQuery).StaticPropertyValidation += (SendEmailTaskEntity er, PropertyInfo pi) =>
                {
                    if (er.TargetsFromUserQuery != null && er.EmailTemplate != null)
                    {
                        Implementations?emailImplementations = GetImplementations(er.EmailTemplate.InDB(a => a.Query));
                        var             uqImplementations    = GetImplementations(er.TargetsFromUserQuery.InDB(a => a.Query));
                        if (!emailImplementations !.Value.Types.Intersect(uqImplementations !.Value.Types).Any())
                        {
                            return(ValidationMessage._0ShouldBeOfType1.NiceToString(pi.NiceName(), emailImplementations.Value.Types.CommaOr(t => t.NiceName())));
                        }
                    }

                    return(null);
                };

                new Graph <SendEmailTaskEntity> .Execute(SendEmailTaskOperation.Save)
                {
                    CanBeNew      = true,
                    CanBeModified = true,
                    Execute       = (e, _) => { }
                }

                .Register();

                SchedulerLogic.ExecuteTask.Register((SendEmailTaskEntity er, ScheduledTaskContext ctx) =>
                {
                    if (er.UniqueTarget != null)
                    {
                        ModifiableEntity entity = er.UniqueTarget.RetrieveAndRemember();

                        if (er.ModelConverter != null)
                        {
                            entity = er.ModelConverter.Convert(entity);
                        }

                        Lite <EmailMessageEntity>?last = null;
                        foreach (var email in er.EmailTemplate.CreateEmailMessage(entity))
                        {
                            email.SendMailAsync();
                            last = email.ToLite();
                        }
                        return(last);
                    }
                    else
                    {
                        var qr = er.TargetsFromUserQuery !.RetrieveAndRemember().ToQueryRequest();

                        List <Lite <Entity> > entities;

                        if (!qr.GroupResults)
                        {
                            qr.Columns.Clear();
                            var result = QueryLogic.Queries.ExecuteQuery(qr);

                            entities = result.Rows.Select(a => a.Entity).Distinct().NotNull().ToList();
                        }
                        else
                        {
                            var result = QueryLogic.Queries.ExecuteQuery(qr);

                            var col = result.Columns.FirstOrDefault();
                            if (col == null || !col.Column.Type.IsLite())
                            {
                                throw new InvalidOperationException("Grouping UserQueries should have the target entity as first column");
                            }

                            entities = result.Rows.Select(row => (Lite <Entity>?)row[col]).Distinct().NotNull().ToList();
                        }

                        if (entities.IsEmpty())
                        {
                            return(null);
                        }

                        return(EmailPackageLogic.SendMultipleEmailsAsync(er.EmailTemplate, entities, er.ModelConverter).Execute(ProcessOperation.Execute).ToLite());
                    }
                });
            }
        }