ImagingTools Core SDK
TGraphQlJsonSerializerWrap.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/QJsonArray>
7#include <QtCore/QJsonDocument>
8#include <QtCore/QJsonObject>
9#include <QtCore/QJsonValue>
10
11// ImtCore includes
12#include <imtgql/IGqlResponse.h>
13
14
15namespace imtgql
16{
17
18
19template <class GqlResponseBase>
20class TGraphQlJsonSerializerWrap: public virtual GqlResponseBase
21{
22public:
23 TGraphQlJsonSerializerWrap(IGqlResponse::GqlRequestPtr originalRequestPtr);
24
25 // reimplemented (IGqlResponse)
26 virtual QByteArray GetData() const override;
27 virtual typename GqlResponseBase::ErrorEntryList GetErrorList() const override;
28 virtual QStringList GetErrorMessageList() const override;
29};
30
31
32template<class GqlResponseBase>
33TGraphQlJsonSerializerWrap<GqlResponseBase>::TGraphQlJsonSerializerWrap(IGqlResponse::GqlRequestPtr originalRequestPtr)
34 : GqlResponseBase(originalRequestPtr)
35{
36}
37
38
39template <class GqlResponseBase>
40QByteArray TGraphQlJsonSerializerWrap<GqlResponseBase>::GetData() const
41{
42 QJsonDocument rawPayload = QJsonDocument::fromJson(GqlResponseBase::GetResponseData());
43 if (!rawPayload.isObject()){
44 Q_ASSERT_X(false, "GetData", "Unexpected JSON");
45
46 return QByteArray();
47 }
48
49 QJsonValue payloadDataValue = rawPayload.object().value(QStringLiteral("data"));
50
51 if (payloadDataValue.isObject()){
52 return QJsonDocument(payloadDataValue.toObject()).toJson();
53 }
54 if (payloadDataValue.isArray()){
55 return QJsonDocument(payloadDataValue.toArray()).toJson();
56 }
57
58 Q_ASSERT_X(false, "GetData", "Unexpected 'data' JSON");
59
60 return QByteArray();
61}
62
63
64template <class GqlResponseBase>
65typename GqlResponseBase::ErrorEntryList TGraphQlJsonSerializerWrap<GqlResponseBase>::GetErrorList() const
66{
67 QJsonDocument rawPayload = QJsonDocument::fromJson(GqlResponseBase::GetResponseData());
68 if (!rawPayload.isObject()){
69 Q_ASSERT_X(false, "GetErrorList", "Unexpected JSON");
70
71 return typename GqlResponseBase::ErrorEntryList();
72 }
73
74 QJsonValue payloadErrorsValue = rawPayload.object().value(QStringLiteral("errors"));
75
76 Q_ASSERT_X(payloadErrorsValue.isArray(), "GetErrorList", "Unexpected 'errors' JSON");
77
78 const QJsonArray payloadErrorsArray = payloadErrorsValue.toArray();
79 typename GqlResponseBase::ErrorEntryList retVal;
80 for(const QJsonValue& errorEntry: payloadErrorsArray){
81 Q_ASSERT_X(errorEntry.isObject(), "GetErrorList", "Unexpected error entry");
82
83 retVal << errorEntry.toObject().toVariantMap();
84 }
85
86 return retVal;
87}
88
89
90template <class GqlResponseBase>
91QStringList TGraphQlJsonSerializerWrap<GqlResponseBase>::GetErrorMessageList() const
92{
93 QStringList retVal;
94 const typename GqlResponseBase::ErrorEntryList errors = GetErrorList();
95 for (const QVariantMap& errorEntry: errors){
96 Q_ASSERT(errorEntry.contains(QStringLiteral("message")));
97
98 retVal << errorEntry[QStringLiteral("message")].toString();
99 }
100
101 return retVal;
102}
103
104
105} // namespace imtqml
106
107