ChangeFeed.kt

package de.werkbaum.domain

import de.werkbaum.diff.LineOp

/**
 * Was an einer Version geschehen ist und wer sie eingereicht hat.
 * [title] nur bei [ChangeType.RENAMED]: der neue Titel im Klartext, damit der
 * Client ihn ohne weiteren Abruf übernehmen kann (D76/D85).
 */
data class ChangeEvent(
    val version: Long,
    val changeType: ChangeType,
    val author: ChangeAuthor? = null,
    val title: String? = null,
)

/**
 * Alles, was seit einer bekannten Version geschehen ist.
 *
 * Entweder [ops] (der Normalfall – der Client wendet sie an und behält Cursor
 * und Scrollposition) **oder** [content] als Volltext. Letzteres, wenn die
 * Basis bereits verdichtet ist oder der Client noch gar nichts hat: Dann kann
 * kein exaktes Diff mehr entstehen, und über hunderte Versionen hinweg wäre
 * der Cursor ohnehin nicht zu retten. Ein Roundtrip und ein Sonderzustand
 * weniger als ein eigener Fehlerpfad (D76).
 */
data class ChangeFeed(
    val fromVersion: Long?,
    val currentVersion: Long,
    val ops: List<LineOp>?,
    val content: String?,
    val events: List<ChangeEvent>,
)