#pragma once #include "CppCommon/NetQt/WebApi/ExePost.h" #include "JsonCommand.h" #include "JsonCommandFactory.h" #include "JsonWebApiCommandWrapper.h" #include "VariantJsonCommandInfo.h" #include #include namespace Incart::Net::WebApi { class JsonWebApiPostCommand : public Net::WebApi::exePost { private: JsonCommandFactory* m_jsonCommands; public: JsonWebApiPostCommand(JsonCommandFactory* jsonCommands) : exePost() , m_jsonCommands(jsonCommands) { } public: void exe(Net::WebApi::ParsingURI&, QByteArray& body, QTcpSocket* socket) override { QByteArray bodyCopy = body; QJsonDocument jdoc = QJsonDocument::fromJson(body); if (!jdoc.isObject()) { std::cout << "[JsonWebApiPostCommand] ==== 400 Bad Request === " << std::endl; std::cout << QString(bodyCopy).toStdString() << std::endl; std::cout << "[JsonWebApiPostCommand] ======================== " << std::endl; m_resp->retError("400 Bad Request", bodyCopy); sentResponse(socket); return; } QJsonObject jobj = jdoc.object(); QVariantMap jmap = jobj.toVariantMap(); std::string commandName = jmap["cmd"].toString().toStdString(); uint32_t commandUid = jmap["uid"].toUInt(); //std::cout << "[JsonCommand.exe begin] " << commandName << " " << commandUid << std::endl; std::shared_ptr answerStatus = std::make_shared(); std::shared_ptr jsonCommand = m_jsonCommands->create(commandName); if (jsonCommand != nullptr) { JsonWebApiCommandWrapper* webApiCommand = new JsonWebApiCommandWrapper(jsonCommand, socket); connect(webApiCommand, &JsonWebApiCommandWrapper::answerIsReady, this, &JsonWebApiPostCommand::handleCommandAnswerIsReady); answerStatus = jsonCommand->execute(std::make_shared(commandName, commandUid, jmap["data"])); } if (answerStatus->result != EJsonCommandStatus::OK) { std::shared_ptr answerErrorStatus = std::dynamic_pointer_cast(answerStatus); QJsonObject jsonCommandAnswer; jsonCommandAnswer.insert("uid", static_cast(commandUid)); jsonCommandAnswer.insert("status", "error"); jsonCommandAnswer.insert("errorcode", QString::fromStdString(answerErrorStatus->errorText)); QJsonDocument document(jsonCommandAnswer); QByteArray answerBytes = document.toJson(QJsonDocument::Compact); m_resp->ret200("json", answerBytes); sentResponse(socket); } } private slots: void handleCommandAnswerIsReady(JsonWebApiCommandWrapper* command, QJsonDocument answer, std::shared_ptr status) { QJsonObject jsonCommandAnswer; QJsonValue result; if (answer.isObject()) result = answer.object(); else if (answer.isArray()) result = answer.array(); else result = {}; jsonCommandAnswer.insert("uid", static_cast(command->getUid())); if (status->result == EJsonCommandStatus::OK) { std::cout << "[JsonWebApiPostCommand.handleCommandAnswerIsReady] success" << std::endl; jsonCommandAnswer.insert("data", result); jsonCommandAnswer.insert("status", "ok"); } else { std::cout << "[JsonWebApiPostCommand.handleCommandAnswerIsReady] error" << std::endl; std::shared_ptr answerErrorStatus = std::dynamic_pointer_cast(status); jsonCommandAnswer.insert("status", "error"); jsonCommandAnswer.insert("errorcode", QString::fromStdString(answerErrorStatus->errorText)); } QJsonDocument document(jsonCommandAnswer); QByteArray answerBytes = document.toJson(QJsonDocument::Compact); //std::cout << "[JsonCommand.exe end cc] " << webApiCommand->getName() << " " << webApiCommand->getUid() << std::endl; m_resp->ret200("json", answerBytes); sentResponse(command->getSocket()); delete command; } }; } // namespace Incart::Net::WebApi