From 4a41df3cf6d91831a9ba9e6bc336b8c2aff8fd93 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Thu, 3 Dec 2020 12:00:47 +0100 Subject: [PATCH] Allow filtering GetThingClasses for thingClassIds --- libnymea-core/jsonrpc/integrationshandler.cpp | 33 +++++++++++-------- nymea.pro | 2 +- tests/auto/api.json | 7 ++-- tests/auto/integrations/testintegrations.cpp | 17 ++++++++-- 4 files changed, 39 insertions(+), 20 deletions(-) diff --git a/libnymea-core/jsonrpc/integrationshandler.cpp b/libnymea-core/jsonrpc/integrationshandler.cpp index 60b566a7..08243330 100644 --- a/libnymea-core/jsonrpc/integrationshandler.cpp +++ b/libnymea-core/jsonrpc/integrationshandler.cpp @@ -104,8 +104,9 @@ IntegrationsHandler::IntegrationsHandler(ThingManager *thingManager, QObject *pa registerMethod("GetVendors", description, params, returns); params.clear(); returns.clear(); - description = "Returns a list of supported thing classes, optionally filtered by vendorId."; + description = "Returns a list of supported thing classes, optionally filtered by vendorId or by a list of thing class ids."; params.insert("o:vendorId", enumValueName(Uuid)); + params.insert("o:thingClassIds", QVariantList() << enumValueName(Uuid)); returns.insert("thingError", enumRef()); returns.insert("o:thingClasses", objectRef()); registerMethod("GetThingClasses", description, params, returns); @@ -507,21 +508,25 @@ JsonReply* IntegrationsHandler::GetThingClasses(const QVariantMap ¶ms, const QVariantMap returns; QVariantList thingClasses; - if (params.contains("vendorId")) { - VendorId vendorId = VendorId(params.value("vendorId").toString()); - if (m_thingManager->supportedVendors().findById(vendorId).id().isNull()) { - qCWarning(dcThingManager()) << "No such vendor:" << vendorId; - return createReply(statusToReply(Thing::ThingErrorVendorNotFound)); + foreach (const ThingClass &thingClass, NymeaCore::instance()->thingManager()->supportedThings()) { + if (params.contains("vendorId") && thingClass.vendorId() != VendorId(params.value("vendorId").toUuid())) { + continue; } - foreach (const ThingClass &thingClass, NymeaCore::instance()->thingManager()->supportedThings(vendorId)) { - ThingClass translatedThingClass = NymeaCore::instance()->thingManager()->translateThingClass(thingClass, context.locale()); - thingClasses.append(pack(translatedThingClass)); - } - } else { - foreach (const ThingClass &thingClass, NymeaCore::instance()->thingManager()->supportedThings()) { - ThingClass translatedThingClass = NymeaCore::instance()->thingManager()->translateThingClass(thingClass, context.locale()); - thingClasses.append(pack(translatedThingClass)); + if (params.contains("thingClassIds")) { + bool found = false; + foreach (const QString &tcString, params.value("thingClassIds").toStringList()) { + if (ThingClassId(tcString) == thingClass.id()) { + found = true; + break; + } + } + if (!found) { + continue; + } } + + ThingClass translatedThingClass = NymeaCore::instance()->thingManager()->translateThingClass(thingClass, context.locale()); + thingClasses.append(pack(translatedThingClass)); } returns.insert("thingError", enumValueName(Thing::ThingErrorNoError)); diff --git a/nymea.pro b/nymea.pro index 4a8c3cda..9f9e0cd3 100644 --- a/nymea.pro +++ b/nymea.pro @@ -5,7 +5,7 @@ NYMEA_VERSION_STRING=$$system('dpkg-parsechangelog | sed -n -e "s/^Version: //p" # define protocol versions JSON_PROTOCOL_VERSION_MAJOR=5 -JSON_PROTOCOL_VERSION_MINOR=2 +JSON_PROTOCOL_VERSION_MINOR=3 JSON_PROTOCOL_VERSION="$${JSON_PROTOCOL_VERSION_MAJOR}.$${JSON_PROTOCOL_VERSION_MINOR}" LIBNYMEA_API_VERSION_MAJOR=7 LIBNYMEA_API_VERSION_MINOR=0 diff --git a/tests/auto/api.json b/tests/auto/api.json index 1a25139c..cbfaea7b 100644 --- a/tests/auto/api.json +++ b/tests/auto/api.json @@ -1,4 +1,4 @@ -5.2 +5.3 { "enums": { "BasicType": [ @@ -1119,8 +1119,11 @@ } }, "Integrations.GetThingClasses": { - "description": "Returns a list of supported thing classes, optionally filtered by vendorId.", + "description": "Returns a list of supported thing classes, optionally filtered by vendorId or by a list of thing class ids.", "params": { + "o:thingClassIds": [ + "Uuid" + ], "o:vendorId": "Uuid" }, "returns": { diff --git a/tests/auto/integrations/testintegrations.cpp b/tests/auto/integrations/testintegrations.cpp index 16119f51..c59ac6ea 100644 --- a/tests/auto/integrations/testintegrations.cpp +++ b/tests/auto/integrations/testintegrations.cpp @@ -289,22 +289,33 @@ void TestIntegrations::getSupportedVendors() void TestIntegrations::getThingClasses_data() { QTest::addColumn("vendorId"); + QTest::addColumn>("thingClassIds"); QTest::addColumn("resultCount"); - QTest::newRow("vendor nymea") << nymeaVendorId << 17; - QTest::newRow("no filter") << VendorId() << 17; - QTest::newRow("invalid vendor") << VendorId("93e7d361-8025-4354-b17e-b68406c800bc") << 0; + QTest::newRow("vendor nymea") << nymeaVendorId << QList() << 17; + QTest::newRow("no filter") << VendorId() << QList() << 17; + QTest::newRow("invalid vendor") << VendorId("93e7d361-8025-4354-b17e-b68406c800bc") << QList() << 0; + QTest::newRow("mockThingClassId") << VendorId() << (QList() << mockThingClassId) << 1; + QTest::newRow("invalid thingClassId") << VendorId() << (QList() << ThingClassId("6c78ec28-09b6-476d-ac27-1d6966a45c57")) << 0; } void TestIntegrations::getThingClasses() { QFETCH(VendorId, vendorId); + QFETCH(QList, thingClassIds); QFETCH(int, resultCount); QVariantMap params; if (!vendorId.isNull()) { params.insert("vendorId", vendorId); } + if (!thingClassIds.isEmpty()) { + QStringList thingClassIdStrings; + foreach (const ThingClassId &id, thingClassIds) { + thingClassIdStrings.append(id.toString()); + } + params.insert("thingClassIds", thingClassIdStrings); + } QVariant result = injectAndWait("Integrations.GetThingClasses", params); QVariantList thingClasses = result.toMap().value("params").toMap().value("thingClasses").toList();