Add more database traits (and Broadcast tables)

This commit is contained in:
Kgothatso Ngako
2026-03-25 00:58:06 +02:00
parent 907aaac788
commit 1d30ba04d3
11 changed files with 80 additions and 17 deletions

View File

@@ -3,7 +3,6 @@ package ac.aux.compose.database.dao
import ac.aux.compose.database.AuxDatabase
import ac.aux.compose.database.model.NostrEvent
import ac.aux.compose.database.model.Post
import ac.aux.compose.database.model.Profile
import androidx.room.Dao
import androidx.room.Embedded
import androidx.room.Relation
@@ -14,9 +13,12 @@ abstract class NostrDao(
private val database: AuxDatabase
) {
@Transaction
open suspend fun insertPostAndNostrEvent(nostrEvent: NostrEvent) {
open suspend fun insertNostrEvent(nostrEvent: NostrEvent) {
// TODO: Find or create profile with nostrEvent.pubkey
database.nostrEventDao().insert(nostrEvent)
// TODO: Get post from nostrEvent
// database.nostrEventDao().insert(nostrEvent)
// database.postDao().insert(nostrEvent.post) // TODO: Make use of the nostrEventId...
}

View File

@@ -0,0 +1,31 @@
package ac.aux.compose.database.model
import ac.aux.compose.database.model.traits.NostrEventEntity
import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.Index
import androidx.room.PrimaryKey
import com.vitorpamplona.quartz.nip01Core.core.HexKey
@Entity(
foreignKeys = [
ForeignKey(
entity = NostrEvent::class,
parentColumns = ["id"],
childColumns = ["nostrEventId"],
onDelete = ForeignKey.CASCADE,
),
],
indices = [
Index("nostrEventId"),
Index("isAccepted"),
],
)
data class BroadcastNostrEventReceipt(
@PrimaryKey(autoGenerate = true)
val id: Long,
override val nostrEventId: HexKey,
val isAccepted: Boolean,
val relayURL: String,
val messages: String? = null
): NostrEventEntity

View File

@@ -18,6 +18,7 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey
],
indices = [
Index("nostrEventId"),
Index("status"),
],
)
data class BroadcastRequest(
@@ -25,4 +26,5 @@ data class BroadcastRequest(
val id: Long,
override val nostrEventId: HexKey,
val status: String = "pending",
val relayURL: String,
): NostrEventEntity

View File

@@ -3,6 +3,8 @@ package ac.aux.compose.database.model
import ac.aux.compose.database.model.traits.BroadcastableEntity
import ac.aux.compose.database.model.traits.LocalStoreEntity
import ac.aux.compose.database.model.traits.NostrEventEntity
import ac.aux.compose.database.model.traits.ProfilePublicKeyEntity
import ac.aux.compose.database.model.traits.ReplyingToEntity
import ac.aux.compose.database.model.traits.SoftDeletableEntity
import ac.aux.compose.database.model.traits.TimestampedEntity
import ac.aux.compose.database.model.traits.UserViewableEntity
@@ -56,17 +58,18 @@ import kotlin.time.Instant
data class Post(
@PrimaryKey
val id: HexKey,
override val nostrEventId: HexKey, // Might be a replaceable nostr event?
val replyToId: HexKey? = null,
val repostId: HexKey? = null,
val quote: HexKey? = null,
val profilePublicKey: HexKey,
val content: String,
override val nostrEventId: HexKey, // Might be a replaceable nostr event?
override val replyToId: HexKey? = null,
override val profilePublicKey: HexKey,
override val createdAt: Instant = Clock.System.now(),
override val updatedAt: Instant = Clock.System.now(),
override val savedAt: Instant = Clock.System.now(),
override val viewedAt: Instant? = null,
override val deletedAt: Instant? = null,
override val broadcastedAt: Instant? = null,
): NostrEventEntity, TimestampedEntity, LocalStoreEntity, UserViewableEntity, BroadcastableEntity, SoftDeletableEntity
): NostrEventEntity, ReplyingToEntity, ProfilePublicKeyEntity, TimestampedEntity, LocalStoreEntity, UserViewableEntity, BroadcastableEntity, SoftDeletableEntity

View File

