From 3feb4c45c579430b83606f30c188a27044b99bda Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Mon, 12 Feb 2024 11:17:24 -0300 Subject: [PATCH] use the database instead of the context in the parameters, save the last 5 replaceables --- app/build.gradle.kts | 5 +++++ .../citrine/CustomWebSocketServer.kt | 19 ++++++++++--------- .../greenart7c3/citrine/EventRepository.kt | 7 +++---- .../greenart7c3/citrine/EventSubscription.kt | 6 +++--- .../citrine/WebSocketServerService.kt | 6 +++++- .../greenart7c3/citrine/database/EventDao.kt | 4 ++++ 6 files changed, 30 insertions(+), 17 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 49f85c0..1bfc318 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -20,6 +20,11 @@ android { vectorDrawables { useSupportLibrary = true } + javaCompileOptions { + annotationProcessorOptions { + arguments.putIfAbsent("room.schemaLocation", "$projectDir/schemas") + } + } } buildTypes { diff --git a/app/src/main/java/com/greenart7c3/citrine/CustomWebSocketServer.kt b/app/src/main/java/com/greenart7c3/citrine/CustomWebSocketServer.kt index 2a42fa9..da6e4e5 100644 --- a/app/src/main/java/com/greenart7c3/citrine/CustomWebSocketServer.kt +++ b/app/src/main/java/com/greenart7c3/citrine/CustomWebSocketServer.kt @@ -1,6 +1,5 @@ package com.greenart7c3.citrine -import android.content.Context import android.util.Log import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.databind.JsonNode @@ -27,7 +26,7 @@ import io.ktor.websocket.send import kotlinx.coroutines.channels.ClosedReceiveChannelException import java.util.zip.Deflater -class CustomWebSocketServer(private val port: Int, private val context: Context) { +class CustomWebSocketServer(private val port: Int, private val appDatabase: AppDatabase) { private lateinit var server: ApplicationEngine private val objectMapper = jacksonObjectMapper() .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) @@ -60,7 +59,7 @@ class CustomWebSocketServer(private val port: Int, private val context: Context) filter.copy(tags = tags) }.toSet() - EventSubscription.subscribe(subscriptionId, filters, session, context, objectMapper) + EventSubscription.subscribe(subscriptionId, filters, session, appDatabase, objectMapper) } private suspend fun processNewRelayMessage(newMessage: String, session: DefaultWebSocketServerSession) { @@ -107,7 +106,7 @@ class CustomWebSocketServer(private val port: Int, private val context: Context) event.isParameterizedReplaceable() -> handleParameterizedReplaceable(event) event.shouldOverwrite() -> override(event) !event.isEphemeral() -> { - val eventEntity = AppDatabase.getDatabase(context).eventDao().getById(event.id) + val eventEntity = appDatabase.eventDao().getById(event.id) if (eventEntity != null) { session.send(CommandResult.duplicated(event).toJson()) return @@ -121,22 +120,24 @@ class CustomWebSocketServer(private val port: Int, private val context: Context) private fun handleParameterizedReplaceable(event: Event) { save(event) - val ids = AppDatabase.getDatabase(context).eventDao().getOldestReplaceable(event.kind, event.pubKey, event.tags.firstOrNull { it.size > 1 && it[0] == "d" }?.get(1) ?: "") - AppDatabase.getDatabase(context).eventDao().delete(ids) + val ids = appDatabase.eventDao().getOldestReplaceable(event.kind, event.pubKey, event.tags.firstOrNull { it.size > 1 && it[0] == "d" }?.get(1) ?: "") + appDatabase.eventDao().delete(ids) } private fun override(event: Event) { save(event) - AppDatabase.getDatabase(context).eventDao().deleteOldestByKind(event.kind, event.pubKey) + val ids = appDatabase.eventDao().getByKind(event.kind).drop(5) + if (ids.isEmpty()) return + appDatabase.eventDao().delete(ids) } private fun save(event: Event) { - AppDatabase.getDatabase(context).eventDao().insertEventWithTags(event.toEventWithTags()) + appDatabase.eventDao().insertEventWithTags(event.toEventWithTags()) } private fun deleteEvent(event: Event) { save(event) - AppDatabase.getDatabase(context).eventDao().delete(event.taggedEvents()) + appDatabase.eventDao().delete(event.taggedEvents()) } private fun startKtorHttpServer(port: Int): ApplicationEngine { diff --git a/app/src/main/java/com/greenart7c3/citrine/EventRepository.kt b/app/src/main/java/com/greenart7c3/citrine/EventRepository.kt index 4c09453..93195d8 100644 --- a/app/src/main/java/com/greenart7c3/citrine/EventRepository.kt +++ b/app/src/main/java/com/greenart7c3/citrine/EventRepository.kt @@ -1,6 +1,5 @@ package com.greenart7c3.citrine -import android.content.Context import com.fasterxml.jackson.databind.ObjectMapper import com.greenart7c3.citrine.database.AppDatabase import com.greenart7c3.citrine.database.toEvent @@ -13,7 +12,7 @@ object EventRepository { subscriptionId: String, filter: EventFilter, session: DefaultWebSocketServerSession, - context: Context, + appDatabase: AppDatabase, objectMapper: ObjectMapper ) { val whereClause = mutableListOf() @@ -74,10 +73,10 @@ object EventRepository { query += " LIMIT ${filter.limit}" } - val cursor = AppDatabase.getDatabase(context).query(query, arrayOf()) + val cursor = appDatabase.query(query, arrayOf()) cursor.use { item -> while (item.moveToNext()) { - val eventEntity = AppDatabase.getDatabase(context).eventDao().getById(item.getString(0)) + val eventEntity = appDatabase.eventDao().getById(item.getString(0)) eventEntity?.let { val event = it.toEvent() if (!event.isExpired()) { diff --git a/app/src/main/java/com/greenart7c3/citrine/EventSubscription.kt b/app/src/main/java/com/greenart7c3/citrine/EventSubscription.kt index 27223d3..5bbb7ba 100644 --- a/app/src/main/java/com/greenart7c3/citrine/EventSubscription.kt +++ b/app/src/main/java/com/greenart7c3/citrine/EventSubscription.kt @@ -1,9 +1,9 @@ package com.greenart7c3.citrine import EOSE -import android.content.Context import android.util.Log import com.fasterxml.jackson.databind.ObjectMapper +import com.greenart7c3.citrine.database.AppDatabase import io.ktor.server.websocket.DefaultWebSocketServerSession import io.ktor.websocket.send import kotlinx.coroutines.runBlocking @@ -21,7 +21,7 @@ object EventSubscription { subscriptions.remove(subscriptionId) } - suspend fun subscribe(subscriptionId: String, filters: Set, session: DefaultWebSocketServerSession, context: Context, objectMapper: ObjectMapper) { + suspend fun subscribe(subscriptionId: String, filters: Set, session: DefaultWebSocketServerSession, appDatabase: AppDatabase, objectMapper: ObjectMapper) { subscriptions.plus( Pair( subscriptionId, @@ -35,7 +35,7 @@ object EventSubscription { for (filter in filters) { try { runBlocking { - EventRepository.subscribe(subscriptionId, filter, session, context, objectMapper) + EventRepository.subscribe(subscriptionId, filter, session, appDatabase, objectMapper) } } catch (e: Exception) { Log.d("error", "Error reading data from database", e) diff --git a/app/src/main/java/com/greenart7c3/citrine/WebSocketServerService.kt b/app/src/main/java/com/greenart7c3/citrine/WebSocketServerService.kt index 75056bd..0abb21a 100644 --- a/app/src/main/java/com/greenart7c3/citrine/WebSocketServerService.kt +++ b/app/src/main/java/com/greenart7c3/citrine/WebSocketServerService.kt @@ -17,6 +17,7 @@ import android.os.Build import android.os.IBinder import androidx.core.app.NotificationCompat import androidx.core.content.ContextCompat.getSystemService +import com.greenart7c3.citrine.database.AppDatabase class WebSocketServerService : Service() { lateinit var webSocketServer: CustomWebSocketServer @@ -50,7 +51,10 @@ class WebSocketServerService : Service() { // Start the WebSocket server val port = if (BuildConfig.DEBUG) defaultPortDebug else defaultPort - webSocketServer = CustomWebSocketServer(port, this@WebSocketServerService) + webSocketServer = CustomWebSocketServer( + port, + AppDatabase.getDatabase(this@WebSocketServerService) + ) webSocketServer.start() // Create a notification to keep the service in the foreground diff --git a/app/src/main/java/com/greenart7c3/citrine/database/EventDao.kt b/app/src/main/java/com/greenart7c3/citrine/database/EventDao.kt index 308ab38..0662814 100644 --- a/app/src/main/java/com/greenart7c3/citrine/database/EventDao.kt +++ b/app/src/main/java/com/greenart7c3/citrine/database/EventDao.kt @@ -22,6 +22,10 @@ interface EventDao { @Transaction fun getById(id: String): EventWithTags? + @Query("SELECT id FROM EventEntity WHERE kind = :kind ORDER BY createdAt DESC") + @Transaction + fun getByKind(kind: Int): List + @Query("DELETE FROM EventEntity WHERE id in (:ids)") @Transaction fun delete(ids: List)