ImagingTools Core SDK
CSdlJsonServletBaseComp.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
9// imtrest includes
10#include <imtrest/CHttpServletCompBase.h>
11#include <imtrest/IProtocolEngine.h>
12
13
14namespace imtrest
15{
16
17
18class CSdlJsonServletBaseComp: public imtrest::CHttpServletCompBase
19{
20public:
21 typedef imtrest::CHttpServletCompBase BaseClass;
22 typedef QSharedPointer<imtrest::IResponse> ResponsePtr;
23
24 I_BEGIN_BASE_COMPONENT(CSdlJsonServletBaseComp)
25 I_END_COMPONENT
26
27protected:
28 template <class SdlClass>
29 bool ReadRequestToSdlStruct(
30 SdlClass& out,
31 const imtrest::CHttpRequest& request,
32 ResponsePtr& response) const;
33
34 template <class SdlClass>
35 bool CreateResponseFromSdlStruct(
36 const SdlClass& input,
37 const imtrest::CHttpRequest& request,
38 IProtocolEngine::StatusCode protocolStatusCode,
39 ResponsePtr& response,
40 QJsonDocument::JsonFormat jsonFormat = QJsonDocument::Compact) const;
41
42
43 virtual ResponsePtr CreateDefaultErrorResponse(
44 int errorCode,
45 const QString& errorString,
46 const QString& additionalInfo,
47 IProtocolEngine::StatusCode protocolStatusCode,
48 const imtrest::CHttpRequest& request) const;
49};
50
51
52// template protected methods
53
54template<class SdlClass>
55bool CSdlJsonServletBaseComp::ReadRequestToSdlStruct(
56 SdlClass& out,
57 const CHttpRequest& request,
58 ResponsePtr& responsePtr) const
59{
60 const QByteArray requestBody = request.GetBody();
61 const QJsonDocument payloadDocument = QJsonDocument::fromJson(requestBody);
62 if (!payloadDocument.isObject()){
63 const QString baseErrorString = QT_TR_NOOP("The request is not a valid json object");
64 SendErrorMessage(0, baseErrorString + QString(": '%1'").arg(QString(requestBody)), __func__);
65
66 responsePtr = CreateDefaultErrorResponse(
67 400,
68 "Incorrect request",
69 baseErrorString,
70 imtrest::IProtocolEngine::SC_BAD_REQUEST,
71 request);
72
73 return false;
74 }
75
76 const QJsonObject payloadObject = payloadDocument.object();
77 const bool isCreated = SdlClass::ReadFromJsonObject(out, payloadObject);
78 if (!isCreated){
79 const QString baseErrorString = QT_TR_NOOP("The request does not match the scheme");
80 SendErrorMessage(0, baseErrorString + QString(": '%1'").arg(QString(requestBody)), __func__);
81 responsePtr = CreateDefaultErrorResponse(
82 400,
83 "Incorrect request",
84 baseErrorString,
85 imtrest::IProtocolEngine::SC_BAD_REQUEST,
86 request);
87
88 return false;
89 }
90
91 return true;
92}
93
94
95template <class SdlClass>
96bool CSdlJsonServletBaseComp::CreateResponseFromSdlStruct(
97 const SdlClass& input,
98 const imtrest::CHttpRequest& request,
99 IProtocolEngine::StatusCode protocolStatusCode,
100 ResponsePtr& responsePtr,
101 QJsonDocument::JsonFormat jsonFormat) const
102{
103 QJsonObject replyJson;
104 const bool isAdded = input.WriteToJsonObject(replyJson);
105 if (!isAdded){
106 QString baseErrorString = QT_TR_NOOP("Unable to convert reply to json");
107 SendCriticalMessage(0, baseErrorString, __func__);
108 Q_ASSERT_X(false, __func__, baseErrorString.toLocal8Bit());
109
110 responsePtr = CreateDefaultErrorResponse(
111 500,
112 "Internal error",
113 baseErrorString,
114 imtrest::IProtocolEngine::SC_INTERNAL_SERVER_ERROR,
115 request);
116
117 return false;
118 }
119
120 QByteArray replyPayload = QJsonDocument(replyJson).toJson(jsonFormat);
121 responsePtr.reset(request.GetProtocolEngine().CreateResponse(
122 request,
123 protocolStatusCode,
124 replyPayload,
125 QByteArray("application/json; charset=utf-8")).PopInterfacePtr());
126
127 return true;
128}
129
130
131} // namespace imtrest
132
133