Skip to content

Commit

Permalink
use the database instead of the context in the parameters, save the l…
Browse files Browse the repository at this point in the history
…ast 5 replaceables
  • Loading branch information
greenart7c3 committed Feb 12, 2024
1 parent cd39a5a commit 3feb4c4
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 17 deletions.
5 changes: 5 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ android {
vectorDrawables {
useSupportLibrary = true
}
javaCompileOptions {
annotationProcessorOptions {
arguments.putIfAbsent("room.schemaLocation", "$projectDir/schemas")
}
}
}

buildTypes {
Expand Down
19 changes: 10 additions & 9 deletions app/src/main/java/com/greenart7c3/citrine/CustomWebSocketServer.kt
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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
Expand All @@ -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 {
Expand Down
7 changes: 3 additions & 4 deletions app/src/main/java/com/greenart7c3/citrine/EventRepository.kt
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -13,7 +12,7 @@ object EventRepository {
subscriptionId: String,
filter: EventFilter,
session: DefaultWebSocketServerSession,
context: Context,
appDatabase: AppDatabase,
objectMapper: ObjectMapper
) {
val whereClause = mutableListOf<String>()
Expand Down Expand Up @@ -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()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -21,7 +21,7 @@ object EventSubscription {
subscriptions.remove(subscriptionId)
}

suspend fun subscribe(subscriptionId: String, filters: Set<EventFilter>, session: DefaultWebSocketServerSession, context: Context, objectMapper: ObjectMapper) {
suspend fun subscribe(subscriptionId: String, filters: Set<EventFilter>, session: DefaultWebSocketServerSession, appDatabase: AppDatabase, objectMapper: ObjectMapper) {
subscriptions.plus(
Pair(
subscriptionId,
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String>

@Query("DELETE FROM EventEntity WHERE id in (:ids)")
@Transaction
fun delete(ids: List<String>)
Expand Down

0 comments on commit 3feb4c4

Please sign in to comment.