diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/dao/NostrDao.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/dao/NostrDao.kt index 3c85132a..d9aaa53d 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/dao/NostrDao.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/dao/NostrDao.kt @@ -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... } diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/BroadcastNostrEventReceipt.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/BroadcastNostrEventReceipt.kt new file mode 100644 index 00000000..bbb13283 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/BroadcastNostrEventReceipt.kt @@ -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 \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/BroadcastNostrEventRequest.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/BroadcastNostrEventRequest.kt index 19262c91..cc1a14b6 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/BroadcastNostrEventRequest.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/BroadcastNostrEventRequest.kt @@ -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 \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Post.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Post.kt index e51c0fc9..eb35a87c 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Post.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Post.kt @@ -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 \ No newline at end of file +): NostrEventEntity, ReplyingToEntity, ProfilePublicKeyEntity, TimestampedEntity, LocalStoreEntity, UserViewableEntity, BroadcastableEntity, SoftDeletableEntity \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Profile.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Profile.kt index d351e9c6..3714bc45 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Profile.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Profile.kt @@ -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(), diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Reaction.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Reaction.kt index afbd305f..b3cb6406 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Reaction.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Reaction.kt @@ -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 diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Repost.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Repost.kt index 832fe981..1abe7ed1 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Repost.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Repost.kt @@ -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 \ No newline at end of file +): NostrEventEntity, ProfilePublicKeyEntity, TimestampedEntity, LocalStoreEntity, UserViewableEntity, BroadcastableEntity, SoftDeletableEntity \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Zap.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Zap.kt index b2cb1560..9f78d5c1 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Zap.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Zap.kt @@ -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(), diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/traits/ProfilePublicKeyEntity.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/traits/ProfilePublicKeyEntity.kt new file mode 100644 index 00000000..000990bf --- /dev/null +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/traits/ProfilePublicKeyEntity.kt @@ -0,0 +1,7 @@ +package ac.aux.compose.database.model.traits + +import com.vitorpamplona.quartz.nip01Core.core.HexKey + +interface ProfilePublicKeyEntity { + val profilePublicKey: HexKey +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/traits/ReplyingToEntity.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/traits/ReplyingToEntity.kt new file mode 100644 index 00000000..360ec8f1 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/traits/ReplyingToEntity.kt @@ -0,0 +1,7 @@ +package ac.aux.compose.database.model.traits + +import com.vitorpamplona.quartz.nip01Core.core.HexKey + +interface ReplyingToEntity { + val replyToId: HexKey? +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/repository/DatabasePostRepository.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/repository/DatabasePostRepository.kt index 679c131e..44ac53cc 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/repository/DatabasePostRepository.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/repository/DatabasePostRepository.kt @@ -12,7 +12,7 @@ class DatabasePostRepository( ) { val nostrDao = database.nostrDao() - nostrDao.insertPostAndNostrEvent( + nostrDao.insertNostrEvent( nostrEvent ) }