cutelyst  3.9.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 
19  : ViewEmail(new ViewEmailTemplatePrivate, parent, name)
20 {
21  Q_D(ViewEmailTemplate);
22 
23  d->defaultContentType = QByteArrayLiteral("text/html");
24 }
25 
27 {
28  Q_D(const ViewEmailTemplate);
29  return d->templatePrefix;
30 }
31 
33 {
34  Q_D(ViewEmailTemplate);
35  d->templatePrefix = prefix;
36  Q_EMIT changedProp();
37 }
38 
40 {
41  Q_D(const ViewEmailTemplate);
42  return d->defaultView;
43 }
44 
46 {
47  Q_D(ViewEmailTemplate);
48  d->defaultView = view;
49  Q_EMIT changedProp();
50 }
51 
52 MimePart *generatePart(Context *c, const ViewEmailTemplatePrivate *d, const QVariantHash &partHash)
53 {
54  const QString defaultView = d->defaultView;
55 
56  View *view = nullptr;
57  auto viewIt = partHash.constFind(QStringLiteral("view"));
58  if (viewIt != partHash.constEnd() && !viewIt.value().toString().isEmpty()) {
59  // use the view specified for the email part
60  const QString viewString = viewIt.value().toString();
61  qCDebug(CUTELYST_VIEW_EMAILTEMPLATE)
62  << "Using specified view" << viewString << "for rendering.";
63  view = c->view(viewString);
64  } else if (!defaultView.isEmpty()) {
65  // if none specified use the configured default view
66  qCDebug(CUTELYST_VIEW_EMAILTEMPLATE)
67  << "Using default view" << defaultView << "for rendering.";
68  view = c->view(defaultView);
69  } else {
70  // else fallback to Cutelysts default view
71  qCDebug(CUTELYST_VIEW_EMAILTEMPLATE) << "Using Cutelysts default view for rendering.";
72  view = c->view(QString());
73  }
74 
75  // validate the per template view
76  if (!view) {
77  c->error(QStringLiteral("Could not find a view to render"));
78  return nullptr;
79  }
80 
81  QString templateString = partHash.value(QStringLiteral("template")).toString();
82  ;
83  // prefix with template_prefix if configured
84  if (!d->templatePrefix.isEmpty()) {
85  templateString = d->templatePrefix + QLatin1Char('/') + templateString;
86  }
87 
88  // render the email part
89  const QVariantHash currentStash = c->stash();
90  c->stash(partHash);
91  c->setStash(QStringLiteral("template"), templateString);
92  QByteArray output = view->render(c);
93  if (c->error()) {
94  qCDebug(CUTELYST_VIEW_EMAILTEMPLATE) << "Errors" << c->errors();
95  }
96  c->stash() = currentStash;
97 
98  MimePart *part = new MimePart();
99  part->setContent(output);
100 
101  d->setupAttributes(part, partHash);
102 
103  return part;
104 }
105 
107 {
108  Q_D(const ViewEmailTemplate);
109 
110  QByteArray ret;
111  QVariantHash email = c->stash(d->stashKey).toHash();
112  const QString templateName = email.value(QStringLiteral("template")).toString();
113  const QVariantList templateList = email.value(QStringLiteral("templates")).toList();
114  if (templateName.isEmpty() && templateList.isEmpty()) {
115  ret = ViewEmail::render(c);
116  return ret;
117  }
118 
119  QVariantList parts = email.value(QStringLiteral("parts")).toList();
120  if (!templateList.isEmpty() && templateList.first().type() == QVariant::Hash) {
121  // multipart API
122  for (const QVariant &part : templateList) {
123  const QVariantHash partHash = part.toHash();
124  MimePart *partObj = generatePart(c, d, partHash);
125  parts.append(QVariant::fromValue(partObj));
126  }
127 
128  } else if (!templateName.isEmpty()) {
129  // single part API
130  QVariantHash partArgs({
131  {QStringLiteral("template"), templateName},
132 
133  });
134  auto contentTypeIt = email.constFind(QStringLiteral("content_type"));
135  if (contentTypeIt != email.constEnd() && !contentTypeIt.value().toString().isEmpty()) {
136  partArgs.insert(QStringLiteral("content_type"), contentTypeIt.value().toString());
137  }
138  MimePart *partObj = generatePart(c, d, partArgs);
139  parts.append(QVariant::fromValue(partObj));
140  }
141  email.insert(QStringLiteral("parts"), parts);
142  c->setStash(d->stashKey, email);
143 
144  ret = ViewEmail::render(c);
145  return ret;
146 }
147 
148 #include "moc_viewemailtemplate.cpp"
bool error() const noexcept
Returns true if an error was set.
Definition: context.cpp:49
virtual QByteArray render(Context *c) const override
QVariant fromValue(T &&value)
void setStash(const QString &key, const QVariant &value)
Definition: context.cpp:217
View * view(const QString &name) const
Definition: context.cpp:168
void setDefaultView(const QString &view)
The Cutelyst Context.
Definition: context.h:38
virtual QByteArray render(Context *c) const override
Definition: viewemail.cpp:196
QString defaultView() const
void setTemplatePrefix(const QString &prefix)
void stash(const QVariantHash &unite)
Definition: context.cpp:566
bool isEmpty() const const
The Cutelyst namespace holds all public Cutelyst API.
Definition: Mainpage.dox:7
virtual QByteArray render(Context *c) const =0
Cutelyst View abstract view component
Definition: view.h:21
ViewEmailTemplate(QObject *parent, const QString &name=QString())
Constructs a new ViewEmailTemplate object with the given parent and name.
QString templatePrefix() const
QStringList errors() const noexcept
Returns a list of errors that were defined.
Definition: context.cpp:66
Q_EMITQ_EMIT