ImagingTools Core SDK
TClientRequestManagerCompWrap.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/QJsonDocument>
7#include <QtCore/QJsonObject>
8#include <QtCore/QJsonArray>
9
10// ACF includes
11#include <icomp/CComponentBase.h>
12
13// ImtCore includes
14#include <imtclientgql/IGqlClient.h>
15
16
17namespace imtclientgql
18{
19
20
21template <class Base>
22class TClientRequestManagerCompWrap: public Base
23{
24public:
25 typedef Base BaseClass;
26
27 I_BEGIN_BASE_COMPONENT(TClientRequestManagerCompWrap);
28 I_ASSIGN(m_apiClientCompPtr, "ApiClient", "API Client", true, "ApiClient");
29 I_END_COMPONENT;
30
31protected:
32 template<class SdlClass>
33 SdlClass SendModelRequest(const imtgql::IGqlRequest& request, QString& errorMessage) const
34 {
35 errorMessage.clear();
36
37 if (!m_apiClientCompPtr.IsValid()){
38 Q_ASSERT(false);
39 return SdlClass();
40 }
41
42 IGqlClient::GqlRequestPtr requestPtr;
43 requestPtr.MoveCastedPtr(request.CloneMe());
44 if (!requestPtr.IsValid()){
45 errorMessage = QStringLiteral("Request is invalid");
46 return SdlClass();
47 }
48
49 IGqlClient::GqlResponsePtr responsePtr = m_apiClientCompPtr->SendRequest(requestPtr);
50 if (!responsePtr.IsValid()){
51 errorMessage = QStringLiteral("Response is invalid");
52 return SdlClass();
53 }
54
55 const QByteArray responseData = responsePtr->GetResponseData();
56 const QJsonDocument document = QJsonDocument::fromJson(responseData);
57 if (!document.isObject()){
58 errorMessage = QStringLiteral("Response is invalid");
59 return SdlClass();
60 }
61
62 QJsonObject object = document.object();
63
64 const QJsonValue payloadValue = object.value(QStringLiteral("payload"));
65 if (payloadValue.isObject()){
66 object = payloadValue.toObject();
67 }
68
69 const QJsonValue errorsValue = object.value(QStringLiteral("errors"));
70 if (errorsValue.isArray()){
71 const QJsonArray errorArr = errorsValue.toArray();
72 if (!errorArr.isEmpty()){
73 const QJsonValue firstError = errorArr.at(0);
74 if (firstError.isObject()){
75 errorMessage = firstError.toObject().value(QStringLiteral("message")).toString();
76 }
77 }
78
79 SdlClass response;
80 response.Version_1_0.emplace();
81 return response;
82 }
83
84 const QJsonValue dataValue = object.value(QStringLiteral("data"));
85 if (dataValue.isObject()){
86 object = dataValue.toObject();
87
88 const QString commandId = request.GetCommandId();
89 const QJsonValue commandValue = object.value(commandId);
90 if (commandValue.isObject()){
91 object = commandValue.toObject();
92 }
93 }
94
95 SdlClass response;
96 response.Version_1_0.emplace();
97
98 if (!response.Version_1_0->ReadFromJsonObject(object)){
99 errorMessage = QStringLiteral("Response parsing error");
100 }
101
102 return response;
103 }
104
105protected:
106 I_REF(imtclientgql::IGqlClient, m_apiClientCompPtr);
107};
108
109
110typedef TClientRequestManagerCompWrap<icomp::CComponentBase> CClientRequestManagerCompBase;
111
112
113} // namespace imtclientgql
114
115