fix: Fix hive type adapter for empty clases causing app to crash

This commit is contained in:
Anton Stubenbord
2023-10-06 21:37:24 +02:00
parent 5dcae3f0b3
commit 690e4558cb
13 changed files with 194 additions and 198 deletions

View File

@@ -3,7 +3,7 @@ import 'package:paperless_api/paperless_api.dart';
class PaperlessApiHiveTypeIds {
PaperlessApiHiveTypeIds._();
static const int documentFilter = 100;
static const int idQueryParameter = 101;
static const int tagsQuery = 102;
static const int anyAssignedTagsQuery = 103;
@@ -31,6 +31,7 @@ class PaperlessApiHiveTypeIds {
static const int permissions = 125;
static const int userModelv2 = 126;
static const int usersAndGroupsPermissions = 127;
static const int documentFilter = 128;
}
void registerPaperlessApiHiveTypeAdapters() {

View File

@@ -1,2 +1 @@
export 'document_model_json_converter.dart';
export 'date_range_query_json_converter.dart';

View File

@@ -1,30 +0,0 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:paperless_api/src/models/models.dart';
class DateRangeQueryJsonConverter
extends JsonConverter<DateRangeQuery, Map<String, dynamic>> {
const DateRangeQueryJsonConverter();
@override
DateRangeQuery fromJson(Map<String, dynamic> json) {
final type = json['type'];
final data = json['data'];
switch (json['type'] as String) {
case 'UnsetDateRangeQuery':
return const UnsetDateRangeQuery();
case 'AbsoluteDateRangeQuery':
return AbsoluteDateRangeQuery.fromJson(data);
case 'RelativeDateRangeQuery':
return RelativeDateRangeQuery.fromJson(data);
default:
throw Exception('Error parsing DateRangeQuery: Unknown type $type');
}
}
@override
Map<String, dynamic> toJson(DateRangeQuery object) {
return {
'type': object.runtimeType.toString(),
'data': object.toJson(),
};
}
}

View File

@@ -1,14 +1,11 @@
import 'package:collection/collection.dart';
import 'package:equatable/equatable.dart';
import 'package:hive/hive.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_api/src/models/query_parameters/date_range_queries/date_range_query_field.dart';
part 'document_filter.g.dart';
@DateRangeQueryJsonConverter()
// @JsonSerializable(explicitToJson: true)
@HiveType(typeId: PaperlessApiHiveTypeIds.documentFilter)
class DocumentFilter extends Equatable {
static const DocumentFilter initial = DocumentFilter();

View File

@@ -11,34 +11,27 @@ import 'date_range_unit.dart';
part 'date_range_query.g.dart';
sealed class DateRangeQuery extends Equatable {
sealed class DateRangeQuery {
const DateRangeQuery();
Map<String, String> toQueryParameter(DateRangeQueryField field);
Map<String, dynamic> toJson();
bool matches(DateTime dt);
}
// @HiveType(typeId: PaperlessApiHiveTypeIds.unsetDateRangeQuery)
class UnsetDateRangeQuery extends DateRangeQuery {
const UnsetDateRangeQuery();
@override
List<Object?> get props => [];
@override
Map<String, String> toQueryParameter(DateRangeQueryField field) => const {};
@override
Map<String, dynamic> toJson() => const {};
@override
bool matches(DateTime dt) => true;
}
@JsonSerializable()
@HiveType(typeId: PaperlessApiHiveTypeIds.relativeDateRangeQuery)
class RelativeDateRangeQuery extends DateRangeQuery {
class RelativeDateRangeQuery extends DateRangeQuery with EquatableMixin {
@HiveField(0)
final int offset;
@HiveField(1)
@@ -83,12 +76,6 @@ class RelativeDateRangeQuery extends DateRangeQuery {
}
}
@override
Map<String, dynamic> toJson() => _$RelativeDateRangeQueryToJson(this);
factory RelativeDateRangeQuery.fromJson(Map<String, dynamic> json) =>
_$RelativeDateRangeQueryFromJson(json);
@override
bool matches(DateTime dt) {
return dt.isAfter(dateTime) || dt == dateTime;
@@ -97,7 +84,7 @@ class RelativeDateRangeQuery extends DateRangeQuery {
@JsonSerializable()
@HiveType(typeId: PaperlessApiHiveTypeIds.absoluteDateRangeQuery)
class AbsoluteDateRangeQuery extends DateRangeQuery {
class AbsoluteDateRangeQuery extends DateRangeQuery with EquatableMixin {
@LocalDateTimeJsonConverter()
@HiveField(0)
final DateTime? after;
@@ -138,12 +125,6 @@ class AbsoluteDateRangeQuery extends DateRangeQuery {
);
}
factory AbsoluteDateRangeQuery.fromJson(json) =>
_$AbsoluteDateRangeQueryFromJson(json);
@override
Map<String, dynamic> toJson() => _$AbsoluteDateRangeQueryToJson(this);
@override
bool matches(DateTime dt) {
//TODO: Check if after and before are inclusive or exclusive definitions.

View File

@@ -1,11 +1,7 @@
import 'dart:isolate';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:equatable/equatable.dart';
import 'package:hive/hive.dart';
import 'package:paperless_api/config/hive/hive_type_ids.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'id_query_parameter.freezed.dart';
part 'id_query_parameter.g.dart';
sealed class IdQueryParameter {
@@ -19,12 +15,9 @@ sealed class IdQueryParameter {
bool get isOnlyAssigned => this is AnyAssignedIdQueryParameter;
}
@HiveType(typeId: PaperlessApiHiveTypeIds.unsetIdQueryParameter)
@Freezed(toJson: false, fromJson: false)
class UnsetIdQueryParameter extends IdQueryParameter
with _$UnsetIdQueryParameter {
const UnsetIdQueryParameter._();
const factory UnsetIdQueryParameter() = _UnsetIdQueryParameter;
// @HiveType(typeId: PaperlessApiHiveTypeIds.unsetIdQueryParameter)
class UnsetIdQueryParameter extends IdQueryParameter {
const UnsetIdQueryParameter();
@override
Map<String, String> toQueryParameter(String field) => {};
@@ -32,12 +25,10 @@ class UnsetIdQueryParameter extends IdQueryParameter
bool matches(int? id) => true;
}
@HiveType(typeId: PaperlessApiHiveTypeIds.notAssignedIdQueryParameter)
@Freezed(toJson: false, fromJson: false)
class NotAssignedIdQueryParameter extends IdQueryParameter
with _$NotAssignedIdQueryParameter {
const NotAssignedIdQueryParameter._();
const factory NotAssignedIdQueryParameter() = _NotAssignedIdQueryParameter;
// @HiveType(typeId: PaperlessApiHiveTypeIds.notAssignedIdQueryParameter)
class NotAssignedIdQueryParameter extends IdQueryParameter {
const NotAssignedIdQueryParameter();
@override
Map<String, String> toQueryParameter(String field) {
return {'${field}__isnull': '1'};
@@ -47,12 +38,9 @@ class NotAssignedIdQueryParameter extends IdQueryParameter
bool matches(int? id) => id == null;
}
@HiveType(typeId: PaperlessApiHiveTypeIds.anyAssignedIdQueryParameter)
@Freezed(toJson: false, fromJson: false)
class AnyAssignedIdQueryParameter extends IdQueryParameter
with _$AnyAssignedIdQueryParameter {
const factory AnyAssignedIdQueryParameter() = _AnyAssignedIdQueryParameter;
const AnyAssignedIdQueryParameter._();
// @HiveType(typeId: PaperlessApiHiveTypeIds.anyAssignedIdQueryParameter)
class AnyAssignedIdQueryParameter extends IdQueryParameter {
const AnyAssignedIdQueryParameter();
@override
Map<String, String> toQueryParameter(String field) {
return {'${field}__isnull': '0'};
@@ -63,12 +51,12 @@ class AnyAssignedIdQueryParameter extends IdQueryParameter
}
@HiveType(typeId: PaperlessApiHiveTypeIds.setIdQueryParameter)
@Freezed(toJson: false, fromJson: false)
class SetIdQueryParameter extends IdQueryParameter with _$SetIdQueryParameter {
const SetIdQueryParameter._();
const factory SetIdQueryParameter({
@HiveField(0) required int id,
}) = _SetIdQueryParameter;
class SetIdQueryParameter extends IdQueryParameter with EquatableMixin {
@HiveField(0)
final int id;
const SetIdQueryParameter({required this.id});
@override
Map<String, String> toQueryParameter(String field) {
return {'${field}__id': '$id'};
@@ -76,4 +64,89 @@ class SetIdQueryParameter extends IdQueryParameter with _$SetIdQueryParameter {
@override
bool matches(int? id) => id == this.id;
@override
List<Object?> get props => [id];
}
/// Custom Adapters
class UnsetIdQueryParameterAdapter extends TypeAdapter<UnsetIdQueryParameter> {
@override
final int typeId = 116;
@override
UnsetIdQueryParameter read(BinaryReader reader) {
reader.readByte();
return const UnsetIdQueryParameter();
}
@override
void write(BinaryWriter writer, UnsetIdQueryParameter obj) {
writer.writeByte(0);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is UnsetIdQueryParameterAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
class NotAssignedIdQueryParameterAdapter
extends TypeAdapter<NotAssignedIdQueryParameter> {
@override
final int typeId = 117;
@override
NotAssignedIdQueryParameter read(BinaryReader reader) {
reader.readByte();
return const NotAssignedIdQueryParameter();
}
@override
void write(BinaryWriter writer, NotAssignedIdQueryParameter obj) {
writer.writeByte(0);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is NotAssignedIdQueryParameterAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
class AnyAssignedIdQueryParameterAdapter
extends TypeAdapter<AnyAssignedIdQueryParameter> {
@override
final int typeId = 118;
@override
AnyAssignedIdQueryParameter read(BinaryReader reader) {
reader.readByte();
return const AnyAssignedIdQueryParameter();
}
@override
void write(BinaryWriter writer, AnyAssignedIdQueryParameter obj) {
writer.writeByte(0);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is AnyAssignedIdQueryParameterAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -1,7 +1,7 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:equatable/equatable.dart';
import 'package:hive/hive.dart';
import 'package:paperless_api/config/hive/hive_type_ids.dart';
part 'tags_query.freezed.dart';
part 'tags_query.g.dart';
sealed class TagsQuery {
@@ -10,11 +10,9 @@ sealed class TagsQuery {
bool matches(Iterable<int> ids);
}
@HiveType(typeId: PaperlessApiHiveTypeIds.notAssignedTagsQuery)
@Freezed(toJson: false, fromJson: false)
class NotAssignedTagsQuery extends TagsQuery with _$NotAssignedTagsQuery {
const NotAssignedTagsQuery._();
const factory NotAssignedTagsQuery() = _NotAssignedTagsQuery;
// @HiveType(typeId: PaperlessApiHiveTypeIds.notAssignedTagsQuery)
class NotAssignedTagsQuery extends TagsQuery {
const NotAssignedTagsQuery();
@override
Map<String, String> toQueryParameter() {
return {'is_tagged': '0'};
@@ -25,12 +23,13 @@ class NotAssignedTagsQuery extends TagsQuery with _$NotAssignedTagsQuery {
}
@HiveType(typeId: PaperlessApiHiveTypeIds.anyAssignedTagsQuery)
@Freezed(toJson: false, fromJson: false)
class AnyAssignedTagsQuery extends TagsQuery with _$AnyAssignedTagsQuery {
const AnyAssignedTagsQuery._();
const factory AnyAssignedTagsQuery({
@HiveField(0) @Default([]) List<int> tagIds,
}) = _AnyAssignedTagsQuery;
class AnyAssignedTagsQuery extends TagsQuery with EquatableMixin {
@HiveField(0)
final List<int> tagIds;
const AnyAssignedTagsQuery({
this.tagIds = const [],
});
@override
Map<String, String> toQueryParameter() {
if (tagIds.isEmpty) {
@@ -41,16 +40,29 @@ class AnyAssignedTagsQuery extends TagsQuery with _$AnyAssignedTagsQuery {
@override
bool matches(Iterable<int> ids) => ids.isNotEmpty;
AnyAssignedTagsQuery copyWith({
List<int>? tagIds,
}) {
return AnyAssignedTagsQuery(
tagIds: tagIds ?? this.tagIds,
);
}
@override
List<Object?> get props => [tagIds];
}
@HiveType(typeId: PaperlessApiHiveTypeIds.idsTagsQuery)
@Freezed(toJson: false, fromJson: false)
class IdsTagsQuery extends TagsQuery with _$IdsTagsQuery {
const IdsTagsQuery._();
const factory IdsTagsQuery({
@HiveField(0) @Default([]) List<int> include,
@HiveField(1) @Default([]) List<int> exclude,
}) = _IdsTagsQuery;
class IdsTagsQuery extends TagsQuery with EquatableMixin {
@HiveField(0)
final List<int> include;
@HiveField(1)
final List<int> exclude;
const IdsTagsQuery({
this.include = const [],
this.exclude = const [],
});
@override
Map<String, String> toQueryParameter() {
final Map<String, String> params = {};
@@ -68,4 +80,45 @@ class IdsTagsQuery extends TagsQuery with _$IdsTagsQuery {
return include.toSet().difference(ids.toSet()).isEmpty &&
exclude.toSet().intersection(ids.toSet()).isEmpty;
}
IdsTagsQuery copyWith({
List<int>? include,
List<int>? exclude,
}) {
return IdsTagsQuery(
include: include ?? this.include,
exclude: exclude ?? this.exclude,
);
}
@override
List<Object?> get props => [include, exclude];
}
/// Custom adapters
class NotAssignedTagsQueryAdapter extends TypeAdapter<NotAssignedTagsQuery> {
@override
final int typeId = PaperlessApiHiveTypeIds.notAssignedTagsQuery;
@override
NotAssignedTagsQuery read(BinaryReader reader) {
reader.readByte();
return const NotAssignedTagsQuery();
}
@override
void write(BinaryWriter writer, NotAssignedTagsQuery obj) {
writer.writeByte(0);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is NotAssignedTagsQueryAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -1,5 +1,3 @@
import 'package:equatable/equatable.dart';
import 'package:flutter/widgets.dart';
import 'package:hive/hive.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:paperless_api/config/hive/hive_type_ids.dart';
@@ -8,9 +6,7 @@ import 'query_type.dart';
part 'text_query.g.dart';
//TODO: Realize with freezed...
@HiveType(typeId: PaperlessApiHiveTypeIds.textQuery)
@JsonSerializable()
class TextQuery {
@HiveField(0)
final QueryType queryType;
@@ -85,11 +81,6 @@ class TextQuery {
}
}
Map<String, dynamic> toJson() => _$TextQueryToJson(this);
factory TextQuery.fromJson(Map<String, dynamic> json) =>
_$TextQueryFromJson(json);
@override
bool operator ==(Object? other) {
if (identical(this, other)) return true;

View File

@@ -20,7 +20,7 @@ dependencies:
dio: ^5.0.0
collection: ^1.17.0
jiffy: ^5.0.0
freezed_annotation: ^2.2.0
freezed_annotation: ^2.4.1
hive: ^2.2.3
dev_dependencies:
@@ -28,9 +28,9 @@ dev_dependencies:
sdk: flutter
flutter_lints: ^2.0.0
json_serializable: ^6.5.4
build_runner: ^2.4.2
freezed: ^2.3.3
hive_generator: ^2.0.0
build_runner: ^2.4.6
freezed: ^2.4.1
hive_generator: ^2.0.1
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec