Cutelyst  3.5.0
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 
9 #include <SimpleMail/mimemessage.h>
10 #include <SimpleMail/emailaddress.h>
11 #include <SimpleMail/mimetext.h>
12 
13 #include <QtCore/QLoggingCategory>
14 
15 Q_LOGGING_CATEGORY(CUTELYST_VIEW_EMAILTEMPLATE, "cutelyst.view.emailtemplate", QtWarningMsg)
16 
17 using namespace Cutelyst;
18 
19 ViewEmailTemplate::ViewEmailTemplate(QObject *parent, const QString &name) : 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) << "Using specified view" << viewString << "for rendering.";
62  view = c->view(viewString);
63  } else if (!defaultView.isEmpty()) {
64  // if none specified use the configured default view
65  qCDebug(CUTELYST_VIEW_EMAILTEMPLATE) << "Using default view" << defaultView << "for rendering.";
66  view = c->view(defaultView);
67  } else {
68  // else fallback to Cutelysts default view
69  qCDebug(CUTELYST_VIEW_EMAILTEMPLATE) << "Using Cutelysts default view for rendering.";
70  view = c->view(QString());
71  }
72 
73  // validate the per template view
74  if (!view) {
75  c->error(QStringLiteral("Could not find a view to render"));
76  return nullptr;
77  }
78 
79  QString templateString = partHash.value(QStringLiteral("template")).toString();;
80  // prefix with template_prefix if configured
81  if (!d->templatePrefix.isEmpty()) {
82  templateString = d->templatePrefix + QLatin1Char('/') + templateString;
83  }
84 
85  // render the email part
86  const QVariantHash currentStash = c->stash();
87  c->stash(partHash);
88  c->setStash(QStringLiteral("template"), templateString);
89  QByteArray output = view->render(c);
90  if (c->error()) {
91  qCDebug(CUTELYST_VIEW_EMAILTEMPLATE) << "Errors" << c->errors();
92  }
93  c->stash() = currentStash;
94 
95  MimePart *part = new MimePart();
96  part->setContent(output);
97 
98  d->setupAttributes(part, partHash);
99 
100  return part;
101 }
102 
104 {
105  Q_D(const ViewEmailTemplate);
106 
107  QByteArray ret;
108  QVariantHash email = c->stash(d->stashKey).toHash();
109  const QString templateName = email.value(QStringLiteral("template")).toString();
110  const QVariantList templateList = email.value(QStringLiteral("templates")).toList();
111  if (templateName.isEmpty() && templateList.isEmpty()) {
112  ret = ViewEmail::render(c);
113  return ret;
114  }
115 
116  QVariantList parts = email.value(QStringLiteral("parts")).toList();
117  if (!templateList.isEmpty() && templateList.first().type() == QVariant::Hash) {
118  // multipart API
119  for (const QVariant &part : templateList) {
120  const QVariantHash partHash = part.toHash();
121  MimePart *partObj = generatePart(c, d, partHash);
122  parts.append(QVariant::fromValue(partObj));
123  }
124 
125  } else if (!templateName.isEmpty()) {
126  // single part API
127  QVariantHash partArgs({
128  {QStringLiteral("template"), templateName},
129 
130  });
131  auto contentTypeIt = email.constFind(QStringLiteral("content_type"));
132  if (contentTypeIt != email.constEnd() && !contentTypeIt.value().toString().isEmpty()) {
133  partArgs.insert(QStringLiteral("content_type"), contentTypeIt.value().toString());
134  }
135  MimePart *partObj = generatePart(c, d, partArgs);
136  parts.append(QVariant::fromValue(partObj));
137  }
138  email.insert(QStringLiteral("parts"), parts);
139  c->setStash(d->stashKey, email);
140 
141  ret = ViewEmail::render(c);
142  return ret;
143 }
144 
145 #include "moc_viewemailtemplate.cpp"
bool error() const noexcept
Returns true if an error was set.
Definition: context.cpp:50
virtual QByteArray render(Context *c) const override
void setStash(const QString &key, const QVariant &value)
Definition: context.cpp:212
void setDefaultView(const QString &view)
The Cutelyst Context.
Definition: context.h:38
virtual QByteArray render(Context *c) const override
Definition: viewemail.cpp:195
QString defaultView() const
void setTemplatePrefix(const QString &prefix)
void stash(const QVariantHash &unite)
Definition: context.cpp:540
bool isEmpty() const const
View * view(const QString &name=QString()) const
Definition: context.cpp:169
The Cutelyst namespace holds all public Cutelyst API.
Definition: Mainpage.dox:7
virtual QByteArray render(Context *c) const =0
QVariant fromValue(const T &value)
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:67