1 /*
2    SPDX-FileCopyrightText: 2020-2021 Laurent Montel <montel@kde.org>
3 
4    SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "roomsexportjob.h"
8 
9 #include "restapimethod.h"
10 #include "rocketchatqtrestapi_debug.h"
11 #include <QJsonArray>
12 #include <QJsonDocument>
13 #include <QJsonObject>
14 #include <QNetworkReply>
15 using namespace RocketChatRestApi;
RoomsExportJob(QObject * parent)16 RoomsExportJob::RoomsExportJob(QObject *parent)
17     : RestApiAbstractJob(parent)
18 {
19 }
20 
21 RoomsExportJob::~RoomsExportJob() = default;
22 
start()23 bool RoomsExportJob::start()
24 {
25     if (!canStart()) {
26         deleteLater();
27         return false;
28     }
29     addStartRestApiInfo("RoomsExportJob::start");
30     submitPostRequest(json());
31 
32     return true;
33 }
34 
onPostRequestResponse(const QJsonDocument & replyJson)35 void RoomsExportJob::onPostRequestResponse(const QJsonDocument &replyJson)
36 {
37     const QJsonObject replyObject = replyJson.object();
38     if (replyObject[QStringLiteral("success")].toBool()) {
39         addLoggerInfo(QByteArrayLiteral("RoomsExportJob: success: ") + replyJson.toJson(QJsonDocument::Indented));
40         Q_EMIT roomExportDone();
41     } else {
42         emitFailedMessage(replyObject);
43         addLoggerWarning(QByteArrayLiteral("RoomsExportJob: problem: ") + replyJson.toJson(QJsonDocument::Indented));
44     }
45 }
46 
requireHttpAuthentication() const47 bool RoomsExportJob::requireHttpAuthentication() const
48 {
49     return true;
50 }
51 
canStart() const52 bool RoomsExportJob::canStart() const
53 {
54     if (!mRoomExportInfo.isValid()) {
55         qCWarning(ROCKETCHATQTRESTAPI_LOG) << "mRoomExportInfo: mRoomExportInfo is not valid.";
56         return false;
57     }
58 
59     if (!RestApiAbstractJob::canStart()) {
60         return false;
61     }
62     return true;
63 }
64 
json() const65 QJsonDocument RoomsExportJob::json() const
66 {
67     QJsonObject jsonObj;
68 
69     jsonObj[QLatin1String("rid")] = mRoomExportInfo.roomId;
70     switch (mRoomExportInfo.exportAs) {
71     case RoomsExportInfo::ExportAs::Unknown:
72         // Nothing it's a bug here.
73         break;
74     case RoomsExportInfo::ExportAs::File:
75         jsonObj[QLatin1String("type")] = QStringLiteral("file");
76         createJsonForFile(jsonObj);
77         break;
78     case RoomsExportInfo::ExportAs::Email:
79         jsonObj[QLatin1String("type")] = QStringLiteral("email");
80         createJsonForEmail(jsonObj);
81         break;
82     }
83     const QJsonDocument postData = QJsonDocument(jsonObj);
84     // qDebug() << " postData**************** " << postData;
85     return postData;
86 }
87 
createJsonForFile(QJsonObject & jsonObj) const88 void RoomsExportJob::createJsonForFile(QJsonObject &jsonObj) const
89 {
90     switch (mRoomExportInfo.fileFormat) {
91     case RoomsExportInfo::FileFormat::Unknown:
92         // It's a bug
93         break;
94     case RoomsExportInfo::FileFormat::Html:
95         jsonObj[QLatin1String("format")] = QStringLiteral("html");
96         break;
97     case RoomsExportInfo::FileFormat::Json:
98         jsonObj[QLatin1String("format")] = QStringLiteral("json");
99         break;
100     }
101     jsonObj[QLatin1String("dateTo")] = mRoomExportInfo.dateTo.toString(Qt::ISODateWithMs);
102     jsonObj[QLatin1String("dateFrom")] = mRoomExportInfo.dateFrom.toString(Qt::ISODateWithMs);
103 }
104 
createJsonForEmail(QJsonObject & jsonObj) const105 void RoomsExportJob::createJsonForEmail(QJsonObject &jsonObj) const
106 {
107     jsonObj[QLatin1String("toUsers")] = QJsonArray::fromStringList(mRoomExportInfo.toUsers);
108     jsonObj[QLatin1String("toEmails")] = QJsonArray::fromStringList(mRoomExportInfo.toEmails);
109     jsonObj[QLatin1String("subject")] = mRoomExportInfo.subject;
110     jsonObj[QLatin1String("messages")] = mRoomExportInfo.messages;
111 }
112 
roomExportInfo() const113 RoomsExportJob::RoomsExportInfo RoomsExportJob::roomExportInfo() const
114 {
115     return mRoomExportInfo;
116 }
117 
setRoomExportInfo(const RoomsExportJob::RoomsExportInfo & roomExportInfo)118 void RoomsExportJob::setRoomExportInfo(const RoomsExportJob::RoomsExportInfo &roomExportInfo)
119 {
120     mRoomExportInfo = roomExportInfo;
121 }
122 
request() const123 QNetworkRequest RoomsExportJob::request() const
124 {
125     const QUrl url = mRestApiMethod->generateUrl(RestApiUtil::RestApiUrlType::RoomsExport);
126     QNetworkRequest request(url);
127     addAuthRawHeader(request);
128     addRequestAttribute(request);
129     return request;
130 }
131 
operator <<(QDebug d,const RocketChatRestApi::RoomsExportJob::RoomsExportInfo & t)132 QDebug operator<<(QDebug d, const RocketChatRestApi::RoomsExportJob::RoomsExportInfo &t)
133 {
134     d << "roomId " << t.roomId;
135     d << "toUsers " << t.toUsers;
136     d << "toEmails " << t.toEmails;
137     d << "subject " << t.subject;
138     d << "messages " << t.messages;
139     d << "dateFrom " << t.dateFrom;
140     d << "dateTo " << t.dateTo;
141     d << "fileFormat " << static_cast<int>(t.fileFormat);
142     d << "exportAs " << static_cast<int>(t.exportAs);
143     return d;
144 }
145 
isValid() const146 bool RoomsExportJob::RoomsExportInfo::isValid() const
147 {
148     // Check from exportas type
149     return fileFormat != RoomsExportInfo::FileFormat::Unknown && exportAs != RoomsExportInfo::ExportAs::Unknown && !roomId.isEmpty();
150 }
151