mnemo_cards/mnemo_cards_backend/lib/database/converters.dart

121 lines
2.9 KiB
Dart
Raw Normal View History

2025-12-13 13:27:05 +00:00
import 'package:drift/drift.dart';
import 'dart:convert';
2025-12-13 20:55:50 +00:00
import 'package:uuid/uuid.dart';
const _uuid = Uuid();
2025-12-13 13:27:05 +00:00
// Конвертеры для JSON полей - общие для всех таблиц
2025-12-13 20:55:50 +00:00
class JsonMapConverter extends TypeConverter<Map<String, dynamic>?, String?> {
2025-12-13 13:27:05 +00:00
const JsonMapConverter();
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
@override
Map<String, dynamic>? fromSql(String? fromDb) {
if (fromDb == null || fromDb.isEmpty || fromDb == '{}') return null;
try {
return json.decode(fromDb) as Map<String, dynamic>;
} catch (e) {
return null;
}
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
@override
String toSql(Map<String, dynamic>? value) {
if (value == null || value.isEmpty) return '{}';
return json.encode(value);
}
}
2025-12-14 00:25:54 +00:00
class JsonListConverter extends TypeConverter<List<dynamic>, String?> {
2025-12-13 13:27:05 +00:00
const JsonListConverter();
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
@override
2025-12-13 20:55:50 +00:00
List<dynamic> fromSql(String? fromDb) {
if (fromDb == null || fromDb.isEmpty || fromDb == '[]') return [];
2025-12-13 13:27:05 +00:00
try {
return json.decode(fromDb) as List<dynamic>;
} catch (e) {
2025-12-13 20:55:50 +00:00
return [];
2025-12-13 13:27:05 +00:00
}
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
@override
String toSql(List<dynamic>? value) {
if (value == null || value.isEmpty) return '[]';
return json.encode(value);
}
}
2025-12-14 00:25:54 +00:00
class StringListConverter extends TypeConverter<List<String>, String?> {
2025-12-13 13:27:05 +00:00
const StringListConverter();
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
@override
2025-12-14 00:25:54 +00:00
List<String> fromSql(String? fromDb) {
if (fromDb == null || fromDb.isEmpty || fromDb == '[]') return [];
2025-12-13 13:27:05 +00:00
try {
final decoded = json.decode(fromDb);
2025-12-13 20:55:50 +00:00
return (decoded as List).map((e) => e as String).toList();
2025-12-13 13:27:05 +00:00
} catch (e) {
return [];
}
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
@override
String toSql(List<String> value) {
if (value.isEmpty) return '[]';
return json.encode(value);
}
}
class DateTimeListConverter extends TypeConverter<List<DateTime>?, String> {
const DateTimeListConverter();
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
@override
List<DateTime>? fromSql(String? fromDb) {
if (fromDb == null || fromDb.isEmpty || fromDb == '[]') return null;
try {
final decoded = json.decode(fromDb) as List;
return decoded.map((e) {
if (e is String) {
return DateTime.parse(e);
}
return DateTime.now();
}).toList();
} catch (e) {
return null;
}
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
@override
String toSql(List<DateTime>? value) {
if (value == null || value.isEmpty) return '[]';
return json.encode(value.map((e) => e.toIso8601String()).toList());
}
}
2025-12-14 00:25:54 +00:00
class IntListConverter extends TypeConverter<List<int>, String?> {
2025-12-13 13:27:05 +00:00
const IntListConverter();
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
@override
2025-12-14 00:25:54 +00:00
List<int> fromSql(String? fromDb) {
if (fromDb == null || fromDb.isEmpty || fromDb == '[]') return [];
2025-12-13 13:27:05 +00:00
try {
final decoded = json.decode(fromDb);
return (decoded as List).map((e) => e as int).toList();
} catch (e) {
return [];
}
}
2025-12-20 18:26:15 +00:00
2025-12-13 13:27:05 +00:00
@override
String toSql(List<int> value) {
if (value.isEmpty) return '[]';
return json.encode(value);
}
}
2025-12-13 20:55:50 +00:00
/// Helper function for UUID generation
String generateUuid() {
return _uuid.v4();
}