add vendors resource

pull/135/head
Simon Stürz 2015-07-27 19:32:21 +02:00 committed by Michael Zanetti
parent 34e53ef5b3
commit f8296c8707
15 changed files with 119 additions and 32 deletions

View File

@ -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();

View File

@ -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:

View File

@ -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

View File

@ -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:

View File

@ -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)

View File

@ -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:

View File

@ -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)

View File

@ -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:

View File

@ -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();

View File

@ -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()

View File

@ -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();

View File

@ -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)

View File

@ -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:

View File

@ -20,6 +20,10 @@
#include "vendorsresource.h"
#include "network/httprequest.h"
#include "loggingcategories.h"
#include "guhcore.h"
#include <QJsonDocument>
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);
}
}

View File

@ -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;
};