@@ -29,7 +29,6 @@ import kotlin.time.Instant
data class Profile(
@PrimaryKey
val publicKey: String,
override val nostrEventId: String,
val userName: String? = null, // name in the nostr event...
val displayName: String? = null,
val picture: String? = null,
@@ -44,6 +43,8 @@ data class Profile(
val lud16: String? = null,
val twitter: String? = null,
override val nostrEventId: String,
override val createdAt: Instant = Clock.System.now(),
override val updatedAt: Instant = Clock.System.now(),
override val savedAt: Instant = Clock.System.now(),

View File

@@ -3,6 +3,8 @@ package ac.aux.compose.database.model
import ac.aux.compose.database.model.traits.BroadcastableEntity
import ac.aux.compose.database.model.traits.LocalStoreEntity
import ac.aux.compose.database.model.traits.NostrEventEntity
import ac.aux.compose.database.model.traits.ProfilePublicKeyEntity
import ac.aux.compose.database.model.traits.ReplyingToEntity
import ac.aux.compose.database.model.traits.SoftDeletableEntity
import ac.aux.compose.database.model.traits.TimestampedEntity
import ac.aux.compose.database.model.traits.UserViewableEntity
@@ -48,14 +50,16 @@ import kotlin.time.Instant
data class Reaction(
@PrimaryKey
val id: HexKey,
override val nostrEventId: HexKey, // Might be a replaceable nostr event?
val replyToId: HexKey,
val profilePublicKey: HexKey,
val content: String,
override val nostrEventId: HexKey,
override val replyToId: HexKey,
override val profilePublicKey: HexKey,
override val createdAt: Instant = Clock.System.now(),
override val updatedAt: Instant = Clock.System.now(),
override val savedAt: Instant = Clock.System.now(),
override val viewedAt: Instant? = null,
override val deletedAt: Instant? = null,
override val broadcastedAt: Instant? = null,
): NostrEventEntity, TimestampedEntity, LocalStoreEntity, UserViewableEntity, BroadcastableEntity, SoftDeletableEntity
): NostrEventEntity, ReplyingToEntity, ProfilePublicKeyEntity, TimestampedEntity, LocalStoreEntity, UserViewableEntity, BroadcastableEntity, SoftDeletableEntity

View File

@@ -3,6 +3,7 @@ package ac.aux.compose.database.model
import ac.aux.compose.database.model.traits.BroadcastableEntity
import ac.aux.compose.database.model.traits.LocalStoreEntity
import ac.aux.compose.database.model.traits.NostrEventEntity
import ac.aux.compose.database.model.traits.ProfilePublicKeyEntity
import ac.aux.compose.database.model.traits.SoftDeletableEntity
import ac.aux.compose.database.model.traits.TimestampedEntity
import ac.aux.compose.database.model.traits.UserViewableEntity
@@ -48,14 +49,16 @@ import kotlin.time.Instant
data class Repost(
@PrimaryKey
val id: HexKey,
override val nostrEventId: HexKey, // Might be a replaceable nostr event?
val postId: HexKey? = null,
val profilePublicKey: HexKey,
val content: String,
override val nostrEventId: HexKey, // Might be a replaceable nostr event?
override val profilePublicKey: HexKey,
override val createdAt: Instant = Clock.System.now(),
override val updatedAt: Instant = Clock.System.now(),
override val savedAt: Instant = Clock.System.now(),
override val viewedAt: Instant? = null,
override val deletedAt: Instant? = null,
override val broadcastedAt: Instant? = null,
): NostrEventEntity, TimestampedEntity, LocalStoreEntity, UserViewableEntity, BroadcastableEntity, SoftDeletableEntity
): NostrEventEntity, ProfilePublicKeyEntity, TimestampedEntity, LocalStoreEntity, UserViewableEntity, BroadcastableEntity, SoftDeletableEntity

View File

@@ -52,12 +52,15 @@ import kotlin.time.Instant
data class Zap(
@PrimaryKey
val id: HexKey,
override val nostrEventId: HexKey, // Might be a replaceable nostr event?
val postId: HexKey,
val senderPublicKey: HexKey,
val receiverPublicKey: HexKey,
val message: String?,
val invoice: String?,
val amountInMillisatoshis: Long?,
override val nostrEventId: HexKey, // Might be a replaceable nostr event?
override val createdAt: Instant = Clock.System.now(),
override val updatedAt: Instant = Clock.System.now(),
override val savedAt: Instant = Clock.System.now(),

View File

@@ -0,0 +1,7 @@
package ac.aux.compose.database.model.traits
import com.vitorpamplona.quartz.nip01Core.core.HexKey
interface ProfilePublicKeyEntity {
val profilePublicKey: HexKey
}

View File

@@ -0,0 +1,7 @@
package ac.aux.compose.database.model.traits
import com.vitorpamplona.quartz.nip01Core.core.HexKey
interface ReplyingToEntity {
val replyToId: HexKey?
}

View File

@@ -12,7 +12,7 @@ class DatabasePostRepository(
) {
val nostrDao = database.nostrDao()
nostrDao.insertPostAndNostrEvent(
nostrDao.insertNostrEvent(
nostrEvent
)
}