From 239d1675af5dd186f8ea2bb7553cfce0611a6582 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Fri, 1 Sep 2023 14:56:34 +0800 Subject: [PATCH] Add more logging Use better way to serialize user permissions --- lib/api/token.dart | 8 +++++--- lib/api/token.g.dart | 11 ++--------- lib/api/user.dart | 36 ++++++++++++++++++++++++++++-------- lib/api/user.g.dart | 11 ++--------- lib/auth.dart | 9 +++++++++ lib/main.dart | 3 ++- pubspec.lock | 8 ++++++++ pubspec.yaml | 1 + 8 files changed, 57 insertions(+), 30 deletions(-) diff --git a/lib/api/token.dart b/lib/api/token.dart index cd8dce0..a13f79e 100644 --- a/lib/api/token.dart +++ b/lib/api/token.dart @@ -5,7 +5,7 @@ part 'token.g.dart'; @JsonSerializable() class Token { - const Token ({ + const Token({ required this.id, required this.uid, required this.token, @@ -39,7 +39,9 @@ class TokenWithUserInfo { final String name; @JsonKey(name: 'is_admin') final bool isAdmin; - final UserPermission permissions; - factory TokenWithUserInfo.fromJson(Map json) => _$TokenWithUserInfoFromJson(json); + @JsonKey(fromJson: UserPermissions.fromJson, toJson: UserPermissions.toJson2) + final UserPermissions permissions; + factory TokenWithUserInfo.fromJson(Map json) => + _$TokenWithUserInfoFromJson(json); Map toJson() => _$TokenWithUserInfoToJson(this); } diff --git a/lib/api/token.g.dart b/lib/api/token.g.dart index d991315..24987b7 100644 --- a/lib/api/token.g.dart +++ b/lib/api/token.g.dart @@ -29,7 +29,7 @@ TokenWithUserInfo _$TokenWithUserInfoFromJson(Map json) => token: Token.fromJson(json['token'] as Map), name: json['name'] as String, isAdmin: json['is_admin'] as bool, - permissions: $enumDecode(_$UserPermissionEnumMap, json['permissions']), + permissions: UserPermissions.fromJson(json['permissions'] as int), ); Map _$TokenWithUserInfoToJson(TokenWithUserInfo instance) => @@ -37,12 +37,5 @@ Map _$TokenWithUserInfoToJson(TokenWithUserInfo instance) => 'token': instance.token, 'name': instance.name, 'is_admin': instance.isAdmin, - 'permissions': _$UserPermissionEnumMap[instance.permissions]!, + 'permissions': UserPermissions.toJson2(instance.permissions), }; - -const _$UserPermissionEnumMap = { - UserPermission.none: 0, - UserPermission.readGallery: 1, - UserPermission.editGallery: 2, - UserPermission.all: 3, -}; diff --git a/lib/api/user.dart b/lib/api/user.dart index 67839fe..e69737e 100644 --- a/lib/api/user.dart +++ b/lib/api/user.dart @@ -1,16 +1,35 @@ +import 'package:enum_flag/enum_flag.dart'; import 'package:json_annotation/json_annotation.dart'; part 'user.g.dart'; -@JsonEnum(valueField: 'code') -enum UserPermission { - none(0), - readGallery(1), - editGallery(2), - all(3); +enum UserPermission with EnumFlag { + readGallery, + editGallery, +} - const UserPermission(this.code); +const userPermissionAll = 3; + +class UserPermissions { + const UserPermissions(this.code); final int code; + bool has(UserPermission permission) => code.hasFlag(permission); + int toJson() => code; + static int toJson2(UserPermissions code) { + return code.code; + } + + static fromJson(int code) { + return UserPermissions(code); + } + + @override + String toString() { + if (code & userPermissionAll != 0) return "all"; + final set = code.getFlags(UserPermission.values).toSet(); + if (set.isEmpty) return "none"; + return set.map((e) => e.name).join("|"); + } } @JsonSerializable() @@ -25,7 +44,8 @@ class BUser { final String username; @JsonKey(name: 'is_admin') final bool isAdmin; - final UserPermission permissions; + @JsonKey(fromJson: UserPermissions.fromJson, toJson: UserPermissions.toJson2) + final UserPermissions permissions; factory BUser.fromJson(Map json) => _$BUserFromJson(json); Map toJson() => _$BUserToJson(this); } diff --git a/lib/api/user.g.dart b/lib/api/user.g.dart index 97957be..3726649 100644 --- a/lib/api/user.g.dart +++ b/lib/api/user.g.dart @@ -10,19 +10,12 @@ BUser _$BUserFromJson(Map json) => BUser( id: json['id'] as int, username: json['username'] as String, isAdmin: json['is_admin'] as bool, - permissions: $enumDecode(_$UserPermissionEnumMap, json['permissions']), + permissions: UserPermissions.fromJson(json['permissions'] as int), ); Map _$BUserToJson(BUser instance) => { 'id': instance.id, 'username': instance.username, 'is_admin': instance.isAdmin, - 'permissions': _$UserPermissionEnumMap[instance.permissions]!, + 'permissions': UserPermissions.toJson2(instance.permissions), }; - -const _$UserPermissionEnumMap = { - UserPermission.none: 0, - UserPermission.readGallery: 1, - UserPermission.editGallery: 2, - UserPermission.all: 3, -}; diff --git a/lib/auth.dart b/lib/auth.dart index 787b494..b4ea56a 100644 --- a/lib/auth.dart +++ b/lib/auth.dart @@ -1,7 +1,10 @@ +import 'package:logging/logging.dart'; import 'api/status.dart'; import 'api/user.dart'; import 'globals.dart'; +final _log = Logger("AuthInfo"); + class AuthInfo { AuthInfo(); BUser? _user; @@ -20,8 +23,14 @@ class AuthInfo { final re = await api.getUser(); if (re.ok) { _user = re.data!; + final u = _user!; + _log.info( + "Logged in as ${u.username} (${u.id}). isAdmin: ${u.isAdmin}. permissions: ${u.permissions}"); + } else if (re.status == 401) { + _user = null; } else { _user = null; + throw re.unwrapErr(); } _checked = true; await getServerStatus(); diff --git a/lib/main.dart b/lib/main.dart index 01c4fa0..2c4582f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -127,7 +127,8 @@ class _MainApp extends State { } void changeThemeMode(ThemeMode mode) { - prefs.setInt("themeMode", mode.index); + prefs.setInt("themeMode", mode.index).then( + (value) => {if (!value) _log.warning("Failed to save themeMode.")}); setState(() { _themeMode = mode; }); diff --git a/pubspec.lock b/pubspec.lock index 5cee718..81bc8f4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -217,6 +217,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.0+1" + enum_flag: + dependency: "direct main" + description: + name: enum_flag + sha256: "1d3e32120855818209c8d17a0b5a0dffd633a6b6f5f6025e8c9a085b40c78c53" + url: "https://pub.dev" + source: hosted + version: "1.0.2" fake_async: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 9ce7c2b..becef80 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,6 +12,7 @@ dependencies: cryptography_flutter: ^2.3.0 dio: ^5.3.2 dio_cookie_manager: ^3.1.0+1 + enum_flag: ^1.0.2 file: ^6.1.4 flutter: sdk: flutter