feat(core+frontend): enhance SyncEvent model and integrate sync handling in BewerbViewModel

- **Core Updates:**
  - Expanded `SyncEvent` model with additional fields (`eventId`, `sequenceNumber`, `originNodeId`, `createdAt`, `checksum`, `schemaVersion`) for improved event tracking and validation.
  - Updated event classes (`PingEvent`, `PongEvent`, `DataChangedEvent`, `DataRequestEvent`) to align with the extended `SyncEvent`.

- **Frontend Enhancements:**
  - Enhanced `BewerbViewModel` to handle sync events (`PingEvent`, `DataChangedEvent`) and observe connected peers using `SyncManager`.
  - Added support for
This commit is contained in:
2026-04-10 11:09:29 +02:00
parent 0d75c9b664
commit 22c631ec43
4 changed files with 80 additions and 21 deletions
@@ -2,6 +2,7 @@ package at.mocode.turnier.feature.presentation
import at.mocode.frontend.core.network.discovery.DiscoveredService
import at.mocode.frontend.core.network.sync.SyncManager
import at.mocode.frontend.core.network.sync.*
import at.mocode.turnier.feature.domain.Bewerb
import at.mocode.turnier.feature.domain.BewerbRepository
import at.mocode.turnier.feature.domain.StartlistenRepository
@@ -93,8 +94,30 @@ class BewerbViewModel(
private fun observeSyncEvents() {
syncManager?.let { manager ->
// In einer realen App würde das P2pSyncService.incomingEvents Flow genutzt
// Hier als Demo-Verknüpfung
scope.launch {
manager.getIncomingEvents().collect { event ->
when (event) {
is DataChangedEvent -> {
if (event.aggregateType == "Bewerb" || event.aggregateType == "Startliste") {
load() // Bei relevanten Änderungen neu laden
}
}
is PingEvent -> {
// Optional: Heartbeat loggen oder Status anzeigen
}
else -> {}
}
}
}
// Auch verbundene Peers beobachten
scope.launch {
manager.getConnectedPeers().collect { peers ->
reduce { it.copy(discoveredNodes = peers.map { p ->
at.mocode.frontend.core.network.discovery.DiscoveredService("P2P", p, 0)
}) }
}
}
}
}
@@ -143,6 +166,13 @@ class BewerbViewModel(
private fun startScan() {
syncManager?.start(8080)
_state.update { it.copy(isScanning = true) }
// Nach dem Start des Servers ein Ping-Event broadcasten um Präsenz zu zeigen
syncManager?.broadcastEvent(PingEvent(
eventId = turnierId.toString(),
sequenceNumber = 0,
originNodeId = "Client-${(1000..9999).random()}",
createdAt = 0 // In commonMain ohne Clock-Lib erst mal 0
))
refreshNodes()
}