Allow filtering GetThingClasses for thingClassIds

This commit is contained in:
Michael Zanetti 2020-12-03 12:00:47 +01:00
parent bfaa85979d
commit 4a41df3cf6
4 changed files with 39 additions and 20 deletions

View File

@ -104,8 +104,9 @@ IntegrationsHandler::IntegrationsHandler(ThingManager *thingManager, QObject *pa
registerMethod("GetVendors", description, params, returns); registerMethod("GetVendors", description, params, returns);
params.clear(); returns.clear(); 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:vendorId", enumValueName(Uuid));
params.insert("o:thingClassIds", QVariantList() << enumValueName(Uuid));
returns.insert("thingError", enumRef<Thing::ThingError>()); returns.insert("thingError", enumRef<Thing::ThingError>());
returns.insert("o:thingClasses", objectRef<ThingClasses>()); returns.insert("o:thingClasses", objectRef<ThingClasses>());
registerMethod("GetThingClasses", description, params, returns); registerMethod("GetThingClasses", description, params, returns);
@ -507,21 +508,25 @@ JsonReply* IntegrationsHandler::GetThingClasses(const QVariantMap &params, const
QVariantMap returns; QVariantMap returns;
QVariantList thingClasses; QVariantList thingClasses;
if (params.contains("vendorId")) { foreach (const ThingClass &thingClass, NymeaCore::instance()->thingManager()->supportedThings()) {
VendorId vendorId = VendorId(params.value("vendorId").toString()); if (params.contains("vendorId") && thingClass.vendorId() != VendorId(params.value("vendorId").toUuid())) {
if (m_thingManager->supportedVendors().findById(vendorId).id().isNull()) { continue;
qCWarning(dcThingManager()) << "No such vendor:" << vendorId;
return createReply(statusToReply(Thing::ThingErrorVendorNotFound));
} }
foreach (const ThingClass &thingClass, NymeaCore::instance()->thingManager()->supportedThings(vendorId)) { if (params.contains("thingClassIds")) {
ThingClass translatedThingClass = NymeaCore::instance()->thingManager()->translateThingClass(thingClass, context.locale()); bool found = false;
thingClasses.append(pack(translatedThingClass)); foreach (const QString &tcString, params.value("thingClassIds").toStringList()) {
} if (ThingClassId(tcString) == thingClass.id()) {
} else { found = true;
foreach (const ThingClass &thingClass, NymeaCore::instance()->thingManager()->supportedThings()) { break;
ThingClass translatedThingClass = NymeaCore::instance()->thingManager()->translateThingClass(thingClass, context.locale()); }
thingClasses.append(pack(translatedThingClass)); }
if (!found) {
continue;
}
} }
ThingClass translatedThingClass = NymeaCore::instance()->thingManager()->translateThingClass(thingClass, context.locale());
thingClasses.append(pack(translatedThingClass));
} }
returns.insert("thingError", enumValueName(Thing::ThingErrorNoError)); returns.insert("thingError", enumValueName(Thing::ThingErrorNoError));

View File

@ -5,7 +5,7 @@ NYMEA_VERSION_STRING=$$system('dpkg-parsechangelog | sed -n -e "s/^Version: //p"
# define protocol versions # define protocol versions
JSON_PROTOCOL_VERSION_MAJOR=5 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}" JSON_PROTOCOL_VERSION="$${JSON_PROTOCOL_VERSION_MAJOR}.$${JSON_PROTOCOL_VERSION_MINOR}"
LIBNYMEA_API_VERSION_MAJOR=7 LIBNYMEA_API_VERSION_MAJOR=7
LIBNYMEA_API_VERSION_MINOR=0 LIBNYMEA_API_VERSION_MINOR=0

View File

@ -1,4 +1,4 @@
5.2 5.3
{ {
"enums": { "enums": {
"BasicType": [ "BasicType": [
@ -1119,8 +1119,11 @@
} }
}, },
"Integrations.GetThingClasses": { "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": { "params": {
"o:thingClassIds": [
"Uuid"
],
"o:vendorId": "Uuid" "o:vendorId": "Uuid"
}, },
"returns": { "returns": {

View File

@ -289,22 +289,33 @@ void TestIntegrations::getSupportedVendors()
void TestIntegrations::getThingClasses_data() void TestIntegrations::getThingClasses_data()
{ {
QTest::addColumn<VendorId>("vendorId"); QTest::addColumn<VendorId>("vendorId");
QTest::addColumn<QList<ThingClassId>>("thingClassIds");
QTest::addColumn<int>("resultCount"); QTest::addColumn<int>("resultCount");
QTest::newRow("vendor nymea") << nymeaVendorId << 17; QTest::newRow("vendor nymea") << nymeaVendorId << QList<ThingClassId>() << 17;
QTest::newRow("no filter") << VendorId() << 17; QTest::newRow("no filter") << VendorId() << QList<ThingClassId>() << 17;
QTest::newRow("invalid vendor") << VendorId("93e7d361-8025-4354-b17e-b68406c800bc") << 0; QTest::newRow("invalid vendor") << VendorId("93e7d361-8025-4354-b17e-b68406c800bc") << QList<ThingClassId>() << 0;
QTest::newRow("mockThingClassId") << VendorId() << (QList<ThingClassId>() << mockThingClassId) << 1;
QTest::newRow("invalid thingClassId") << VendorId() << (QList<ThingClassId>() << ThingClassId("6c78ec28-09b6-476d-ac27-1d6966a45c57")) << 0;
} }
void TestIntegrations::getThingClasses() void TestIntegrations::getThingClasses()
{ {
QFETCH(VendorId, vendorId); QFETCH(VendorId, vendorId);
QFETCH(QList<ThingClassId>, thingClassIds);
QFETCH(int, resultCount); QFETCH(int, resultCount);
QVariantMap params; QVariantMap params;
if (!vendorId.isNull()) { if (!vendorId.isNull()) {
params.insert("vendorId", vendorId); 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); QVariant result = injectAndWait("Integrations.GetThingClasses", params);
QVariantList thingClasses = result.toMap().value("params").toMap().value("thingClasses").toList(); QVariantList thingClasses = result.toMap().value("params").toMap().value("thingClasses").toList();