import 'package:drift/drift.dart'; import 'dart:convert'; import 'package:uuid/uuid.dart'; const _uuid = Uuid(); // Конвертеры для JSON полей - общие для всех таблиц class JsonMapConverter extends TypeConverter?, String?> { const JsonMapConverter(); @override Map? fromSql(String? fromDb) { if (fromDb == null || fromDb.isEmpty || fromDb == '{}') return null; try { return json.decode(fromDb) as Map; } catch (e) { return null; } } @override String toSql(Map? value) { if (value == null || value.isEmpty) return '{}'; return json.encode(value); } } class JsonListConverter extends TypeConverter, String?> { const JsonListConverter(); @override List fromSql(String? fromDb) { if (fromDb == null || fromDb.isEmpty || fromDb == '[]') return []; try { return json.decode(fromDb) as List; } catch (e) { return []; } } @override String toSql(List? value) { if (value == null || value.isEmpty) return '[]'; return json.encode(value); } } class StringListConverter extends TypeConverter, String?> { const StringListConverter(); @override List fromSql(String? fromDb) { if (fromDb == null || fromDb.isEmpty || fromDb == '[]') return []; try { final decoded = json.decode(fromDb); return (decoded as List).map((e) => e as String).toList(); } catch (e) { return []; } } @override String toSql(List value) { if (value.isEmpty) return '[]'; return json.encode(value); } } class DateTimeListConverter extends TypeConverter?, String> { const DateTimeListConverter(); @override List? 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; } } @override String toSql(List? value) { if (value == null || value.isEmpty) return '[]'; return json.encode(value.map((e) => e.toIso8601String()).toList()); } } class IntListConverter extends TypeConverter, String?> { const IntListConverter(); @override List fromSql(String? fromDb) { if (fromDb == null || fromDb.isEmpty || fromDb == '[]') return []; try { final decoded = json.decode(fromDb); return (decoded as List).map((e) => e as int).toList(); } catch (e) { return []; } } @override String toSql(List value) { if (value.isEmpty) return '[]'; return json.encode(value); } } /// Helper function for UUID generation String generateUuid() { return _uuid.v4(); }