示例#1
0
        public static string Failed(string message)
        {
            var status = new PostResult();

            status.IsSuccess   = false;
            status.MessageType = "warning";
            status.MessageText = message;
            return(JsonConvert.SerializeObject(status));
        }
示例#2
0
        public static string Success(string message)
        {
            var status = new PostResult();

            status.IsSuccess   = true;
            status.MessageType = "success";
            status.MessageText = message;
            return(JsonConvert.SerializeObject(status));
        }
示例#3
0
        public MailingModule()
        {
            this.RequiresAuthentication();

            Get["/mailing"] = parameters =>
            {
                return(View["View/mailing.sshtml",
                            new MailingViewModel(Translator, CurrentSession)]);
            };
            Get["/mailing/list"] = parameters =>
            {
                return(View["View/mailinglist.sshtml",
                            new MailingListViewModel(Translator, Database, CurrentSession)]);
            };
            Get["/mailing/add"] = parameters =>
            {
                return(View["View/mailingedit.sshtml",
                            new MailingEditViewModel(Translator, Database, CurrentSession)]);
            };
            Post["/mailing/add/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    model    = JsonConvert.DeserializeObject <MailingEditViewModel>(ReadBody());
                var    status   = CreateStatus();

                if (Guid.TryParse(idString, out Guid id))
                {
                    var mailing = new Mailing(id);
                    status.AssignStringRequired("Title", mailing.Title, model.Title);
                    status.AssignObjectIdString("RecipientFeed", mailing.RecipientFeed, model.RecipientFeed);
                    status.AssignObjectIdString("RecipientTag", mailing.RecipientTag, model.RecipientTag);
                    status.AssignEnumIntString("RecipientLanguage", mailing.RecipientLanguage, model.RecipientLanguage);
                    status.AssignObjectIdString("SenderGroup", mailing.Sender, model.SenderGroup);
                    status.AssignObjectIdString("Header", mailing.Header, model.Header);
                    status.AssignObjectIdString("Footer", mailing.Footer, model.Footer);
                    status.AssignStringRequired("Subject", mailing.Subject, model.Subject);
                    var worker = new HtmlWorker(model.HtmlText);
                    mailing.HtmlText.Value  = worker.CleanHtml;
                    mailing.PlainText.Value = worker.PlainText;
                    mailing.Creator.Value   = CurrentSession.User;

                    if (status.IsSuccess)
                    {
                        if (status.HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                            (mailing.Sender.Value == null || status.HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                        {
                            Database.Save(mailing);
                            Notice("{0} added mailing {1}", CurrentSession.User.UserName.Value, mailing);
                        }
                    }
                }
                else
                {
                    status.SetErrorNotFound();
                }

                return(status.CreateJsonData());
            };
            Get["/mailing/edit/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    mailing  = Database.Query <Mailing>(idString);

                if (mailing != null)
                {
                    if (mailing.Status.Value == MailingStatus.New)
                    {
                        return(View["View/mailingedit.sshtml",
                                    new MailingEditViewModel(Translator, Database, CurrentSession, mailing)]);
                    }
                    else
                    {
                        return(View["View/mailingscheduled.sshtml",
                                    new MailingScheduledViewModel(Translator, Database, CurrentSession, mailing)]);
                    }
                }

                return(Response.AsRedirect("/mailing"));
            };
            Post["/mailing/edit/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    model    = JsonConvert.DeserializeObject <MailingEditViewModel>(ReadBody());
                var    mailing  = Database.Query <Mailing>(idString);
                var    status   = CreateStatus();

                if (status.ObjectNotNull(mailing))
                {
                    if (mailing.Status.Value == MailingStatus.New)
                    {
                        status.AssignStringRequired("Title", mailing.Title, model.Title);
                        status.AssignObjectIdString("RecipientFeed", mailing.RecipientFeed, model.RecipientFeed);
                        status.AssignObjectIdString("RecipientTag", mailing.RecipientTag, model.RecipientTag);
                        status.AssignEnumIntString("RecipientLanguage", mailing.RecipientLanguage, model.RecipientLanguage);
                        status.AssignObjectIdString("SenderGroup", mailing.Sender, model.SenderGroup);
                        status.AssignObjectIdString("Header", mailing.Header, model.Header);
                        status.AssignObjectIdString("Footer", mailing.Footer, model.Footer);
                        status.AssignStringRequired("Subject", mailing.Subject, model.Subject);
                        var worker = new HtmlWorker(model.HtmlText);
                        mailing.HtmlText.Value  = worker.CleanHtml;
                        mailing.PlainText.Value = worker.PlainText;
                        mailing.Creator.Value   = CurrentSession.User;

                        if (status.IsSuccess)
                        {
                            if (status.HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                                (mailing.Sender.Value == null || status.HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                            {
                                Database.Save(mailing);
                                Notice("{0} changed mailing {1}", CurrentSession.User.UserName.Value, mailing);
                            }
                        }
                    }
                    else
                    {
                        status.SetErrorAccessDenied();
                    }
                }

                return(status.CreateJsonData());
            };
            Post["/mailing/test"] = parameters =>
            {
                var model  = JsonConvert.DeserializeObject <MailingEditViewModel>(ReadBody());
                var worker = new HtmlWorker(model.HtmlText);
                var header = Database.Query <MailingElement>(model.Header);
                var footer = Database.Query <MailingElement>(model.Footer);
                var sender = Database.Query <Group>(model.SenderGroup);

                var htmlText  = worker.CleanHtml;
                var plainText = worker.PlainText;

                if (header != null)
                {
                    htmlText  = HtmlWorker.ConcatHtml(header.HtmlText.Value, htmlText);
                    plainText = header.PlainText.Value + plainText;
                }

                if (footer != null)
                {
                    htmlText  = HtmlWorker.ConcatHtml(htmlText, footer.HtmlText.Value);
                    plainText = plainText + footer.PlainText.Value;
                }

                var contact = Database
                              .Query <Contact>()
                              .Where(p => HasAccess(p, PartAccess.Contact, AccessRight.Read))
                              .FirstOrDefault();

                if (contact == null)
                {
                    return(PostResult.Failed(
                               Translate("Mailing.Edit.Test.Failed", "Failed message on sending test mail in mailing edit page", "E-Mail could not be sent.")));
                }

                var templator = new Templator(new ContactContentProvider(Translator, contact));
                htmlText  = templator.Apply(htmlText);
                plainText = templator.Apply(plainText);

                try
                {
                    var language = CurrentSession.User.Language.Value;
                    var from     = new MailboxAddress(
                        sender.MailName.Value[language],
                        sender.MailAddress.Value[language]);
                    var to        = new MailboxAddress(model.TestAddress);
                    var senderKey = sender.GpgKeyId.Value == null ? null :
                                    new GpgPrivateKeyInfo(
                        sender.GpgKeyId.Value,
                        sender.GpgKeyPassphrase.Value);
                    var content  = new Multipart("alternative");
                    var textPart = new TextPart("plain")
                    {
                        Text = plainText
                    };
                    textPart.ContentTransferEncoding = ContentEncoding.QuotedPrintable;
                    content.Add(textPart);
                    var htmlPart = new TextPart("html")
                    {
                        Text = htmlText
                    };
                    htmlPart.ContentTransferEncoding = ContentEncoding.QuotedPrintable;
                    content.Add(htmlPart);

                    Global.Mail.Send(from, to, senderKey, null, model.Subject, content);
                    Notice("{0} tests mailing with subject {1}", CurrentSession.User.UserName.Value, model.Subject);

                    return(PostResult.Success(
                               Translate("Mailing.Edit.Test.Success", "Success message on sending test mail in mailing edit page", "Test E-Mail sent.")));
                }
                catch
                {
                    return(PostResult.Failed(
                               Translate("Mailing.Edit.Test.Failed", "Failed message on sending test mail in mailing edit page", "E-Mail could not be sent.")));
                }
            };
            Get["/mailing/send/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    mailing  = Database.Query <Mailing>(idString);

                if (mailing != null)
                {
                    if (HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                        (mailing.Sender.Value == null || HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                    {
                        return(View["View/mailingsend.sshtml",
                                    new MailingSendViewModel(Translator, Database, CurrentSession, mailing)]);
                    }
                }

                return(AccessDenied());
            };
            Post["/mailing/send/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    model    = JsonConvert.DeserializeObject <MailingSendViewModel>(ReadBody());
                var    mailing  = Database.Query <Mailing>(idString);
                var    status   = CreateStatus();

                if (status.ObjectNotNull(mailing))
                {
                    status.AssignDateString("Date", mailing.SendingDate, model.Date, true);
                    status.AddAssignTimeString("Time", mailing.SendingDate, model.Time);

                    if (status.IsSuccess)
                    {
                        if (status.HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                            (mailing.Sender.Value == null || status.HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                        {
                            mailing.SendingDate.Value = mailing.SendingDate.Value.Value.ToUniversalTime();
                            mailing.Status.Value      = MailingStatus.Scheduled;
                            Database.Save(mailing);
                            Notice("{0} sent mailing {1}", CurrentSession.User.UserName.Value, mailing);
                        }
                    }
                }

                return(status.CreateJsonData());
            };
            Get["/mailing/delete/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    mailing  = Database.Query <Mailing>(idString);
                var    status   = CreateStatus();

                if (status.ObjectNotNull(mailing))
                {
                    if (status.HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                        (mailing.Sender.Value == null || status.HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                    {
                        using (var transaction = Database.BeginTransaction())
                        {
                            mailing.Delete(Database);
                            transaction.Commit();
                            Notice("{0} deleted mailing {1}", CurrentSession.User.UserName.Value, mailing);
                        }
                    }
                }

                return(status.CreateJsonData());
            };
            Get["/mailing/cancel/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    mailing  = Database.Query <Mailing>(idString);
                var    status   = CreateStatus();

                if (status.ObjectNotNull(mailing))
                {
                    if (status.HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                        (mailing.Sender.Value == null || status.HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                    {
                        if (mailing.Status.Value == MailingStatus.Scheduled ||
                            mailing.Status.Value == MailingStatus.Sending)
                        {
                            using (var transaction = Database.BeginTransaction())
                            {
                                mailing.Status.Value = MailingStatus.Canceled;
                                Database.Save(mailing);
                                transaction.Commit();
                                Notice("{0} canceled mailing {1}", CurrentSession.User.UserName.Value, mailing);
                            }
                        }
                        else
                        {
                            status.SetErrorAccessDenied();
                        }
                    }
                }

                return(status.CreateJsonData());
            };
            Get["/mailing/copy/{id}"] = parameters =>
            {
                string idString = parameters.id;
                var    mailing  = Database.Query <Mailing>(idString);
                var    status   = CreateStatus();

                if (status.ObjectNotNull(mailing))
                {
                    if (status.HasAccess(mailing.RecipientFeed.Value, PartAccess.Mailings, AccessRight.Write) &&
                        (mailing.Sender.Value == null || status.HasAccess(mailing.Sender.Value, PartAccess.Mailings, AccessRight.Write)))
                    {
                        var newMailing = new Mailing(Guid.NewGuid());
                        newMailing.Title.Value = mailing.Title.Value +
                                                 Translate("Mailing.Copy.Postfix", "Postfix of copied mailings", " (Copy)");
                        newMailing.RecipientFeed.Value     = mailing.RecipientFeed.Value;
                        newMailing.RecipientTag.Value      = mailing.RecipientTag.Value;
                        newMailing.RecipientLanguage.Value = mailing.RecipientLanguage.Value;
                        newMailing.Sender.Value            = mailing.Sender.Value;
                        newMailing.Header.Value            = mailing.Header.Value;
                        newMailing.Footer.Value            = mailing.Footer.Value;
                        newMailing.Subject.Value           = mailing.Subject.Value;
                        newMailing.HtmlText.Value          = mailing.HtmlText.Value;
                        newMailing.PlainText.Value         = mailing.PlainText.Value;
                        newMailing.Creator.Value           = CurrentSession.User;
                        newMailing.CreatedDate.Value       = DateTime.UtcNow;
                        newMailing.Status.Value            = MailingStatus.New;
                        Database.Save(newMailing);
                        Notice("{0} copied mailing {1}", CurrentSession.User.UserName.Value, mailing);
                    }
                }

                return(status.CreateJsonData());
            };
        }