feat(models): Add safe parsing for boolean and integer values
This commit is contained in:
@@ -69,9 +69,9 @@ abstract class ChatStatusUpdate with _$ChatStatusUpdate {
|
||||
const factory ChatStatusUpdate({
|
||||
String? action,
|
||||
String? description,
|
||||
bool? done,
|
||||
bool? hidden,
|
||||
int? count,
|
||||
@JsonKey(fromJson: _safeBool) bool? done,
|
||||
@JsonKey(fromJson: _safeBool) bool? hidden,
|
||||
@JsonKey(fromJson: _safeInt) int? count,
|
||||
String? query,
|
||||
@JsonKey(fromJson: _safeStringList, toJson: _stringListToJson)
|
||||
@Default(<String>[])
|
||||
@@ -178,6 +178,29 @@ List<String> _safeStringList(dynamic value) {
|
||||
return const [];
|
||||
}
|
||||
|
||||
/// Safely parse a boolean from various formats (bool, String, int).
|
||||
bool? _safeBool(dynamic value) {
|
||||
if (value == null) return null;
|
||||
if (value is bool) return value;
|
||||
if (value is String) {
|
||||
final lower = value.toLowerCase();
|
||||
if (lower == 'true' || lower == '1') return true;
|
||||
if (lower == 'false' || lower == '0') return false;
|
||||
return null;
|
||||
}
|
||||
if (value is num) return value != 0;
|
||||
return null;
|
||||
}
|
||||
|
||||
/// Safely parse an integer from various formats (int, double, String).
|
||||
int? _safeInt(dynamic value) {
|
||||
if (value == null) return null;
|
||||
if (value is int) return value;
|
||||
if (value is double) return value.toInt();
|
||||
if (value is String) return int.tryParse(value);
|
||||
return null;
|
||||
}
|
||||
|
||||
List<String> _stringListToJson(List<String> value) =>
|
||||
List<String>.from(value, growable: false);
|
||||
|
||||
|
||||
@@ -2,6 +2,18 @@ import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
||||
part 'folder.freezed.dart';
|
||||
|
||||
bool? _safeBool(dynamic value) {
|
||||
if (value == null) return null;
|
||||
if (value is bool) return value;
|
||||
if (value is String) {
|
||||
final lower = value.toLowerCase();
|
||||
if (lower == 'true' || lower == '1') return true;
|
||||
if (lower == 'false' || lower == '0') return false;
|
||||
}
|
||||
if (value is num) return value != 0;
|
||||
return null;
|
||||
}
|
||||
|
||||
@freezed
|
||||
sealed class Folder with _$Folder {
|
||||
const factory Folder({
|
||||
@@ -72,7 +84,7 @@ sealed class Folder with _$Folder {
|
||||
userId: json['user_id'] as String?,
|
||||
createdAt: parseTimestamp(json['created_at']),
|
||||
updatedAt: parseTimestamp(json['updated_at']),
|
||||
isExpanded: json['is_expanded'] as bool? ?? false,
|
||||
isExpanded: _safeBool(json['is_expanded']) ?? false,
|
||||
conversationIds: conversationIds,
|
||||
meta: json['meta'] as Map<String, dynamic>?,
|
||||
data: json['data'] as Map<String, dynamic>?,
|
||||
|
||||
@@ -3,6 +3,18 @@ import 'toggle_filter.dart';
|
||||
|
||||
part 'model.freezed.dart';
|
||||
|
||||
bool? _safeBool(dynamic value) {
|
||||
if (value == null) return null;
|
||||
if (value is bool) return value;
|
||||
if (value is String) {
|
||||
final lower = value.toLowerCase();
|
||||
if (lower == 'true' || lower == '1') return true;
|
||||
if (lower == 'false' || lower == '0') return false;
|
||||
}
|
||||
if (value is num) return value != 0;
|
||||
return null;
|
||||
}
|
||||
|
||||
@freezed
|
||||
sealed class Model with _$Model {
|
||||
const Model._();
|
||||
@@ -180,7 +192,7 @@ sealed class Model with _$Model {
|
||||
description: json['description'] as String?,
|
||||
isMultimodal: isMultimodal,
|
||||
supportsStreaming: supportsStreaming,
|
||||
supportsRAG: json['supportsRAG'] as bool? ?? false,
|
||||
supportsRAG: _safeBool(json['supportsRAG']) ?? false,
|
||||
supportedParameters: supportedParamsList,
|
||||
capabilities: {
|
||||
'architecture': architecture,
|
||||
|
||||
@@ -2,6 +2,18 @@ import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
||||
part 'toggle_filter.freezed.dart';
|
||||
|
||||
bool? _safeBool(dynamic value) {
|
||||
if (value == null) return null;
|
||||
if (value is bool) return value;
|
||||
if (value is String) {
|
||||
final lower = value.toLowerCase();
|
||||
if (lower == 'true' || lower == '1') return true;
|
||||
if (lower == 'false' || lower == '0') return false;
|
||||
}
|
||||
if (value is num) return value != 0;
|
||||
return null;
|
||||
}
|
||||
|
||||
/// Represents a toggleable filter that can be enabled/disabled per chat.
|
||||
///
|
||||
/// These filters are created by OpenWebUI when a filter function has
|
||||
@@ -34,7 +46,7 @@ sealed class ToggleFilter with _$ToggleFilter {
|
||||
name: json['name'] as String,
|
||||
description: json['description'] as String?,
|
||||
icon: json['icon'] as String?,
|
||||
hasUserValves: json['has_user_valves'] as bool? ?? false,
|
||||
hasUserValves: _safeBool(json['has_user_valves']) ?? false,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,18 @@ import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
||||
part 'user.freezed.dart';
|
||||
|
||||
bool? _safeBool(dynamic value) {
|
||||
if (value == null) return null;
|
||||
if (value is bool) return value;
|
||||
if (value is String) {
|
||||
final lower = value.toLowerCase();
|
||||
if (lower == 'true' || lower == '1') return true;
|
||||
if (lower == 'false' || lower == '0') return false;
|
||||
}
|
||||
if (value is num) return value != 0;
|
||||
return null;
|
||||
}
|
||||
|
||||
@freezed
|
||||
sealed class User with _$User {
|
||||
const User._();
|
||||
@@ -27,7 +39,8 @@ sealed class User with _$User {
|
||||
json['profile_image_url'] as String? ??
|
||||
json['profileImage'] as String?,
|
||||
role: json['role'] as String? ?? 'user',
|
||||
isActive: json['is_active'] as bool? ?? json['isActive'] as bool? ?? true,
|
||||
isActive:
|
||||
_safeBool(json['is_active']) ?? _safeBool(json['isActive']) ?? true,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user