[client] Rename User.displayName => User.name

This commit is contained in:
Abhishek Shroff
2025-05-27 23:01:36 +05:30
parent e1f92e42a2
commit e20e3625fc
12 changed files with 80 additions and 78 deletions
@@ -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<String, dynamic> map) {
@@ -20,12 +20,12 @@ class UserInviteAction extends PhylumAction with JsonApiAction {
@override
Map<String, dynamic>? get requestBody => {
'email': email,
'display_name': displayName,
'name': userName,
};
@override
List<LocalChange> 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<String, dynamic> 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<String, dynamic> map) {
return UserInviteAction(
localId: map['localId'],
email: map['email'],
displayName: map['displayName'],
userName: map['userName'],
);
}
@@ -6,7 +6,7 @@ class CreateUserChange extends LocalChange<User> {
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<User> {
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);
}
}
+5 -1
View File
@@ -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);
}
},
);
+44 -49
View File
@@ -20,15 +20,14 @@ class Users extends Table with TableInfo<Users, User> {
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL');
static const VerificationMeta _displayNameMeta =
const VerificationMeta('displayName');
late final GeneratedColumn<String> displayName = GeneratedColumn<String>(
'display_name', aliasedName, false,
static const VerificationMeta _nameMeta = const VerificationMeta('name');
late final GeneratedColumn<String> name = GeneratedColumn<String>(
'name', aliasedName, false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL');
@override
List<GeneratedColumn> get $columns => [id, email, displayName];
List<GeneratedColumn> get $columns => [id, email, name];
@override
String get aliasedName => _alias ?? actualTableName;
@override
@@ -48,13 +47,11 @@ class Users extends Table with TableInfo<Users, User> {
} 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<Users, User> {
.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<Users, User> {
class User extends DataClass implements Insertable<User> {
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<String, Expression> toColumns(bool nullToAbsent) {
final map = <String, Expression>{};
map['id'] = Variable<int>(id);
map['email'] = Variable<String>(email);
map['display_name'] = Variable<String>(displayName);
map['name'] = Variable<String>(name);
return map;
}
@@ -102,7 +98,7 @@ class User extends DataClass implements Insertable<User> {
return UsersCompanion(
id: Value(id),
email: Value(email),
displayName: Value(displayName),
name: Value(name),
);
}
@@ -112,7 +108,7 @@ class User extends DataClass implements Insertable<User> {
return User(
id: serializer.fromJson<int>(json['id']),
email: serializer.fromJson<String>(json['email']),
displayName: serializer.fromJson<String>(json['display_name']),
name: serializer.fromJson<String>(json['name']),
);
}
@override
@@ -121,21 +117,20 @@ class User extends DataClass implements Insertable<User> {
return <String, dynamic>{
'id': serializer.toJson<int>(id),
'email': serializer.toJson<String>(email),
'display_name': serializer.toJson<String>(displayName),
'name': serializer.toJson<String>(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<User> {
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<User> {
final Value<int> id;
final Value<String> email;
final Value<String> displayName;
final Value<String> 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<User> custom({
Expression<int>? id,
Expression<String>? email,
Expression<String>? displayName,
Expression<String>? 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<int>? id, Value<String>? email, Value<String>? displayName}) {
{Value<int>? id, Value<String>? email, Value<String>? 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<User> {
if (email.present) {
map['email'] = Variable<String>(email.value);
}
if (displayName.present) {
map['display_name'] = Variable<String>(displayName.value);
if (name.present) {
map['name'] = Variable<String>(name.value);
}
return map;
}
@@ -216,7 +211,7 @@ class UsersCompanion extends UpdateCompanion<User> {
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<int> id,
required String email,
required String displayName,
required String name,
});
typedef $UsersUpdateCompanionBuilder = UsersCompanion Function({
Value<int> id,
Value<String> email,
Value<String> displayName,
Value<String> name,
});
class $UsersFilterComposer extends Composer<_$AppDatabase, Users> {
@@ -2372,8 +2367,8 @@ class $UsersFilterComposer extends Composer<_$AppDatabase, Users> {
ColumnFilters<String> get email => $composableBuilder(
column: $table.email, builder: (column) => ColumnFilters(column));
ColumnFilters<String> get displayName => $composableBuilder(
column: $table.displayName, builder: (column) => ColumnFilters(column));
ColumnFilters<String> 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<String> get email => $composableBuilder(
column: $table.email, builder: (column) => ColumnOrderings(column));
ColumnOrderings<String> get displayName => $composableBuilder(
column: $table.displayName, builder: (column) => ColumnOrderings(column));
ColumnOrderings<String> 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<String> get email =>
$composableBuilder(column: $table.email, builder: (column) => column);
GeneratedColumn<String> get displayName => $composableBuilder(
column: $table.displayName, builder: (column) => column);
GeneratedColumn<String> get name =>
$composableBuilder(column: $table.name, builder: (column) => column);
}
class $UsersTableManager extends RootTableManager<
@@ -2437,22 +2432,22 @@ class $UsersTableManager extends RootTableManager<
updateCompanionCallback: ({
Value<int> id = const Value.absent(),
Value<String> email = const Value.absent(),
Value<String> displayName = const Value.absent(),
Value<String> name = const Value.absent(),
}) =>
UsersCompanion(
id: id,
email: email,
displayName: displayName,
name: name,
),
createCompanionCallback: ({
Value<int> 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)))
+1 -1
View File
@@ -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
);
+5 -5
View File
@@ -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<PhylumAccount> {
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<PhylumAccount> {
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'];
@@ -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<PhylumAccount, User> {
}
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<User> invite(String email, String name) async {
final localId = _account.getPersisted<num>(_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;
}
@@ -16,7 +16,7 @@ class UserListResponse extends PhylumApiSuccessResponse {
final users = (data["users"] as List).cast<Map>().map((u) => User(
id: u['id'],
email: u['email'],
displayName: u['display_name'],
name: u['name'],
));
return UserListResponse(users: users);
}
@@ -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);
}
@@ -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<ResourcePermissionsView> {
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<ResourcePermissionsView> {
}),
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;
+5
View File
@@ -0,0 +1,5 @@
import 'package:phylum/libphylum/db/db.dart';
extension UserDisplayName on User {
String get displayName => name.isEmpty ? email : name;
}