diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d8b58db..4c4a6320 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,21 @@ # Change Log +## 23.1.0 + +* Added `x` OAuth provider to `OAuthProvider` enum +* Added `userType` field to `Log` model +* Added `getHeaders()` method to `Client` +* Updated `X-Appwrite-Response-Format` header to `1.9.1` +* Updated TTL description for list caching in Databases and TablesDB + ## 23.0.0 -* [BREAKING] Changed `$sequence` type from `int` to `string` for rows and documents -* Updated README badge to API version `1.9.x` and dependency example -* Updated dependency example to `^21.1.0` +* [BREAKING] Changed `$sequence` type from `int` to `String` for `Row` and `Document` models +* Added impersonation support: `setImpersonateUserId()`, `setImpersonateUserEmail()`, `setImpersonateUserPhone()` on `Client`, `ClientBrowser`, and `ClientIO` +* Added `impersonator` and `impersonatorUserId` optional fields to `User` model +* Updated `Log` model field descriptions to clarify impersonation behavior for `userId`, `userEmail`, `userName` +* Updated `X-Appwrite-Response-Format` header to `1.9.0` +* Updated README badge to API version `1.9.x` and dependency example to `^23.0.0` ## 22.0.0 diff --git a/README.md b/README.md index 7b48a8ea..4fd2ad0b 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Add this to your package's `pubspec.yaml` file: ```yml dependencies: - appwrite: ^23.0.0 + appwrite: ^23.1.0 ``` You can install packages from the command line: diff --git a/lib/src/client.dart b/lib/src/client.dart index 8af4103d..9535a309 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -97,6 +97,9 @@ abstract class Client { /// Add headers that should be sent with all API calls. Client addHeader(String key, String value); + /// Get the current request headers. + Map getHeaders(); + /// Sends a "ping" request to Appwrite to verify connectivity. Future ping(); diff --git a/lib/src/client_base.dart b/lib/src/client_base.dart index aca65b09..c806e36a 100644 --- a/lib/src/client_base.dart +++ b/lib/src/client_base.dart @@ -45,6 +45,9 @@ abstract class ClientBase implements Client { @override ClientBase addHeader(String key, String value); + @override + Map getHeaders(); + @override Future ping() async { final String apiPath = '/ping'; diff --git a/lib/src/client_browser.dart b/lib/src/client_browser.dart index 679dd6bf..cf1b6829 100644 --- a/lib/src/client_browser.dart +++ b/lib/src/client_browser.dart @@ -40,8 +40,8 @@ class ClientBrowser extends ClientBase with ClientMixin { 'x-sdk-name': 'Flutter', 'x-sdk-platform': 'client', 'x-sdk-language': 'flutter', - 'x-sdk-version': '23.0.0', - 'X-Appwrite-Response-Format': '1.9.0', + 'x-sdk-version': '23.1.0', + 'X-Appwrite-Response-Format': '1.9.1', }; config = {}; @@ -155,6 +155,11 @@ class ClientBrowser extends ClientBase with ClientMixin { return this; } + @override + Map getHeaders() { + return Map.from(_headers!); + } + Future init() async { final cookieFallback = web.window.localStorage.getItem('cookieFallback'); if (cookieFallback != null) { diff --git a/lib/src/client_io.dart b/lib/src/client_io.dart index 2570c71a..31d31428 100644 --- a/lib/src/client_io.dart +++ b/lib/src/client_io.dart @@ -58,8 +58,8 @@ class ClientIO extends ClientBase with ClientMixin { 'x-sdk-name': 'Flutter', 'x-sdk-platform': 'client', 'x-sdk-language': 'flutter', - 'x-sdk-version': '23.0.0', - 'X-Appwrite-Response-Format': '1.9.0', + 'x-sdk-version': '23.1.0', + 'X-Appwrite-Response-Format': '1.9.1', }; config = {}; @@ -184,6 +184,11 @@ class ClientIO extends ClientBase with ClientMixin { return this; } + @override + Map getHeaders() { + return Map.from(_headers!); + } + Future init() async { if (_initProgress) return; _initProgress = true; @@ -384,7 +389,6 @@ class ClientIO extends ClientBase with ClientMixin { ? callbackUrlScheme : "appwrite-callback-${config['project']!}", options: const FlutterWebAuth2Options( - intentFlags: ephemeralIntentFlags, useWebview: false, ), ).then((value) async { diff --git a/lib/src/enums/o_auth_provider.dart b/lib/src/enums/o_auth_provider.dart index fe3f1c74..dc08c932 100644 --- a/lib/src/enums/o_auth_provider.dart +++ b/lib/src/enums/o_auth_provider.dart @@ -35,6 +35,7 @@ enum OAuthProvider { tradeshiftBox(value: 'tradeshiftBox'), twitch(value: 'twitch'), wordpress(value: 'wordpress'), + x(value: 'x'), yahoo(value: 'yahoo'), yammer(value: 'yammer'), yandex(value: 'yandex'), diff --git a/lib/src/models/log.dart b/lib/src/models/log.dart index ff67b75b..572cce50 100644 --- a/lib/src/models/log.dart +++ b/lib/src/models/log.dart @@ -17,6 +17,9 @@ class Log implements Model { /// API mode when event triggered. final String mode; + /// User type who triggered the audit log. Possible values: user, admin, guest, keyProject, keyAccount, keyOrganization. + final String userType; + /// IP session in use when the session was created. final String ip; @@ -71,6 +74,7 @@ class Log implements Model { required this.userEmail, required this.userName, required this.mode, + required this.userType, required this.ip, required this.time, required this.osCode, @@ -96,6 +100,7 @@ class Log implements Model { userEmail: map['userEmail'].toString(), userName: map['userName'].toString(), mode: map['mode'].toString(), + userType: map['userType'].toString(), ip: map['ip'].toString(), time: map['time'].toString(), osCode: map['osCode'].toString(), @@ -123,6 +128,7 @@ class Log implements Model { "userEmail": userEmail, "userName": userName, "mode": mode, + "userType": userType, "ip": ip, "time": time, "osCode": osCode, diff --git a/pubspec.yaml b/pubspec.yaml index 708ff5bb..544936f6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: appwrite -version: 23.0.0 +version: 23.1.0 description: Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API homepage: https://appwrite.io repository: https://github.com/appwrite/sdk-for-flutter @@ -20,7 +20,7 @@ dependencies: sdk: flutter cookie_jar: ^4.0.8 device_info_plus: '>=11.5.0 <13.0.0' - flutter_web_auth_2: ^5.0.0-alpha.3 + flutter_web_auth_2: ^5.0.0 http: '>=0.13.6 <2.0.0' package_info_plus: '>=8.0.2 <10.0.0' path_provider: ^2.1.4 diff --git a/test/services/account_test.dart b/test/services/account_test.dart index c91bab89..384dd0d9 100644 --- a/test/services/account_test.dart +++ b/test/services/account_test.dart @@ -234,8 +234,9 @@ void main() { test('test method createMfaAuthenticator()', () async { final Map data = { - 'secret': '1', - 'uri': '1', + 'secret': '[SHARED_SECRET]', + 'uri': + 'otpauth://totp/appwrite:user@example.com?secret=[SHARED_SECRET]&issuer=appwrite', }; when(client.call( @@ -250,8 +251,9 @@ void main() { test('test method createMFAAuthenticator()', () async { final Map data = { - 'secret': '1', - 'uri': '1', + 'secret': '[SHARED_SECRET]', + 'uri': + 'otpauth://totp/appwrite:user@example.com?secret=[SHARED_SECRET]&issuer=appwrite', }; when(client.call( diff --git a/test/src/models/log_test.dart b/test/src/models/log_test.dart index b328ad58..c8211d3b 100644 --- a/test/src/models/log_test.dart +++ b/test/src/models/log_test.dart @@ -10,6 +10,7 @@ void main() { userEmail: 'john@appwrite.io', userName: 'John Doe', mode: 'admin', + userType: 'user', ip: '127.0.0.1', time: '2020-10-15T06:38:00.000+00:00', osCode: 'Mac', @@ -36,6 +37,7 @@ void main() { expect(result.userEmail, 'john@appwrite.io'); expect(result.userName, 'John Doe'); expect(result.mode, 'admin'); + expect(result.userType, 'user'); expect(result.ip, '127.0.0.1'); expect(result.time, '2020-10-15T06:38:00.000+00:00'); expect(result.osCode, 'Mac'); diff --git a/test/src/models/mfa_type_test.dart b/test/src/models/mfa_type_test.dart index fb964947..81657394 100644 --- a/test/src/models/mfa_type_test.dart +++ b/test/src/models/mfa_type_test.dart @@ -5,15 +5,17 @@ void main() { group('MfaType', () { test('model', () { final model = MfaType( - secret: '1', - uri: '1', + secret: '[SHARED_SECRET]', + uri: + 'otpauth://totp/appwrite:user@example.com?secret=[SHARED_SECRET]&issuer=appwrite', ); final map = model.toMap(); final result = MfaType.fromMap(map); - expect(result.secret, '1'); - expect(result.uri, '1'); + expect(result.secret, '[SHARED_SECRET]'); + expect(result.uri, + 'otpauth://totp/appwrite:user@example.com?secret=[SHARED_SECRET]&issuer=appwrite'); }); }); }