diff --git a/build.yaml b/build.yaml new file mode 100644 index 0000000..8f44bc7 --- /dev/null +++ b/build.yaml @@ -0,0 +1,10 @@ +targets: + $default: + builders: + reflectable_builder: + generate_for: + - example/**.dart + - test/**.dart + - lib/**.dart + options: + formatted: true diff --git a/lib/src/directus_api.dart b/lib/src/directus_api.dart index 59c28a9..d561680 100644 --- a/lib/src/directus_api.dart +++ b/lib/src/directus_api.dart @@ -8,7 +8,9 @@ abstract class IDirectusAPI { bool get hasLoggedInUser; bool get shouldRefreshToken; String? get accessToken; + set accessToken(String? value); String? get currentAuthToken; + String? get refreshToken; set refreshToken(String? value); String get baseUrl; @@ -70,6 +72,7 @@ abstract class IDirectusAPI { PreparedRequest prepareLoginRequest(String username, String password, {String? oneTimePassword}); + DirectusLoginResult parseLoginResponse(Response response); PreparedRequest prepareUserInviteRequest(String email, String roleId); @@ -114,6 +117,8 @@ class DirectusAPI implements IDirectusAPI { String get baseUrl => _baseURL; String? _accessToken; + @override + set accessToken(String? value) => _accessToken = value; String? _refreshToken; @override set refreshToken(String? value) => _refreshToken = value; diff --git a/lib/src/directus_api_manager_base.dart b/lib/src/directus_api_manager_base.dart index edb1430..6bd2b50 100644 --- a/lib/src/directus_api_manager_base.dart +++ b/lib/src/directus_api_manager_base.dart @@ -61,6 +61,8 @@ class DirectusApiManager implements IDirectusApiManager { bool get shouldRefreshToken => _api.shouldRefreshToken; @override String? get accessToken => _api.accessToken; + @override + set accessToken(String? value) => _api.accessToken = value; @override String? get refreshToken => _api.refreshToken; @@ -257,21 +259,18 @@ class DirectusApiManager implements IDirectusApiManager { _currentUserLock = completer.future; try { - if (cachedCurrentUser == null && await hasLoggedInUser()) { - cachedCurrentUser = await _sendRequest( - requestIdentifier: _currentUserRequestIdentifier, - canSaveResponseToCache: canSaveResponseToCache, - canUseCacheForResponse: canUseCacheForResponse, - canUseOldCachedResponseAsFallback: - canUseOldCachedResponseAsFallback, - maxCacheAge: maxCacheAge, - prepareRequest: () => - _api.prepareGetCurrentUserRequest(fields: fields), - parseResponse: (response) { - final parsedJson = _api.parseGetSpecificItemResponse(response); - return DirectusUser(parsedJson); - }); - } + cachedCurrentUser ??= await _sendRequest( + requestIdentifier: _currentUserRequestIdentifier, + canSaveResponseToCache: canSaveResponseToCache, + canUseCacheForResponse: canUseCacheForResponse, + canUseOldCachedResponseAsFallback: canUseOldCachedResponseAsFallback, + maxCacheAge: maxCacheAge, + prepareRequest: () => + _api.prepareGetCurrentUserRequest(fields: fields), + parseResponse: (response) { + final parsedJson = _api.parseGetSpecificItemResponse(response); + return DirectusUser(parsedJson); + }); } catch (error) { print(error); } diff --git a/lib/src/idirectus_api_manager.dart b/lib/src/idirectus_api_manager.dart index f392d8e..6b3bf82 100644 --- a/lib/src/idirectus_api_manager.dart +++ b/lib/src/idirectus_api_manager.dart @@ -85,6 +85,7 @@ abstract class IDirectusApiManager { required T Function(Response) jsonConverter}); bool get shouldRefreshToken; String? get accessToken; + set accessToken(String? value); String? get refreshToken; Future tryAndRefreshToken(); String get webSocketBaseUrl; diff --git a/lib/test/mock_directus_api_manager.dart b/lib/test/mock_directus_api_manager.dart index ec8c236..e52d824 100644 --- a/lib/test/mock_directus_api_manager.dart +++ b/lib/test/mock_directus_api_manager.dart @@ -274,4 +274,18 @@ class MockDirectusApiManager extends IDirectusApiManager with MockMixin { void discardCurrentUserCache() { addCall(named: "discardCurrentUserCache"); } + + @override + Future loginDirectusUserWithProvider( + {required String provider}) { + addCall( + named: "loginDirectusUserWithProvider", + arguments: {"provider": provider}); + return Future.value(popNextReturnedObject()); + } + + @override + set accessToken(String? value) { + addCall(named: "set accessToken", arguments: {"value": value}); + } } diff --git a/pubspec.yaml b/pubspec.yaml index 571efad..2de5edc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: directus_api_manager description: Communicate with a Directus server using its REST API. -version: 1.14.2 +version: 1.14.3 repository: https://github.com/maxbritto/directus_api_manager environment: @@ -9,22 +9,14 @@ environment: dependencies: http: ">=0.13.4 <2.0.0" http_parser: ^4.0.2 - reflectable: ">=4.0.1 <6.0.0" + reflectable: ">=4.0.1 <6.0.0" web_socket_channel: ^3.0.3 extension_dart_tools: ^1.4.1 meta: "^1.15.0" mutex: ^3.1.0 dev_dependencies: + reflectable_builder: any build_runner: any lints: ^6.0.0 - test: ^1.27.0 - -targets: - $default: - builders: - reflectable: - generate_for: - - example/directus_api_manager_example.dart - options: - formatted: true + test: ^1.26.3 diff --git a/test/directus_api_manager_base_test.dart b/test/directus_api_manager_base_test.dart index 1e6d3a8..18533ce 100644 --- a/test/directus_api_manager_base_test.dart +++ b/test/directus_api_manager_base_test.dart @@ -28,6 +28,12 @@ void main() { ); }); + test("Set access token", () { + sut.accessToken = "NEW.ACCESS.TOKEN"; + expect(mockDirectusApi.calledFunctions, contains("set accessToken")); + expect(mockDirectusApi.receivedObjects["value"], "NEW.ACCESS.TOKEN"); + }); + test('Empty manager does not have a logged in user', () async { final mockClient = MockHTTPClient(); final sut = diff --git a/test/directus_api_test.dart b/test/directus_api_test.dart index 529d8b9..be92b71 100644 --- a/test/directus_api_test.dart +++ b/test/directus_api_test.dart @@ -32,6 +32,15 @@ void main() { }); }); + group("DirectusAPI Setter", () { + test("Set access token", () { + final sut = DirectusAPI("http://api.com"); + expect(sut.accessToken, isNull); + sut.accessToken = "NEW.ACCESS.TOKEN"; + expect(sut.accessToken, "NEW.ACCESS.TOKEN"); + }); + }); + group("DirectusAPI Data Management", () { test('Get list of items request', () { final sut = makeAuthenticatedDirectusAPI(); diff --git a/test/mock/mock_directus_api.dart b/test/mock/mock_directus_api.dart index 3225903..e9fd795 100644 --- a/test/mock/mock_directus_api.dart +++ b/test/mock/mock_directus_api.dart @@ -331,4 +331,10 @@ class MockDirectusApi with MockMixin implements IDirectusAPI { addReceivedObject(lastname, name: "lastname"); return nextReturnedRequest; } + + @override + set accessToken(String? value) { + addCalledFunction(named: "set accessToken"); + addReceivedObject(value, name: "value"); + } }