Martin Rotter d34c2d5792 api work
2023-12-11 10:59:24 +01:00

109 lines
3.5 KiB
C++

// For license of this file, see <project-root-folder>/LICENSE.md.
#include "network-web/apiserver.h"
#include "database/databasefactory.h"
#include "database/databasequeries.h"
#include "definitions/definitions.h"
#include "miscellaneous/application.h"
#include <QJsonArray>
ApiServer::ApiServer(QObject* parent) : HttpServer(parent) {}
void ApiServer::answerClient(QTcpSocket* socket, const HttpRequest& request) {
QByteArray incoming_data = socket->readAll();
QByteArray output_data;
QJsonParseError json_err;
QJsonDocument incoming_doc = QJsonDocument::fromJson(incoming_data, &json_err);
if (json_err.error != QJsonParseError::ParseError::NoError) {
output_data =
ApiResponse(ApiResponse::Result::Error, ApiRequest::Method::Unknown, QJsonValue(json_err.errorString()))
.toJson()
.toJson();
}
else {
ApiRequest req(incoming_doc);
try {
ApiResponse resp(processRequest(req));
output_data = resp.toJson().toJson();
}
catch (const ApplicationException& ex) {
ApiResponse err_resp(ApiResponse::Result::Error, req.m_method, ex.message());
output_data = err_resp.toJson().toJson();
}
}
const QByteArray reply_message = QSL("HTTP/1.0 200 OK \r\n"
"Content-Type: application/json; charset=\"utf-8\"\r\n"
"Content-Length: %1"
"\r\n\r\n"
"%2")
.arg(QString::number(output_data.size()), output_data)
.toLocal8Bit();
socket->write(reply_message);
socket->disconnectFromHost();
}
ApiResponse ApiServer::processRequest(const ApiRequest& req) const {
switch (req.m_method) {
case ApiRequest::Method::AppVersion:
return processAppVersion();
case ApiRequest::Method::ArticlesFromFeed:
return processArticlesFromFeed(req.m_parameters);
case ApiRequest::Method::Unknown:
default:
return processUnknown();
}
}
ApiResponse ApiServer::processAppVersion() const {
return ApiResponse(ApiResponse::Result::Success, ApiRequest::Method::AppVersion, QSL(APP_VERSION));
}
ApiResponse ApiServer::processArticlesFromFeed(const QJsonValue& req) const {
QJsonObject data = req.toObject();
QString feed_id = data.value(QSL("feed")).toString();
int account_id = data.value(QSL("account")).toInt();
bool newest_first = data.value(QSL("newest_first")).toBool();
bool unread_only = data.value(QSL("unread_only")).toBool();
int row_offset = data.value(QSL("row_offset")).toInt();
int row_limit = data.value(QSL("row_limit")).toInt();
QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
QList<Message> msgs =
DatabaseQueries::getFeedsSlice(database, feed_id, account_id, newest_first, unread_only, row_offset, row_limit);
QJsonArray msgs_json_array;
for (const Message& msg : msgs) {
msgs_json_array.append(msg.toJson());
}
ApiResponse resp(ApiResponse::Result::Success, ApiRequest::Method::ArticlesFromFeed, msgs_json_array);
return resp;
}
ApiResponse ApiServer::processUnknown() const {
return ApiResponse(ApiResponse::Result::Error, ApiRequest::Method::Unknown, QSL("unknown method"));
}
QJsonDocument ApiResponse::toJson() const {
QJsonObject obj;
obj.insert("method", int(m_method));
obj.insert("result", int(m_result));
obj.insert("data", m_response);
return QJsonDocument(obj);
}