cutelyst 5.0.0
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
14Q_LOGGING_CATEGORY(CUTELYST_VIEW_EMAILTEMPLATE, "cutelyst.view.emailtemplate", QtWarningMsg)
15
16using namespace Cutelyst;
17using namespace Qt::StringLiterals;
18
20 : ViewEmail(new ViewEmailTemplatePrivate, parent, name)
21{
23
24 d->defaultContentType = QByteArrayLiteral("text/html");
25}
26
28{
29 Q_D(const ViewEmailTemplate);
30 return d->templatePrefix;
31}
32
34{
36 d->templatePrefix = prefix;
37 Q_EMIT changedProp();
38}
39
41{
42 Q_D(const ViewEmailTemplate);
43 return d->defaultView;
44}
45
47{
49 d->defaultView = view;
50 Q_EMIT changedProp();
51}
52
53std::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"
The Cutelyst Context.
Definition context.h:42
QStringList errors() const noexcept
Definition context.cpp:68
void stash(const QVariantHash &unite)
Definition context.cpp:562
void setStash(const QString &key, const QVariant &value)
Definition context.cpp:213
View * view(QStringView name={}) const
Definition context.cpp:170
void appendError(const QString &error)
Definition context.cpp:57
bool error() const noexcept
Definition context.cpp:51
A view that renders stash data using another view and sends it via e-mail.
void setDefaultView(const QString &view)
ViewEmailTemplate(QObject *parent, const QString &name={})
QByteArray render(Context *c) const override
void setTemplatePrefix(const QString &prefix)
A view that sends stash data via e-mail.
Definition viewemail.h:24
QByteArray render(Context *c) const override
Abstract View component for Cutelyst.
Definition view.h:25
virtual QByteArray render(Context *c) const =0
The Cutelyst namespace holds all public Cutelyst API.
Q_EMITQ_EMIT
bool isEmpty() const const
QVariant fromValue(T &&value)