Files
cpp-opds/src/restapi/restapiserver.cpp

186 lines
5.7 KiB
C++

#include "restapiserver.h"
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <database/author_s-odb.hxx> // Должен быть здесь
#include <database/author_s.h>
#include <database/book_s-odb.hxx> // Должен быть здесь
#include <database/book_s.h>
#include <odb/core.hxx>
#include <odb/database.hxx>
#include <odb/query.hxx>
#include <redkit-gen-modules/json_serializer.h>
RestApiServer::RestApiServer(odb::database& db, QObject* parent) :
QTcpServer(parent), m_db(db) {}
void RestApiServer::start(quint16 port)
{
if (!this->listen(QHostAddress::Any, port))
{
qWarning() << "Ошибка запуска сервера!";
}
else
{
QString addrs = "http://127.0.0.1:" + QString::number(this->serverPort());
qDebug() << "REST API сервер запущен по адресу:" << addrs;
}
}
void RestApiServer::incomingConnection(qintptr socketDescriptor)
{
QTcpSocket* socket = new QTcpSocket(this);
socket->setSocketDescriptor(socketDescriptor);
connect(socket, &QTcpSocket::readyRead, this, &RestApiServer::handleRequest);
connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater);
qWarning() << "Есть входящее подключение" << socket->socketDescriptor();
}
void RestApiServer::handleRequest()
{
QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());
if (!socket)
return;
QString request = QString::fromUtf8(socket->readAll());
QByteArray response = processRequest(request);
socket->write(response);
socket->flush();
socket->disconnectFromHost();
}
QByteArray RestApiServer::processRequest(const QString& request)
{
if (request.startsWith("GET /books/author/"))
{
QString author = request.section(' ', 1, 1).section('/', 3, 3).replace("%20", " ");
quint64 ageReq = author.toInt();
qWarning() << "THIS" << author << ageReq;
// if (dbConn.query_one<SDB_T>(odb::query<SDB_T>::object == m_objectId, sett))
// odb::result<Book_S> res(m_db.query<Book_S>(odb::query<Book_S>::author-> == author));
// {
QStringList nameParts = author.split(' ');
QString firstName = nameParts.size() > 0 ? nameParts[0] : "";
QString lastName = nameParts.size() > 1 ? nameParts[1] : "";
qWarning()
<< "author:" << author << "\n"
<< "firstName:" << firstName << "\n"
<< "lastName:" << lastName << "\n";
// Result result(m_db.query<Book_S>(
// (Query::author->m_first + " " + Query::author->m_last == authorName) ||
// (Query::author->m_first.like("%" + firstName + "%") &&
// Query::author->m_last.like("%" + lastName + "%"))
// ));
odb::transaction t(m_db.begin());
auto books = m_db.query<Book_S>();
// using Query = odb::query<Author_S>;
// auto authors = m_db.query<Author_S>(Query::id == 2);
auto authors = m_db.query<Author_S>();
for (auto book : books)
qWarning() << book.name() << book.author()->full_name();
for (auto author : authors)
qWarning() << author.full_name() << author.age();
// std::vector<SH<Book_S>> books(result.begin(), result.end());
t.commit();
// return books;
// }
// for (auto book : books)
// qWarning() << book.author()->full_name();
// qWarning() << books;
// QList<BookRecord> results = books.getBooksByAuthor(author);
QByteArray jsonResponse = "{ \"books\": [";
// for (const BookRecord& book : results)
// {
// jsonResponse += QString("{ \"id\": %1, \"title\": \"%2\", \"author\": \"%3\", \"year\": %4 },")
// .arg(book.id)
// .arg(book.title)
// .arg(book.author)
// .arg(book.year)
// .toUtf8();
// }
// if (results.size() > 0)
// jsonResponse.chop(1); // Убираем последнюю запятую
jsonResponse += "] }";
return "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n" + jsonResponse;
}
if (request.startsWith("GET /books"))
{
odb::transaction t(m_db.begin());
odb::result<Book_S> res(m_db.query<Book_S>());
QJsonArray jArray;
for (auto it = res.begin(); it != res.end(); ++it)
{
const auto& book = *it;
QJsonObject j;
j["id"] = QString::number(book.id());
j["title"] = book.name();
j["author"] = book.author()->full_name();
j["year"] = book.year();
jArray.push_back(j);
}
auto jDoc = QJsonDocument(jArray);
t.commit();
return "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n" + jDoc.toJson(QJsonDocument::Indented);
}
if (request.startsWith("GET /author"))
{
odb::transaction t(m_db.begin());
odb::result<Author_S> res(m_db.query<Author_S>());
QJsonArray jArray;
for (auto it = res.begin(); it != res.end(); ++it)
{
const auto& author = *it;
QJsonObject j;
j["id"] = QString::number(author.id());
j["first"] = author.firstName();
j["last"] = author.lastName();
j["age"] = author.age();
jArray.push_back(j);
}
auto jDoc = QJsonDocument(jArray);
t.commit();
return "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n" + jDoc.toJson(QJsonDocument::Indented);
}
return "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\n\r\nNot Found";
}