From dd454ac1080979ffd2885a9c8003b01436e10c9f Mon Sep 17 00:00:00 2001 From: Lanius Trolling Date: Sun, 10 Mar 2024 10:59:05 -0400 Subject: [PATCH] Make page visit operation atomic --- .../kotlin/info/mechyrdia/data/data.kt | 4 ++++ .../kotlin/info/mechyrdia/data/visits.kt | 23 ++++++------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/jvmMain/kotlin/info/mechyrdia/data/data.kt b/src/jvmMain/kotlin/info/mechyrdia/data/data.kt index 7aefc79..d9c7b24 100644 --- a/src/jvmMain/kotlin/info/mechyrdia/data/data.kt +++ b/src/jvmMain/kotlin/info/mechyrdia/data/data.kt @@ -167,6 +167,10 @@ class DocumentTable>(private val kClass: KClass) { collection().updateMany(where, set) } + suspend fun change(where: Bson, set: Bson) { + collection().updateOne(where, set, UpdateOptions().upsert(true)) + } + suspend fun remove(where: Bson) { collection().deleteMany(where) } diff --git a/src/jvmMain/kotlin/info/mechyrdia/data/visits.kt b/src/jvmMain/kotlin/info/mechyrdia/data/visits.kt index 7c1de93..335b7b8 100644 --- a/src/jvmMain/kotlin/info/mechyrdia/data/visits.kt +++ b/src/jvmMain/kotlin/info/mechyrdia/data/visits.kt @@ -3,6 +3,7 @@ package info.mechyrdia.data import com.mongodb.client.model.Accumulators import com.mongodb.client.model.Aggregates import com.mongodb.client.model.Filters +import com.mongodb.client.model.Updates import info.mechyrdia.lore.dateTime import io.ktor.server.application.* import io.ktor.server.plugins.* @@ -46,27 +47,17 @@ data class PageVisitData( } suspend fun visit(path: String, visitor: String) { - val data = Table.locate( + Table.change( Filters.and( Filters.eq(PageVisitData::path.serialName, path), Filters.eq(PageVisitData::visitor.serialName, visitor) + ), + Updates.combine( + Updates.inc(PageVisitData::visits.serialName, 1), + Updates.set(PageVisitData::lastVisit.serialName, Instant.now()), + Updates.setOnInsert(MONGODB_ID_KEY, Id()) ) ) - if (data == null) - Table.put( - PageVisitData( - path = path, - visitor = visitor, - visits = 1L, - ) - ) - else - Table.put( - data.copy( - visits = data.visits + 1, - lastVisit = Instant.now() - ) - ) } suspend fun totalVisits(path: String): PageVisitTotals { -- 2.25.1