From 9bc2553837bbd81e88bd1ae5bea1cf33ed5c9cc2 Mon Sep 17 00:00:00 2001 From: monsieurtanuki Date: Tue, 9 Apr 2024 11:49:17 +0200 Subject: [PATCH 1/3] feat: 893 - 4 new fields for user Impacted files: * `login_status.dart`: added 4 fields and deprecated "email" * `open_food_api_client.dart`: upgraded the max length of user name (60) and user id (40) * `user_management_test_prod.dart`: tested the new 4 login status fields * `user_management_test_test_env.dart`: tested the new 4 login status fields and remove a test on "email" --- lib/src/model/login_status.dart | 49 +++++++++++++++++++------ lib/src/open_food_api_client.dart | 18 +++++++-- test/user_management_test_prod.dart | 5 +++ test/user_management_test_test_env.dart | 8 ++-- 4 files changed, 60 insertions(+), 20 deletions(-) diff --git a/lib/src/model/login_status.dart b/lib/src/model/login_status.dart index 9851fe7c01..2808a3f4f0 100644 --- a/lib/src/model/login_status.dart +++ b/lib/src/model/login_status.dart @@ -1,4 +1,7 @@ import '../interface/json_object.dart'; +import '../utils/country_helper.dart'; +import '../utils/json_helper.dart'; +import '../utils/language_helper.dart'; /// Status after an attempt to log in. /// @@ -14,32 +17,51 @@ import '../interface/json_object.dart'; /// "status_verbose":"user signed-in", /// "user_id":"gqwbgsvvod", /// "user":{ -/// "email":"blababla@gmail.com", -/// "name":"Mr. John Doe" +/// "name":"Mr. John Doe", +/// "preferred_language":"fr", +/// "country":"be" /// } /// } class LoginStatus { LoginStatus({ required this.status, required this.statusVerbose, - this.userEmail, + String? userEmail, this.userName, this.userId, + this.preferredLanguage, + this.country, + this.isModerator, + this.isAdmin, }); final int status; final String statusVerbose; - final String? userEmail; + // TODO: deprecated from 2024-04-09; remove when old enough + @Deprecated('Not retrieved anymore from the server') + final String? userEmail = null; final String? userName; final String? userId; + final OpenFoodFactsLanguage? preferredLanguage; + final OpenFoodFactsCountry? country; + final bool? isModerator; + final bool? isAdmin; - factory LoginStatus.fromJson(Map json) => LoginStatus( - status: JsonObject.parseInt(json['status'])!, - statusVerbose: json['status_verbose'] as String, - userId: json['user_id'] as String?, - userEmail: json['user']?['email'] as String?, - userName: json['user']?['name'] as String?, - ); + factory LoginStatus.fromJson(Map json) { + print('json: $json'); + final details = json['user']; + return LoginStatus( + status: JsonObject.parseInt(json['status'])!, + statusVerbose: json['status_verbose'] as String, + userId: json['user_id'] as String?, + userName: details?['name'] as String?, + preferredLanguage: + OpenFoodFactsLanguage.fromOffTag(details?['preferred_language']), + country: OpenFoodFactsCountry.fromOffTag(details?['country']), + isModerator: JsonHelper.boolFromJSON(details?['moderator']), + isAdmin: JsonHelper.boolFromJSON(details?['admin']), + ); + } /// Was the login successful? bool get successful => status == 1; @@ -49,7 +71,10 @@ class LoginStatus { 'status:$status' ',statusVerbose:$statusVerbose' '${userId == null ? '' : ',userId:$userId'}' - '${userEmail == null ? '' : ',userEmail:$userEmail'}' '${userName == null ? '' : ',userName:$userName'}' + '${preferredLanguage == null ? '' : ',preferredLanguage:$preferredLanguage'}' + '${country == null ? '' : ',country:$country'}' + '${isAdmin == null ? '' : ',isAdmin:$isAdmin'}' + '${isModerator == null ? '' : ',isModerator:$isModerator'}' ')'; } diff --git a/lib/src/open_food_api_client.dart b/lib/src/open_food_api_client.dart index 0251d7b51c..c63ef8d72f 100644 --- a/lib/src/open_food_api_client.dart +++ b/lib/src/open_food_api_client.dart @@ -938,8 +938,11 @@ class OpenFoodAPIClient { return null; } - /// A username may not exceed 20 characters - static const USER_NAME_MAX_LENGTH = 20; + /// A username may not exceed 60 characters + static const USER_NAME_MAX_LENGTH = 60; + + /// A user id may not exceed 40 characters + static const USER_ID_MAX_LENGTH = 40; /// Creates a new user /// @@ -947,6 +950,7 @@ class OpenFoodAPIClient { /// /// Returns [Status.status] 201 = complete; 400 = wrong inputs + [Status.error]; 500 = server error; /// + /// User id may not exceed [OpenFoodAPIClient.USER_ID_MAX_LENGTH] /// [name] may not exceed [OpenFoodAPIClient.USER_NAME_MAX_LENGTH] /// /// When creating a [producer account](https://world.pro.openfoodfacts.org/) use [orgName] (former requested_org) to name the Producer or brand @@ -980,9 +984,15 @@ class OpenFoodAPIClient { final OpenFoodFactsCountry? country, final UriProductHelper uriHelper = uriHelperFoodProd, }) async { - if (user.userId.length > USER_NAME_MAX_LENGTH) { + if (user.userId.length > USER_ID_MAX_LENGTH) { + throw ArgumentError( + 'A user id may not exceed $USER_ID_MAX_LENGTH characters!', + ); + } + + if (name.length > USER_NAME_MAX_LENGTH) { throw ArgumentError( - 'A username may not exceed $USER_NAME_MAX_LENGTH characters!', + 'A user name may not exceed $USER_NAME_MAX_LENGTH characters!', ); } diff --git a/test/user_management_test_prod.dart b/test/user_management_test_prod.dart index d05b9a60e9..d14dd6115a 100644 --- a/test/user_management_test_prod.dart +++ b/test/user_management_test_prod.dart @@ -121,6 +121,11 @@ void main() { expect(status, isNotNull); expect(status!.successful, isTrue); expect(status.userId, TestConstants.PROD_USER.userId); + expect(status.userName, 'Alexander Schacht (TIOLI)'); + expect(status.preferredLanguage, isNull); + expect(status.country, isNull); + expect(status.isAdmin, isFalse); + expect(status.isModerator, isFalse); }); group('reset password', () { diff --git a/test/user_management_test_test_env.dart b/test/user_management_test_test_env.dart index 44bb309875..e62d418f56 100644 --- a/test/user_management_test_test_env.dart +++ b/test/user_management_test_test_env.dart @@ -26,8 +26,6 @@ void main() { name = 'M. $userId'; email = "$userId@gmail.com"; - print(name); - SignUpStatus response = await OpenFoodAPIClient.register( user: User(userId: userId, password: password), name: name, @@ -49,8 +47,10 @@ void main() { expect(status!.successful, isTrue); expect(status.userId, userId); expect(status.userName, name); - expect(status.userEmail, email); - print('Creating a account and logging in worked in $counter trie(s)'); + expect(status.preferredLanguage, isNull); + expect(status.country, isNull); + expect(status.isAdmin, false); + expect(status.isModerator, false); }); test('Login with invalid credentials', () async { From ab786d74d51b3a95e7cfa1c475ee8ab080cfd929 Mon Sep 17 00:00:00 2001 From: monsieurtanuki Date: Sun, 21 Apr 2024 17:50:35 +0200 Subject: [PATCH 2/3] feat: 893 - 'cc' json field instead of 'country' --- lib/src/model/login_status.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/model/login_status.dart b/lib/src/model/login_status.dart index 248ca8d8ec..cee984aa23 100644 --- a/lib/src/model/login_status.dart +++ b/lib/src/model/login_status.dart @@ -62,7 +62,7 @@ class LoginStatus { userName: details?['name'] as String?, preferredLanguage: OpenFoodFactsLanguage.fromOffTag(details?['preferred_language']), - country: OpenFoodFactsCountry.fromOffTag(details?['country']), + country: OpenFoodFactsCountry.fromOffTag(details?['cc']), isModerator: JsonHelper.boolFromJSON(details?['moderator']), isAdmin: JsonHelper.boolFromJSON(details?['admin']), cookie: headers?['set-cookie'], From d3925001c8de244d9feaf76dd5eb496db979477e Mon Sep 17 00:00:00 2001 From: monsieurtanuki Date: Tue, 28 May 2024 08:44:28 +0200 Subject: [PATCH 3/3] Minor changes --- lib/src/model/login_status.dart | 5 ++++- test/user_management_test_prod.dart | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/src/model/login_status.dart b/lib/src/model/login_status.dart index cee984aa23..9a2b9ce6e2 100644 --- a/lib/src/model/login_status.dart +++ b/lib/src/model/login_status.dart @@ -19,7 +19,10 @@ import '../utils/language_helper.dart'; /// "user":{ /// "name":"Mr. John Doe", /// "preferred_language":"fr", -/// "country":"be" +/// "cc":"be", +/// "country":"en:belgium", +/// "admin":0, +/// "moderator":1 /// } /// } class LoginStatus { diff --git a/test/user_management_test_prod.dart b/test/user_management_test_prod.dart index d14dd6115a..4408184f8c 100644 --- a/test/user_management_test_prod.dart +++ b/test/user_management_test_prod.dart @@ -122,7 +122,7 @@ void main() { expect(status!.successful, isTrue); expect(status.userId, TestConstants.PROD_USER.userId); expect(status.userName, 'Alexander Schacht (TIOLI)'); - expect(status.preferredLanguage, isNull); + expect(status.preferredLanguage, OpenFoodFactsLanguage.ENGLISH); expect(status.country, isNull); expect(status.isAdmin, isFalse); expect(status.isModerator, isFalse);