merge entries with existing entries on DB insert

This commit is contained in:
Julian 2025-07-12 14:25:09 +02:00
parent 40ea76895e
commit f43fff233c
6 changed files with 44 additions and 58 deletions

View file

@ -14,8 +14,6 @@ import scala.scalajs.js
import model.Entry
import model.EntryId
import rdts.base.Lattice
import rdts.datatypes.LastWriterWins
import scala.scalajs.js.Date
import scala.util.Failure
import scala.util.Success
@ -43,56 +41,27 @@ object DexieDB {
.toFuture
.map(_.toOption.map(NativeConverter[Entry].fromNative(_)))
def insertEntry(entry: Entry): Unit = {
val e: Future[Option[Entry]] = getEntry(entry.id)
e.flatMap {
case Some(oldEntry) =>
println(s"found old: $oldEntry")
println(s"found new: $entry")
println(oldEntry.id == entry.id)
val newEntry = Lattice[Entry].merge(entry, entry)
val newEntry2 = Lattice[Entry].merge(oldEntry, oldEntry)
println(oldEntry.id)
println(entry.id)
val test =
Lattice[Entry].merge(
Entry(
EntryId("1"),
LastWriterWins.now(0),
LastWriterWins.now(2),
LastWriterWins.now(""),
LastWriterWins.now(false),
LastWriterWins.now("Dirk"),
LastWriterWins.now(new Date())
),
Entry(
EntryId("1"),
LastWriterWins.now(0),
LastWriterWins.now(2),
LastWriterWins.now(""),
LastWriterWins.now(false),
LastWriterWins.now("Dirk"),
LastWriterWins.now(new Date())
)
)
val newEntry3 =
Lattice[Entry].merge(oldEntry, entry.copy(id = oldEntry.id))
println("yolo")
Future.unit
// entriesTable.put(newEntry.toNative).toFuture
case _ =>
entriesTable.put(entry.toNative).toFuture
}.onComplete {
case Failure(exception) => println(s"failed with $exception")
case Success(value) => ()
/** Inserts an entry into the database and merges it with an existing entry if
* it exists.
*
* @param entry
* The entry to be inserted or updated.
*/
def upsertEntry(entry: Entry): Unit = {
for {
oldEntry <- getEntry(entry.id)
newEntry = oldEntry match
case Some(old) =>
Lattice[Entry].merge(entry, old)
case _ => entry
result <- entriesTable.put(newEntry.toNative).toFuture
} yield {
result
}
// .toFuture
// .map(e =>
// if e.isUndefined then entriesTable.put(entry.toNative).toFuture
// else
// val dbEntry = NativeConverter[Entry].fromNative(e)
// Lattice[Entry].merge(entry, dbEntry)
// )
}.onComplete {
case Failure(exception) =>
println(s"Failed to write entry to db: $exception")
case Success(value) => ()
}
def getAllEntries(): Future[Seq[Entry]] = {

View file

@ -25,7 +25,7 @@ object Main {
// track changes to entries
val entryEditBus = new EventBus[Entry]
val entryDbObserver =
Observer[Entry](onNext = DexieDB.insertEntry(_))
Observer[Entry](onNext = DexieDB.upsertEntry(_))
entryEditBus.stream.tapEach(_ => println("lalilu"))
println("test")

View file

@ -23,7 +23,7 @@ class AppComponent(
.combineWith(editStateSignal)
.map { case (entries, editState) =>
entries.toList
.sortBy(_.date.payload.getTime())
.sortBy(_.date.payload)
.map(entry =>
EntryComponent(
entry,

View file

@ -5,6 +5,7 @@ import org.scalajs.dom.HTMLTableRowElement
import com.raquo.laminar.api.L.*
import com.raquo.laminar.api.features.unitArrows
import scala.util.Try
import scala.scalajs.js.Date
class EntryComponent(
entry: Entry,
@ -110,7 +111,7 @@ class EntryComponent(
)
else
tr(
td(entry.date.payload.toISOString()),
td(new Date(entry.date.payload).toISOString()),
td(entry.driver.payload),
td(entry.startKm.payload),
td(entry.endKm.payload),

View file

@ -7,7 +7,6 @@ import com.raquo.laminar.api.features.unitArrows
import fahrtenbuch.Main.entryEditBus
import fahrtenbuch.model.{Entry, EntryId}
import rdts.datatypes.LastWriterWins
import scala.scalajs.js.Date
import scala.util.Try
class NewEntryInput(showNewEntryField: Var[Boolean]):
@ -82,9 +81,8 @@ class NewEntryInput(showNewEntryField: Var[Boolean]):
val endKm = LastWriterWins.now(newEntryEndKm.ref.value.toDouble)
val animal = LastWriterWins.now(newEntryAnimal.ref.value)
val paid = LastWriterWins.now(newEntryPaid.ref.checked)
val date = LastWriterWins.now(new Date(Date.now()))
entryEditBus.emit(
Entry(id, startKm, endKm, animal, paid, driver, date)
Entry(id, startKm, endKm, animal, paid, driver)
)
showNewEntryField.set(false)
newEntryDriver.ref.value = ""

View file

@ -31,7 +31,7 @@ case class Entry(
animal: LastWriterWins[String],
paid: LastWriterWins[Boolean],
driver: LastWriterWins[String],
date: LastWriterWins[Date]
date: LastWriterWins[Double]
) derives NativeConverter:
val distance = endKm.payload - startKm.payload
@ -42,3 +42,21 @@ case class Entry(
object Entry:
given Lattice[Entry] = Lattice.derived
def apply(
id: EntryId,
startKm: LastWriterWins[Double],
endKm: LastWriterWins[Double],
animal: LastWriterWins[String],
paid: LastWriterWins[Boolean],
driver: LastWriterWins[String]
): Entry =
Entry(
id,
startKm,
endKm,
animal,
paid,
driver,
LastWriterWins.now(Date.now())
)