Skip to content

Commit a1de605

Browse files
committed
Update API according to ThingsBoard ver. 3.4.0
1 parent af6ad9b commit a1de605

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+2467
-95
lines changed

analysis_options.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Defines a default set of lint rules enforced for
22
# projects at Google. For details and rationale,
33
# see https://github.com/dart-lang/pedantic#enabled-lints.
4-
include: package:pedantic/analysis_options.yaml
4+
include: package:lints/core.yaml
55

66
# For lint rules and documentation, see http://dart-lang.github.io/linter/lints.
77
# Uncomment to specify additional rules.

example/fetch_data.dart

Lines changed: 119 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:convert';
22
import 'dart:math';
33

4+
import 'package:collection/collection.dart';
45
import 'package:dio/dio.dart';
56
import 'package:thingsboard_client/thingsboard_client.dart';
67

@@ -53,8 +54,12 @@ Future<void> onUserLoaded() async {
5354
print('currentUser: $currentUser');
5455
if (tbClient.isSystemAdmin()) {
5556
await fetchSettingsExample();
57+
await fetchPlatformTwoFactorAuthSettingsExample();
5658
await fetchTenantsExample();
59+
await fetchQueuesExample();
5760
} else if (tbClient.isTenantAdmin()) {
61+
await fetchAccountTwoFactorAuthSettingsExample();
62+
await fetchTenantSettingsExample();
5863
await fetchUsersExample();
5964
await fetchDeviceProfilesExample();
6065
await fetchDeviceProfileInfosExample();
@@ -69,7 +74,10 @@ Future<void> onUserLoaded() async {
6974
await fetchAuditLogsExample();
7075
await fetchResourcesExample();
7176
await fetchOtaPackagesExample();
77+
await fetchQueuesExample();
78+
await vcExample();
7279
} else if (tbClient.isCustomerUser()) {
80+
await fetchAccountTwoFactorAuthSettingsExample();
7381
await fetchUsersExample();
7482
await fetchDeviceProfileInfosExample();
7583
await fetchCustomerAssetsExample();
@@ -133,6 +141,54 @@ Future<void> fetchSettingsExample() async {
133141
'**********************************************************************');
134142
}
135143

144+
Future<void> fetchPlatformTwoFactorAuthSettingsExample() async {
145+
print(
146+
'**********************************************************************');
147+
print(
148+
'* FETCH PLATFORM TWO FACTOR AUTH SETTINGS EXAMPLE *');
149+
print(
150+
'**********************************************************************');
151+
152+
var settings =
153+
await tbClient.getTwoFactorAuthService().getPlatformTwoFaSettings();
154+
155+
print('Platform Two Factor Authentication settings: $settings');
156+
}
157+
158+
Future<void> fetchAccountTwoFactorAuthSettingsExample() async {
159+
print(
160+
'**********************************************************************');
161+
print(
162+
'* FETCH ACCOUNT TWO FACTOR AUTH SETTINGS EXAMPLE *');
163+
print(
164+
'**********************************************************************');
165+
166+
var settings =
167+
await tbClient.getTwoFactorAuthService().getAccountTwoFaSettings();
168+
169+
print('Account Two Factor Authentication settings: $settings');
170+
}
171+
172+
Future<void> fetchTenantSettingsExample() async {
173+
print(
174+
'**********************************************************************');
175+
print(
176+
'* FETCH TENANT SETTINGS EXAMPLE *');
177+
print(
178+
'**********************************************************************');
179+
180+
var repositorySettings =
181+
await tbClient.getAdminService().getRepositorySettings();
182+
print('Repository settings: $repositorySettings');
183+
184+
var autoCommitSettings =
185+
await tbClient.getAdminService().getAutoCommitSettings();
186+
print('Auto-commit settings: $autoCommitSettings');
187+
188+
print(
189+
'**********************************************************************');
190+
}
191+
136192
Future<void> fetchTenantsExample() async {
137193
print(
138194
'**********************************************************************');
@@ -543,7 +599,7 @@ Future<void> fetchCustomerAssetsExample() async {
543599
do {
544600
assets = await tbClient
545601
.getAssetService()
546-
.getCustomerAssetInfos(tbClient.getAuthUser()!.customerId, pageLink);
602+
.getCustomerAssetInfos(tbClient.getAuthUser()!.customerId!, pageLink);
547603
print('assets: $assets');
548604
pageLink = pageLink.nextPageLink();
549605
} while (assets.hasNext);
@@ -564,7 +620,7 @@ Future<void> fetchCustomerDevicesExample() async {
564620
do {
565621
devices = await tbClient
566622
.getDeviceService()
567-
.getCustomerDeviceInfos(tbClient.getAuthUser()!.customerId, pageLink);
623+
.getCustomerDeviceInfos(tbClient.getAuthUser()!.customerId!, pageLink);
568624
print('devices: $devices');
569625
pageLink = pageLink.nextPageLink();
570626
} while (devices.hasNext);
@@ -584,10 +640,70 @@ Future<void> fetchCustomerDashboardsExample() async {
584640
do {
585641
dashboards = await tbClient
586642
.getDashboardService()
587-
.getCustomerDashboards(tbClient.getAuthUser()!.customerId, pageLink);
643+
.getCustomerDashboards(tbClient.getAuthUser()!.customerId!, pageLink);
588644
print('dashboards: $dashboards');
589645
pageLink = pageLink.nextPageLink();
590646
} while (dashboards.hasNext);
591647
print(
592648
'**********************************************************************');
593649
}
650+
651+
Future<void> fetchQueuesExample() async {
652+
print(
653+
'**********************************************************************');
654+
print(
655+
'* FETCH QUEUES EXAMPLE *');
656+
print(
657+
'**********************************************************************');
658+
659+
for (ServiceType serviceType in ServiceType.values) {
660+
print('Fetching queues for ${serviceType.toShortString()} service type:');
661+
var pageLink = PageLink(10);
662+
PageData<Queue> queues;
663+
do {
664+
queues = await tbClient
665+
.getQueueService()
666+
.getTenantQueuesByServiceType(pageLink, serviceType);
667+
print('queues: $queues');
668+
pageLink = pageLink.nextPageLink();
669+
} while (queues.hasNext);
670+
}
671+
print(
672+
'**********************************************************************');
673+
}
674+
675+
Future<void> vcExample() async {
676+
print(
677+
'**********************************************************************');
678+
print(
679+
'* VERSION CONTROL EXAMPLE *');
680+
print(
681+
'**********************************************************************');
682+
683+
var repositorySettingsExists =
684+
await tbClient.getAdminService().repositorySettingsExists();
685+
print('Repository settings exists: $repositorySettingsExists');
686+
687+
if (repositorySettingsExists) {
688+
var branches =
689+
await tbClient.getEntitiesVersionControlService().listBranches();
690+
print('branches: $branches');
691+
692+
var defaultBranch = branches.firstWhereOrNull((branch) => branch.isDefault);
693+
print('defaultBranch: $defaultBranch');
694+
if (defaultBranch != null) {
695+
var pageLink = PageLink(10);
696+
PageData<EntityVersion> versions;
697+
do {
698+
versions = await tbClient
699+
.getEntitiesVersionControlService()
700+
.listVersions(pageLink, defaultBranch.name);
701+
print('versions: $versions');
702+
pageLink = pageLink.nextPageLink();
703+
} while (versions.hasNext);
704+
}
705+
}
706+
707+
print(
708+
'**********************************************************************');
709+
}

example/mfa.dart

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import 'dart:convert';
2+
import 'dart:io';
3+
4+
import 'package:thingsboard_client/thingsboard_client.dart';
5+
import 'package:collection/collection.dart';
6+
7+
const thingsBoardApiEndpoint = 'http://localhost:8080';
8+
9+
late ThingsboardClient tbClient;
10+
11+
void main() async {
12+
try {
13+
tbClient = ThingsboardClient(thingsBoardApiEndpoint, onMfaAuth: onMfa);
14+
await tbClient.login(LoginRequest('tenant@thingsboard.org', 'tenant'));
15+
16+
print('isAuthenticated=${tbClient.isAuthenticated()}');
17+
18+
print('authUser: ${tbClient.getAuthUser()}');
19+
20+
if (tbClient.isAuthenticated() &&
21+
tbClient.getAuthUser()!.authority != Authority.PRE_VERIFICATION_TOKEN) {
22+
var currentUserDetails = await tbClient.getUserService().getUser();
23+
print('currentUserDetails: $currentUserDetails');
24+
await tbClient.logout();
25+
}
26+
} catch (e, s) {
27+
print('Error: $e');
28+
print('Stack: $s');
29+
}
30+
}
31+
32+
void onMfa() async {
33+
print('ON MULTI-FACTOR AUTHENTICATION!');
34+
List<TwoFaProviderInfo> providers = await tbClient
35+
.getTwoFactorAuthService()
36+
.getAvailableLoginTwoFaProviders();
37+
print('Available providers: $providers');
38+
var defaultProvider =
39+
providers.firstWhereOrNull((provider) => provider.isDefault);
40+
if (defaultProvider != null) {
41+
print('Default provider: $defaultProvider');
42+
await tbClient
43+
.getTwoFactorAuthService()
44+
.requestTwoFaVerificationCode(defaultProvider.type);
45+
print('Verification code sent!');
46+
print('Enter MFA code:');
47+
var code = stdin.readLineSync(encoding: utf8);
48+
var mfaCode = code?.trim();
49+
print('Code entered: $mfaCode');
50+
await tbClient.checkTwoFaVerificationCode(defaultProvider.type, mfaCode!);
51+
52+
print('isAuthenticated=${tbClient.isAuthenticated()}');
53+
54+
print('authUser: ${tbClient.getAuthUser()}');
55+
56+
var currentUserDetails = await tbClient.getUserService().getUser();
57+
print('currentUserDetails: $currentUserDetails');
58+
await tbClient.logout();
59+
} else {
60+
await tbClient.logout();
61+
}
62+
}

lib/src/error/_thingsboard_error_handler_html.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ ThingsboardError toThingsboardError(error, [StackTrace? stackTrace]) {
7676
message: error.toString(),
7777
errorCode: ThingsBoardErrorCode.general);
7878

79-
var errorStackTrace;
79+
StackTrace? errorStackTrace;
8080
if (tbError.error is Error) {
8181
errorStackTrace = tbError.error.stackTrace;
8282
}

lib/src/error/_thingsboard_error_handler_io.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ ThingsboardError toThingsboardError(error, [StackTrace? stackTrace]) {
7575
message: error.toString(),
7676
errorCode: ThingsBoardErrorCode.general);
7777

78-
var errorStackTrace;
78+
StackTrace? errorStackTrace;
7979
if (tbError.error is Error) {
8080
errorStackTrace = tbError.error.stackTrace;
8181
}

lib/src/interceptor/http_interceptor.dart

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,9 @@ class HttpInterceptor extends Interceptor {
128128

129129
Future _refreshTokenAndRetry(DioError error, ErrorInterceptorHandler handler,
130130
InterceptorConfig config) async {
131+
// ignore: deprecated_member_use
131132
_dio.interceptors.requestLock.lock();
133+
// ignore: deprecated_member_use
132134
_dio.interceptors.responseLock.lock();
133135
try {
134136
await _tbClient.refreshJwtToken(
@@ -139,7 +141,9 @@ class HttpInterceptor extends Interceptor {
139141
}
140142
return _handleError(e, error.requestOptions, handler, true);
141143
} finally {
144+
// ignore: deprecated_member_use
142145
_dio.interceptors.requestLock.unlock();
146+
// ignore: deprecated_member_use
143147
_dio.interceptors.responseLock.unlock();
144148
}
145149
return _retryRequest(error, handler);
@@ -161,28 +165,33 @@ class HttpInterceptor extends Interceptor {
161165
var options = error.requestOptions;
162166
var extra = options.extra;
163167
extra['isRetry'] = true;
164-
var response = await _dio.request(options.path,
165-
data: options.data,
166-
queryParameters: options.queryParameters,
167-
cancelToken: options.cancelToken,
168-
onReceiveProgress: options.onReceiveProgress,
169-
onSendProgress: options.onSendProgress,
170-
options: Options(
171-
method: options.method,
172-
sendTimeout: options.sendTimeout,
173-
receiveTimeout: options.receiveTimeout,
174-
extra: extra,
175-
headers: options.headers,
176-
responseType: options.responseType,
177-
contentType: options.contentType,
178-
validateStatus: options.validateStatus,
179-
receiveDataWhenStatusError: options.receiveDataWhenStatusError,
180-
followRedirects: options.followRedirects,
181-
maxRedirects: options.maxRedirects,
182-
requestEncoder: options.requestEncoder,
183-
responseDecoder: options.responseDecoder,
184-
listFormat: options.listFormat,
185-
));
168+
Response response;
169+
try {
170+
response = await _dio.request(options.path,
171+
data: options.data,
172+
queryParameters: options.queryParameters,
173+
cancelToken: options.cancelToken,
174+
onReceiveProgress: options.onReceiveProgress,
175+
onSendProgress: options.onSendProgress,
176+
options: Options(
177+
method: options.method,
178+
sendTimeout: options.sendTimeout,
179+
receiveTimeout: options.receiveTimeout,
180+
extra: extra,
181+
headers: options.headers,
182+
responseType: options.responseType,
183+
contentType: options.contentType,
184+
validateStatus: options.validateStatus,
185+
receiveDataWhenStatusError: options.receiveDataWhenStatusError,
186+
followRedirects: options.followRedirects,
187+
maxRedirects: options.maxRedirects,
188+
requestEncoder: options.requestEncoder,
189+
responseDecoder: options.responseDecoder,
190+
listFormat: options.listFormat,
191+
));
192+
} catch (e) {
193+
return _handleError(e, options, handler, false);
194+
}
186195
return handler.resolve(response);
187196
}
188197
}

lib/src/model/additional_info_based.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ abstract class AdditionalInfoBased<T extends HasUuid> extends BaseData<T>
1010
AdditionalInfoBased();
1111

1212
AdditionalInfoBased.fromJson(Map<String, dynamic> json,
13-
[fromIdFunction<T>? fromId])
13+
[FromIdFunction<T>? fromId])
1414
: additionalInfo = json['additionalInfo'],
1515
super.fromJson(json, fromId);
1616

0 commit comments

Comments
 (0)