From f8296c8707aa9e9f0f88a26ba9601c7eb610e814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Mon, 27 Jul 2015 19:32:21 +0200 Subject: [PATCH] add vendors resource --- server/rest/deviceclassesresource.cpp | 6 +++ server/rest/deviceclassesresource.h | 2 + server/rest/devicesresource.cpp | 10 ++-- server/rest/devicesresource.h | 2 + server/rest/logsresource.cpp | 5 ++ server/rest/logsresource.h | 2 + server/rest/pluginsresource.cpp | 5 ++ server/rest/pluginsresource.h | 2 + server/rest/restresource.h | 2 + server/rest/restserver.cpp | 15 ++++++ server/rest/restserver.h | 2 + server/rest/rulesresource.cpp | 5 ++ server/rest/rulesresource.h | 2 + server/rest/vendorsresource.cpp | 76 ++++++++++++++++++++------- server/rest/vendorsresource.h | 15 +++--- 15 files changed, 119 insertions(+), 32 deletions(-) diff --git a/server/rest/deviceclassesresource.cpp b/server/rest/deviceclassesresource.cpp index aff05a54..1e52d4c0 100644 --- a/server/rest/deviceclassesresource.cpp +++ b/server/rest/deviceclassesresource.cpp @@ -32,6 +32,11 @@ DeviceClassesResource::DeviceClassesResource(QObject *parent) : connect(GuhCore::instance(), &GuhCore::devicesDiscovered, this, &DeviceClassesResource::devicesDiscovered, Qt::QueuedConnection); } +QString DeviceClassesResource::name() const +{ + return "deviceclasses"; +} + HttpReply *DeviceClassesResource::proccessRequest(const HttpRequest &request, const QStringList &urlTokens) { @@ -248,6 +253,7 @@ void DeviceClassesResource::devicesDiscovered(const DeviceClassId &deviceClassId return; // Not the discovery we are waiting for. qCDebug(dcRest) << "Discovery finished. Found" << deviceDescriptors.count() << "devices."; + HttpReply *reply = m_discoverRequests.take(deviceClassId); reply->setPayload(QJsonDocument::fromVariant(JsonTypes::packDeviceDescriptors(deviceDescriptors)).toJson()); reply->finished(); diff --git a/server/rest/deviceclassesresource.h b/server/rest/deviceclassesresource.h index b71c1196..80809ceb 100644 --- a/server/rest/deviceclassesresource.h +++ b/server/rest/deviceclassesresource.h @@ -38,6 +38,8 @@ class DeviceClassesResource : public RestResource public: explicit DeviceClassesResource(QObject *parent = 0); + QString name() const override; + HttpReply *proccessRequest(const HttpRequest &request, const QStringList &urlTokens) override; private: diff --git a/server/rest/devicesresource.cpp b/server/rest/devicesresource.cpp index 0945c662..f0746c17 100644 --- a/server/rest/devicesresource.cpp +++ b/server/rest/devicesresource.cpp @@ -36,6 +36,11 @@ DevicesResource::DevicesResource(QObject *parent) : connect(GuhCore::instance(), &GuhCore::deviceEditFinished, this, &DevicesResource::deviceEditFinished); } +QString DevicesResource::name() const +{ + return "devices"; +} + HttpReply *DevicesResource::proccessRequest(const HttpRequest &request, const QStringList &urlTokens) { m_device = 0; @@ -258,10 +263,10 @@ HttpReply *DevicesResource::addConfiguredDevice(const QByteArray &payload) const DeviceManager::DeviceError status; if (deviceDescriptorId.isNull()) { - qCDebug(dcRest) << "...adding device with params" << deviceParams; + qCDebug(dcRest) << "Adding device with params" << deviceParams; status = GuhCore::instance()->addConfiguredDevice(deviceClass, deviceParams, newDeviceId); } else { - qCDebug(dcRest) << "...adding discovered device with descriptor id" << deviceDescriptorId; + qCDebug(dcRest) << "Adding discovered device"; status = GuhCore::instance()->addConfiguredDevice(deviceClass, deviceDescriptorId, newDeviceId); } if (status == DeviceManager::DeviceErrorAsync) { @@ -274,7 +279,6 @@ HttpReply *DevicesResource::addConfiguredDevice(const QByteArray &payload) const return createErrorReply(HttpReply::InternalServerError); return createSuccessReply(); - } HttpReply *DevicesResource::editDevice(Device *device, const QByteArray &payload) const diff --git a/server/rest/devicesresource.h b/server/rest/devicesresource.h index 0ab9c235..5bda455c 100644 --- a/server/rest/devicesresource.h +++ b/server/rest/devicesresource.h @@ -38,6 +38,8 @@ class DevicesResource: public RestResource public: explicit DevicesResource(QObject *parent = 0); + QString name() const override; + HttpReply *proccessRequest(const HttpRequest &request, const QStringList &urlTokens) override; private: diff --git a/server/rest/logsresource.cpp b/server/rest/logsresource.cpp index ba382f84..14790609 100644 --- a/server/rest/logsresource.cpp +++ b/server/rest/logsresource.cpp @@ -28,6 +28,11 @@ LogsResource::LogsResource(QObject *parent) : { } +QString LogsResource::name() const +{ + return "logs"; +} + HttpReply *LogsResource::proccessRequest(const HttpRequest &request, const QStringList &urlTokens) { Q_UNUSED(request) diff --git a/server/rest/logsresource.h b/server/rest/logsresource.h index 469178e2..c582a815 100644 --- a/server/rest/logsresource.h +++ b/server/rest/logsresource.h @@ -38,6 +38,8 @@ class LogsResource : public RestResource public: explicit LogsResource(QObject *parent = 0); + QString name() const override; + HttpReply *proccessRequest(const HttpRequest &request, const QStringList &urlTokens) override; private: diff --git a/server/rest/pluginsresource.cpp b/server/rest/pluginsresource.cpp index e63091f0..dc0c6e25 100644 --- a/server/rest/pluginsresource.cpp +++ b/server/rest/pluginsresource.cpp @@ -28,6 +28,11 @@ PluginsResource::PluginsResource(QObject *parent) : { } +QString PluginsResource::name() const +{ + return "plugins"; +} + HttpReply *PluginsResource::proccessRequest(const HttpRequest &request, const QStringList &urlTokens) { Q_UNUSED(request) diff --git a/server/rest/pluginsresource.h b/server/rest/pluginsresource.h index d9c83414..c759c6c1 100644 --- a/server/rest/pluginsresource.h +++ b/server/rest/pluginsresource.h @@ -38,6 +38,8 @@ class PluginsResource : public RestResource public: explicit PluginsResource(QObject *parent = 0); + QString name() const override; + HttpReply *proccessRequest(const HttpRequest &request, const QStringList &urlTokens) override; private: diff --git a/server/rest/restresource.h b/server/rest/restresource.h index 9e701e73..877fe7ff 100644 --- a/server/rest/restresource.h +++ b/server/rest/restresource.h @@ -39,6 +39,8 @@ public: explicit RestResource(QObject *parent = 0); virtual ~RestResource() = 0; + virtual QString name() const = 0; + virtual HttpReply *proccessRequest(const HttpRequest &request, const QStringList &urlTokens) = 0; static HttpReply *createSuccessReply(); diff --git a/server/rest/restserver.cpp b/server/rest/restserver.cpp index 8541338c..59f4f157 100644 --- a/server/rest/restserver.cpp +++ b/server/rest/restserver.cpp @@ -46,6 +46,7 @@ void RestServer::setup() // Create resources m_deviceResource = new DevicesResource(this); m_deviceClassesResource = new DeviceClassesResource(this); + m_vendorsResource = new VendorsResource(this); } void RestServer::clientConnected(const QUuid &clientId) @@ -103,6 +104,20 @@ void RestServer::processHttpRequest(const QUuid &clientId, const HttpRequest &re reply->deleteLater(); return; } + + if (urlTokens.at(2) == "vendors") { + HttpReply *reply = m_vendorsResource->proccessRequest(request, urlTokens); + reply->setClientId(clientId); + if (reply->type() == HttpReply::TypeAsync) { + connect(reply, &HttpReply::finished, this, &RestServer::asyncReplyFinished); + reply->startWait(); + m_asyncReplies.insert(clientId, reply); + return; + } + m_webserver->sendHttpReply(reply); + reply->deleteLater(); + return; + } } void RestServer::asyncReplyFinished() diff --git a/server/rest/restserver.h b/server/rest/restserver.h index cf20d3f2..4a3124d4 100644 --- a/server/rest/restserver.h +++ b/server/rest/restserver.h @@ -27,6 +27,7 @@ #include "jsonhandler.h" #include "devicesresource.h" #include "deviceclassesresource.h" +#include "vendorsresource.h" class HttpRequest; class HttpReply; @@ -47,6 +48,7 @@ private: DevicesResource *m_deviceResource; DeviceClassesResource *m_deviceClassesResource; + VendorsResource *m_vendorsResource; private slots: void setup(); diff --git a/server/rest/rulesresource.cpp b/server/rest/rulesresource.cpp index a4adce54..ce7c3266 100644 --- a/server/rest/rulesresource.cpp +++ b/server/rest/rulesresource.cpp @@ -27,6 +27,11 @@ RulesResource::RulesResource(QObject *parent) : { } +QString RulesResource::name() const +{ + return "rules"; +} + HttpReply *RulesResource::proccessRequest(const HttpRequest &request, const QStringList &urlTokens) { Q_UNUSED(request) diff --git a/server/rest/rulesresource.h b/server/rest/rulesresource.h index 1c7fd8cb..c81a34b7 100644 --- a/server/rest/rulesresource.h +++ b/server/rest/rulesresource.h @@ -38,6 +38,8 @@ class RulesResource : public RestResource public: explicit RulesResource(QObject *parent = 0); + QString name() const override; + HttpReply *proccessRequest(const HttpRequest &request, const QStringList &urlTokens) override; private: diff --git a/server/rest/vendorsresource.cpp b/server/rest/vendorsresource.cpp index ff02f978..1c86eddf 100644 --- a/server/rest/vendorsresource.cpp +++ b/server/rest/vendorsresource.cpp @@ -20,6 +20,10 @@ #include "vendorsresource.h" #include "network/httprequest.h" +#include "loggingcategories.h" +#include "guhcore.h" + +#include namespace guhserver { @@ -28,10 +32,33 @@ VendorsResource::VendorsResource(QObject *parent) : { } +QString VendorsResource::name() const +{ + return "vendors"; +} + HttpReply *VendorsResource::proccessRequest(const HttpRequest &request, const QStringList &urlTokens) { - Q_UNUSED(request) - Q_UNUSED(urlTokens) + // /api/v1/vendors/{vendorId}/ + if (urlTokens.count() >= 4) { + m_vendorId = VendorId(urlTokens.at(3)); + if (m_vendorId.isNull()) { + qCWarning(dcRest) << "Could not parse VendorId:" << urlTokens.at(3); + return createErrorReply(HttpReply::BadRequest); + } + } + + // check method + HttpReply *reply; + switch (request.method()) { + case HttpRequest::Get: + reply = proccessGetRequest(request, urlTokens); + break; + default: + reply = createErrorReply(HttpReply::BadRequest); + break; + } + return reply; return createErrorReply(HttpReply::NotImplemented); } @@ -39,33 +66,42 @@ HttpReply *VendorsResource::proccessRequest(const HttpRequest &request, const QS HttpReply *VendorsResource::proccessGetRequest(const HttpRequest &request, const QStringList &urlTokens) { Q_UNUSED(request) - Q_UNUSED(urlTokens) + + // GET /api/v1/vendors + if (urlTokens.count() == 3) + return getVendors(); + + // GET /api/v1/vendors/{vendorId} + if (urlTokens.count() == 4) + return getVendor(m_vendorId); return createErrorReply(HttpReply::NotImplemented); } -HttpReply *VendorsResource::proccessDeleteRequest(const HttpRequest &request, const QStringList &urlTokens) +HttpReply *VendorsResource::getVendors() const { - Q_UNUSED(request) - Q_UNUSED(urlTokens) + qCDebug(dcRest) << "Get vendors"; + HttpReply *reply = createSuccessReply(); - return createErrorReply(HttpReply::NotImplemented); + QVariantList vendorsList; + foreach (const Vendor &vendor, GuhCore::instance()->supportedVendors()) { + vendorsList.append(JsonTypes::packVendor(vendor)); + } + reply->setPayload(QJsonDocument::fromVariant(vendorsList).toJson()); + return reply; } -HttpReply *VendorsResource::proccessPutRequest(const HttpRequest &request, const QStringList &urlTokens) +HttpReply *VendorsResource::getVendor(const VendorId &vendorId) const { - Q_UNUSED(request) - Q_UNUSED(urlTokens) - - return createErrorReply(HttpReply::NotImplemented); -} - -HttpReply *VendorsResource::proccessPostRequest(const HttpRequest &request, const QStringList &urlTokens) -{ - Q_UNUSED(request) - Q_UNUSED(urlTokens) - - return createErrorReply(HttpReply::NotImplemented); + qCDebug(dcRest) << "Get vendor with id" << vendorId; + foreach (const Vendor &vendor, GuhCore::instance()->supportedVendors()) { + if (vendor.id() == vendorId) { + HttpReply *reply = createSuccessReply(); + reply->setPayload(QJsonDocument::fromVariant(JsonTypes::packVendor(vendor)).toJson()); + return reply; + } + } + return createErrorReply(HttpReply::NotFound); } } diff --git a/server/rest/vendorsresource.h b/server/rest/vendorsresource.h index 6d7994e6..fa6abcd5 100644 --- a/server/rest/vendorsresource.h +++ b/server/rest/vendorsresource.h @@ -38,22 +38,19 @@ class VendorsResource : public RestResource public: explicit VendorsResource(QObject *parent = 0); + QString name() const override; + HttpReply *proccessRequest(const HttpRequest &request, const QStringList &urlTokens) override; private: + VendorId m_vendorId; + // Process method HttpReply *proccessGetRequest(const HttpRequest &request, const QStringList &urlTokens) override; - HttpReply *proccessDeleteRequest(const HttpRequest &request, const QStringList &urlTokens) override; - HttpReply *proccessPutRequest(const HttpRequest &request, const QStringList &urlTokens) override; - HttpReply *proccessPostRequest(const HttpRequest &request, const QStringList &urlTokens) override; // Get methods - - // Delete methods - - // Post methods - - // Put methods + HttpReply *getVendors() const; + HttpReply *getVendor(const VendorId &vendorId) const; };