From e20e3625fc5e006b4cd4dbd7e71960f2e38161db Mon Sep 17 00:00:00 2001 From: Abhishek Shroff Date: Tue, 27 May 2025 23:01:36 +0530 Subject: [PATCH] [client] Rename User.displayName => User.name --- .../actions/action_resource_share.dart | 2 +- .../libphylum/actions/action_user_invite.dart | 12 +-- .../actions/changes/create_user_change.dart | 6 +- client/lib/libphylum/db/db.dart | 6 +- client/lib/libphylum/db/db.g.dart | 93 +++++++++---------- client/lib/libphylum/db/sql/users.drift | 2 +- client/lib/libphylum/phylum_account.dart | 10 +- .../repositories/user_repository.dart | 9 +- .../responses/user_list_response.dart | 2 +- .../libphylum/responses/user_response.dart | 2 +- .../explorer/resource_permissions_view.dart | 9 +- client/lib/util/user_display_name.dart | 5 + 12 files changed, 80 insertions(+), 78 deletions(-) create mode 100644 client/lib/util/user_display_name.dart diff --git a/client/lib/libphylum/actions/action_resource_share.dart b/client/lib/libphylum/actions/action_resource_share.dart index f93e6895..f96903ec 100644 --- a/client/lib/libphylum/actions/action_resource_share.dart +++ b/client/lib/libphylum/actions/action_resource_share.dart @@ -74,7 +74,7 @@ class ResourceShareAction extends ResourceAction with JsonApiAction { userEmail: user.email, permission: permission, modified: DateTime.now(), - description: 'Sharing $resourceName with ${user.displayName}', + description: 'Sharing $resourceName with ${user.name}', ); static ResourceShareAction fromMap(Map map) { diff --git a/client/lib/libphylum/actions/action_user_invite.dart b/client/lib/libphylum/actions/action_user_invite.dart index 3223abb8..3fcfe4b7 100644 --- a/client/lib/libphylum/actions/action_user_invite.dart +++ b/client/lib/libphylum/actions/action_user_invite.dart @@ -20,12 +20,12 @@ class UserInviteAction extends PhylumAction with JsonApiAction { @override Map? get requestBody => { 'email': email, - 'display_name': displayName, + 'name': userName, }; @override List get localChanges => [ - CreateUserChange(localId: localId, email: email, displayName: displayName), + CreateUserChange(localId: localId, email: email, name: userName), ]; @override @@ -35,24 +35,24 @@ class UserInviteAction extends PhylumAction with JsonApiAction { Map get props => { 'localId': localId, 'email': email, - 'displayName': displayName, + 'userName': userName, }; final int localId; final String email; - final String displayName; + final String userName; UserInviteAction({ required this.localId, required this.email, - required this.displayName, + required this.userName, }); static UserInviteAction fromMap(Map map) { return UserInviteAction( localId: map['localId'], email: map['email'], - displayName: map['displayName'], + userName: map['userName'], ); } diff --git a/client/lib/libphylum/actions/changes/create_user_change.dart b/client/lib/libphylum/actions/changes/create_user_change.dart index adbca153..bcbc5d41 100644 --- a/client/lib/libphylum/actions/changes/create_user_change.dart +++ b/client/lib/libphylum/actions/changes/create_user_change.dart @@ -6,7 +6,7 @@ class CreateUserChange extends LocalChange { String get objectId => localId.toString(); final int localId; final String email; - final String displayName; + final String name; @override String get description => 'Creating'; @@ -14,11 +14,11 @@ class CreateUserChange extends LocalChange { const CreateUserChange({ required this.localId, required this.email, - required this.displayName, + required this.name, }); @override User? apply(User? data) { - return User(id: localId, email: email, displayName: displayName); + return User(id: localId, email: email, name: name); } } diff --git a/client/lib/libphylum/db/db.dart b/client/lib/libphylum/db/db.dart index f629371a..ad486adb 100644 --- a/client/lib/libphylum/db/db.dart +++ b/client/lib/libphylum/db/db.dart @@ -24,7 +24,7 @@ class AppDatabase extends _$AppDatabase { AppDatabase.fromExecutor({required this.accountId, required QueryExecutor executor}) : super(executor); @override - int get schemaVersion => 6; + int get schemaVersion => 7; @override MigrationStrategy get migration => MigrationStrategy( @@ -54,6 +54,10 @@ class AppDatabase extends _$AppDatabase { await m.drop(resources); await m.create(resources); } + if (from < 7) { + await m.drop(users); + await m.create(users); + } }, ); diff --git a/client/lib/libphylum/db/db.g.dart b/client/lib/libphylum/db/db.g.dart index 29f84cb0..2e3ae251 100644 --- a/client/lib/libphylum/db/db.g.dart +++ b/client/lib/libphylum/db/db.g.dart @@ -20,15 +20,14 @@ class Users extends Table with TableInfo { type: DriftSqlType.string, requiredDuringInsert: true, $customConstraints: 'NOT NULL'); - static const VerificationMeta _displayNameMeta = - const VerificationMeta('displayName'); - late final GeneratedColumn displayName = GeneratedColumn( - 'display_name', aliasedName, false, + static const VerificationMeta _nameMeta = const VerificationMeta('name'); + late final GeneratedColumn name = GeneratedColumn( + 'name', aliasedName, false, type: DriftSqlType.string, requiredDuringInsert: true, $customConstraints: 'NOT NULL'); @override - List get $columns => [id, email, displayName]; + List get $columns => [id, email, name]; @override String get aliasedName => _alias ?? actualTableName; @override @@ -48,13 +47,11 @@ class Users extends Table with TableInfo { } else if (isInserting) { context.missing(_emailMeta); } - if (data.containsKey('display_name')) { + if (data.containsKey('name')) { context.handle( - _displayNameMeta, - displayName.isAcceptableOrUnknown( - data['display_name']!, _displayNameMeta)); + _nameMeta, name.isAcceptableOrUnknown(data['name']!, _nameMeta)); } else if (isInserting) { - context.missing(_displayNameMeta); + context.missing(_nameMeta); } return context; } @@ -69,8 +66,8 @@ class Users extends Table with TableInfo { .read(DriftSqlType.int, data['${effectivePrefix}id'])!, email: attachedDatabase.typeMapping .read(DriftSqlType.string, data['${effectivePrefix}email'])!, - displayName: attachedDatabase.typeMapping - .read(DriftSqlType.string, data['${effectivePrefix}display_name'])!, + name: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}name'])!, ); } @@ -86,15 +83,14 @@ class Users extends Table with TableInfo { class User extends DataClass implements Insertable { final int id; final String email; - final String displayName; - const User( - {required this.id, required this.email, required this.displayName}); + final String name; + const User({required this.id, required this.email, required this.name}); @override Map toColumns(bool nullToAbsent) { final map = {}; map['id'] = Variable(id); map['email'] = Variable(email); - map['display_name'] = Variable(displayName); + map['name'] = Variable(name); return map; } @@ -102,7 +98,7 @@ class User extends DataClass implements Insertable { return UsersCompanion( id: Value(id), email: Value(email), - displayName: Value(displayName), + name: Value(name), ); } @@ -112,7 +108,7 @@ class User extends DataClass implements Insertable { return User( id: serializer.fromJson(json['id']), email: serializer.fromJson(json['email']), - displayName: serializer.fromJson(json['display_name']), + name: serializer.fromJson(json['name']), ); } @override @@ -121,21 +117,20 @@ class User extends DataClass implements Insertable { return { 'id': serializer.toJson(id), 'email': serializer.toJson(email), - 'display_name': serializer.toJson(displayName), + 'name': serializer.toJson(name), }; } - User copyWith({int? id, String? email, String? displayName}) => User( + User copyWith({int? id, String? email, String? name}) => User( id: id ?? this.id, email: email ?? this.email, - displayName: displayName ?? this.displayName, + name: name ?? this.name, ); User copyWithCompanion(UsersCompanion data) { return User( id: data.id.present ? data.id.value : this.id, email: data.email.present ? data.email.value : this.email, - displayName: - data.displayName.present ? data.displayName.value : this.displayName, + name: data.name.present ? data.name.value : this.name, ); } @@ -144,55 +139,55 @@ class User extends DataClass implements Insertable { return (StringBuffer('User(') ..write('id: $id, ') ..write('email: $email, ') - ..write('displayName: $displayName') + ..write('name: $name') ..write(')')) .toString(); } @override - int get hashCode => Object.hash(id, email, displayName); + int get hashCode => Object.hash(id, email, name); @override bool operator ==(Object other) => identical(this, other) || (other is User && other.id == this.id && other.email == this.email && - other.displayName == this.displayName); + other.name == this.name); } class UsersCompanion extends UpdateCompanion { final Value id; final Value email; - final Value displayName; + final Value name; const UsersCompanion({ this.id = const Value.absent(), this.email = const Value.absent(), - this.displayName = const Value.absent(), + this.name = const Value.absent(), }); UsersCompanion.insert({ this.id = const Value.absent(), required String email, - required String displayName, + required String name, }) : email = Value(email), - displayName = Value(displayName); + name = Value(name); static Insertable custom({ Expression? id, Expression? email, - Expression? displayName, + Expression? name, }) { return RawValuesInsertable({ if (id != null) 'id': id, if (email != null) 'email': email, - if (displayName != null) 'display_name': displayName, + if (name != null) 'name': name, }); } UsersCompanion copyWith( - {Value? id, Value? email, Value? displayName}) { + {Value? id, Value? email, Value? name}) { return UsersCompanion( id: id ?? this.id, email: email ?? this.email, - displayName: displayName ?? this.displayName, + name: name ?? this.name, ); } @@ -205,8 +200,8 @@ class UsersCompanion extends UpdateCompanion { if (email.present) { map['email'] = Variable(email.value); } - if (displayName.present) { - map['display_name'] = Variable(displayName.value); + if (name.present) { + map['name'] = Variable(name.value); } return map; } @@ -216,7 +211,7 @@ class UsersCompanion extends UpdateCompanion { return (StringBuffer('UsersCompanion(') ..write('id: $id, ') ..write('email: $email, ') - ..write('displayName: $displayName') + ..write('name: $name') ..write(')')) .toString(); } @@ -2350,12 +2345,12 @@ abstract class _$AppDatabase extends GeneratedDatabase { typedef $UsersCreateCompanionBuilder = UsersCompanion Function({ Value id, required String email, - required String displayName, + required String name, }); typedef $UsersUpdateCompanionBuilder = UsersCompanion Function({ Value id, Value email, - Value displayName, + Value name, }); class $UsersFilterComposer extends Composer<_$AppDatabase, Users> { @@ -2372,8 +2367,8 @@ class $UsersFilterComposer extends Composer<_$AppDatabase, Users> { ColumnFilters get email => $composableBuilder( column: $table.email, builder: (column) => ColumnFilters(column)); - ColumnFilters get displayName => $composableBuilder( - column: $table.displayName, builder: (column) => ColumnFilters(column)); + ColumnFilters get name => $composableBuilder( + column: $table.name, builder: (column) => ColumnFilters(column)); } class $UsersOrderingComposer extends Composer<_$AppDatabase, Users> { @@ -2390,8 +2385,8 @@ class $UsersOrderingComposer extends Composer<_$AppDatabase, Users> { ColumnOrderings get email => $composableBuilder( column: $table.email, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get displayName => $composableBuilder( - column: $table.displayName, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get name => $composableBuilder( + column: $table.name, builder: (column) => ColumnOrderings(column)); } class $UsersAnnotationComposer extends Composer<_$AppDatabase, Users> { @@ -2408,8 +2403,8 @@ class $UsersAnnotationComposer extends Composer<_$AppDatabase, Users> { GeneratedColumn get email => $composableBuilder(column: $table.email, builder: (column) => column); - GeneratedColumn get displayName => $composableBuilder( - column: $table.displayName, builder: (column) => column); + GeneratedColumn get name => + $composableBuilder(column: $table.name, builder: (column) => column); } class $UsersTableManager extends RootTableManager< @@ -2437,22 +2432,22 @@ class $UsersTableManager extends RootTableManager< updateCompanionCallback: ({ Value id = const Value.absent(), Value email = const Value.absent(), - Value displayName = const Value.absent(), + Value name = const Value.absent(), }) => UsersCompanion( id: id, email: email, - displayName: displayName, + name: name, ), createCompanionCallback: ({ Value id = const Value.absent(), required String email, - required String displayName, + required String name, }) => UsersCompanion.insert( id: id, email: email, - displayName: displayName, + name: name, ), withReferenceMapper: (p0) => p0 .map((e) => (e.readTable(table), BaseReferences(db, table, e))) diff --git a/client/lib/libphylum/db/sql/users.drift b/client/lib/libphylum/db/sql/users.drift index e45f19c6..cfa56ff7 100644 --- a/client/lib/libphylum/db/sql/users.drift +++ b/client/lib/libphylum/db/sql/users.drift @@ -1,5 +1,5 @@ CREATE TABLE IF NOT EXISTS users( id INTEGER NOT NULL PRIMARY KEY, email TEXT NOT NULL, - display_name TEXT NOT NULL + name TEXT NOT NULL ); \ No newline at end of file diff --git a/client/lib/libphylum/phylum_account.dart b/client/lib/libphylum/phylum_account.dart index 92098b35..dcf6cacd 100644 --- a/client/lib/libphylum/phylum_account.dart +++ b/client/lib/libphylum/phylum_account.dart @@ -13,7 +13,7 @@ import 'package:phylum/util/logging.dart'; const _persistKeyAccessToken = 'accessToken'; const _persistKeyUserId = 'userId'; const _persistKeyUserEmail = 'userEmail'; -const _persistKeyUserDisplayName = 'userDisplayName'; +const _persistKeyUserName = 'userName'; const _persistKeyUserHome = 'userHome'; const _persistKeyUserPermissions = 'userPermissions'; @@ -65,9 +65,9 @@ class PhylumAccount extends Account { persist(_persistKeyUserEmail, value); } - String get userDisplayName => getPersisted(_persistKeyUserDisplayName); - set userDisplayName(String value) { - persist(_persistKeyUserDisplayName, value); + String get userName => getPersisted(_persistKeyUserName); + set userName(String value) { + persist(_persistKeyUserName, value); } String get userHome => getPersisted(_persistKeyUserHome); @@ -132,7 +132,7 @@ class PhylumAccount extends Account { final userMap = response['user']; account.userEmail = userMap['email']; - account.userDisplayName = userMap['display_name']; + account.userName = userMap['name']; account.userId = userMap['id']; account.userHome = userMap['home']; account.userPermissions = userMap['permissions']; diff --git a/client/lib/libphylum/repositories/user_repository.dart b/client/lib/libphylum/repositories/user_repository.dart index 20c9da3a..9986fa96 100644 --- a/client/lib/libphylum/repositories/user_repository.dart +++ b/client/lib/libphylum/repositories/user_repository.dart @@ -8,6 +8,7 @@ import 'package:phylum/libphylum/db/db.dart'; import 'package:phylum/libphylum/phylum_account.dart'; import 'package:phylum/libphylum/requests/users_list_request.dart'; import 'package:phylum/libphylum/responses/responses.dart'; +import 'package:phylum/util/user_display_name.dart'; const _remoteUsersBoxName = 'remote_users'; const _keyLocalUserId = 'local_user_id'; @@ -49,16 +50,14 @@ class UserRepository extends Repository { } String getUserDisplayName(int userId) { - final user = _users[userId]; - if (user == null) return 'Unknown User($userId)'; - return user.displayName.isNotEmpty ? user.displayName : user.email; + return _users[userId]?.displayName ?? 'Unknown User($userId)'; } Future invite(String email, String name) async { final localId = _account.getPersisted(_keyLocalUserId)?.toInt() ?? -1; await _account.persist(_keyLocalUserId, localId - 1); - final user = User(id: localId, email: email, displayName: name); - await _account.addAction(UserInviteAction(localId: localId, email: email, displayName: name)); + final user = User(id: localId, email: email, name: name); + await _account.addAction(UserInviteAction(localId: localId, email: email, userName: name)); return user; } diff --git a/client/lib/libphylum/responses/user_list_response.dart b/client/lib/libphylum/responses/user_list_response.dart index 62d8842b..e35740d5 100644 --- a/client/lib/libphylum/responses/user_list_response.dart +++ b/client/lib/libphylum/responses/user_list_response.dart @@ -16,7 +16,7 @@ class UserListResponse extends PhylumApiSuccessResponse { final users = (data["users"] as List).cast().map((u) => User( id: u['id'], email: u['email'], - displayName: u['display_name'], + name: u['name'], )); return UserListResponse(users: users); } diff --git a/client/lib/libphylum/responses/user_response.dart b/client/lib/libphylum/responses/user_response.dart index 213f57a2..f3d4b170 100644 --- a/client/lib/libphylum/responses/user_response.dart +++ b/client/lib/libphylum/responses/user_response.dart @@ -15,7 +15,7 @@ class UserResponse extends PhylumApiSuccessResponse { final user = User( id: data['id'], email: data['email'], - displayName: data['display_name'], + name: data['name'], ); return UserResponse(user: user); } diff --git a/client/lib/ui/explorer/resource_permissions_view.dart b/client/lib/ui/explorer/resource_permissions_view.dart index 04b36fc7..96cd3f76 100644 --- a/client/lib/ui/explorer/resource_permissions_view.dart +++ b/client/lib/ui/explorer/resource_permissions_view.dart @@ -8,6 +8,7 @@ import 'package:phylum/libphylum/db/resource_helpers.dart'; import 'package:phylum/libphylum/phylum_account.dart'; import 'package:phylum/util/dialogs.dart'; import 'package:phylum/util/permissions.dart'; +import 'package:phylum/util/user_display_name.dart'; import 'package:provider/provider.dart'; class ResourcePermissionsView extends StatefulWidget { @@ -121,16 +122,14 @@ class _ResourcePermissionsViewState extends State { final allUsers = await (account.db.users.select()..where((u) => u.id.isNotIn(grants!.keys))).get(); final users = allUsers.toList(growable: false) ..sort((a, b) { - final aName = (a.displayName.isNotEmpty ? a.displayName : a.email); - final bName = b.displayName.isNotEmpty ? b.displayName : b.email; // TODO: not the most efficient - return aName.toLowerCase().compareTo(bName.toLowerCase()); + return a.displayName.toLowerCase().compareTo(b.displayName.toLowerCase()); }); if (!context.mounted) return; final user = await showOptionsDialogBuilder( context, users, - (user) => ListTile(title: Text(user.displayName.isNotEmpty ? user.displayName : user.email)), + (user) => ListTile(title: Text(user.displayName)), buildLastItem: (_) => ListTile( leading: Icon(Icons.person_add), title: Text('Invite'), @@ -141,7 +140,7 @@ class _ResourcePermissionsViewState extends State { }), filterList: (u, q) { final query = q.toLowerCase(); - return u.where((u) => u.email.contains(query) || u.displayName.contains(query)).toList(growable: false); + return u.where((u) => u.email.contains(query) || u.name.contains(query)).toList(growable: false); }, ); if (user == null || !context.mounted) return; diff --git a/client/lib/util/user_display_name.dart b/client/lib/util/user_display_name.dart new file mode 100644 index 00000000..ec9a516c --- /dev/null +++ b/client/lib/util/user_display_name.dart @@ -0,0 +1,5 @@ +import 'package:phylum/libphylum/db/db.dart'; + +extension UserDisplayName on User { + String get displayName => name.isEmpty ? email : name; +}