Skip to content
This repository was archived by the owner on Apr 3, 2025. It is now read-only.

Commit d8506ee

Browse files
committed
fix(database): validate enabled profile exists on restore
1 parent 910bb43 commit d8506ee

File tree

9 files changed

+56
-44
lines changed

9 files changed

+56
-44
lines changed

lib/database/box.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ enum LunaBox<T> {
1212
alerts<dynamic>('alerts'),
1313
externalModules<LunaExternalModule>('external_modules'),
1414
indexers<LunaIndexer>('indexers'),
15-
logs<LunaLogHiveObject>('logs'),
15+
logs<LunaLog>('logs'),
1616
lunasea<dynamic>('lunasea'),
1717
profiles<LunaProfile>('profiles');
1818

@@ -92,7 +92,7 @@ extension LunaBoxExtension on LunaBox {
9292
List<Map<String, dynamic>> export() {
9393
try {
9494
return _instance.keys
95-
.map<Map<String, dynamic>>((k) => _instance.get(k)!.toMap())
95+
.map<Map<String, dynamic>>((k) => _instance.get(k)!.toJson())
9696
.toList();
9797
} catch (error, stack) {
9898
LunaLogger().error('Failed to export LunaBox', error, stack);

lib/database/config.dart

+9-3
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,16 @@ class LunaConfig {
1010
await LunaDatabase().clear();
1111

1212
try {
13-
Map config = json.decode(data);
13+
Map<String, dynamic> config = json.decode(data);
14+
1415
_setProfiles(config[LunaBox.profiles.key]);
1516
_setIndexers(config[LunaBox.indexers.key]);
1617
_setExternalModules(config[LunaBox.externalModules.key]);
1718
for (final table in LunaTable.values) table.import(config[table.key]);
19+
20+
if (!LunaProfile.list.contains(LunaSeaDatabase.ENABLED_PROFILE.read())) {
21+
LunaSeaDatabase.ENABLED_PROFILE.update(LunaProfile.list[0]);
22+
}
1823
} catch (error, stack) {
1924
LunaLogger().error(
2025
'Failed to import configuration, resetting to default',
@@ -41,8 +46,9 @@ class LunaConfig {
4146
if (data == null) return;
4247

4348
for (final item in data) {
44-
final key = item['key'];
45-
final obj = LunaProfile.fromJson((item as Map).cast<String, dynamic>());
49+
final content = (item as Map).cast<String, dynamic>();
50+
final key = content['key'] ?? 'default';
51+
final obj = LunaProfile.fromJson(content);
4652
LunaBox.profiles.update(key, obj);
4753
}
4854
}

lib/database/models/log.dart

+7-7
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import 'package:stack_trace/stack_trace.dart';
44

55
part 'log.g.dart';
66

7-
@HiveType(typeId: 23, adapterName: 'LunaLogHiveObjectAdapter')
8-
class LunaLogHiveObject extends HiveObject {
7+
@HiveType(typeId: 23, adapterName: 'LunaLogAdapter')
8+
class LunaLog extends HiveObject {
99
@HiveField(0)
1010
final int timestamp;
1111
@HiveField(1)
@@ -21,7 +21,7 @@ class LunaLogHiveObject extends HiveObject {
2121
@HiveField(6)
2222
final String? stackTrace;
2323

24-
LunaLogHiveObject({
24+
LunaLog({
2525
required this.timestamp,
2626
required this.type,
2727
this.className,
@@ -31,21 +31,21 @@ class LunaLogHiveObject extends HiveObject {
3131
this.stackTrace,
3232
});
3333

34-
factory LunaLogHiveObject.withMessage({
34+
factory LunaLog.withMessage({
3535
required LunaLogType type,
3636
required String message,
3737
String? className,
3838
String? methodName,
3939
}) {
4040
int timestamp = DateTime.now().millisecondsSinceEpoch;
41-
return LunaLogHiveObject(
41+
return LunaLog(
4242
timestamp: timestamp,
4343
type: type,
4444
message: message,
4545
);
4646
}
4747

48-
factory LunaLogHiveObject.withError({
48+
factory LunaLog.withError({
4949
required LunaLogType type,
5050
required String message,
5151
required dynamic error,
@@ -60,7 +60,7 @@ class LunaLogHiveObject extends HiveObject {
6060
_className = trace?.frames[0].uri.toString();
6161
_methodName = trace?.frames[0].member.toString();
6262
}
63-
return LunaLogHiveObject(
63+
return LunaLog(
6464
timestamp: timestamp,
6565
type: type,
6666
className: className ?? _className,

lib/database/models/profile.dart

+13-9
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class LunaProfile extends HiveObject {
3535

3636
@JsonKey()
3737
@HiveField(26)
38-
Map lidarrHeaders;
38+
Map<String, dynamic> lidarrHeaders;
3939

4040
Map<String, dynamic> getLidarr() {
4141
return {
@@ -59,7 +59,7 @@ class LunaProfile extends HiveObject {
5959
String radarrKey;
6060

6161
@HiveField(27)
62-
Map radarrHeaders;
62+
Map<String, dynamic> radarrHeaders;
6363

6464
Map<String, dynamic> getRadarr() {
6565
return {
@@ -84,7 +84,7 @@ class LunaProfile extends HiveObject {
8484

8585
@JsonKey()
8686
@HiveField(28)
87-
Map sonarrHeaders;
87+
Map<String, dynamic> sonarrHeaders;
8888

8989
Map<String, dynamic> getSonarr() {
9090
return {
@@ -110,7 +110,7 @@ class LunaProfile extends HiveObject {
110110
@JsonKey()
111111
@JsonKey()
112112
@HiveField(29)
113-
Map sabnzbdHeaders;
113+
Map<String, dynamic> sabnzbdHeaders;
114114

115115
Map<String, dynamic> getSABnzbd() {
116116
return {
@@ -139,7 +139,7 @@ class LunaProfile extends HiveObject {
139139

140140
@JsonKey()
141141
@HiveField(30)
142-
Map nzbgetHeaders;
142+
Map<String, dynamic> nzbgetHeaders;
143143

144144
Map<String, dynamic> getNZBGet() {
145145
return {
@@ -185,7 +185,7 @@ class LunaProfile extends HiveObject {
185185

186186
@JsonKey()
187187
@HiveField(35)
188-
Map tautulliHeaders;
188+
Map<String, dynamic> tautulliHeaders;
189189

190190
Map<String, dynamic> getTautulli() {
191191
return {
@@ -210,7 +210,7 @@ class LunaProfile extends HiveObject {
210210

211211
@JsonKey()
212212
@HiveField(43)
213-
Map overseerrHeaders;
213+
Map<String, dynamic> overseerrHeaders;
214214

215215
Map<String, dynamic> getOverseerr() {
216216
return {
@@ -267,14 +267,18 @@ class LunaProfile extends HiveObject {
267267
@override
268268
String toString() => json.encode(this.toJson());
269269

270-
Map<String, dynamic> toJson() => _$LunaProfileToJson(this);
270+
Map<String, dynamic> toJson() {
271+
final json = _$LunaProfileToJson(this);
272+
json['key'] = key.toString();
273+
return json;
274+
}
271275

272276
factory LunaProfile.fromJson(Map<String, dynamic> json) {
273277
return _$LunaProfileFromJson(json);
274278
}
275279

276280
factory LunaProfile.clone(LunaProfile profile) {
277-
return LunaProfile.fromJson(profile.toJson());
281+
return LunaProfile.fromJson(profile.toJson().cast<String, dynamic>());
278282
}
279283

280284
factory LunaProfile.get(String key) {

lib/database/tables/lunasea.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ enum LunaSeaDatabase<T> with LunaTableMixin<T> {
4444
Hive.registerAdapter(LunaExternalModuleAdapter());
4545
Hive.registerAdapter(LunaIndexerAdapter());
4646
Hive.registerAdapter(LunaProfileAdapter());
47-
Hive.registerAdapter(LunaLogHiveObjectAdapter());
47+
Hive.registerAdapter(LunaLogAdapter());
4848
Hive.registerAdapter(LunaIndexerIconAdapter());
4949
Hive.registerAdapter(LunaLogTypeAdapter());
5050
Hive.registerAdapter(LunaModuleAdapter());

lib/modules/settings/routes/system_logs/pages/log_details.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin {
6969

7070
Widget _body() {
7171
return LunaBox.logs.watch(builder: (context, _) {
72-
List<LunaLogHiveObject> logs = filter();
72+
List<LunaLog> logs = filter();
7373
if (logs.isEmpty) {
7474
return LunaMessage.goBack(
7575
context: context,
@@ -86,8 +86,8 @@ class _State extends State<_Widget> with LunaScrollControllerMixin {
8686
});
8787
}
8888

89-
List<LunaLogHiveObject> filter() {
90-
List<LunaLogHiveObject> logs;
89+
List<LunaLog> filter() {
90+
List<LunaLog> logs;
9191
const box = LunaBox.logs;
9292

9393
switch (widget.type) {

lib/modules/settings/routes/system_logs/widgets/log_tile.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'package:lunasea/core.dart';
33
import 'package:lunasea/database/models/log.dart';
44

55
class SettingsSystemLogTile extends StatelessWidget {
6-
final LunaLogHiveObject log;
6+
final LunaLog log;
77

88
const SettingsSystemLogTile({
99
Key? key,

lib/system/logger.dart

+5-5
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class LunaLogger {
2121

2222
Future<void> _compact([int count = 50]) async {
2323
if (LunaBox.logs.data.length <= count) return;
24-
List<LunaLogHiveObject> logs = LunaBox.logs.data.toList();
24+
List<LunaLog> logs = LunaBox.logs.data.toList();
2525
logs.sort((a, b) => (b.timestamp).compareTo(a.timestamp));
2626
logs.skip(count).forEach((log) => log.delete());
2727
}
@@ -35,15 +35,15 @@ class LunaLogger {
3535
Future<void> clear() async => LunaBox.logs.clear();
3636

3737
void debug(String message) {
38-
LunaLogHiveObject log = LunaLogHiveObject.withMessage(
38+
LunaLog log = LunaLog.withMessage(
3939
type: LunaLogType.DEBUG,
4040
message: message,
4141
);
4242
LunaBox.logs.create(log);
4343
}
4444

4545
void warning(String message, [String? className, String? methodName]) {
46-
LunaLogHiveObject log = LunaLogHiveObject.withMessage(
46+
LunaLog log = LunaLog.withMessage(
4747
type: LunaLogType.WARNING,
4848
message: message,
4949
className: className,
@@ -54,7 +54,7 @@ class LunaLogger {
5454

5555
void error(String message, dynamic error, StackTrace? stackTrace) {
5656
if (error is! NetworkImageLoadException) {
57-
LunaLogHiveObject log = LunaLogHiveObject.withError(
57+
LunaLog log = LunaLog.withError(
5858
type: LunaLogType.ERROR,
5959
message: message,
6060
error: error,
@@ -71,7 +71,7 @@ class LunaLogger {
7171

7272
void critical(dynamic error, StackTrace stackTrace) {
7373
if (error is! NetworkImageLoadException) {
74-
LunaLogHiveObject log = LunaLogHiveObject.withError(
74+
LunaLog log = LunaLog.withError(
7575
type: LunaLogType.CRITICAL,
7676
message: error?.toString() ?? LunaUI.TEXT_EMDASH,
7777
error: error,

lib/widgets/ui/scaffold.dart

+15-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'package:flutter/material.dart';
2-
import 'package:lunasea/core.dart';
2+
import 'package:lunasea/database/tables/lunasea.dart';
3+
import 'package:lunasea/modules.dart';
4+
import 'package:lunasea/system/platform.dart';
35

46
class LunaScaffold extends StatelessWidget {
57
final GlobalKey<ScaffoldState>? scaffoldKey;
@@ -31,21 +33,21 @@ class LunaScaffold extends StatelessWidget {
3133

3234
@override
3335
Widget build(BuildContext context) {
34-
return WillPopScope(
35-
onWillPop: () async {
36-
final hasDrawer = scaffoldKey?.currentState?.hasDrawer ?? false;
37-
final isOpen = scaffoldKey?.currentState?.isDrawerOpen ?? false;
36+
final state = scaffoldKey?.currentState;
37+
final hasDrawer = state?.hasDrawer ?? false;
3838

39-
if (hasDrawer) {
40-
if (isOpen) return true;
41-
scaffoldKey?.currentState?.openDrawer();
39+
if (hasDrawer && LunaPlatform.isAndroid) {
40+
return WillPopScope(
41+
onWillPop: () async {
42+
if (state!.isDrawerOpen) return true;
43+
state.openDrawer();
4244
return false;
43-
}
45+
},
46+
child: scaffold,
47+
);
48+
}
4449

45-
return true;
46-
},
47-
child: scaffold,
48-
);
50+
return scaffold;
4951
}
5052

5153
Widget get scaffold {

0 commit comments

Comments
 (0)