// Direktimport nötig, damit build_runner die @Entity-Annotation auflösen kann, // ohne auf die gerade erst generierte objectbox.g.dart angewiesen zu sein // (zirkuläre Auflösung). Nicht entfernen, auch wenn der Lint ihn als unnötig meldet. // ignore: unnecessary_import import 'package:objectbox/objectbox.dart'; import 'package:stadtbote/main.dart'; import 'package:stadtbote/objectbox.g.dart'; import 'package:stadtbote/tools/util.dart'; @Entity() class ChatMessage { @Id() int id = 0; // Nachrichten-ID für den Server, getrennt von der lokalen ObjectBox-ID. @Unique() late int externalId; late int time; late String from; late String subj; late String text; bool read = false; ChatMessage(); factory ChatMessage.outgoing({ required int externalId, required int time, required String from, required String text, }) { // ObjectBox vergibt die lokale ID beim ersten Speichern selbst. return ChatMessage() ..externalId = externalId ..time = time ..from = from ..subj = '' ..text = text ..read = true; } factory ChatMessage.fromJson(Map json) { final message = ChatMessage(); message.id = 0; // Let ObjectBox assign the ID message.externalId = json['id'] as int; // Store external ID separately message.time = json['time'] as int; message.from = json['from'] as String; message.subj = json['subj'] as String; message.text = json['text'] as String; message.read = json['read'] as bool? ?? false; return message; } Map toJson() { return { 'id': externalId, // Use external ID for JSON 'time': time, 'from': from, 'subj': subj, 'text': text, 'read': read, }; } static Future mergeFromJson(Map json) async { final box = MyApp.objectBoxStore.box(); final externalId = json["id"] as int; // Find message by external ID final query = box.query(ChatMessage_.externalId.equals(externalId)).build(); var availableMessage = query.findFirst(); query.close(); if (availableMessage != null) { availableMessage.externalId = json["id"]; availableMessage.time = json["time"]; availableMessage.from = json["from"]; availableMessage.subj = json["subj"]; availableMessage.text = json['text']; return availableMessage; } else { var message = ChatMessage.fromJson(json); message.read = false; return message; } } static Future getNextId() async { int currentExport500Id = Util.preferencesGetInt('next_message_id', 0) as int; currentExport500Id += 1; Util.preferencesSaveInt("next_message_id", currentExport500Id); return currentExport500Id; } }