cutelyst  5.0.1
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
viewemailtemplate.cpp
1 /*
2  * SPDX-FileCopyrightText: (C) 2015-2022 Daniel Nicoletti <dantti12@gmail.com>
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 #include "viewemailtemplate_p.h"
6 
7 #include <Cutelyst/Context>
8 #include <SimpleMail/emailaddress.h>
9 #include <SimpleMail/mimemessage.h>
10 #include <SimpleMail/mimetext.h>
11 
12 #include <QtCore/QLoggingCategory>
13 
14 Q_LOGGING_CATEGORY(CUTELYST_VIEW_EMAILTEMPLATE, "cutelyst.view.emailtemplate", QtWarningMsg)
15 
16 using namespace Cutelyst;
17 using namespace Qt::StringLiterals;
18 
20  : ViewEmail(new ViewEmailTemplatePrivate, parent, name)
21 {
22  Q_D(ViewEmailTemplate);
23 
24  d->defaultContentType = QByteArrayLiteral("text/html");
25 }
26 
28 {
29  Q_D(const ViewEmailTemplate);
30  return d->templatePrefix;
31 }
32 
34 {
35  Q_D(ViewEmailTemplate);
36  d->templatePrefix = prefix;
37  Q_EMIT changedProp();
38 }
39 
41 {
42  Q_D(const ViewEmailTemplate);
43  return d->defaultView;
44 }
45 
47 {
48  Q_D(ViewEmailTemplate);
49  d->defaultView = view;
50  Q_EMIT changedProp();
51 }
52 
53 std::shared_ptr<MimePart>
54  generatePart(Context *c, const ViewEmailTemplatePrivate *d, const QVariantHash &partHash)
55 {
56  const QString defaultView = d->defaultView;
57 
58  const View *view = nullptr;
59  auto viewIt = partHash.constFind(u"view"_s);
60  if (viewIt != partHash.constEnd() && !viewIt.value().toString().isEmpty()) {
61  // use the view specified for the email part
62  const QString viewString = viewIt.value().toString();
63  qCDebug(CUTELYST_VIEW_EMAILTEMPLATE)
64  << "Using specified view" << viewString << "for rendering.";
65  view = c->view(viewString);
66  } else if (!defaultView.isEmpty()) {
67  // if none specified use the configured default view
68  qCDebug(CUTELYST_VIEW_EMAILTEMPLATE)
69  << "Using default view" << defaultView << "for rendering.";
70  view = c->view(defaultView);
71  } else {
72  // else fallback to Cutelysts default view
73  qCDebug(CUTELYST_VIEW_EMAILTEMPLATE) << "Using Cutelysts default view for rendering.";
74  view = c->view({});
75  }
76 
77  // validate the per template view
78  if (!view) {
79  c->appendError(u"Could not find a view to render"_s);
80  return nullptr;
81  }
82 
83  QString templateString = partHash.value(u"template"_s).toString();
84  ;
85  // prefix with template_prefix if configured
86  if (!d->templatePrefix.isEmpty()) {
87  templateString = d->templatePrefix + u'/' + templateString;
88  }
89 
90  // render the email part
91  const QVariantHash currentStash = c->stash();
92  c->stash(partHash);
93  c->setStash(u"template"_s, templateString);
94  QByteArray output = view->render(c);
95  if (c->error()) {
96  qCDebug(CUTELYST_VIEW_EMAILTEMPLATE) << "Errors" << c->errors();
97  }
98  c->stash() = currentStash;
99 
100  auto part = std::make_shared<MimePart>();
101  part->setContent(output);
102 
103  d->setupAttributes(part, partHash);
104 
105  return part;
106 }
107 
109 {
110  Q_D(const ViewEmailTemplate);
111 
112  QByteArray ret;
113  QVariantHash email = c->stash(d->stashKey).toHash();
114  const QString templateName = email.value(u"template"_s).toString();
115  const QVariantList templateList = email.value(u"templates"_s).toList();
116  if (templateName.isEmpty() && templateList.isEmpty()) {
117  ret = ViewEmail::render(c);
118  return ret;
119  }
120 
121  QVariantList parts = email.value(u"parts"_s).toList();
122  if (!templateList.isEmpty() && templateList.first().typeId() == QMetaType::QVariantHash) {
123  // multipart API
124  for (const QVariant &part : templateList) {
125  const QVariantHash partHash = part.toHash();
126  auto partObj = generatePart(c, d, partHash);
127  parts.append(QVariant::fromValue(partObj));
128  }
129 
130  } else if (!templateName.isEmpty()) {
131  // single part API
132  QVariantHash partArgs({
133  {u"template"_s, templateName},
134 
135  });
136  auto contentTypeIt = email.constFind(u"content_type"_s);
137  if (contentTypeIt != email.constEnd() && !contentTypeIt.value().toString().isEmpty()) {
138  partArgs.insert(u"content_type"_s, contentTypeIt.value().toString());
139  }
140  auto partObj = generatePart(c, d, partArgs);
141  parts.append(QVariant::fromValue(partObj));
142  }
143  email.insert(u"parts"_s, parts);
144  c->setStash(d->stashKey, email);
145 
146  ret = ViewEmail::render(c);
147  return ret;
148 }
149 
150 #include "moc_viewemailtemplate.cpp"
bool error() const noexcept
Definition: context.cpp:51
A view that renders stash data using another view and sends it via e-mail.
QByteArray render(Context *c) const override
QVariant fromValue(T &&value)
void setStash(const QString &key, const QVariant &value)
Definition: context.cpp:213
void setDefaultView(const QString &view)
void appendError(const QString &error)
Definition: context.cpp:57
The Cutelyst Context.
Definition: context.h:42
ViewEmailTemplate(QObject *parent, const QString &name={})
QByteArray render(Context *c) const override
Definition: viewemail.cpp:153
QString defaultView() const
void setTemplatePrefix(const QString &prefix)
void stash(const QVariantHash &unite)
Definition: context.cpp:562
bool isEmpty() const const
The Cutelyst namespace holds all public Cutelyst API.
virtual QByteArray render(Context *c) const =0
A view that sends stash data via e-mail.
Definition: viewemail.h:24
Abstract View component for Cutelyst.
Definition: view.h:24
View * view(QStringView name={}) const
Definition: context.cpp:170
QString templatePrefix() const
QStringList errors() const noexcept
Definition: context.cpp:68
Q_EMITQ_EMIT