merge entries with existing entries on DB insert
This commit is contained in:
parent
40ea76895e
commit
f43fff233c
6 changed files with 44 additions and 58 deletions
|
|
@ -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]] = {
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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 = ""
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
)
|
||||
|
|
|
|||
Loading…
Reference in a new issue